Browse Source

Coloca a busca por semelhança de nome como classmethod em Orgao

pull/187/head
Sesóstris Vieira 4 months ago
parent
commit
da9ab3e892
  1. 25
      sigi/apps/casas/models.py
  2. 21
      sigi/apps/convenios/models.py

25
sigi/apps/casas/models.py

@ -1,4 +1,5 @@
import random import random
from difflib import SequenceMatcher
from string import ascii_uppercase from string import ascii_uppercase
from unicodedata import normalize from unicodedata import normalize
from django.contrib.contenttypes.fields import GenericRelation from django.contrib.contenttypes.fields import GenericRelation
@ -9,7 +10,7 @@ from django.utils.translation import gettext as _
from sigi.apps.contatos.models import Municipio from sigi.apps.contatos.models import Municipio
from sigi.apps.servidores.models import Servidor from sigi.apps.servidores.models import Servidor
from sigi.apps.utils import SearchField, mask_cnpj, valida_cnpj from sigi.apps.utils import SearchField, mask_cnpj, valida_cnpj, to_ascii
class TipoOrgao(models.Model): class TipoOrgao(models.Model):
@ -135,6 +136,28 @@ class Orgao(models.Model):
brasao_largura = models.SmallIntegerField(editable=False, null=True) brasao_largura = models.SmallIntegerField(editable=False, null=True)
brasao_altura = models.SmallIntegerField(editable=False, null=True) brasao_altura = models.SmallIntegerField(editable=False, null=True)
def _mathnames(nome, orgaos):
for o, nome_canonico in orgaos:
ratio = SequenceMatcher(
None, to_ascii(nome).lower(), nome_canonico
).ratio()
if ratio > 0.9:
yield (o, ratio)
@classmethod
def get_semelhantes(cls, nome, orgaos=None):
if orgaos is None:
orgaos = [
(o, f"{to_ascii(o.nome)} - {o.uf_sigla}".lower())
for o in Orgao.objects.all()
.order_by()
.annotate(uf_sigla=models.F("municipio__uf__sigla"))
]
return sorted(
cls._mathnames(nome, orgaos),
key=lambda m: m[1],
)
class Meta: class Meta:
ordering = ("nome",) ordering = ("nome",)
verbose_name = _("órgão") verbose_name = _("órgão")

21
sigi/apps/convenios/models.py

@ -675,20 +675,6 @@ class Gescon(models.Model):
importados/atualizados) importados/atualizados)
""" """
def mathnames(nome, orgaos, all=False):
for o, nome_canonico in orgaos:
ratio = SequenceMatcher(
None, to_ascii(nome).lower(), nome_canonico
).ratio()
if ratio > 0.9:
yield (o, ratio)
def get_semelhantes(nome, orgaos, all=False):
return sorted(
mathnames(nome, orgaos, all),
key=lambda m: m[1],
)
self.ultima_importacao = "" self.ultima_importacao = ""
if self.checksums is None: if self.checksums is None:
self.checksums = {} self.checksums = {}
@ -946,7 +932,7 @@ class Gescon(models.Model):
# da prefeitura, e ambos terem convênio com o ILB. # da prefeitura, e ambos terem convênio com o ILB.
# Podemos tentar desambiguar pelo nome mais # Podemos tentar desambiguar pelo nome mais
# semelhante. # semelhante.
orgao = get_semelhantes( orgao = Orgao.get_semelhantes(
to_ascii(contrato["nomeFornecedor"]).lower(), to_ascii(contrato["nomeFornecedor"]).lower(),
[ [
( (
@ -957,7 +943,6 @@ class Gescon(models.Model):
.order_by() .order_by()
.annotate(uf_sigla=F("municipio__uf__sigla")) .annotate(uf_sigla=F("municipio__uf__sigla"))
], ],
all=True,
)[0][0] )[0][0]
except Orgao.DoesNotExist: except Orgao.DoesNotExist:
# Encontrou 0: Vamos seguir sem órgao e tentar # Encontrou 0: Vamos seguir sem órgao e tentar
@ -982,13 +967,13 @@ class Gescon(models.Model):
erros += 1 erros += 1
continue continue
# Tentar primeiro com o nome igual veio do GESCON # Tentar primeiro com o nome igual veio do GESCON
semelhantes = get_semelhantes( semelhantes = Orgao.get_semelhantes(
to_ascii(contrato["nomeFornecedor"]).lower(), to_ascii(contrato["nomeFornecedor"]).lower(),
todos_orgaos, todos_orgaos,
) )
if not semelhantes: if not semelhantes:
# Não achou, então vamos tentar com o nome limpado # Não achou, então vamos tentar com o nome limpado
semelhantes = get_semelhantes( semelhantes = Orgao.get_semelhantes(
to_ascii(nome).lower(), to_ascii(nome).lower(),
todos_orgaos, todos_orgaos,
) )

Loading…
Cancel
Save