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