diff --git a/.gitignore b/.gitignore index b6e4761..a6d9c60 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +media/ +.idea/ + # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] diff --git a/checker/admin.py b/checker/admin.py index 8c38f3f..48b362f 100644 --- a/checker/admin.py +++ b/checker/admin.py @@ -1,3 +1,6 @@ from django.contrib import admin # Register your models here. +from checker.models import ParagraphType + +admin.site.register(ParagraphType) \ No newline at end of file diff --git a/checker/api/serializers.py b/checker/api/serializers.py index 69d410a..763ef10 100644 --- a/checker/api/serializers.py +++ b/checker/api/serializers.py @@ -1,4 +1,3 @@ -from django.core.files.uploadedfile import InMemoryUploadedFile from rest_framework import serializers from checker.models import Docx @@ -9,6 +8,3 @@ class DocxSerializer(serializers.ModelSerializer): model = Docx fields = ["uuid", "file"] extra_kwargs = {"uuid": {"read_only": True}} - - def validate_file(self, file: InMemoryUploadedFile): - return file diff --git a/checker/models.py b/checker/models.py index 49b0d5c..9d713b3 100644 --- a/checker/models.py +++ b/checker/models.py @@ -9,3 +9,21 @@ class Docx(models.Model): default=uuid.uuid4, editable=False, unique=True, primary_key=True ) file = models.FileField(upload_to="") + + def __str__(self): + return self.uuid + + +class ParagraphType(models.Model): + name = models.CharField(max_length=200) + + def __str__(self): + return f"{self.id} - {self.name}" + + +class Paragraph(models.Model): + text = models.TextField() + type = models.ForeignKey( + ParagraphType, related_name="paragraphs", on_delete=models.CASCADE + ) + docx = models.ForeignKey(Docx, related_name="paragraphs", on_delete=models.CASCADE) diff --git a/checker/services/file.py b/checker/services/file.py index e69de29..0c0dc0a 100644 --- a/checker/services/file.py +++ b/checker/services/file.py @@ -0,0 +1,15 @@ +def process_paragraphs(text): + paragraphs = {} + c = 0 + for line in text: + ind = line[:2] + if len(ind) == 2 and ind[1] == ".": + try: + ind = int(ind[0]) + c = ind + paragraphs[c] = "" + except ValueError: + print() + if c: + paragraphs[c] += line + return paragraphs \ No newline at end of file diff --git a/checker/signals.py b/checker/signals.py index 2e72a0d..15cc591 100644 --- a/checker/signals.py +++ b/checker/signals.py @@ -1,12 +1,19 @@ +from pprint import pprint +import requests + +import docx2txt +from django.conf import settings from django.db.models.signals import post_save from django.dispatch import receiver from checker.models import Docx -from checker.tasks import process_file +from checker.services.file import process_paragraphs @receiver(post_save, sender=Docx) -def create_player(sender, instance, created, **kwargs): +def create_docs(sender, instance, created, **kwargs): if created: - process_file.delay(file=instance) + document = docx2txt.process(instance.file.path) + paragraphs = process_paragraphs(document.split("\n")) + x = requests.post(settings.AI_URL, json=paragraphs) return diff --git a/checker/tasks.py b/checker/tasks.py index 5dd864e..d1f44a0 100644 --- a/checker/tasks.py +++ b/checker/tasks.py @@ -1,8 +1,10 @@ from celery import shared_task +from uuid import uuid4 from checker.models import Docx -@shared_task -def process_file(file: Docx): - return +@shared_task(name="process_file") +def process_file(file: uuid4): + print(file) + return file diff --git a/conf/celery.py b/conf/celery.py index 4690ed2..bedd42d 100644 --- a/conf/celery.py +++ b/conf/celery.py @@ -15,9 +15,3 @@ app.config_from_object("django.conf:settings", namespace="CELERY") # Load task modules from all registered Django apps. app.autodiscover_tasks() - - -# TODO REMOVE THIS -@app.task(bind=True) -def debug_task(self): - print(f"Request: {self.request!r}") diff --git a/conf/settings/base.py b/conf/settings/base.py index 3172e49..9e666f3 100644 --- a/conf/settings/base.py +++ b/conf/settings/base.py @@ -4,6 +4,9 @@ from pathlib import Path ROOT_DIR = Path(__file__).resolve(strict=True).parent.parent.parent +AI_URL = "http://185.244.175.164:5000/api" +# AI_URL = "http://127.0.0.1:5000" + APPS_DIR = ROOT_DIR env = environ.Env() diff --git a/fixtures/paragraphtypes.json b/fixtures/paragraphtypes.json new file mode 100644 index 0000000..7a88ef7 --- /dev/null +++ b/fixtures/paragraphtypes.json @@ -0,0 +1,275 @@ +[ + { + "model": "checker.paragraphtype", + "pk": 1, + "fields": { + "name": "Понятия, используемые для целей правового акта (при необходимости)" + } + }, + { + "model": "checker.paragraphtype", + "pk": 2, + "fields": { + "name": "Цель предоставления субсидии" + } + }, + { + "model": "checker.paragraphtype", + "pk": 3, + "fields": { + "name": "Наименование органа государственной власти (государственного органа)" + } + }, + { + "model": "checker.paragraphtype", + "pk": 4, + "fields": { + "name": "Порядок предоставления средств из бюджета" + } + }, + { + "model": "checker.paragraphtype", + "pk": 5, + "fields": { + "name": "Получатель субсидии" + } + }, + { + "model": "checker.paragraphtype", + "pk": 6, + "fields": { + "name": "Категории отбора получателей субсидий" + } + }, + { + "model": "checker.paragraphtype", + "pk": 7, + "fields": { + "name": "Размещение информации на едином портале бюджетной системы Российской Федерации" + } + }, + { + "model": "checker.paragraphtype", + "pk": 8, + "fields": { + "name": "Наличие способа проведения отбора" + } + }, + { + "model": "checker.paragraphtype", + "pk": 9, + "fields": { + "name": "Дата размещения объявления о проведении отбора" + } + }, + { + "model": "checker.paragraphtype", + "pk": 10, + "fields": { + "name": "Содержание объявления о проведении отбора" + } + }, + { + "model": "checker.paragraphtype", + "pk": 11, + "fields": { + "name": "Требования к участникам отбора" + } + }, + { + "model": "checker.paragraphtype", + "pk": 12, + "fields": { + "name": "Иные требования к участникам отбора" + } + }, + { + "model": "checker.paragraphtype", + "pk": 13, + "fields": { + "name": "Требования, предъявляемыек форме и содержанию предложений (заявок), подаваемых участниками отбора" + } + }, + { + "model": "checker.paragraphtype", + "pk": 14, + "fields": { + "name": "Информация о количестве предложений (заявок), которое может подать участник" + } + }, + { + "model": "checker.paragraphtype", + "pk": 15, + "fields": { + "name": "Правила рассмотрения и оценки предложений (заявок) участников" + } + }, + { + "model": "checker.paragraphtype", + "pk": 16, + "fields": { + "name": "Порядок формирования комиссии для рассмотрения и оценки предложений (заявок) участников" + } + }, + { + "model": "checker.paragraphtype", + "pk": 17, + "fields": { + "name": "Основание для отклонения предложения (заявки) участника" + } + }, + { + "model": "checker.paragraphtype", + "pk": 18, + "fields": { + "name": "Дата, на которую получатель субсидии должен соответствовать требованиям" + } + }, + { + "model": "checker.paragraphtype", + "pk": 19, + "fields": { + "name": "Перечень документов, представляемых получателем субсидии для подтверждения соответствия требованиям" + } + }, + { + "model": "checker.paragraphtype", + "pk": 20, + "fields": { + "name": "Порядок и сроки рассмотрения документов" + } + }, + { + "model": "checker.paragraphtype", + "pk": 21, + "fields": { + "name": "Основания для отказа получателю субсидии в предоставлении субсидии" + } + }, + { + "model": "checker.paragraphtype", + "pk": 22, + "fields": { + "name": "Размер субсидии и (или) порядок расчета размера субсидии" + } + }, + { + "model": "checker.paragraphtype", + "pk": 23, + "fields": { + "name": "Предоставление субсидии в очередном финансовом году получателю субсидии" + } + }, + { + "model": "checker.paragraphtype", + "pk": 24, + "fields": { + "name": "Условия и порядок заключения соглашения" + } + }, + { + "model": "checker.paragraphtype", + "pk": 25, + "fields": { + "name": "Требования об условиях согласования новых условий" + } + }, + { + "model": "checker.paragraphtype", + "pk": 26, + "fields": { + "name": "Дополнительные условия к порядку заключения соглашения" + } + }, + { + "model": "checker.paragraphtype", + "pk": 27, + "fields": { + "name": "Результаты предоставления субсидии" + } + }, + { + "model": "checker.paragraphtype", + "pk": 28, + "fields": { + "name": "Сроки (периодичность) перечисления субсидии" + } + }, + { + "model": "checker.paragraphtype", + "pk": 29, + "fields": { + "name": "Счета, на которые перечисляется субсидия" + } + }, + { + "model": "checker.paragraphtype", + "pk": 30, + "fields": { + "name": "Направление расходов" + } + }, + { + "model": "checker.paragraphtype", + "pk": 31, + "fields": { + "name": "Запрет на приобретение иностранной валюты" + } + }, + { + "model": "checker.paragraphtype", + "pk": 32, + "fields": { + "name": "Согласие на проведение проверки" + } + }, + { + "model": "checker.paragraphtype", + "pk": 33, + "fields": { + "name": "Направление затрат (недополученных доходов)" + } + }, + { + "model": "checker.paragraphtype", + "pk": 34, + "fields": { + "name": "Перечень документов, подтверждающих фактически произведенные затраты (недополученные доходы)" + } + }, + { + "model": "checker.paragraphtype", + "pk": 35, + "fields": { + "name": "Иная информация" + } + }, + { + "model": "checker.paragraphtype", + "pk": 36, + "fields": { + "name": "Порядок и сроки представления получателем субсидии отчетности" + } + }, + { + "model": "checker.paragraphtype", + "pk": 37, + "fields": { + "name": "Требования об осуществлении контроля (мониторинга) за соблюдением условий, целей и порядка предоставления субсидий и ответственности за их нарушение" + } + }, + { + "model": "checker.paragraphtype", + "pk": 38, + "fields": { + "name": "Меры ответственности за нарушение условий, целей и порядка предоставления субсидий" + } + }, + { + "model": "checker.paragraphtype", + "pk": 39, + "fields": { + "name": "Предоставление средств субсидии третьим лицам" + } + } +] \ No newline at end of file diff --git a/requirements/base.txt b/requirements/base.txt index 6258319..b61cff5 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -14,4 +14,4 @@ django_celery_results==2.4.0 psutil dj-database-url uuid -python-docx \ No newline at end of file +docx2txt \ No newline at end of file