Skip to content

Generator of decrees with markup in json format

Notifications You must be signed in to change notification settings

cann3v/decree_gen

Folders and files

NameName
Last commit message
Last commit date

Latest commit

6543a0f · Dec 30, 2022

History

59 Commits
Nov 13, 2022
Dec 27, 2022
Nov 6, 2022
Dec 30, 2022
Dec 27, 2022
Dec 5, 2022
Nov 22, 2022
Dec 27, 2022
Dec 27, 2022
Dec 1, 2022
Nov 22, 2022
Dec 27, 2022

Repository files navigation

Decree generator

Python script that generates a lot of decrees from samples. Скрипт для генерации файлов приказов из образцов.

Usage/Использование

$ python3 gen.py -h
usage: gen.py [-h] [-i] [-f format] [-s path] [-o path] [-v] size

Decrees generator

positional arguments:
  size                  Max size of output dir. For example: 10KB, 10MB, 10GB

options:
  -h, --help            show this help message and exit
  -i, --image           use images (logo, signature, seal) in decree
  -f format, --format format
                        formats to save (docx: d, pdf: p, jpg: j)
  -s path, --samples path
                        path to dir with samples
  -o path, --out path   path for output files
  -v, --verbose         verbose output

Example: python3 gen.py 50MB -f dp -s samples -o decrees -vv

$ python3 gen.py 50MB -i -f dp -s samples/ -o output_decrees/
2022-12-04 20:38:42.542 | WARNING  | __main__:main:169 - Generation is started...
2022-12-04 20:39:15.208 | WARNING  | __main__:generate:136 - Approximate generation time: 1.13 min.
2022-12-04 20:39:52.709 | WARNING  | __main__:generate:124 - Size of output_decrees/ dir: 53422132 bytes
2022-12-04 20:39:52.709 | WARNING  | __main__:main:171 - Generation is finished!

Samples description/Описание образцов

description one description two

Структура проекта

Проект содержит в себе:

  • raw/img- директория, в которой содержатся изображения, используемые в README.md;

  • samples – директория, в которой содержатся размеченные данные для генерации приказов;

  • .gitignore;

  • README.md;

  • auxil.py - модуль, содержащий вспомогательные функции;

  • change_case.py – модуль, позволяющий склонять инструкции и ответственных по падежам;

  • consts.py – модуль, содержащий основные константные параметры, используемые при генерации;

  • gen.py - основной файл проекта;

  • requirements.txt;

  • russian_datetime.py - надстройка над классом date встроенного модуля datetime;

  • write.py – модуль, содержащий функции для создания файлов с приказами.

Описание файлов

auxil.py

Модуль с дополнительными функциями, используемыми при работе скрипта.

  • logger_config(v: int) -> None 
    # Конфигурирует логгер.
  • generate_date(standart_format=False, unixtime=False) -> str 
    # Генерирует случайную дату. 
    # standard_format задает формат даты. 
    # При unixtime=True возвращает массив, где 1-ый элемент –str, второй 
    # – float.
  • check_size_format(size: str, pat=re.compile(r"^\d*[KMG]B$")) -> str 
    # Проверяет формат параметра (аргумента) скрипта. Например, 1KB, 
    # 5MB, 10GB. При несоответствии вызывает ArgumentTypeError.
  • size_to_bytes(size: str) -> int 
    # Переводит 1KB в 1024.
  • getsize(out: str) -> int 
    # Возвращает размер файлов в директории out в байтах. 
  • to_roman(n: int) -> str 
    # Переводит арабское число в римское. 
  • add_numbering(instruction: list) -> list 
    # Нумерует каждую инструкцию, рандомно определяет уровень 
    # вложенности инструкции. 
  • check_abiword() -> int 
    # Проверяет наличие abiword в системе. Возвращает 0 при успешном 
    # выполнении или вызывает исключение. 
  • check_os() -> str 
    # Возвращает название используемой ОС.
  • parse_formats(fmts: str) -> str 
    # Проверяет расширение файлов в аргументе (параметре) скрипта на 
    # соответствие заданному формату. 
  • mm_to_px(mm: int, dpi=300) -> int 
    # Переводит из миллиметров в пиксели.
  • PDFunits_to_px(units: int, dpi=300) -> int 
    # Переводит из pdf units в пиксели. 
  • calculate_logo_coords() -> list
    # Считает координаты логотипа в документе.
  • calculate_sign_coords(tmx: int, tmy: int, new_page=False) -> list
    # Считает координаты подписи в документе. 
  • calculate_seal_coords(sign_coords: list, new_page=False) -> list 
    # Считает координаты печати в документе. 
  • calculate_borders(original_coords: list, 
        creator_and_date=False, task=False) -> list 
    # Добавляет смещение к границам текста. 
  • calculate_text_coords(pdf_path: str, data: tuple) -> list
    # Считает координаты параграфов с текстом. 

