From 429181ac58ac558ace3c4cce98526a84caa205f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ses=C3=B3stris=20Vieira?= Date: Fri, 20 Mar 2026 12:08:23 -0300 Subject: [PATCH] =?UTF-8?q?Melhora=20gera=C3=A7=C3=A3o=20de=20URL=20do=20S?= =?UTF-8?q?IGAD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sigi/apps/convenios/models.py | 24 ++-------------- sigi/apps/espacos/models.py | 17 ++--------- sigi/apps/eventos/models.py | 53 ++++++----------------------------- sigi/apps/utils/__init__.py | 40 ++++++++++++++++++++++++++ 4 files changed, 53 insertions(+), 81 deletions(-) diff --git a/sigi/apps/convenios/models.py b/sigi/apps/convenios/models.py index 0e5e381..3cded7f 100644 --- a/sigi/apps/convenios/models.py +++ b/sigi/apps/convenios/models.py @@ -23,7 +23,7 @@ from sigi.apps.parlamentares.models import Parlamentar from sigi.apps.utils import to_ascii from sigi.apps.casas.models import Funcionario, Orgao from sigi.apps.servidores.models import Servidor, Servico -from sigi.apps.utils import editor_help, mask_cnpj +from sigi.apps.utils import editor_help, mask_cnpj, get_sigad_url class Projeto(models.Model): @@ -376,27 +376,7 @@ class Convenio(models.Model): return obj.get_sigad_url() def get_sigad_url(self, display_type="numero"): - m = re.match( - r"(?P00100|00200)\.(?P\d{6})/(?P\d{4})-\d{2}", - self.num_processo_sf, - ) - if m: - orgao, sequencial, ano = m.groups() - if display_type == "numero": - display = self.num_processo_sf - else: - display = '' - return ( - f'{display}' - ) - if display_type == "numero": - return self.num_processo_sf - else: - return '' + return get_sigad_url(self.num_processo_sf, display_type) def get_url_gescon(self): if not self.id_contrato_gescon: diff --git a/sigi/apps/espacos/models.py b/sigi/apps/espacos/models.py index 8b0059b..b20c7ee 100644 --- a/sigi/apps/espacos/models.py +++ b/sigi/apps/espacos/models.py @@ -5,6 +5,7 @@ from django.template.loader import render_to_string from django.urls import reverse from django.utils.safestring import mark_safe from django.utils.translation import gettext as _ +from sigi.apps.utils import get_sigad_url class Espaco(models.Model): @@ -217,21 +218,7 @@ class Reserva(models.Model): ) def get_sigad_url(self): - m = re.match( - r"(?P00100|00200)\.(?P\d{6})/(?P" - r"\d{4})-\d{2}", - self.num_processo, - ) - if m: - return ( - '{processo}' - ).format(processo=self.num_processo, **m.groupdict()) - return self.num_processo + return get_sigad_url(self.num_processo) class RecursoSolicitado(models.Model): diff --git a/sigi/apps/eventos/models.py b/sigi/apps/eventos/models.py index f44d413..795e0bd 100644 --- a/sigi/apps/eventos/models.py +++ b/sigi/apps/eventos/models.py @@ -18,6 +18,7 @@ from django.utils.translation import gettext as _ from sigi.apps.casas.models import Orgao, Servidor from sigi.apps.contatos.models import UnidadeFederativa from sigi.apps.espacos.models import Reserva +from sigi.apps.utils import get_sigad_url from sigi.apps.utils.templatetags.model_fields import verbose_name from sigi.apps.eventos.saberes import EventoSaberes @@ -42,9 +43,7 @@ class TipoEvento(models.Model): categoria = models.CharField( _("Categoria"), max_length=1, choices=CATEGORIA_CHOICES ) - casa_solicita = models.BooleanField( - _("casa pode solicitar"), default=False - ) + casa_solicita = models.BooleanField(_("casa pode solicitar"), default=False) gerar_turma = models.BooleanField( _("Gerar turma"), default=True, @@ -178,23 +177,7 @@ class Solicitacao(models.Model): @admin.display(description=_("SIGAD"), ordering="num_processo") def get_sigad_url(self): - m = re.match( - r"(?P00100|00200)\.(?P\d{6})/(?P" - r"\d{4})-\d{2}", - self.num_processo, - ) - if m: - return mark_safe( - ( - '{processo}' - ).format(processo=self.num_processo, **m.groupdict()) - ) - return self.num_processo + return get_sigad_url(self.num_processo) class ItemSolicitado(models.Model): @@ -413,9 +396,7 @@ class Evento(models.Model): origem_sincronizacao = models.CharField( _("origem da sincronização"), max_length=100, blank=True ) - status = models.CharField( - _("Status"), max_length=1, choices=STATUS_CHOICES - ) + status = models.CharField(_("Status"), max_length=1, choices=STATUS_CHOICES) publicar = models.BooleanField(_("publicar no site"), default=False) moodle_courseid = models.PositiveBigIntegerField( _("ID do curso"), @@ -517,21 +498,7 @@ class Evento(models.Model): return reverse("admin:eventos_evento_change", args=[self.id]) def get_sigad_url(self): - m = re.match( - r"(?P00100|00200)\.(?P\d{6})/(?P" - r"\d{4})-\d{2}", - self.num_processo, - ) - if m: - return ( - '{processo}' - ).format(processo=self.num_processo, **m.groupdict()) - return self.num_processo + return get_sigad_url(self.num_processo) @property def link_inscricao(self): @@ -698,9 +665,9 @@ class Evento(models.Model): # preenchido com o total de aprovados quando da sincronização # veja o método self.sincroniza.saberes() - total = self.convite_set.aggregate( - total=Sum("qtde_participantes") - )["total"] + total = self.convite_set.aggregate(total=Sum("qtde_participantes"))[ + "total" + ] if total and total > 0 and total != self.total_participantes: self.total_participantes = total # Salva de novo se o total de participantes mudou # @@ -1116,9 +1083,7 @@ class Cronograma(models.Model): _("data prevista de término"), blank=True, null=True ) data_inicio = models.DateField(_("data de início"), blank=True, null=True) - data_termino = models.DateField( - _("data de término"), blank=True, null=True - ) + data_termino = models.DateField(_("data de término"), blank=True, null=True) dependencia = models.CharField( _("depende da etapa"), max_length=200, diff --git a/sigi/apps/utils/__init__.py b/sigi/apps/utils/__init__.py index 8e1cca7..2d7edfd 100644 --- a/sigi/apps/utils/__init__.py +++ b/sigi/apps/utils/__init__.py @@ -106,3 +106,43 @@ def mask_cnpj(cnpj): return re.sub( r"(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})", r"\1.\2.\3/\4-\5", cnpj ) + + +def get_sigad_url(num_sigad, display_type="numero"): + m = re.match( + r"(?P\d{5})\.(?P\d{6})/(?P\d{4})-\d{2}", + num_sigad, + ) + if m: + orgao, sequencial, ano = m.groups() + if display_type == "icone": + display = '' + elif display_type == "icone+numero": + display = f' {num_sigad}' + else: + display = num_sigad + return ( + f'{display}' + ) + return num_sigad + + +def unmask_sigad(num_sigad): + return re.sub(r"\D", "", num_sigad) + + +def mask_sigad(num_sigad): + unmasked = unmask_sigad(num_sigad) + m = re.match( + r"(?P00100|00200|00300)(?P\d{6})(?P\d{4})(?P\d{2})", + unmasked, + ) + if m: + orgao, sequencial, ano, dv = m.groups() + return f"{orgao}.{sequencial}/{ano}-{dv}" + else: + return num_sigad