From 42ab9e5711b4105a76413b24a892c485c9bd8fec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ses=C3=B3stris=20Vieira?= Date: Tue, 11 May 2021 11:52:22 -0300 Subject: [PATCH] =?UTF-8?q?Importar=20dados=20de=20servi=C3=A7os=20SEIT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sigi/apps/casas/admin.py | 2 +- .../management/commands/importa_servico.py | 159 ++++++++++++++++++ 2 files changed, 160 insertions(+), 1 deletion(-) create mode 100644 sigi/apps/servicos/management/commands/importa_servico.py diff --git a/sigi/apps/casas/admin.py b/sigi/apps/casas/admin.py index 1204ba0..c09d079 100644 --- a/sigi/apps/casas/admin.py +++ b/sigi/apps/casas/admin.py @@ -319,7 +319,7 @@ class OrgaoAdmin(ImageCroppingMixin, BaseModelAdmin): actions = ['adicionar_casas', ] inlines = (TelefonesInline, PresidenteInline, FuncionariosInline, ConveniosInline, ServicoInline, OcorrenciaInline,) - list_display = ('sigla', 'nome', 'get_uf', 'get_gerentes', 'get_convenios', + list_display = ('id', 'sigla', 'nome', 'get_uf', 'get_gerentes', 'get_convenios', 'get_servicos') list_display_links = ('sigla', 'nome',) list_filter = ('tipo', ('gerentes_interlegis', GerentesInterlegisFilter), diff --git a/sigi/apps/servicos/management/commands/importa_servico.py b/sigi/apps/servicos/management/commands/importa_servico.py new file mode 100644 index 0000000..64b7c1a --- /dev/null +++ b/sigi/apps/servicos/management/commands/importa_servico.py @@ -0,0 +1,159 @@ +# -*- coding: utf-8 -*- + +import csv +import os +from datetime import datetime, date +from django.core.management.base import BaseCommand, CommandError +from sigi.apps.utils import to_ascii +from sigi.apps.servicos.models import Servico, TipoServico +from sigi.apps.casas.models import Orgao, Funcionario + +class Command(BaseCommand): + args = "nome_do_arquivo.txt" + help = u""" +Importa dados de serviços de arquivos TXT gerados pela COTIN. +""" + def handle(self, *args, **options): + if len(args) != 1: + raise CommandError(u"Informe UM arquivo TXT a importar") + file_name = args[0] + + self.stdout.write(u'Verificando estrutura do arquivo...') + if not os.path.isfile(file_name): + raise CommandError(u"Arquivo '%s' não encontrado" % file_name) + + with open(file_name, 'r') as f: + reader = csv.DictReader(f, delimiter=" ") + if (not 'TEMPLATE' in reader.fieldnames or + not 'NAME' in reader.fieldnames or + not 'COD_ORGAO' in reader.fieldnames): + raise CommandError(u"Formato inválido do arquivo.") + self.stdout.write(u'Estrutura parece ok.') + self.stdout.write("Preparando dados...") + casas = { + to_ascii(c.municipio.nome).replace(' ','').replace('-','').lower() + + '-' + to_ascii(c.municipio.uf.sigla).lower(): c.pk + for c in Orgao.objects.filter(tipo__sigla='CM') + } + casas.update( + {'al-'+to_ascii(c.municipio.uf.sigla).lower(): c.pk + for c in Orgao.objects.filter(tipo__sigla='AL')} + ) + casas.update( + {'tce-'+to_ascii(c.municipio.uf.sigla).lower(): c.pk + for c in Orgao.objects.filter(tipo__sigla='TCE')} + ) + self.stdout.write("Processando...") + + lista_tipos = set() + agora = datetime.now() + subdominios = {'PM': 'www', 'SAPL': 'sapl', + 'EmailLeg': 'correioadm', 'edem': 'edemocracia', + 'LEGBR': '', 'GOVBR': ''} + can_deactivate = True + + for rec in reader: + nome = rec['NAME'] + sigla = rec['TEMPLATE'] + cod_orgao = rec['COD_ORGAO'] + + if sigla == 'DNS': + dominio = nome + if '.leg.br' in nome: + nome = nome.replace('.leg.br', '') + sigla = 'LEGBR' + elif '.gov.br' in nome: + nome = nome.replace('.gov.br', '') + if nome.startswith('camara'): + nome = nome.replace('camara', '') + if nome.startswith('cm'): + nome = nome.replace('cm','') + sigla = 'GOVBR' + nome = nome.replace('.', '-') + else: + dominio = nome.replace('-','.')+'.leg.br' + + url = u"https://{subdominio}.{dominio}".format( + subdominio=subdominios[sigla], + dominio=dominio + ) + tipo_servico = TipoServico.objects.get(sigla=sigla) + lista_tipos.add(tipo_servico) + + if cod_orgao is not None: + if cod_orgao == '*': + self.stdout.write( + "{template} {name} {cod_orgao} " + "registro ignorado".format( + template=rec['TEMPLATE'], + name=rec['NAME'], + cod_orgao=rec['COD_ORGAO'] + ) + ) + continue + else: + casa = Orgao.objects.get(id=cod_orgao) + else: + if nome not in casas: + self.stdout.write( + "{template} {name} {cod_orgao} " + "orgao nao encontrado ({s})".format( + template=rec['TEMPLATE'], + name=rec['NAME'], + cod_orgao=rec['COD_ORGAO'], + s=nome + ) + ) + can_deactivate = False + continue + casa = Orgao.objects.get(id=casas[nome]) + + try: + contato, created = casa.funcionario_set.get_or_create( + setor='contato_interlegis', + defaults={'nome': u"<>"} + ) + except Funcionario.MultipleObjectsReturned: + contato = casa.funcionario_set.filter( + setor='contato_interlegis', + ).first() # Hack - pega sempre o primeiro + + try: + servico, created = casa.servico_set.get_or_create( + tipo_servico=tipo_servico, + data_desativacao=None, + defaults={ + 'contato_tecnico': contato, + 'contato_administrativo': contato, + 'url': url, + 'hospedagem_interlegis': True, + 'data_ativacao': date.today() + } + ) + servico.save() + except Servico.MultipleObjectsReturned: + self.stdout.write( + u"{template} {name} mais de um servico encontrado " + u"({s})".format(template=rec['TEMPLATE'], + name=rec['NAME'], s=nome) + ) + can_deactivate = False + + + if can_deactivate: + for tipo_servico in lista_tipos: + tipo_servico.servico_set.filter( + data_alteracao__lt=agora + ).update( + data_desativacao=agora, + motivo_desativacao=(u"[AUTOMÁTICO] Não consta da lista " + u"da COTIN") + ) + else: + self.stdout.write( + self.style.ERROR(u"Os serviços excendentes não podem ser " + u"desativados porque foram encontradas " + u"inconsistências no arquivo de origem") + ) + +