Skip to content

Commit 389ba7e

Browse files
add SWSectionLiteratureReferenceCheck
1 parent a909bd2 commit 389ba7e

File tree

3 files changed

+144
-0
lines changed

3 files changed

+144
-0
lines changed

app/main/checks/report_checks/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,6 @@
2626
from .template_name import ReportTemplateNameCheck
2727
from .key_words_check import KeyWordsReportCheck
2828
from .empty_task_page_check import EmptyTaskPageCheck
29+
from .sw_section_lit_reference import SWSectionLiteratureReferenceCheck
2930
from .sw_tasks import SWTasksCheck
3031
from .sw_section_size import SWSectionSizeCheck
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
import re
2+
3+
from logging import getLogger
4+
5+
from ..base_check import BaseReportCriterion, answer
6+
7+
8+
logger = getLogger('root')
9+
10+
SW_CONSTANTS = {
11+
"SW_KEY_QUESTIONS_SECTIONS": {
12+
"Актуальность": {
13+
"count": 1
14+
}
15+
},
16+
"SW_ANALOGS_SECTIONS": {
17+
"Принцип отбора аналогов": {
18+
"count": 4,
19+
"subchapters": 1
20+
}
21+
},
22+
"SW_FINAL_SECTIONS": {},
23+
}
24+
25+
26+
class SWSectionLiteratureReferenceCheck(BaseReportCriterion):
27+
label = "Проверка наличия ссылок на литературу в определенных разделах"
28+
description = "Проверка наличия и количества ссылок на литературу в определенных разделах"
29+
id = "sw_section_lit_reference"
30+
priority = True
31+
32+
def __init__(self, file_info, sections_info=None):
33+
super().__init__(file_info)
34+
35+
self.sections = None
36+
if sections_info in SW_CONSTANTS:
37+
self.sections = SW_CONSTANTS[sections_info]
38+
elif isinstance(sections_info, dict):
39+
self.sections = sections_info
40+
41+
def check(self):
42+
self.file.make_chapters('VKR')
43+
chapters = self.file.chapters_to_str()
44+
getLogger().error(str(chapters))
45+
chapter_tree = self.file.build_chapter_tree(chapters)
46+
getLogger().error(str(chapter_tree))
47+
result = dict.fromkeys(self.sections.keys(), None)
48+
feedback = ""
49+
50+
for chapter in chapters:
51+
if chapter['name'] in self.sections:
52+
subchapter_settings = self.sections[chapter['name']].get("subchapters")
53+
main_chapter_references = len(
54+
self.search_references(chapter['text'])[0])
55+
subchapter_result = []
56+
57+
if chapter['node']['children']:
58+
for subchapter in chapter['node']['children']:
59+
subchapter_references = len(
60+
self.search_references(subchapter['text'])[0])
61+
main_chapter_references += subchapter_references
62+
63+
# check count_ref of subchapter
64+
subchapter_result.append({
65+
"name": subchapter['name'],
66+
"count": subchapter_references
67+
})
68+
69+
# CHECK1: verify chapter count references
70+
verify_count_references = main_chapter_references >= self.sections[chapter['name']]['count']
71+
result[chapter['name']] = {
72+
"count": verify_count_references
73+
}
74+
if not verify_count_references:
75+
feedback += f"<br> Раздел '{chapter['name']}' содержит недостаточное количество ссылок на источники. " \
76+
f"Сейчас их {main_chapter_references}, должно быть не менее {self.sections[chapter['name']]['count']}"
77+
78+
# CHECK2: verify subchapter count references
79+
if subchapter_settings:
80+
verify_subchapter_references = all(subchapter['count']>=subchapter_settings for subchapter in subchapter_result)
81+
result[chapter['name']]['subchapters'] = verify_subchapter_references
82+
if not verify_subchapter_references:
83+
feedback += f"<br> Каждый из подразделов (уровень вложенности +1) раздела '{chapter['name']}' должен содержать не менее {self.sections[chapter['name']]['subchapters']} ссылок на источники. " \
84+
f"Сейчас их: {', '.join(subchapter['name'] + ' - ' + str(subchapter['count']) for subchapter in subchapter_result)}"
85+
if feedback:
86+
return answer(0, feedback)
87+
88+
return answer(1, "Проверка пройдена!")
89+
90+
def search_references(self, chapter_text):
91+
"""
92+
Re-worked ReferencesToLiteratureCheck.search_references
93+
"""
94+
prev_ref, ref_sequence, array_of_references = 0, [], set()
95+
detected_references = re.findall(r'\[[\d \-,]+\]', chapter_text)
96+
for reference in detected_references:
97+
for one_part in re.split(r'[\[\],]', reference):
98+
if re.match(r'\d+[ \-]+\d+', one_part):
99+
start, end = re.split(r'[ -]+', one_part)
100+
for k in range(int(start), int(end) + 1):
101+
prev_ref = self.add_references(
102+
k, prev_ref, array_of_references, ref_sequence)
103+
elif one_part:
104+
prev_ref = self.add_references(
105+
int(one_part), prev_ref, array_of_references, ref_sequence)
106+
if ref_sequence:
107+
if ref_sequence[0][1] == '0':
108+
ref_sequence[0] = ref_sequence[0].replace('[0],', '')
109+
return array_of_references, ref_sequence
110+
111+
def add_references(self, k, prev_ref, array_of_references, ref_sequence):
112+
if k not in array_of_references:
113+
if k - prev_ref != 1:
114+
ref_sequence.append(f'[{prev_ref}], [{k}]')
115+
prev_ref = k
116+
elif k - prev_ref == 1:
117+
prev_ref = k
118+
array_of_references.add(k)
119+
return prev_ref

app/main/reports/md_uploader/md_uploader.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,30 @@ def chapters_to_str(self):
158158
})
159159
return result
160160

161+
def build_chapter_tree(self, chapters):
162+
tree = []
163+
stack = [tree]
164+
165+
for chapter in chapters:
166+
level = int(chapter['style'].split(' ')[-1])-1
167+
168+
while len(stack) > level:
169+
stack.pop()
170+
171+
parent = stack[-1]
172+
new_chapter = {
173+
'name': chapter['name'],
174+
'text': chapter['text'],
175+
'children': []
176+
}
177+
178+
parent.append(new_chapter)
179+
stack.append(new_chapter['children'])
180+
181+
chapter['node'] = new_chapter
182+
183+
return tree
184+
161185
def get_tables_size(self):
162186
count_table_line = 0
163187
count_paragraph = len(self.paragraphs)

0 commit comments

Comments
 (0)