Added left calendar dates parsing
This commit is contained in:
77
parser.py
77
parser.py
@@ -10,8 +10,9 @@ import aigenerated
|
||||
from coord import Coord, Merged
|
||||
from translations import ExcelSheetReader
|
||||
import utils
|
||||
from collections import defaultdict
|
||||
|
||||
LOGGING = True
|
||||
LOGGING = False
|
||||
|
||||
def pprint(*args, **kwargs):
|
||||
if LOGGING:
|
||||
@@ -21,9 +22,11 @@ class Parser:
|
||||
def __init__(self, reader: ExcelSheetReader):
|
||||
self.reader = reader
|
||||
self.groups = {}
|
||||
self.teachers = set()
|
||||
self.places = set()
|
||||
self.week_keys_metadata = {}
|
||||
|
||||
self.weeknums: defaultdict = defaultdict(set) # no support json!
|
||||
self.parser_error = None
|
||||
self.parser_warnings = []
|
||||
pprint("Parser created for '{0}'".format(reader.info()))
|
||||
|
||||
def parse(self):
|
||||
@@ -34,6 +37,11 @@ class Parser:
|
||||
self.parser_error = "'ПОНЕДЕЛЬНИК' не найден в таблице."
|
||||
return
|
||||
|
||||
if monday.col != 4:
|
||||
print("--- warning parse! ---")
|
||||
print(f"Monday col != 4 (actual: {monday})")
|
||||
self.parser_warnings.append(f"Monday col != 4 (actual: {monday}); Это, наверное, может работать не стабильно!")
|
||||
|
||||
head_rx = monday.row - 1 # выше первого понидельника
|
||||
if head_rx < 0:
|
||||
raise Exception("head_rx < 0: Программа пыталась найти 'ПОНЕДЕЛЬНИК', но по всей видимости не нашла.")
|
||||
@@ -49,8 +57,62 @@ class Parser:
|
||||
pprint("\nSTART OF PROCESS GROUP\n")
|
||||
self.process_group(group, monday)
|
||||
pprint("\nEND OF PROCESS GROUP\n")
|
||||
|
||||
self.process_weekmetadatas(monday)
|
||||
|
||||
pprint(self.teachers)
|
||||
def process_weekmetadatas(self, first_monday: "Coord"):
|
||||
for x in self.weeknums.keys():
|
||||
pprint(x)
|
||||
set_of_merged: set = self.weeknums[x]
|
||||
l = len(set_of_merged)
|
||||
if l != 1:
|
||||
self.week_keys_metadata[x] = {
|
||||
"error": True,
|
||||
"error_text": f"Parse error: count of found '{x}' (need view like WEEKDAY_1; weekday - in r; 1 - weeknum[1, 2]) is {l}; required only one!"
|
||||
}
|
||||
self.parser_warnings.append(f"Processing weekmetadata for '{x}' failed because count of uniqie merged cells not one (actual: {l}). :<")
|
||||
continue
|
||||
|
||||
weekday_merged: Merged = set_of_merged.pop()
|
||||
if weekday_merged.width() != 1:
|
||||
self.week_keys_metadata[x] = {
|
||||
"error": True,
|
||||
"error_text": f"Weekday excel block width != 1 (actual {weekday_merged.width()})"
|
||||
}
|
||||
self.parser_warnings.append(f"Processing weekmetadata for '{x}' failed because weekday excel block width != 1 (actual {weekday_merged.width()})")
|
||||
continue
|
||||
|
||||
month_row = first_monday.row - 1
|
||||
curr_col = weekday_merged.low.col - 1
|
||||
while curr_col >= 0:
|
||||
month_pos = Coord(month_row, curr_col)
|
||||
month_cell = month_pos.cell(self.reader)
|
||||
if month_cell.is_empty():
|
||||
pprint("month cell is empty")
|
||||
break
|
||||
month_name = str(month_cell.value).strip()
|
||||
pprint(month_cell)
|
||||
all_nums_of_month = utils.parse_all_dirt(self.reader, month_pos.shift(down=1), right=1, down=weekday_merged.height())
|
||||
|
||||
if (x not in self.week_keys_metadata.keys()):
|
||||
self.week_keys_metadata[x] = {}
|
||||
|
||||
if (month_name not in self.week_keys_metadata[x].keys()):
|
||||
self.week_keys_metadata[x][month_name] = []
|
||||
|
||||
for x2 in all_nums_of_month:
|
||||
m = self.week_keys_metadata[x][month_name]
|
||||
if x2 not in m:
|
||||
try:
|
||||
m.append(str(x2).replace(".0", ""))
|
||||
except:
|
||||
m.append(x2)
|
||||
|
||||
curr_col -= 1
|
||||
|
||||
|
||||
def push_weekday_meta(self, weekday: str, weeknum: int, week_key_name: str, merged: "Merged"):
|
||||
self.weeknums[week_key_name].add(merged)
|
||||
|
||||
def parse_potokoviy(self, merged: Merged):
|
||||
speaker = None
|
||||
@@ -66,7 +128,7 @@ class Parser:
|
||||
|
||||
return {"loc": str(location).strip(), "leader": str(speaker).strip(), "name": str(merged.cell(self.reader).value).strip()}
|
||||
|
||||
def process_group(self, group, monday):
|
||||
def process_group(self, group: dict, monday: Coord):
|
||||
"""
|
||||
Обработать группы, выполняется для каждой группы, после того как они распарены (parse_groups)
|
||||
group = {'name': 'ИВТ-260', 'position': [5, 6], 'position_human': 'G6:J6'}
|
||||
@@ -109,6 +171,9 @@ class Parser:
|
||||
if not skip:
|
||||
next = 3 # на сколько пыгнуть для следующего шага?
|
||||
|
||||
weekday_key_name = weekday + ("_1" if weeknum == 1 else "_2")
|
||||
self.push_weekday_meta(weekday, weeknum, weekday_key_name, weekday_mr)
|
||||
|
||||
is_empty_lesson = len(utils.parse_all_dirt(self.reader, pos, 4, 3)) == 0 # если в поле не найдено ничего..
|
||||
parsed_discipline_name = None
|
||||
parsed_location = None
|
||||
@@ -182,7 +247,7 @@ class Parser:
|
||||
# если не пустой предмет то записываем его
|
||||
if not is_empty_lesson:
|
||||
slots = group['slots']
|
||||
w = weekday + ("_1" if weeknum == 1 else "_2")
|
||||
w = weekday_key_name
|
||||
if w not in slots.keys():
|
||||
slots[w] = {}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user