added docx parser, api call, paragraph typing

This commit is contained in:
Alexander Karpov 2022-08-26 23:18:02 +03:00
parent dd4ae8ee4e
commit 0c1d881dff
11 changed files with 333 additions and 17 deletions

3
.gitignore vendored
View File

@ -1,3 +1,6 @@
media/
.idea/
# Byte-compiled / optimized / DLL files # Byte-compiled / optimized / DLL files
__pycache__/ __pycache__/
*.py[cod] *.py[cod]

View File

@ -1,3 +1,6 @@
from django.contrib import admin from django.contrib import admin
# Register your models here. # Register your models here.
from checker.models import ParagraphType
admin.site.register(ParagraphType)

View File

@ -1,4 +1,3 @@
from django.core.files.uploadedfile import InMemoryUploadedFile
from rest_framework import serializers from rest_framework import serializers
from checker.models import Docx from checker.models import Docx
@ -9,6 +8,3 @@ class DocxSerializer(serializers.ModelSerializer):
model = Docx model = Docx
fields = ["uuid", "file"] fields = ["uuid", "file"]
extra_kwargs = {"uuid": {"read_only": True}} extra_kwargs = {"uuid": {"read_only": True}}
def validate_file(self, file: InMemoryUploadedFile):
return file

View File

@ -9,3 +9,21 @@ class Docx(models.Model):
default=uuid.uuid4, editable=False, unique=True, primary_key=True default=uuid.uuid4, editable=False, unique=True, primary_key=True
) )
file = models.FileField(upload_to="") 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)

View File

@ -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

View File

@ -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.db.models.signals import post_save
from django.dispatch import receiver from django.dispatch import receiver
from checker.models import Docx from checker.models import Docx
from checker.tasks import process_file from checker.services.file import process_paragraphs
@receiver(post_save, sender=Docx) @receiver(post_save, sender=Docx)
def create_player(sender, instance, created, **kwargs): def create_docs(sender, instance, created, **kwargs):
if created: 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 return

View File

@ -1,8 +1,10 @@
from celery import shared_task from celery import shared_task
from uuid import uuid4
from checker.models import Docx from checker.models import Docx
@shared_task @shared_task(name="process_file")
def process_file(file: Docx): def process_file(file: uuid4):
return print(file)
return file

View File

@ -15,9 +15,3 @@ app.config_from_object("django.conf:settings", namespace="CELERY")
# Load task modules from all registered Django apps. # Load task modules from all registered Django apps.
app.autodiscover_tasks() app.autodiscover_tasks()
# TODO REMOVE THIS
@app.task(bind=True)
def debug_task(self):
print(f"Request: {self.request!r}")

View File

@ -4,6 +4,9 @@ from pathlib import Path
ROOT_DIR = Path(__file__).resolve(strict=True).parent.parent.parent 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 APPS_DIR = ROOT_DIR
env = environ.Env() env = environ.Env()

View File

@ -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": "Предоставление средств субсидии третьим лицам"
}
}
]

View File

@ -14,4 +14,4 @@ django_celery_results==2.4.0
psutil psutil
dj-database-url dj-database-url
uuid uuid
python-docx docx2txt