mirror of https://github.com/interlegis/sigi.git
Sesostris Vieira
4 years ago
2 changed files with 160 additions and 1 deletions
@ -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"<<CRIADO PELO SISTEMA>>"} |
||||
|
) |
||||
|
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") |
||||
|
) |
||||
|
|
||||
|
|
Loading…
Reference in new issue