mirror of https://github.com/interlegis/sigi.git
Sesóstris Vieira
1 year ago
5 changed files with 732 additions and 7 deletions
@ -0,0 +1,219 @@ |
|||||
|
# Generated by Django 4.2.4 on 2023-08-30 19:21 |
||||
|
|
||||
|
from django.db import migrations, models |
||||
|
import django.db.models.deletion |
||||
|
|
||||
|
|
||||
|
class Migration(migrations.Migration): |
||||
|
dependencies = [ |
||||
|
("servidores", "0013_servidor_moodle_userid"), |
||||
|
("casas", "0027_alter_orgao_email"), |
||||
|
("eventos", "0036_tipoevento_prefixo_turma_alter_evento_turma"), |
||||
|
] |
||||
|
|
||||
|
operations = [ |
||||
|
migrations.AddField( |
||||
|
model_name="tipoevento", |
||||
|
name="duracao", |
||||
|
field=models.PositiveIntegerField( |
||||
|
default=1, verbose_name="Duração (dias)" |
||||
|
), |
||||
|
), |
||||
|
migrations.AddField( |
||||
|
model_name="tipoevento", |
||||
|
name="sigla", |
||||
|
field=models.CharField( |
||||
|
blank=True, max_length=20, verbose_name="sigla" |
||||
|
), |
||||
|
), |
||||
|
migrations.CreateModel( |
||||
|
name="Solicitacao", |
||||
|
fields=[ |
||||
|
( |
||||
|
"id", |
||||
|
models.BigAutoField( |
||||
|
auto_created=True, |
||||
|
primary_key=True, |
||||
|
serialize=False, |
||||
|
verbose_name="ID", |
||||
|
), |
||||
|
), |
||||
|
( |
||||
|
"senador", |
||||
|
models.CharField( |
||||
|
max_length=100, verbose_name="senador solicitante" |
||||
|
), |
||||
|
), |
||||
|
( |
||||
|
"num_processo", |
||||
|
models.CharField( |
||||
|
blank=True, |
||||
|
help_text="Formato:<em>XXXXX.XXXXXX/XXXX-XX</em>", |
||||
|
max_length=20, |
||||
|
verbose_name="número do processo SIGAD", |
||||
|
), |
||||
|
), |
||||
|
( |
||||
|
"descricao", |
||||
|
models.TextField(verbose_name="descrição da solicitação"), |
||||
|
), |
||||
|
( |
||||
|
"data_pedido", |
||||
|
models.DateField( |
||||
|
help_text="Data em que o pedido do Gabinete chegou à COPERI", |
||||
|
verbose_name="Data do pedido", |
||||
|
), |
||||
|
), |
||||
|
( |
||||
|
"contato", |
||||
|
models.CharField( |
||||
|
max_length=100, |
||||
|
verbose_name="pessoa de contato na Casa", |
||||
|
), |
||||
|
), |
||||
|
( |
||||
|
"email_contato", |
||||
|
models.EmailField( |
||||
|
blank=True, |
||||
|
max_length=254, |
||||
|
verbose_name="e-mail do contato", |
||||
|
), |
||||
|
), |
||||
|
( |
||||
|
"telefone_contato", |
||||
|
models.CharField( |
||||
|
blank=True, |
||||
|
max_length=20, |
||||
|
verbose_name="telefone do contato", |
||||
|
), |
||||
|
), |
||||
|
( |
||||
|
"whatsapp_contato", |
||||
|
models.CharField( |
||||
|
blank=True, |
||||
|
max_length=20, |
||||
|
verbose_name="whatsapp do contato", |
||||
|
), |
||||
|
), |
||||
|
( |
||||
|
"estimativa_casas", |
||||
|
models.PositiveIntegerField( |
||||
|
help_text="estimativa de quantas Casas participarão dos eventos", |
||||
|
verbose_name="estimativa de Casas participantes", |
||||
|
), |
||||
|
), |
||||
|
( |
||||
|
"estimativa_servidores", |
||||
|
models.PositiveIntegerField( |
||||
|
help_text="estimativa de quantos Servidores participarão dos eventos", |
||||
|
verbose_name="estimativa de servidores participantes", |
||||
|
), |
||||
|
), |
||||
|
( |
||||
|
"casa", |
||||
|
models.ForeignKey( |
||||
|
on_delete=django.db.models.deletion.PROTECT, |
||||
|
to="casas.orgao", |
||||
|
verbose_name="casa solicitante", |
||||
|
), |
||||
|
), |
||||
|
], |
||||
|
options={ |
||||
|
"verbose_name": "Solicitação de eventos", |
||||
|
"verbose_name_plural": "Solicitações de eventos", |
||||
|
"ordering": ("-data_pedido",), |
||||
|
}, |
||||
|
), |
||||
|
migrations.CreateModel( |
||||
|
name="ItemSolicitado", |
||||
|
fields=[ |
||||
|
( |
||||
|
"id", |
||||
|
models.BigAutoField( |
||||
|
auto_created=True, |
||||
|
primary_key=True, |
||||
|
serialize=False, |
||||
|
verbose_name="ID", |
||||
|
), |
||||
|
), |
||||
|
( |
||||
|
"virtual", |
||||
|
models.BooleanField(default=False, verbose_name="virtual"), |
||||
|
), |
||||
|
( |
||||
|
"inicio_desejado", |
||||
|
models.DateField( |
||||
|
help_text="Data desejada para o início do evento. Pode ser solicitado pela Casa ou definido pela conveniência do Interlegis. Será usada como data de início do evento, caso seja autorizado.", |
||||
|
verbose_name="início desejado", |
||||
|
), |
||||
|
), |
||||
|
( |
||||
|
"status", |
||||
|
models.CharField( |
||||
|
choices=[ |
||||
|
("S", "Solicitado"), |
||||
|
("A", "Autorizado"), |
||||
|
("R", "Rejeitado"), |
||||
|
], |
||||
|
default="S", |
||||
|
verbose_name="status", |
||||
|
), |
||||
|
), |
||||
|
( |
||||
|
"data_analise", |
||||
|
models.DateTimeField( |
||||
|
blank=True, |
||||
|
editable=False, |
||||
|
null=True, |
||||
|
verbose_name="data da autorização/rejeição", |
||||
|
), |
||||
|
), |
||||
|
( |
||||
|
"justificativa", |
||||
|
models.TextField(blank=True, verbose_name="Justificativa"), |
||||
|
), |
||||
|
( |
||||
|
"evento", |
||||
|
models.ForeignKey( |
||||
|
editable=False, |
||||
|
null=True, |
||||
|
on_delete=django.db.models.deletion.SET_NULL, |
||||
|
to="eventos.evento", |
||||
|
), |
||||
|
), |
||||
|
( |
||||
|
"servidor", |
||||
|
models.ForeignKey( |
||||
|
blank=True, |
||||
|
editable=False, |
||||
|
help_text="Servidor que autorizou ou rejeitou a realização do evento", |
||||
|
limit_choices_to={"externo": False}, |
||||
|
null=True, |
||||
|
on_delete=django.db.models.deletion.PROTECT, |
||||
|
to="servidores.servidor", |
||||
|
verbose_name="servidor analisador", |
||||
|
), |
||||
|
), |
||||
|
( |
||||
|
"solicitacao", |
||||
|
models.ForeignKey( |
||||
|
on_delete=django.db.models.deletion.CASCADE, |
||||
|
to="eventos.solicitacao", |
||||
|
), |
||||
|
), |
||||
|
( |
||||
|
"tipo_evento", |
||||
|
models.ForeignKey( |
||||
|
limit_choices_to={"casa_solicita": True}, |
||||
|
on_delete=django.db.models.deletion.PROTECT, |
||||
|
to="eventos.tipoevento", |
||||
|
), |
||||
|
), |
||||
|
], |
||||
|
options={ |
||||
|
"verbose_name": "Evento solicitado", |
||||
|
"verbose_name_plural": "Eventos solicitados", |
||||
|
"ordering": ("status",), |
||||
|
}, |
||||
|
), |
||||
|
] |
@ -0,0 +1,141 @@ |
|||||
|
# Generated by Django 4.2.4 on 2023-08-11 20:36 |
||||
|
import re |
||||
|
from functools import reduce |
||||
|
from django.db import migrations |
||||
|
from django.utils import timezone |
||||
|
from sigi.apps.utils import to_ascii |
||||
|
|
||||
|
|
||||
|
def forwards(apps, schema_editor): |
||||
|
TipoEvento = apps.get_model("eventos", "TipoEvento") |
||||
|
Evento = apps.get_model("eventos", "Evento") |
||||
|
Solicitacao = apps.get_model("eventos", "Solicitacao") |
||||
|
ItemSolicitado = apps.get_model("eventos", "ItemSolicitado") |
||||
|
|
||||
|
conjuncoes = [ |
||||
|
"oficina", |
||||
|
"a", |
||||
|
"e", |
||||
|
"o", |
||||
|
"da", |
||||
|
"de", |
||||
|
"do", |
||||
|
"na", |
||||
|
"no", |
||||
|
"em", |
||||
|
"ao", |
||||
|
"-", |
||||
|
"com", |
||||
|
] |
||||
|
|
||||
|
# Siglas para TipoEvento com as iniciais de cada palavra do nome |
||||
|
|
||||
|
for t in TipoEvento.objects.all(): |
||||
|
t.sigla = "".join( |
||||
|
[s[:1] for s in t.nome.split(" ") if s.lower() not in conjuncoes] |
||||
|
) |
||||
|
t.save() |
||||
|
|
||||
|
tipos = { |
||||
|
t.id: { |
||||
|
s |
||||
|
for s in to_ascii(t.nome.lower()).replace("/", " ").split(" ") |
||||
|
if s not in conjuncoes |
||||
|
} |
||||
|
for t in TipoEvento.objects.exclude(id=35) |
||||
|
} |
||||
|
|
||||
|
conjugados = [ |
||||
|
to_ascii(re.search("(\w+) e (\w+)", t.nome.lower()).group()) |
||||
|
for t in TipoEvento.objects.exclude(id=35) |
||||
|
if " e " in t.nome |
||||
|
] |
||||
|
|
||||
|
# Tipo_evento_id 35 foi cadastrado como 'pedidos SIGAD' e todos os eventos |
||||
|
# deste tipo serão convertidos em Solicitacao |
||||
|
|
||||
|
for e in Evento.objects.filter(tipo_evento_id=35).exclude( |
||||
|
casa_anfitria=None |
||||
|
): |
||||
|
solicitacao = Solicitacao( |
||||
|
casa=e.casa_anfitria, |
||||
|
senador=e.solicitante, |
||||
|
num_processo=e.num_processo, |
||||
|
descricao=e.descricao, |
||||
|
data_pedido=e.data_pedido or timezone.localdate(), |
||||
|
contato=e.contato, |
||||
|
telefone_contato=e.telefone, |
||||
|
estimativa_casas=0, |
||||
|
estimativa_servidores=0, |
||||
|
) |
||||
|
solicitacao.save() |
||||
|
|
||||
|
if e.num_processo: |
||||
|
for se in Evento.objects.filter( |
||||
|
num_processo=e.num_processo |
||||
|
).exclude(id=e.id): |
||||
|
ItemSolicitado( |
||||
|
solicitacao=solicitacao, |
||||
|
tipo_evento=se.tipo_evento, |
||||
|
virtual=se.virtual, |
||||
|
inicio_desejado=se.data_inicio |
||||
|
or se.data_pedido |
||||
|
or timezone.localdate(), |
||||
|
status="A", # autorizado |
||||
|
justificativa="Automática na migração dos dados", |
||||
|
evento=se, |
||||
|
).save() |
||||
|
|
||||
|
descricoes = ( |
||||
|
reduce( |
||||
|
lambda x, y: x.replace(y, y.replace(" e ", " ")), |
||||
|
conjugados, |
||||
|
to_ascii( |
||||
|
e.descricao.lower().replace("\r\n", "").replace(";", ",") |
||||
|
), |
||||
|
) |
||||
|
.replace(" e ", ", ") |
||||
|
.replace("/", " ") |
||||
|
.replace(".", " ") |
||||
|
.replace("(", " ") |
||||
|
.replace(")", " ") |
||||
|
.split(",") |
||||
|
) |
||||
|
|
||||
|
for d in descricoes: |
||||
|
termos = { |
||||
|
s.strip() for s in d.strip().split(" ") if s not in conjuncoes |
||||
|
} |
||||
|
similar = min( |
||||
|
[(id, len(termos.difference(t))) for id, t in tipos.items()], |
||||
|
key=lambda x: x[1], |
||||
|
) |
||||
|
if similar and similar[1] < len(termos): |
||||
|
if not ItemSolicitado.objects.filter( |
||||
|
solicitacao=solicitacao, tipo_evento_id=similar[0] |
||||
|
).exists(): |
||||
|
ItemSolicitado( |
||||
|
solicitacao=solicitacao, |
||||
|
tipo_evento_id=similar[0], |
||||
|
virtual=e.virtual, |
||||
|
inicio_desejado=e.data_inicio |
||||
|
or e.data_pedido |
||||
|
or timezone.localdate(), |
||||
|
status="S", |
||||
|
).save() |
||||
|
e.delete() |
||||
|
|
||||
|
|
||||
|
class Migration(migrations.Migration): |
||||
|
dependencies = [ |
||||
|
( |
||||
|
"eventos", |
||||
|
"0037_tipoevento_duracao_tipoevento_sigla_solicitacao_and_more", |
||||
|
), |
||||
|
] |
||||
|
|
||||
|
operations = [ |
||||
|
migrations.RunPython( |
||||
|
forwards, |
||||
|
) |
||||
|
] |
Loading…
Reference in new issue