|
1 | 1 | from ..base_check import BaseReportCriterion, answer |
| 2 | +from .main_page_settings import ReportMainPageSetting |
| 3 | +import re |
| 4 | +import copy |
2 | 5 |
|
3 | 6 |
|
4 | 7 | class ReportMainCharacterCheck(BaseReportCriterion): |
5 | | - label = "Проверка фамилии и должности заведующего кафедрой" |
6 | | - description = 'Зав. кафедрой: А.А. Лисс' |
7 | | - id = 'main_character_check' |
| 8 | + label = "Проверка составляющих титульного листа, задания и календарного плана" |
| 9 | + description = "" |
| 10 | + id = "main_character_check" |
8 | 11 | priority = True |
9 | 12 |
|
10 | | - def __init__(self, file_info, main_character_name_right="А.А. Лисс", main_character_name_wrong="К.В. Кринкин", |
11 | | - main_character_job_right="Зав. кафедрой", main_character_job_wrong="И.о. зав. кафедрой"): |
| 13 | + def __init__(self, file_info, tables_count_to_verify=8): |
12 | 14 | super().__init__(file_info) |
13 | 15 | self.headers = [] |
14 | | - self.main_character_name_right = main_character_name_right |
15 | | - self.main_character_name_wrong = main_character_name_wrong |
16 | | - self.main_character_job_right = main_character_job_right |
17 | | - self.main_character_job_wrong = main_character_job_wrong |
| 16 | + self.first_check_list = None |
| 17 | + self.second_check_list = None |
| 18 | + self.tables_count_to_verify = tables_count_to_verify |
18 | 19 |
|
19 | 20 | def late_init(self): |
20 | | - self.headers = self.file.make_headers(self.file_type['report_type']) |
| 21 | + self.headers = self.file.make_headers(self.file_type["report_type"]) |
21 | 22 |
|
22 | 23 | def check(self): |
| 24 | + self.first_check_list = copy.deepcopy(ReportMainPageSetting.FIRST_TABLE) |
| 25 | + self.second_check_list = copy.deepcopy(ReportMainPageSetting.SECOND_TABLE) |
23 | 26 | if self.file.page_counter() < 4: |
24 | 27 | return answer(False, "В отчете недостаточно страниц. Нечего проверять.") |
| 28 | + if self.tables_count_to_verify > len(self.file.tables): |
| 29 | + return answer( |
| 30 | + False, |
| 31 | + f"Количество таблиц на страницах титульного листа, задания и календарного плана должно быть не меньше {self.tables_count_to_verify}", |
| 32 | + ) |
25 | 33 | self.late_init() |
26 | | - result_str = '' |
| 34 | + result_str = "" |
| 35 | + pages = [] |
27 | 36 | for header in self.headers: |
28 | 37 | if header["marker"] and header["main_character"]: |
29 | | - page = header["page"] |
30 | | - text_on_page = self.file.pdf_file.text_on_page[page] |
31 | | - if text_on_page.find(self.main_character_name_wrong) >= 0 and not text_on_page.find( |
32 | | - self.main_character_name_right) >= 0: |
33 | | - result_str += f"На странице {self.format_page_link([page])} указана неверная фамилия заведующего " \ |
34 | | - f"кафедрой. Убедитесь, что {self.main_character_job_right} {self.main_character_name_right}.<br>" |
35 | | - elif not text_on_page.find(self.main_character_name_right) >= 0: |
36 | | - result_str += f"На странице {self.format_page_link([page])} не указано ФИО заведующего кафедрой, в " \ |
37 | | - f"графе {self.main_character_job_right} должно быть указано {self.main_character_name_right}.<br>" |
38 | | - if text_on_page.find(self.main_character_job_wrong) >= 0 and not text_on_page.find( |
39 | | - self.main_character_job_right) >= 0: |
40 | | - result_str += f'На странице {self.format_page_link([page])} указана неверная должность ' \ |
41 | | - f'заведующего кафедрой, должно быть "{self.main_character_job_right}".<br>' |
42 | | - if not result_str: |
43 | | - return answer(True, 'ФИО и должность исполняющего обязанности зав. кафедрой указаны верно на всех листах.') |
| 38 | + pages.append(header["page"]) |
| 39 | + for i in range(self.tables_count_to_verify): |
| 40 | + table = self.file.tables[i] |
| 41 | + extract_table = self.extract_table_contents(table) |
| 42 | + self.check_table(self.first_check_list, extract_table, i+1) |
| 43 | + self.check_table(self.second_check_list, extract_table, i+1) |
| 44 | + links = self.format_page_link(pages) |
| 45 | + result_score = 1.0 |
| 46 | + check_result = self.first_check_list + self.second_check_list |
| 47 | + penalty_score = 1 / len(check_result) |
| 48 | + for res in check_result: |
| 49 | + if res["found_key"] > 1 and res["key"] == "Консультант": |
| 50 | + links = self.format_page_link(pages[1:]) |
| 51 | + result_str += f"Предупреждение: помните, что на страницах {links} указывается только консультант, являющийся фактическим руководителем (консультант от кафедры / по допразделу не указываются).<br>" |
| 52 | + elif res["found_key"] < res["find"] and res["key"] != "Консультант": |
| 53 | + result_score -= penalty_score * (res["find"] - res['found_value']) |
| 54 | + result_str += f"Поле '{res['key']}' не найдено на страницах {links}. Его удалось обнаружить {res['found_key']} из {res['find']} раз. Проверьте корректность всех вхождений.<br>" |
| 55 | + elif res["found_value"] < res["find"]: |
| 56 | + result_score -= penalty_score * (res["find"] - res['found_value']) |
| 57 | + links = self.format_page_link(pages) |
| 58 | + result_str += f"Содержимое поля '{res['key']}' указано корректно {res['found_value']} из {res['find']} раз. Проверьте корректность всех вхождений на страницах {links}.<br>" |
| 59 | + result_str += f"""<br>Логи проверки:<br><code>{"<br>".join(res['logs'] for res in check_result)}</code><br>""" |
| 60 | + if result_score < 0: |
| 61 | + result_score = 0 # for case with big penalty |
| 62 | + |
| 63 | + if result_score == 1.0: |
| 64 | + return answer(result_score, f"Пройдена!<br>{result_str}") |
44 | 65 | else: |
45 | | - result_str += f'<br>Убедитесь, что вы использовали правильные формы бланков титульного листа, задания и календарного плана.' \ |
46 | | - f'<br>Для бакалавров: <a href="https://drive.google.com/drive/folders/1pvv9HJIUB0VZUXteGqtLcVq6zIgZ6rbZ">Формы бланков для бакалавров</a>.' \ |
47 | | - f'<br>Для магистров: <a href="https://drive.google.com/drive/folders/1KOoXzKv4Wf-XyGzOf1X8gN256sgame1D">Формы бланков для магистров</a>.' |
48 | | - return answer(False, result_str) |
| 66 | + result_str += ( |
| 67 | + f"<br>Убедитесь, что вы использовали правильные формы бланков титульного листа, задания и календарного плана." |
| 68 | + f'<br>Для бакалавров: <a href="https://drive.google.com/drive/folders/1pvv9HJIUB0VZUXteGqtLcVq6zIgZ6rbZ">Формы бланков для бакалавров</a>.' |
| 69 | + f'<br>Для магистров: <a href="https://drive.google.com/drive/folders/1KOoXzKv4Wf-XyGzOf1X8gN256sgame1D">Формы бланков для магистров</a>.' |
| 70 | + ) |
| 71 | + return answer(result_score, result_str) |
| 72 | + |
| 73 | + def extract_table_contents(self, table): |
| 74 | + contents = [] |
| 75 | + processed_cells = set() |
| 76 | + for row in table.rows: |
| 77 | + row_text = [] |
| 78 | + for cell in row.cells: |
| 79 | + if cell not in processed_cells: |
| 80 | + row_text.append(cell.text.strip()) |
| 81 | + processed_cells.add(cell) |
| 82 | + contents.append("|".join(row_text)) |
| 83 | + return contents |
| 84 | + |
| 85 | + def calculate_find_value(self, table, index): |
| 86 | + count = int((len(table) - index - 2) / 2) |
| 87 | + if count >= 0: |
| 88 | + return count |
| 89 | + return 0 |
| 90 | + |
| 91 | + def check_table(self, check_list, table, table_num): |
| 92 | + for item in check_list: |
| 93 | + for i, line in enumerate(table): |
| 94 | + if item["key"] in line: |
| 95 | + item["found_key"] += 1 |
| 96 | + item["logs"] += f"'{item['key']}': ключ компоненты найден в строке '{line}' в таблице №{table_num}<br>" |
| 97 | + |
| 98 | + for value in item["value"]: |
| 99 | + if re.search(value, line): |
| 100 | + item["found_value"] += 1 |
| 101 | + item["logs"] += f"\t'{item['key']}': значение компоненты '{value}' найдено в строке '{line}' в таблице №{table_num}<br>" |
| 102 | + break |
| 103 | + |
| 104 | + if item["key"] != "Зав. кафедрой" and item["key"] != "Консультант": |
| 105 | + continue |
| 106 | + |
| 107 | + elif item["key"] in ["Зав. кафедрой", "Консультант"] and item["found_key"] > 0: |
| 108 | + if item["key"] == "Консультант": |
| 109 | + if item["found_key"] == 1: |
| 110 | + item["find"] += self.calculate_find_value(table, i) |
| 111 | + for value in item["value"]: |
| 112 | + if re.search(value, line): |
| 113 | + item["found_value"] += 1 |
| 114 | + item["logs"] += f"'{item['key']}': значение компоненты '{value}' найдено в строке '{line}' в таблице №{table_num}<br>" |
0 commit comments