diff --git a/app/main/check_packs/pack_config.py b/app/main/check_packs/pack_config.py index 91e08134..0376b17b 100644 --- a/app/main/check_packs/pack_config.py +++ b/app/main/check_packs/pack_config.py @@ -50,6 +50,7 @@ ["empty_task_page_check"], ["water_in_the_text_check"], ["report_task_tracker"], + ["report_sequence_sections_check"], ] DEFAULT_TYPE = 'pres' diff --git a/app/main/checks/report_checks/__init__.py b/app/main/checks/report_checks/__init__.py index 30f22617..4a381ede 100644 --- a/app/main/checks/report_checks/__init__.py +++ b/app/main/checks/report_checks/__init__.py @@ -32,5 +32,6 @@ from .sw_section_size import SWSectionSizeCheck from .sw_keywords_check import SWKeywordsCheck from .task_tracker import ReportTaskTracker +from .check_sequence_sections import ReportSequenceSectionsCheck from .paragraphs_count_check import ReportParagraphsCountCheck from .template_name import ReportTemplateNameCheck diff --git a/app/main/checks/report_checks/check_sequence_sections.py b/app/main/checks/report_checks/check_sequence_sections.py new file mode 100644 index 00000000..43acb375 --- /dev/null +++ b/app/main/checks/report_checks/check_sequence_sections.py @@ -0,0 +1,56 @@ + +from ..base_check import BaseReportCriterion, answer + + +class ReportSequenceSectionsCheck(BaseReportCriterion): + label = "Проверка последовательности разделов" + description = "Структура работы не правильна: до раздела 'ВВЕДЕНИЕ' должны быть в определенном порядке разделы:" \ + "'ЗАДАНИЕ НА ВЫПУСКНУЮ КВАЛИФИКАЦИОННУЮ РАБОТУ' (заголовок первого уровня)" \ + "'КАЛЕНДАРНЫЙ ПЛАН ВЫПОЛНЕНИЯ ВЫПУСКНОЙ КВАЛИФИКАЦИОННОЙ РАБОТЫ' (заголовок первого уровня)" \ + "'РЕФЕРАТ' (заголовок первого уровня)" \ + "'ABSTRACT' (заголовок первого уровня)" \ + "'СОДЕРЖАНИЕ' (заголовок второго уровня)" \ + " 'ОПРЕДЕЛЕНИЯ, ОБОЗНАЧЕНИЯ И СОКРАЩЕНИЯ' (заголовок второго уровня)" + id = 'report_sequence_sections_check' + + def __init__(self, file_info): + super().__init__(file_info) + + def check(self): + try: + headers = self.file.make_chapters(self.file_type['report_type']) + # return answer(True, f"{headers}") + if not headers: + return answer(False, "Не найдено ни одного заголовка.") + + flag_intro, struct_label = get_header_1_2_level(headers, []) + + if not flag_intro: + return answer(False, "Не найдено раздела 'ВВЕДЕНИЕ'/'ВСТУПЛЕНИЕ'") + + if " ".join(struct_label) != "ЗАДАНИЕ НА ВЫПУСКНУЮ КВАЛИФИКАЦИОННУЮ РАБОТУ КАЛЕНДАРНЫЙ ПЛАН ВЫПОЛНЕНИЯ ВЫПУСКНОЙ КВАЛИФИКАЦИОННОЙ РАБОТЫ" \ + " РЕФЕРАТ ABSTRACT СОДЕРЖАНИЕ ОПРЕДЕЛЕНИЯ, ОБОЗНАЧЕНИЯ И СОКРАЩЕНИЯ": + return answer(False, f"Ваша структура работы не соотвествует требуемой: {'\n'.join(struct_label)}") + + + return answer(True, "Проверка последовательности разделов до раздела 'ВВЕДЕНИЕ' пройдена") + + except Exception as e: + return answer(False, f"Ошибка про проверке последовательности разделов до раздела 'ВВЕДЕНИЕ'/'ВСТУПЛЕНИЕ': {str(e)}, {self.file.make_chapters(self.file_type['report_type'])}") + + +def get_header_1_2_level(headers, struct_label): + for header in headers: + style = header.get('style', '').lower() + + if style != "heading 1" and style != "heading 2" : + continue + + name_label = header['text'].strip().upper() + + if name_label in ["ВВЕДЕНИЕ", "ВСТУПЛЕНИЕ"]: + return True, struct_label + + struct_label.append(name_label.upper()) + + return False, struct_label