From f746be5f5b55ef163766b380e8b71c9df7f86bb7 Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov Date: Thu, 14 May 2026 23:15:15 +0300 Subject: [PATCH 1/5] add IND_PRAC_CONFIG to StyleCheckSettings --- .../report_checks/style_check_settings.py | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/app/main/checks/report_checks/style_check_settings.py b/app/main/checks/report_checks/style_check_settings.py index 44ebc054..53e0d664 100644 --- a/app/main/checks/report_checks/style_check_settings.py +++ b/app/main/checks/report_checks/style_check_settings.py @@ -214,6 +214,25 @@ class StyleCheckSettings: }, } + IND_PRAC_CONFIG = { + 'any_header': { + "style": HEADER_1_STYLE, + "docx_style": ["heading 2"], + "headers": [ + "ВВЕДЕНИЕ", + "ПОСТАНОВКА ЗАДАЧИ", + "РЕЗУЛЬТАТЫ РАБОТЫ", + "ИСПОЛЬЗУЕМЫЕ ТЕХНОЛОГИИ", + "ОТЗЫВ РУКОВОДИТЕЛЯ", + "ЗАКЛЮЧЕНИЕ", + ], + "unify_regex": None, + "regex": HEADER_REGEX, + "banned_words": STD_BANNED_WORDS, + "warned_words": STD_WARNED_WORDS, + }, + } + NIR1_CONFIG = { 'any_header': { "style": HEADER_1_STYLE, @@ -393,6 +412,7 @@ class StyleCheckSettings: 'LR_MAIN_TEXT': LR_MAIN_TEXT_CONFIG, 'VKR_HEADERS': VKR_CONFIG, 'VKR_MAIN_TEXT': VKR_MAIN_TEXT_CONFIG, + 'IND_PRAC_CONFIG': IND_PRAC_CONFIG, 'NIR_HEADERS': NIR2_CONFIG, 'NIR1_HEADERS': NIR1_CONFIG, 'NIR2_HEADERS': NIR2_CONFIG, From be0509f1b6dc025487419089f600d6cb2c3955fc Mon Sep 17 00:00:00 2001 From: LapshinAE0 Date: Fri, 27 Mar 2026 14:20:20 +0300 Subject: [PATCH 2/5] skeleton of the program --- app/main/check_packs/pack_config.py | 1 + .../intervals_between_paragraphs.py | 54 +++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 app/main/checks/report_checks/intervals_between_paragraphs.py diff --git a/app/main/check_packs/pack_config.py b/app/main/check_packs/pack_config.py index d31bc3c1..4c5346e2 100644 --- a/app/main/check_packs/pack_config.py +++ b/app/main/check_packs/pack_config.py @@ -54,6 +54,7 @@ ["water_in_the_text_check"], ["report_task_tracker"], ["report_was_were_check"], + ["report_intervals_paragraphs_check"], ] DEFAULT_TYPE = 'pres' diff --git a/app/main/checks/report_checks/intervals_between_paragraphs.py b/app/main/checks/report_checks/intervals_between_paragraphs.py new file mode 100644 index 00000000..0760ac9a --- /dev/null +++ b/app/main/checks/report_checks/intervals_between_paragraphs.py @@ -0,0 +1,54 @@ +from ..base_check import answer, BaseReportCriterion + +class ReportIntervalsParagraphsCheck(BaseReportCriterion): + label = "Проверка значений интервалов между абзацами" + description = "Межстрочный интервал должен быть 1.5, а интервал до и после себя 0pt" + id = 'report_intervals_paragraphs_check' + + def __init__(self, file_info, max_line_spacing=1.5, max_space=12, max_indent=1.5): + super().__init__(file_info) + self.max_line_spacing = max_line_spacing + self.max_space = max_space + self.max_indent = max_indent + + def check(self): + try: + problematic_paragraphs = [] + + for i, paragraph in enumerate(self.file.paragraphs): + + + if not paragraph.paragraph_text or "heading" in paragraph.paragraph_style_name: + continue + + if (paragraph.paragraph_space_after is not None and paragraph.paragraph_space_after != 0) or \ + (paragraph.paragraph_space_before is not None and paragraph.paragraph_space_before != 0) or \ + (paragraph.paragraph_line_spacing is not None and paragraph.paragraph_line_spacing != 1.5): + + preview_paragraph = paragraph.paragraph_text[:40].strip() + numb_page = self._find_paragraph_page(preview_paragraph) + problematic_paragraphs.append({ + 'preview': preview_paragraph, + 'number_page': numb_page + }) + if problematic_paragraphs: + return answer(False, f"Абзацы в работе имеют нерекомендованные интервалы: {'
'.join([f'абзац {par['preview']} - страница {par['number_page']}' for par in problematic_paragraphs])}") + + return answer(True, "Все абзацы имеют рекомендованные интервалы") + + + except Exception as e: + return answer(False, f"Ошибка при проверке интервалов: {str(e)}") + + + def _find_paragraph_page(self, paragraph_text): + try: + for page_num in range(1, self.file.page_counter() + 1): + text_on_page = self.file.pdf_file.text_on_page[page_num] + + if paragraph_text in text_on_page: + return self.format_page_link(page_num) + + except Exception: + return None + \ No newline at end of file From 1b8e6c2b70e7ba2ebac85e1d4c68e8abd7c35d8e Mon Sep 17 00:00:00 2001 From: LapshinAE0 Date: Tue, 5 May 2026 10:47:34 +0300 Subject: [PATCH 3/5] fix: fix check --- .../intervals_between_paragraphs.py | 64 +++++++++++-------- 1 file changed, 37 insertions(+), 27 deletions(-) diff --git a/app/main/checks/report_checks/intervals_between_paragraphs.py b/app/main/checks/report_checks/intervals_between_paragraphs.py index 0760ac9a..ff7ff836 100644 --- a/app/main/checks/report_checks/intervals_between_paragraphs.py +++ b/app/main/checks/report_checks/intervals_between_paragraphs.py @@ -1,9 +1,10 @@ from ..base_check import answer, BaseReportCriterion + class ReportIntervalsParagraphsCheck(BaseReportCriterion): label = "Проверка значений интервалов между абзацами" - description = "Межстрочный интервал должен быть 1.5, а интервал до и после себя 0pt" - id = 'report_intervals_paragraphs_check' + _description = "Межстрочный интервал должен быть равен 1.5, а интервал до и после абзаца сответсвенно равен 0pt" + id = "report_intervals_paragraphs_check" def __init__(self, file_info, max_line_spacing=1.5, max_space=12, max_indent=1.5): super().__init__(file_info) @@ -16,39 +17,48 @@ def check(self): problematic_paragraphs = [] for i, paragraph in enumerate(self.file.paragraphs): - - if not paragraph.paragraph_text or "heading" in paragraph.paragraph_style_name: + if ( + not paragraph.paragraph_text + or "heading" in paragraph.paragraph_style_name + ): continue - if (paragraph.paragraph_space_after is not None and paragraph.paragraph_space_after != 0) or \ - (paragraph.paragraph_space_before is not None and paragraph.paragraph_space_before != 0) or \ - (paragraph.paragraph_line_spacing is not None and paragraph.paragraph_line_spacing != 1.5): + if ( + ( + paragraph.paragraph_space_after is not None + and paragraph.paragraph_space_after != 0 + ) + or ( + paragraph.paragraph_space_before is not None + and paragraph.paragraph_space_before != 0 + ) + or ( + paragraph.paragraph_line_spacing is not None + and paragraph.paragraph_line_spacing != 1.5 + ) + ): preview_paragraph = paragraph.paragraph_text[:40].strip() - numb_page = self._find_paragraph_page(preview_paragraph) - problematic_paragraphs.append({ - 'preview': preview_paragraph, - 'number_page': numb_page - }) + problematic_paragraphs.append( + {"preview": preview_paragraph, "number_paragraph": i} + ) + if problematic_paragraphs: - return answer(False, f"Абзацы в работе имеют нерекомендованные интервалы: {'
'.join([f'абзац {par['preview']} - страница {par['number_page']}' for par in problematic_paragraphs])}") - return answer(True, "Все абзацы имеют рекомендованные интервалы") + details = "
".join( + [ + f"абзац (до первых 40 символов): {par['preview']} - номер параграфа: {par['number_paragraph']}" + for par in problematic_paragraphs + ] + ) + return answer( + False, + f"Абзацы в работе имеют нерекомендованные интервалы: {details}", + ) + + return answer(True, "Все абзацы имеют рекомендованные интервалы") except Exception as e: return answer(False, f"Ошибка при проверке интервалов: {str(e)}") - - - def _find_paragraph_page(self, paragraph_text): - try: - for page_num in range(1, self.file.page_counter() + 1): - text_on_page = self.file.pdf_file.text_on_page[page_num] - - if paragraph_text in text_on_page: - return self.format_page_link(page_num) - - except Exception: - return None - \ No newline at end of file From 6f4958c23ae8fd0f1df4c8e0f80d6fa788b48224 Mon Sep 17 00:00:00 2001 From: LapshinAE0 Date: Fri, 22 May 2026 14:57:17 +0300 Subject: [PATCH 4/5] fix: linter --- .../intervals_between_paragraphs.py | 27 ++++--------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/app/main/checks/report_checks/intervals_between_paragraphs.py b/app/main/checks/report_checks/intervals_between_paragraphs.py index ff7ff836..0fd4305a 100644 --- a/app/main/checks/report_checks/intervals_between_paragraphs.py +++ b/app/main/checks/report_checks/intervals_between_paragraphs.py @@ -17,35 +17,18 @@ def check(self): problematic_paragraphs = [] for i, paragraph in enumerate(self.file.paragraphs): - - if ( - not paragraph.paragraph_text - or "heading" in paragraph.paragraph_style_name - ): + if not paragraph.paragraph_text or "heading" in paragraph.paragraph_style_name: continue if ( - ( - paragraph.paragraph_space_after is not None - and paragraph.paragraph_space_after != 0 - ) - or ( - paragraph.paragraph_space_before is not None - and paragraph.paragraph_space_before != 0 - ) - or ( - paragraph.paragraph_line_spacing is not None - and paragraph.paragraph_line_spacing != 1.5 - ) + (paragraph.paragraph_space_after is not None and paragraph.paragraph_space_after != 0) + or (paragraph.paragraph_space_before is not None and paragraph.paragraph_space_before != 0) + or (paragraph.paragraph_line_spacing is not None and paragraph.paragraph_line_spacing != 1.5) ): - preview_paragraph = paragraph.paragraph_text[:40].strip() - problematic_paragraphs.append( - {"preview": preview_paragraph, "number_paragraph": i} - ) + problematic_paragraphs.append({"preview": preview_paragraph, "number_paragraph": i}) if problematic_paragraphs: - details = "
".join( [ f"абзац (до первых 40 символов): {par['preview']} - номер параграфа: {par['number_paragraph']}" From efb337d9795a3c6fe91868a213213316f6ef7cb1 Mon Sep 17 00:00:00 2001 From: LapshinAE0 Date: Fri, 22 May 2026 14:59:32 +0300 Subject: [PATCH 5/5] fix: linter 2 --- .../checks/report_checks/literature_references.py | 2 +- app/main/checks/report_checks/main_page_settings.py | 4 +++- app/utils/converter.py | 13 ++++++++----- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/app/main/checks/report_checks/literature_references.py b/app/main/checks/report_checks/literature_references.py index ba550d3d..8d95bd59 100644 --- a/app/main/checks/report_checks/literature_references.py +++ b/app/main/checks/report_checks/literature_references.py @@ -156,7 +156,7 @@ def search_references(self, start_par): match = re.search(r'Таблица ([.\d]+)', paragraph_text) table_text = '' if match: - index_table += 1 # int(match.group(1)) - 1 # TODO: fix logic + index_table += 1 # int(match.group(1)) - 1 # TODO: fix logic table_text = self.get_text_in_table(index_table) paragraph_text += table_text diff --git a/app/main/checks/report_checks/main_page_settings.py b/app/main/checks/report_checks/main_page_settings.py index e0ed9f06..bd50dab0 100644 --- a/app/main/checks/report_checks/main_page_settings.py +++ b/app/main/checks/report_checks/main_page_settings.py @@ -60,7 +60,9 @@ class ReportMainPageSetting: "found_value": 0, "found_key": 0, "find": 3, - "value": [r"(Руководитель).*([кд]\..+\.н\., (доцент|профессор))[|]*([А-Я](?:\.-?[А-Я])?\.[А-Я]\. [А-Я][а-я]+)"], # + "value": [ + r"(Руководитель).*([кд]\..+\.н\., (доцент|профессор))[|]*([А-Я](?:\.-?[А-Я])?\.[А-Я]\. [А-Я][а-я]+)" + ], # "logs": "", }, { diff --git a/app/utils/converter.py b/app/utils/converter.py index 821cc976..2c051eba 100644 --- a/app/utils/converter.py +++ b/app/utils/converter.py @@ -9,11 +9,14 @@ def run_process(cmd: str): def convert_to(filepath, target_format='pdf'): new_filename, outdir = None, dirname(filepath) - convert_cmd = "timeout 3m " + { - 'pdf': f"soffice --headless --convert-to pdf --outdir {outdir} {filepath}", - 'docx': f"soffice --headless --convert-to docx --outdir {outdir} {filepath}", - 'pptx': f"soffice --headless --convert-to pptx --outdir {outdir} {filepath}", - }[target_format] + convert_cmd = ( + "timeout 3m " + + { + 'pdf': f"soffice --headless --convert-to pdf --outdir {outdir} {filepath}", + 'docx': f"soffice --headless --convert-to docx --outdir {outdir} {filepath}", + 'pptx': f"soffice --headless --convert-to pptx --outdir {outdir} {filepath}", + }[target_format] + ) if run_process(convert_cmd).returncode == 0: # success conversion