Files
Diarios-Oficiais-ALEMS/diarios/models.py
2025-03-15 16:52:23 +01:00

95 lines
3.1 KiB
Python

import json
import os
from urllib.parse import urlparse
import PyPDF2
import requests
from babel.dates import format_date
from django.core.files.base import ContentFile
from django.core.serializers.json import DjangoJSONEncoder
from django.db import models
class TipoDiarioOficial(models.Model):
nome = models.CharField(max_length=100, unique=True)
def __str__(self):
return self.nome
class Meta:
verbose_name_plural = "Tipos de Diários Oficiais"
class DiarioOficial(models.Model):
data = models.DateField()
arquivo = models.FileField(upload_to="diarios_oficiais/", blank=True, null=True)
tipo = models.ForeignKey(
TipoDiarioOficial,
blank=True,
null=True,
on_delete=models.SET_NULL,
related_name="diarios",
)
numero = models.CharField(max_length=20, unique=True)
link = models.URLField(blank=True, null=True, unique=True)
page_content = models.JSONField(encoder=DjangoJSONEncoder, blank=True, null=True)
def save(self, *args, **kwargs):
# Se houver um link, baixa o PDF e extrai o conteúdo
if self.link and not self.arquivo:
try:
# Faz o download do PDF
response = requests.get(self.link)
response.raise_for_status() # Verifica se o download foi bem-sucedido
# Define o nome do arquivo a partir do link
parsed_url = urlparse(self.link)
file_name = (
os.path.basename(parsed_url.path) or f"diario_{self.numero}.pdf"
)
# Salva o arquivo no campo `arquivo`
self.arquivo.save(file_name, ContentFile(response.content), save=False)
# Extrai o conteúdo do PDF
pdf = PyPDF2.PdfReader(self.arquivo)
pages_data = []
for i, pagina in enumerate(pdf.pages):
page_text = pagina.extract_text()
if page_text: # Ignora páginas sem conteúdo
pages_data.append(
{
"number": i + 1,
"content": page_text,
}
)
# Salva o conteúdo das páginas no campo `page_content`
self.page_content = pages_data
except requests.RequestException as e:
print(f"Erro ao baixar o PDF: {e}")
except PyPDF2.PdfReadError as e:
print(f"Erro ao ler o PDF: {e}")
except Exception as e:
print(f"Erro inesperado: {e}")
# Salva o modelo
super().save(*args, **kwargs)
@property
def data_formatada(self):
return format_date(self.data, format="long", locale="pt_BR")
@property
def is_online(self):
return True if self.link else False
def __str__(self):
return f"Diário {self.tipo.nome}{self.numero}, {self.data_formatada}"
class Meta:
constraints = [models.UniqueConstraint(fields=["numero"], name="unique_numero")]
verbose_name_plural = "Diários Oficiais"