Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

466 criteria pack for md test #471

Merged
merged 25 commits into from
Mar 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions app/main/check_packs/pack_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,13 @@
["banned_words_in_literature"],
["page_counter"],
["image_share_check"],
# ["headers_at_page_top_check", {"headers": ["Приложение А Исходный код программы"]}],
["headers_at_page_top_check", {"headers": ["Приложение А Исходный код программы"]}],
["headers_at_page_top_check"],
["lr_sections_check"],
["style_check"],
["short_sections_check"],
["banned_words_check"],
["right_words_check"],
["banned_words_in_literature"],
["literature_references"],
["image_references"],
["table_references"],
Expand Down
9 changes: 5 additions & 4 deletions app/main/checks/report_checks/banned_words_in_literature.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ def __init__(self, file_info, banned_words=["wikipedia"]):

def late_init_vkr(self):
self.literature_header = self.file.find_literature_vkr(self.file_type['report_type'])
self.headers_page = self.file.find_header_page(self.file_type['report_type'])
# self.headers_page = self.file.find_header_page(self.file_type['report_type'])
self.lit_page = self.file.find_literature_page(self.file_type['report_type'])

def check(self):
if self.file.page_counter() < 4:
Expand All @@ -31,7 +32,7 @@ def check(self):
self.late_init_vkr()
header = self.literature_header
if not header:
return answer(False, f"Нет списка использованных источников!")
return answer(True, f"Нет списка использованных источников!<br><br>Если в вашей работе есть список литературы, убедитесь в правильности формата заголовка ")
if not header["child"]:
return answer(False, "Не найдено ни одного источника.")
header_number = header["number"]
Expand All @@ -52,7 +53,7 @@ def check(self):
for i in sorted(detected_words_dict.keys()):
result_str += f"Абзац {i}: {detected_words_dict[i]}.<br>"
return answer(False, f'Есть запрещенные слова в списке источников '
f'{self.format_page_link([self.headers_page])}:<br><br>{result_str}')
f'{self.format_page_link([self.lit_page])}:<br><br>{result_str}')
return answer(True, f"Пройдена!")

