Skip to content

Commit

Permalink
merge master
Browse files Browse the repository at this point in the history
  • Loading branch information
MarinaProsche committed Nov 8, 2023
2 parents f15190e + 9f7b7b6 commit bc3f7ef
Show file tree
Hide file tree
Showing 14 changed files with 401 additions and 2 deletions.
2 changes: 2 additions & 0 deletions app/main/check_packs/pack_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
['pres_image_share'],
['future_dev'],
['pres_banned_words_check'],
['pres_empty_slide'],
['pres_banned_words_check'],
['verify_git_link'],
]
BASE_REPORT_CRITERION = [
Expand Down
4 changes: 4 additions & 0 deletions app/main/checks/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,11 @@
PresImageShareCheck.id: PresImageShareCheck,
FurtherDev.id: FurtherDev,
PresBannedWordsCheck.id: PresBannedWordsCheck,
<<<<<<< HEAD
PresVerifyGitLinkCheck.id: PresVerifyGitLinkCheck
=======
PresEmptySlideCheck.id: PresEmptySlideCheck,
>>>>>>> master
},
'report': {
ReportSimpleCheck.id: ReportSimpleCheck,
Expand Down
4 changes: 4 additions & 0 deletions app/main/checks/presentation_checks/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,8 @@
from .pres_right_words import PresRightWordsCheck
from .image_share import PresImageShareCheck
from .banned_words import PresBannedWordsCheck
<<<<<<< HEAD
from .verify_git_link import PresVerifyGitLinkCheck
=======
from .empty_slide_check import PresEmptySlideCheck
>>>>>>> master
66 changes: 66 additions & 0 deletions app/main/checks/presentation_checks/empty_slide_check.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import re

from app.utils.parse_for_html import format_header
from ..base_check import BasePresCriterion, answer


class PresEmptySlideCheck(BasePresCriterion):
description = "Проверка наличия пустых слайдов в презентации"
id = 'pres_empty_slide'

def __init__(self, file_info, status=False):
super().__init__(file_info)
self.status = status

def check(self):
result_str = ''
page_titles = {}
full_pages = {}
empty_pages = []
pages_with_title = []

pages_with_images = [page for page, slide in enumerate(self.file.slides, 1)
if slide.get_images() or slide.get_table()]

for page, slide in enumerate(self.file.get_text_from_slides(), 1):
slide_string = ''.join(slide.replace("\n", " "))
slide_without_page = re.sub(r'\d+(?=\s*$)', '', slide_string)
full_pages[str(page)] = ''.join(char for char in slide_without_page.strip() if char.isprintable())
if not full_pages[str(page)]:
empty_pages.append(page)

for page, slide in enumerate(self.file.get_titles(), 1):
page_titles[str(page)] = slide
if slide != "Запасные слайды":
if slide == full_pages[str(page)] and page not in pages_with_images and page not in empty_pages:
pages_with_title.append(page)

if self.file.presentation_name.endswith('.ppt') or self.file.presentation_name.endswith('.pptx'):

if empty_pages and not pages_with_title:
result_str += format_header(
'Не пройдена! Обнаружены пустые слайды: {}'.format(
', '.join(self.format_page_link(empty_pages)))
)
if pages_with_title and not empty_pages:
result_str += format_header(
'Не пройдена! Обнаружены слайды, в которых присутствует только заголовок: {}'.format(
', '.join(self.format_page_link(pages_with_title)))
)
if empty_pages and pages_with_title:
result_str += format_header(
'Не пройдена! Обнаружены пустые слайды: {}, также обнаружены слайды, в которых присутствует только заголовок: {}'.format(
', '.join(self.format_page_link(empty_pages)), ', '.join(self.format_page_link(pages_with_title)))
)
elif self.file.presentation_name.lower().endswith('.odp'):
if empty_pages:
result_str += format_header(
'Не пройдена! Обнаружены пустые слайды или слайды, в которых присутствует только заголовок: {}'.format(
', '.join(self.format_page_link(empty_pages)))
)

if not result_str:
self.status = True
result_str = 'Пройдена!'

return answer(self.status, result_str)
2 changes: 2 additions & 0 deletions app/main/presentations/pptx/slide_pptx.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ def __init__(self, container, w, h, index=-1):
self.images.append(shape)
if hasattr(shape, "text"):
self.text += "\n" + shape.text
if shape.has_table:
self.table.append(shape)

def __str__(self):
return super().__str__()
6 changes: 5 additions & 1 deletion app/main/presentations/slide_basic.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ def __init__(self, container): # Extracting only the properties we need!
self.page_number = [-1, -1, -1]
self.dimensions = [-1, -1]
self.images = []
self.table = []

def get_title(self):
return self.title
Expand All @@ -16,7 +17,10 @@ def get_page_number(self):
return self.page_number

def get_images(self):
return self.images
return self.images

def get_table(self):
return self.table

def __str__(self):
return f"\tTitle: {self.title}.\n\tText: {self.text}.\n\tPage_num: {self.page_number}"
11 changes: 10 additions & 1 deletion app/main/reports/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Запуск и тестирование

Пререквизиты: `argparse`, `python-docx`, `docx2python`, `re`, `subprocess`. Для парсинга `.doc`-файлов потребуется
Пререквизиты: `argparse`, `python-docx`, `docx2python`, `re`, `subprocess`, `markdown`. Для парсинга `.doc`-файлов потребуется
LibreOffice.

Здесь и далее считается, что корневая директория репозитория добавлена в `PYTHONPATH`.
Expand Down Expand Up @@ -65,3 +65,12 @@ Proof-of-concept парсинг файлов `.docx` с выводом стру
```bash
$ python3 -m app.main.mse22.pdf_document text_from_pages --filename path_to_file
```

## `MD`

Парсинг файлов `.md` с выводом структуры файла в текстовом виде в stdout.

```bash
$ python3 -m app.main.reports.md_uploader md_parser --mdfile path_to_md_file
```

1 change: 1 addition & 0 deletions app/main/reports/md_uploader/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .md_uploader import MdUpload
21 changes: 21 additions & 0 deletions app/main/reports/md_uploader/__main__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import argparse

from .md_uploader import main as md_uploader_main


def parse_args():
parser = argparse.ArgumentParser(description='File md parser')
subparsers = parser.add_subparsers()
md_parser = subparsers.add_parser('md_parser', help='md document')
md_parser.add_argument('--mdfile', type=str, required=True, help='path to md file')
md_parser.set_defaults(func=md_uploader_main)
return parser.parse_args()


def main():
args = parse_args()
args.func(args)


if __name__ == '__main__':
main()
61 changes: 61 additions & 0 deletions app/main/reports/md_uploader/md_uploader.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import markdown #installation: pip install markdown
import re

class MdUpload:
def __init__(self, path_to_md_file):
self.path_to_md_file = path_to_md_file
self.headers = []
self.chapters = []
self.paragraphs = []
self.html_text = ''
self.tables = []
self.chapter_with_text = []

def read_md_file(self):
with open(self.path_to_md_file, "r", encoding="utf-8") as f:
md_text = f.read()
return md_text

def get_html_from_md(self, md_text):
self.html_text = markdown.markdown(md_text)
self.paragraphs = self.html_text.split('\n')

def get_headers(self):
header_regex = "<h1>(.*?)<\/h1>"
self.headers = re.findall(header_regex, self.html_text)

def get_chapters(self):
chapter_regex = "<h2>(.*?)<\/h2>"
self.chapters = re.findall(chapter_regex, self.html_text)

def get_chapter_with_text(self):
text = self.html_text
chapter_name = ''
for chapter in self.chapters:
self.split_chapter = text.split("<h2>" + chapter + "</h2>")
self.chapter_with_text.append(chapter_name + self.split_chapter[-2])
chapter_name = chapter
text = self.split_chapter[-1]
self.chapter_with_text.append(chapter_name + text)

def get_tables_size(self):
count_table_line = 0
count_paragraph = len(self.paragraphs)
for line in self.paragraphs:
if "|" in line:
count_table_line +=1
return round(count_table_line/count_paragraph, 4)

def parse_md_file(self):
md_text = self.read_md_file()
self.get_html_from_md(md_text)
self.get_headers()
self.get_chapters()
self.get_chapter_with_text()
self.get_tables_size()
return f"Заголовки:\n{self.headers}\n\nГлавы:\n{self.chapters}\n\nГлавы с текстом:\n{self.chapter_with_text}\n\nДоля таблиц в тексте:\n{self.get_tables_size()}"

def main(args):
md_file = MdUpload(args.mdfile)
print(md_file.parse_md_file())

2 changes: 2 additions & 0 deletions app/servants/pre_luncher.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

from db.db_methods import add_user, get_user, get_client, edit_user, save_criteria_pack
from main.check_packs.pack_config import BASE_PACKS, DEFAULT_REPORT_TYPE_INFO

from pymongo.errors import ConnectionFailure
from server import ALLOWED_EXTENSIONS

Expand Down Expand Up @@ -40,6 +41,7 @@ def init(app, debug):
user.criteria = BASE_PACKS[file_type].name
user.formats = list(ALLOWED_EXTENSIONS.get(file_type))
user.two_files = True

edit_user(user)

logger.info(f"Создан администратор по умолчанию: логин: {user.username}, пароль уточняйте у разработчика")
Expand Down
Loading

0 comments on commit bc3f7ef

Please sign in to comment.