From 4d94e7319fdf8b849ca9eb2b7ca5d86e3530e88f Mon Sep 17 00:00:00 2001 From: LapshinAE0 Date: Tue, 27 Jan 2026 19:06:41 +0300 Subject: [PATCH 1/2] check is done --- app/main/check_packs/pack_config.py | 1 + app/main/checks/report_checks/__init__.py | 1 + .../report_checks/check_sequence_sections.py | 45 +++++++++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 app/main/checks/report_checks/check_sequence_sections.py 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 0ed2a8dc..8cded5e5 100644 --- a/app/main/checks/report_checks/__init__.py +++ b/app/main/checks/report_checks/__init__.py @@ -32,3 +32,4 @@ from .sw_section_size import SWSectionSizeCheck from .sw_keywords_check import SWKeywordsCheck from .task_tracker import ReportTaskTracker +from .check_sequence_sections import ReportSequenceSectionsCheck 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..b7f7b190 --- /dev/null +++ b/app/main/checks/report_checks/check_sequence_sections.py @@ -0,0 +1,45 @@ + +from ..base_check import BaseReportCriterion, answer + + +class ReportSequenceSectionsCheck(BaseReportCriterion): + label = "Проверка последовательности разделов" + description = "Структура работы не правильна: до раздела 'ВВЕДЕНИЕ' должны быть только титульник и раздел 'СОДЕРЖАНИЕ'/'ОГЛАВЛЕНИЕ'." + 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']) + + if not headers: + return answer(False, "Не найдено ни одного заголовка.") + + struct_label = [] + flag_intro = False + for header in headers: + name_label = header['text'] + + if header["style"] != 'heading 1': + continue + + if name_label.upper() == "ВВЕДЕНИЕ" or name_label.upper() == "ВСТУПЛЕНИЕ": + flag_intro = True + break + + struct_label.append(name_label.upper()) + + if not flag_intro: + return answer(False, "Не найдено раздела 'ВВЕДЕНИЕ'/'ВСТУПЛЕНИЕ' (1 уровень загаловка)") + + if len(struct_label) == 1 and (struct_label[0] == "ОГЛАВЛЕНИЕ" or struct_label[0] == "СОДЕРЖАНИЕ"): + return answer(True, "Проверка последовательности разделов до раздела 'ВВЕДЕНИЕ' пройдена") + + return answer(False, f"Найдены лишние разделы 1-ого уровня до раздела 'ВВЕДЕНИЕ'/'ВСТУПЛЕНИЕ': {' '.join(struct_label)}") + + + except Exception as e: + return answer(False, f"Ошибка про проверке последовательности разделов до раздела 'ВВЕДЕНИЕ'/'ВСТУПЛЕНИЕ': {str(e)}, {self.file.make_chapters(self.file_type['report_type'])}") + \ No newline at end of file From 2f3977b95f149bde1bd9889642975922cbd704d5 Mon Sep 17 00:00:00 2001 From: LapshinAE0 Date: Wed, 11 Feb 2026 15:10:41 +0300 Subject: [PATCH 2/2] sequence: add check --- .../report_checks/check_sequence_sections.py | 55 +++++++++++-------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/app/main/checks/report_checks/check_sequence_sections.py b/app/main/checks/report_checks/check_sequence_sections.py index b7f7b190..43acb375 100644 --- a/app/main/checks/report_checks/check_sequence_sections.py +++ b/app/main/checks/report_checks/check_sequence_sections.py @@ -4,42 +4,53 @@ class ReportSequenceSectionsCheck(BaseReportCriterion): label = "Проверка последовательности разделов" - description = "Структура работы не правильна: до раздела 'ВВЕДЕНИЕ' должны быть только титульник и раздел 'СОДЕРЖАНИЕ'/'ОГЛАВЛЕНИЕ'." + description = "Структура работы не правильна: до раздела 'ВВЕДЕНИЕ' должны быть в определенном порядке разделы:" \ + "'ЗАДАНИЕ НА ВЫПУСКНУЮ КВАЛИФИКАЦИОННУЮ РАБОТУ' (заголовок первого уровня)" \ + "'КАЛЕНДАРНЫЙ ПЛАН ВЫПОЛНЕНИЯ ВЫПУСКНОЙ КВАЛИФИКАЦИОННОЙ РАБОТЫ' (заголовок первого уровня)" \ + "'РЕФЕРАТ' (заголовок первого уровня)" \ + "'ABSTRACT' (заголовок первого уровня)" \ + "'СОДЕРЖАНИЕ' (заголовок второго уровня)" \ + " 'ОПРЕДЕЛЕНИЯ, ОБОЗНАЧЕНИЯ И СОКРАЩЕНИЯ' (заголовок второго уровня)" id = 'report_sequence_sections_check' def __init__(self, file_info): super().__init__(file_info) def check(self): - try: + try: headers = self.file.make_chapters(self.file_type['report_type']) - + # return answer(True, f"{headers}") if not headers: return answer(False, "Не найдено ни одного заголовка.") - struct_label = [] - flag_intro = False - for header in headers: - name_label = header['text'] - - if header["style"] != 'heading 1': - continue - - if name_label.upper() == "ВВЕДЕНИЕ" or name_label.upper() == "ВСТУПЛЕНИЕ": - flag_intro = True - break - - struct_label.append(name_label.upper()) + flag_intro, struct_label = get_header_1_2_level(headers, []) if not flag_intro: - return answer(False, "Не найдено раздела 'ВВЕДЕНИЕ'/'ВСТУПЛЕНИЕ' (1 уровень загаловка)") + return answer(False, "Не найдено раздела 'ВВЕДЕНИЕ'/'ВСТУПЛЕНИЕ'") - if len(struct_label) == 1 and (struct_label[0] == "ОГЛАВЛЕНИЕ" or struct_label[0] == "СОДЕРЖАНИЕ"): - return answer(True, "Проверка последовательности разделов до раздела 'ВВЕДЕНИЕ' пройдена") - - return answer(False, f"Найдены лишние разделы 1-ого уровня до раздела 'ВВЕДЕНИЕ'/'ВСТУПЛЕНИЕ': {' '.join(struct_label)}") + 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'])}") - \ No newline at end of file + + +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