def find_banned_words(self, list_of_literature):
Expand Down Expand Up @@ -83,6 +84,6 @@ def start_of_literature_chapter(self, ):
start_index = 0
for i in range(len(self.file.paragraphs)):
text_string = self.file.paragraphs[i].to_string().lower().split('\n')[1]
if re.fullmatch(self.name_pattern, text_string):
if re.fullmatch(f'{self.name_pattern}', text_string):
start_index = i
return start_index
9 changes: 6 additions & 3 deletions app/main/checks/report_checks/image_references.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ def check(self):
return answer(False, "Не найдено ни одного заголовка.<br><br>Проверьте корректность использования стилей.")
number_of_images, all_numbers = self.count_images_vkr()
if not number_of_images:
return answer(False, f'Не найдено ни одного рисунка.<br><br>Убедитесь, что для подписи рисунка был '
f'использован стиль {self.image_style}, а рисунок подписан '
return answer(True, f'Не найдено ни одного рисунка.<br><br> Если в вашей работе присутствуют рисунки, убедитесь, что для их подписи был '
f'использован стиль {self.image_style}, и формат: '
f'"Рисунок <Номер рисунка> -- <Название рисунка>".')
else:
return answer(False, 'Во время обработки произошла критическая ошибка')
Expand Down Expand Up @@ -63,7 +63,10 @@ def check(self):
def search_references(self):
array_of_references = set()
for i in range(0, self.last_child_number):
detected_references = re.findall(r'[Рр]ис\. [\d .,]+', self.file.paragraphs[i].paragraph_text)
if isinstance(self.file.paragraphs[i], str):
detected_references = re.findall(r'[Рр]ис\. [\d .,]+', self.file.paragraphs[i])
else:
detected_references = re.findall(r'[Рр]ис\. [\d .,]+', self.file.paragraphs[i].paragraph_text)
if detected_references:
for reference in detected_references:
for one_part in re.split(r'[Рр]ис\.|,| ', reference):
Expand Down
2 changes: 1 addition & 1 deletion app/main/checks/report_checks/image_share_check.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ def check(self):
available_space = self.file.file.sections[0].page_height.cm - self.file.file.sections[0].bottom_margin.cm - \
self.file.file.sections[0].top_margin.cm
images_pages = images_height / available_space
share = images_pages / self.file.count
share = images_pages / self.file.page_count
if share > self.limit:
result_str = f'Проверка не пройдена! Изображения в работе занимают около {round(share, 2)} объема ' \
f'документа без учета приложения, ограничение - {round(self.limit, 2)}'
Expand Down
13 changes: 8 additions & 5 deletions app/main/checks/report_checks/literature_references.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@ def check(self):
self.late_init_vkr()
header = self.literature_header
if not header:
return answer(False,
f'Не найден Список использованных источников.<br><br>Проверьте корректность использования стилей.')
return answer(True,
f'Не найден Список использованных источников.<br><br>Если в вашей работе есть список источников, проверьте корректность использования стилей.')
start_literature_par = header["number"]
number_of_sources = self.count_sources_vkr(header)
else:
Expand Down Expand Up @@ -77,7 +77,10 @@ def check(self):
def search_references(self, start_par):
array_of_references = set()
for i in range(0, start_par):
detected_references = re.findall(r'\[[\d \-,]+\]', self.file.paragraphs[i].to_string().split('\n')[1])
if isinstance(self.file.paragraphs[i], str):
detected_references = re.findall(r'\[[\d \-,]+\]', self.file.paragraphs[i])
else:
detected_references = re.findall(r'\[[\d \-,]+\]', self.file.paragraphs[i].paragraph_text)
if detected_references:
for reference in detected_references:
for one_part in re.split(r'[\[\],]', reference):
Expand All @@ -93,7 +96,7 @@ def find_start_paragraph(self):
start_index = 0
for i in range(len(self.file.paragraphs)):
text_string = self.file.paragraphs[i].to_string().lower().split('\n')[1]
if re.fullmatch(self.name_pattern, text_string):
if re.fullmatch(f'{self.name_pattern}', text_string):
start_index = i
break
return start_index
Expand Down Expand Up @@ -142,4 +145,4 @@ def search_literature_start_pdf(self):
if re.search('приложение а[\n .]', lowercase_str):
end_page = i
break
return start_page, end_page
return start_page, end_page
34 changes: 18 additions & 16 deletions app/main/checks/report_checks/needed_headers_check.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,26 +7,28 @@ class ReportNeededHeadersCheck(BaseReportCriterion):
id = 'needed_headers_check'
priority = True

def __init__(self, file_info, main_heading_style="heading 2"):
def __init__(self, file_info, main_heading_style="heading 2", headers_map=None):
super().__init__(file_info)
self.headers_page = 1
self.headers = []
self.main_heading_style = main_heading_style
self.config = 'VKR_HEADERS' if (self.file_type['report_type'] == 'VKR') else 'LR_HEADERS'
self.patterns = StyleCheckSettings.CONFIGS.get(self.config)[0]["headers"]
self.patterns = []
if headers_map:
self.config = headers_map
else:
self.config = 'VKR_HEADERS' if (self.file_type['report_type'] == 'VKR') else 'LR_HEADERS'
self.patterns = StyleCheckSettings.CONFIGS.get(self.config)[0]["headers"]

def late_init(self):
self.headers = self.file.make_chapters(self.file_type['report_type'])
self.headers_page = self.file.find_header_page(self.file_type['report_type'])

def show_chapters(self):
chapters_str = "<br>"
for header in self.headers:
if header["style"] == self.main_heading_style:
chapters_str += header["text"] + "<br>"
else:
chapters_str += "&nbsp;&nbsp;&nbsp;&nbsp;" + header["text"] + "<br>"
return chapters_str
self.chapters_str = self.file.show_chapters(self.file_type['report_type'])
self.headers_main = self.file.get_main_headers()
# TODO: change
if self.headers_main == "Задание 1":
self.patterns = StyleCheckSettings.CONFIGS.get(self.config)[0]["headers"]
elif self.headers_main == "Задание 2":
self.patterns = StyleCheckSettings.CONFIGS.get(self.config)[1]["headers"]

def check(self):
if self.file.page_counter() < 4:
Expand All @@ -51,9 +53,9 @@ def check(self):

if not result_string:
result_str = f'Все необходимые заголовки обнаружены!'
result_str += f'<br><br><b>&nbsp;&nbsp;&nbsp;&nbsp;Ниже представлена иерархия обработанных заголовков, ' \
result_str += f'<br><br><b>Ниже представлена иерархия обработанных заголовков, ' \
f'сравните с Содержанием {self.format_page_link([self.headers_page])}:</b>'
result_str += self.show_chapters()
result_str += self.chapters_str
result_str += '<br>Если список не точный, убедитесь, что для каждого заголовка указан верный стиль.'
return answer(True, result_str)
else:
Expand All @@ -66,8 +68,8 @@ def check(self):
<li>Убедитесь, что заголовок состоит из одного абзаца.</li>
</ul>
'''
result_str += f'<br><br><b>&nbsp;&nbsp;&nbsp;&nbsp;Ниже представлена иерархия обработанных заголовков, ' \
result_str += f'<br><br><b>Ниже представлена иерархия обработанных заголовков, ' \
f'сравните с Содержанием {self.format_page_link([self.headers_page])}:</b>'
result_str += self.show_chapters()
result_str += self.chapters_str
result_str += '<br>Если список не точный, убедитесь, что для каждого заголовка указан верный стиль.'
return answer(False, result_str)
6 changes: 3 additions & 3 deletions app/main/checks/report_checks/page_counter.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,15 @@ def check(self):
count = self.file.page_counter()
if count >= self.number[0] and (self.number[1] is None or count <= self.number[1]):
return answer(True, f"Пройдена! В отчете {count} стр не считая Приложения. <br>"
f"Последняя учтенная страница {self.format_page_link([self.file.count])}.")
f"Последняя учтенная страница {self.format_page_link([self.file.page_count])}.")
if self.number[1]:
result_str += f'Неверное количество страниц в файле: должно быть [{self.number[0]}, {self.number[1]}] ' \
f'стр. не считая приложения, в отчете {count} стр. <br>Последняя учтенная страница ' \
f'{self.format_page_link([self.file.count])}.<br><br>'
f'{self.format_page_link([self.file.page_count])}.<br><br>'
else:
result_str += f'Неверное количество страниц в файле: должно быть не менее {self.number[0]} стр. ' \
f'не считая приложения, в отчете {count} стр. <br>Последняя учтенная страница ' \
f'{self.format_page_link([self.file.count])}.<br><br>'
f'{self.format_page_link([self.file.page_count])}.<br><br>'
result_str += '''
Если количество страниц неверное, попробуйте сделать следующее:
<ul>
Expand Down
2 changes: 1 addition & 1 deletion app/main/checks/report_checks/right_words_check.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ class ReportRightWordsCheck(BaseReportCriterion):
description = "Проверка наличия определенных (правильных) слов в тексте отчёта"
id = 'right_words_check'

def __init__(self, file_info, patterns=["цель"]):
def __init__(self, file_info, patterns=["цел[ьией]"]):
super().__init__(file_info)
self.patterns = dict.fromkeys(patterns, False)

Expand Down
15 changes: 10 additions & 5 deletions app/main/checks/report_checks/section_component.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
from ..base_check import BaseReportCriterion, answer
from .style_check_settings import StyleCheckSettings


class ReportSectionComponent(BaseReportCriterion):
description = "Проверка наличия необходимых компонент указанного раздела"
description = "Проверка наличия необходимых компонентов указанного раздела"
id = 'report_section_component'

def __init__(self, file_info, chapter='Введение', patterns=('цель', 'задачи', 'объект', 'предмет')):
def __init__(self, file_info, chapter='Введение', patterns=('цель', 'задач', 'объект', 'предмет'), headers_map = None):
super().__init__(file_info)
self.intro = {}
self.chapter = chapter
if headers_map:
self.chapter = StyleCheckSettings.CONFIGS.get(headers_map)[0]["headers"][0]
patterns = ('цель', 'задач')
else:
self.chapter = chapter
self.chapters = []
self.patterns = []
for pattern in patterns:
Expand All @@ -35,14 +40,14 @@ def check(self):
if par.find(self.patterns[i]["text"]) >= 0:
self.patterns[i]["marker"] = 1
else:
return answer(0, f"Раздел {self.chapter} не обнаружен!")
return answer(0, f'Раздел "{self.chapter}" не обнаружен!')

for pattern in self.patterns:
if not pattern["marker"]:
result_str += '<li>' + pattern["name"] + '</li>'

if not result_str:
return answer(True, f"Все необходимые компоненты раздела {self.chapter} обнаружены!")
return answer(True, f'Все необходимые компоненты раздела "{self.chapter}" обнаружены!')
else:
return answer(False,
f'Не найдены следующие компоненты раздела {self.chapter}: <ul>{result_str}</ul>')
41 changes: 40 additions & 1 deletion app/main/checks/report_checks/style_check_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,44 @@ class StyleCheckSettings:
}
]