change_case.py

Модуль для изменения падежей в тексте ответственных.

consts.py

Модуль с основными константными параметрами, использующимися при генерации приказов.

Массив formatsсодержит форматы дат, аналогичные форматам в библиотеке datetime.

gen.py

Основной файл проекта, запускается для генерации приказов.

  • load_samples(samples_dir: str) -> tuple 
    # Загружает образцы из указанной директории. Возвращает кортеж с 
    # данными. 
  • generate(data: tuple, out: str, formats: str, size: int, 
    samples_dir: str, is_image: bool) -> None 
    # Запускает процесс генерации приказов, вызывая функции из других 
    # модулей. 
  • get_args() -> argparse.Namespace
    # Парсит флаги скрипта
  • main() -> None
    # Главная функция скритпа. 

russian_datetime.py

Модуль, переопределяющий метод класса date стандартной библиотеки datetime. Нужен, чтобы метод strftime переводил месяц из числа в строку на рускком языке.

write.py

Модуль, содержащий функции для записи приказов в файл.

  • extend_instruction(instruction: list, samples_dir: str) -> list 
    # Добавляет ответственных и дедлайн в задачу с шансом 25%, если они 
    # отсутствуют. 
  • write_docx(header: str, name: str, intro: str, 
    instruction: list, responsible: str, creator: str, date: 
    str, out: str, count: int, logo: str, sign: str, seal: 
    str) -> str 
    # Создает docx документ с приказом. Через аргументы функция 
    # принимает полный текст с приказом (шапка, название, введение…), 
    # директорию с выходными файлами, порядковый номер приказа, пути к 
    # изображениям (логотип, подпись, печать). Возвращает путь к 
    # сгенерированному документу. 
  • write_json(instruction: list, responsible_arr: list, 
    date: list, out: str, count: int) -> str 
    # Создает разметку для приказа. Возвращает путь к сгенерированному 
    # файлу. 
  • write_pdf_linux(docx_path: str, out: str, count: int) -> str 
    # Конвертирует docx в pdf. Возвращает путь к сгенерированному 
    # документу. 
  • write_jpg(out: str, count: int) -> None 
    # Конвертирует pdf в jpg. 
  • extract_tm(pdf_path: str, page_num: int) -> tuple 
    # Функция для метода extract_text.
    # Считает координаты последнего параграфа в документе.
  • write_coords(json_path: str, pdf_path: str) -> None 
    # Добавляет координаты изображений в pdf файле в json разметку. 

Формат файлов с образцами

execution_control.txt

Контроль над исполнением распоряжения оставить за {ablt} – на место фигурных скобок будет подставляться ответственный в заданном падеже (ablt – творительный, accs – винительный).

responsible.json

[ 
    "{Министр} {генерал} полиции Российской Федерации В.{{КОЛОКОЛЬЦЕВ}}",  
    "КОЛОКОЛЬЦЕВ",
    "В.",
    "",
    "Министр генерал полиции Российской Федерации" 
 ]

Первый элемент массива – строка с ответственным, которая пойдет в приказ.

В одинарных фигурных скобках – слово из должности (профессии), у которого нужно изменить падеж.

В двойных фигурных скобках – слово из имени, у которого нужно изменить падеж.

Это сделано так, потому что профессии и имена склоняют две разные библиотеки.

Следующие элементы заносятся в разметку:

  • Второй элемент массива – фамилия;

  • Третий элемент массива – имя;

  • Четвертый элемент массива – отчество;

  • Пятый элемент массива – должность.