diff --git a/app/main/check_packs/pack_config.py b/app/main/check_packs/pack_config.py
index c053ce0a..52712c31 100644
--- a/app/main/check_packs/pack_config.py
+++ b/app/main/check_packs/pack_config.py
@@ -46,6 +46,7 @@
["theme_in_report_check"],
['key_words_report_check'],
["empty_task_page_check"],
+ ["references_in_chapter_check"],
]
DEFAULT_TYPE = 'pres'
diff --git a/app/main/checks/report_checks/__init__.py b/app/main/checks/report_checks/__init__.py
index 50972ce3..b016a47f 100644
--- a/app/main/checks/report_checks/__init__.py
+++ b/app/main/checks/report_checks/__init__.py
@@ -26,3 +26,4 @@
from .template_name import ReportTemplateNameCheck
from .key_words_check import KeyWordsReportCheck
from .empty_task_page_check import EmptyTaskPageCheck
+from .lit_ref_in_spec_chapter import LitRefInChapter
diff --git a/app/main/checks/report_checks/lit_ref_in_spec_chapter.py b/app/main/checks/report_checks/lit_ref_in_spec_chapter.py
new file mode 100644
index 00000000..2176e25c
--- /dev/null
+++ b/app/main/checks/report_checks/lit_ref_in_spec_chapter.py
@@ -0,0 +1,84 @@
+import re
+from .style_check_settings import StyleCheckSettings
+from ..base_check import BaseReportCriterion, answer
+
+
+class LitRefInChapter(BaseReportCriterion):
+ label = "Проверка количества ссылок на источники в определенном разделе"
+ description = ''
+ id = 'references_in_chapter_check'
+
+ def __init__(self, file_info, min_ref_value=0, max_ref_value=0, headers_map = None):
+ super().__init__(file_info)
+ self.chapters_for_lit_ref = {}
+ self.lit_ref_count = {}
+ self.min_ref_value = min_ref_value
+ self.max_ref_value = max_ref_value
+ if headers_map:
+ self.config = headers_map
+ else:
+ self.config = 'VKR_HEADERS' if (self.file_type['report_type'] == 'VKR') else 'LR_HEADERS'
+
+ def late_init(self):
+ self.chapters = self.file.make_chapters(self.file_type['report_type'])
+ self.headers_main = self.file.get_main_headers(self.file_type['report_type'])
+ if self.headers_main in StyleCheckSettings.CONFIGS.get(self.config):
+ self.chapters_for_lit_ref = StyleCheckSettings.CONFIGS.get(self.config)[self.headers_main]['chapters_for_lit_ref']
+ else:
+ if 'any_header' in StyleCheckSettings.CONFIGS.get(self.config):
+ self.chapters_for_lit_ref= StyleCheckSettings.CONFIGS.get(self.config)['any_header']['chapters_for_lit_ref']
+
+ def check(self):
+ if self.file.page_counter() < 4:
+ return answer(False, "В отчете недостаточно страниц. Нечего проверять.")
+ self.late_init()
+ if not self.chapters_for_lit_ref:
+ return answer(True, 'Для загруженной работы данная проверка не предусмотрена.')
+ result = []
+ result_str = f'Пройдена!'
+ currant_head = ''
+ chapter_for_check = 0
+ for chapter in self.chapters:
+ if chapter['style'] == "heading 2":
+ header = chapter["text"].lower()
+ if currant_head:
+ self.lit_ref_count[currant_head].append(chapter['number'])
+ if currant_head in self.chapters_for_lit_ref:
+ chapter_for_check += 1
+ ref_count = len(self.search_references(self.lit_ref_count[currant_head][0], self.lit_ref_count[currant_head][1]))
+ if ref_count > self.chapters_for_lit_ref[currant_head][1] or ref_count < self.chapters_for_lit_ref[currant_head][0]:
+ result.append(f'«{currant_head[0].upper() + currant_head[1:]}» : {ref_count}')
+ self.lit_ref_count[header] = [chapter['number'],]
+ currant_head = header
+ if result:
+ ref_value = round((chapter_for_check-len(result))/chapter_for_check, 2)
+ result_str = (f'Доля соответствия количества ссылок необходимому в требуемых разделах равна {ref_value}'
+ f'
Количество ссылок на источники не удовлетворяет допустимому в следующих разделах:
{"
".join(res for res in result)}'
+ f'
Допустимые пороги количества ссылок:
'
+ f'{"
".join(f"«{chapter.capitalize()}»: от {limit[0]} до {limit[1]}" for chapter, limit in self.chapters_for_lit_ref.items())}')
+ if ref_value >= self.max_ref_value:
+ return answer(1, f'Пройдена!')
+ elif ref_value >= self.min_ref_value:
+ return answer(ref_value, f'Частично пройдена! {result_str}')
+ else:
+ return answer(0, f'Не пройдена! {result_str}')
+ else:
+ return answer(1, result_str)
+
+ def search_references(self, start_par, end_par):
+ array_of_references = []
+ for i in range(start_par, end_par):
+ 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):
+ if re.match(r'\d+[ \-]+\d+', one_part):
+ start, end = re.split(r'[ -]+', one_part)
+ for k in range(int(start), int(end) + 1):
+ array_of_references.append((k))
+ elif one_part != '':
+ array_of_references.append(int(one_part))
+ return array_of_references
diff --git a/app/main/checks/report_checks/style_check_settings.py b/app/main/checks/report_checks/style_check_settings.py
index 88e1a7ad..68f2d5e4 100644
--- a/app/main/checks/report_checks/style_check_settings.py
+++ b/app/main/checks/report_checks/style_check_settings.py
@@ -91,6 +91,7 @@ class StyleCheckSettings:
"style": HEADER_1_STYLE,
"docx_style": ["heading 1"],
"headers": ["Исходный код программы"],
+ "chapters_for_lit_ref": {},
"unify_regex": APPENDIX_UNIFY_REGEX,
"regex": APPENDIX_REGEX,
"banned_words": STD_BANNED_WORDS,
@@ -104,6 +105,7 @@ class StyleCheckSettings:
"style": HEADER_2_STYLE,
"docx_style": ["heading 2"],
"headers": ["Цель работы", "Выполнение работы", "Выводы"],
+ "chapters_for_lit_ref": {},
"unify_regex": None,
"regex": HEADER_1_REGEX,
}
@@ -115,6 +117,8 @@ class StyleCheckSettings:
"style": HEADER_1_STYLE,
"docx_style": ["heading 2"],
"headers": ["ВВЕДЕНИЕ", "ЗАКЛЮЧЕНИЕ", "СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ"],
+ "chapters_for_lit_ref":{},
+ # { 'введение': [0, 1], 'определения, обозначения и сокращения': [2, 5], 'заключение': [1, 5] },
"unify_regex": None,
"regex": HEADER_REGEX,
"banned_words": STD_BANNED_WORDS,
@@ -163,6 +167,7 @@ class StyleCheckSettings:
"Методы обоснования",
"Статья",
],
+ "chapters_for_lit_ref": {},
"header_for_report_section_component": "Поставленная цель и задачи",
"unify_regex": None,
"regex": HEADER_REGEX,
@@ -178,6 +183,7 @@ class StyleCheckSettings:
"Характеристика выводов",
"Статья",
],
+ "chapters_for_lit_ref": {},
"header_for_report_section_component": "",
"unify_regex": None,
"regex": HEADER_REGEX,
@@ -197,6 +203,7 @@ class StyleCheckSettings:
"Выводы по итогам сравнения",
"Выбор метода решения",
],
+ "chapters_for_lit_ref": {},
"unify_regex": None,
"regex": HEADER_REGEX,
"banned_words": ['аттач', 'билдить', 'бинарник', 'валидный', 'дебаг', 'деплоить', 'десктопное', 'железо',
@@ -220,6 +227,7 @@ class StyleCheckSettings:
"Заключение",
"Список литературы"
],
+ "chapters_for_lit_ref": {},
"unify_regex": None,
"regex": HEADER_REGEX,
"banned_words": ['оптимально', 'оптимальный', 'надежный', 'интуитивный'],