MD_CONFIG = [
{
"style": HEADER_1_STYLE,
"docx_style": ["heading 2"],
"headers": ["Поставленная цель и задачи",
"Тематика статьи",
"Методы обоснования",
"Статья",
],
"unify_regex": None,
"regex": HEADER_REGEX
},
{
"style": HEADER_1_STYLE,
"docx_style": ["heading 2"],
"headers": ["Характеристика используемых данных",
"Характеристика выводов",
"Статья",
],
"unify_regex": None,
"regex": HEADER_REGEX
},
{
"style": HEADER_1_NUM_STYLE,
"docx_style": ["heading 2", "heading 3", "heading 4"],
"headers": [],
"unify_regex": None,
"regex": HEADER_NUM_REGEX
},
{
"style": "Main_header",
"docx_style": ["heading 1"],
"headers": ["Задание"],
"unify_regex": None,
"regex": HEADER_NUM_REGEX
}
]

LR_MAIN_TEXT_CONFIG = [
{
"name": "Основной текст",
Expand Down Expand Up @@ -158,5 +196,6 @@ class StyleCheckSettings:
'LR_HEADERS': LR_CONFIG,
'LR_MAIN_TEXT': LR_MAIN_TEXT_CONFIG,
'VKR_HEADERS': VKR_CONFIG,
'VKR_MAIN_TEXT': VKR_MAIN_TEXT_CONFIG
'VKR_MAIN_TEXT': VKR_MAIN_TEXT_CONFIG,
'MD_HEADERS' : MD_CONFIG
}
9 changes: 6 additions & 3 deletions app/main/checks/report_checks/table_references.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ def check(self):
return answer(False, "Не найдено ни одного заголовка.<br><br>Проверьте корректность использования стилей.")
number_of_tables, all_numbers = self.count_tables_vkr()
if not number_of_tables:
return answer(False, f'Не найдено ни одной таблицы.<br><br>Убедитесь, что для подписи таблиц был '
f'использован стиль {self.table_style}, а таблица подписана '
return answer(True, f'Не найдено ни одной таблицы.<br><br>Если в вашей работе присутствуют таблицы, убедитесь, что для их подписи был '
f'использован стиль {self.table_style} и формат '
f'"Таблица <Номер таблицы> -- <Название таблицы>".')
else:
return answer(False, 'Во время обработки произошла критическая ошибка')
Expand Down Expand Up @@ -63,7 +63,10 @@ def check(self):
def search_references(self):
array_of_references = set()
for i in range(0, self.last_child_number):
detected_references = re.findall(r'таблиц[аеыу][\d .]+', self.file.paragraphs[i].paragraph_text)
if isinstance(self.file.paragraphs[i], str):
detected_references = re.findall(r'таблиц[аеыу][\d .]+', self.file.paragraphs[i])
else:
detected_references = re.findall(r'таблиц[аеыу][\d .]+', self.file.paragraphs[i].paragraph_text)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Аналогично про

А в `app/main/checks/report_checks/image_references.py` используется
`self.file.paragraphs[i].paragraph_text` - в чем разница?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Оставила "paragraph_text"

if detected_references:
for reference in detected_references:
for one_part in re.split(r'таблиц[аеыу]| ', reference):
Expand Down
Loading
Loading