diff --git a/scripts/importa_pesquisa.py b/scripts/importa_pesquisa.py new file mode 100644 index 0000000..0208dec --- /dev/null +++ b/scripts/importa_pesquisa.py @@ -0,0 +1,131 @@ +# -*- coding: utf-8 -*- +# +# importa_pesquisa +# +# Copyright (c) 2015 by Interlegis +# +# GNU General Public License (GPL) +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. +# + +import csv +import urlparse +from datetime import datetime + +from sigi.apps.casas.models import CasaLegislativa +from sigi.apps.servidores.models import Servidor + +def importa(file_list): + ''' Este script importa dados de um arquivo CSV e dá carga no model casas.CasaLegislativa + + O arquivo CSV esperado tem um cabeçalho de campos na primeira linha, com os seguintes campos: + + Indicação de data e hora,Pesquisador,Câmara,Possui portal,Portal Modelo,URL,Observações + + Indicação de data e hora: Uma string datetime no formato %d/%m/%y %H:%M + Pesquisador: O nome do servidor que realizou a pesquisa, conforme cadastrado no SIGI + Câmara: A sigla da UF seguida de um espaço, seguido de um caracter - seguido de um espaço seguido do nome do município, + exemplo: MG - Montes Claros + Possui portal: Deve constar "sim" ou "não" indicando se a casa possui ou não portal. + Portal Modelo: Deve constar "sim" ou "não" indicando se o portal da casa é o portal modelo ou não. + URL: Deve conter a URL do portal da Casa. Opcionalmente pode ter alguma observação do pesquisador + Observações: Deve conter as observações do pesquisador, caso existam.''' + + for filename in file_list: + print 'Importando '+filename+'.csv' + with open(filename+'.csv', 'rb') as infile: + with open(filename+'.out', 'wb') as outfile: + indata = csv.reader(infile, delimiter=',', quotechar='"') + outdata = csv.writer(outfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL) + + head = next(indata) + head.append('Erros encontrados') + outdata.writerow(head) + + for row in indata: + data = row[0] + pesquisador = row[1] + uf_cidade = row[2] + tem_portal = row[3] + pmodelo = row[4] + url = row[5] + obs = row[6] + + if data == '': + data = None + else: + data = datetime.strptime(data, '%d/%m/%y %H:%M') + + uf = uf_cidade[:2] + cidade = uf_cidade[5:] + + if tem_portal.lower() == 'não': + inclusao = CasaLegislativa.INCLUSAO_DIGITAL_CHOICES[1][0] + elif pmodelo.lower() == 'não': + inclusao = CasaLegislativa.INCLUSAO_DIGITAL_CHOICES[3][0] + else: + inclusao = CasaLegislativa.INCLUSAO_DIGITAL_CHOICES[2][0] + + l = url.splitlines() + url = '' + + for s in l: + p = urlparse.urlparse(s) + if p.netloc: + url = s + else: + obs = obs + '\n' + s + + if pesquisador == '': + servidor = None + else: + servidor = Servidor.objects.filter(nome_completo__iexact=pesquisador) + cc = servidor.count() + if cc == 0: + row.append('Não encontrado servidor com este nome') + outdata.writerow(row) + continue + else: + servidor = servidor[0] + + casa = CasaLegislativa.objects.filter(tipo_id=1, municipio__uf__sigla=uf, municipio__nome__iexact=cidade) + cc = casa.count() + if cc == 0: + row.append('Municipio nao foi encontrado') + outdata.writerow(row) + continue + elif cc > 1: + row.append('Existem %s casas legislativas nesta cidade') + outdata.writerow(row) + continue + else: + casa = casa[0] + + casa.inclusao_digital = inclusao + casa.data_levantamento = data + casa.pesquisador = servidor + + if casa.pagina_web == '': + casa.pagina_web = url + else: + obs = url + '\n' + obs + + casa.obs_pesquisa = obs + casa.save() + + print 'O arquivo '+filename+'.out foi criado com os registros que nao puderam ser importados' + \ No newline at end of file diff --git a/sigi/apps/casas/admin.py b/sigi/apps/casas/admin.py index 27b51a4..27a5e4b 100644 --- a/sigi/apps/casas/admin.py +++ b/sigi/apps/casas/admin.py @@ -178,7 +178,8 @@ class CasaLegislativaAdmin(ImageCroppingMixin, BaseModelAdmin): DiagnosticoInline, BemInline, ServicoInline, PlanoDiretorInline, OcorrenciaInline, ) list_display = ('nome', 'municipio', 'gerente_contas', 'get_convenios') list_display_links = ('nome',) - list_filter = ('tipo', ('gerente_contas', GerentesContasFilter), 'municipio__uf__nome', 'convenio__projeto') + list_filter = ('tipo', ('gerente_contas', GerentesContasFilter), 'municipio__uf__nome', 'convenio__projeto', + 'inclusao_digital',) ordering = ('nome', 'municipio__uf') queyrset = queryset_ascii fieldsets = ( @@ -187,7 +188,10 @@ class CasaLegislativaAdmin(ImageCroppingMixin, BaseModelAdmin): }), (_(u'Endereço'), { 'fields': ('data_instalacao', 'logradouro', 'bairro', - 'municipio', 'cep', 'pagina_web', 'email', 'ult_alt_endereco'), + 'municipio', 'cep', 'ult_alt_endereco'), + }), + (_(u'Presença na Internet'), { + 'fields': ('inclusao_digital', 'data_levantamento', 'pesquisador', 'pagina_web', 'email', 'obs_pesquisa',) }), (_(u'Outras informações'), { 'fields': ('observacoes', 'foto', 'recorte'), diff --git a/sigi/apps/casas/migrations/0002_auto_20150710_1247.py b/sigi/apps/casas/migrations/0002_auto_20150710_1247.py new file mode 100644 index 0000000..45a066a --- /dev/null +++ b/sigi/apps/casas/migrations/0002_auto_20150710_1247.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('servidores', '0001_initial'), + ('casas', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='casalegislativa', + name='data_levantamento', + field=models.DateTimeField(null=True, verbose_name='Data/hora da pesquisa', blank=True), + preserve_default=True, + ), + migrations.AddField( + model_name='casalegislativa', + name='inclusao_digital', + field=models.CharField(default=b'NAO PESQUISADO', max_length=30, choices=[(b'NAO PESQUISADO', 'N\xe3o pesquisado'), (b'NAO POSSUI PORTAL', 'N\xe3o possui portal'), (b'PORTAL MODELO', 'Possui Portal Modelo'), (b'OUTRO PORTAL', 'Possui outro portal')]), + preserve_default=True, + ), + migrations.AddField( + model_name='casalegislativa', + name='obs_pesquisa', + field=models.TextField(verbose_name='Observa\xe7\xf5es do pesquisador', blank=True), + preserve_default=True, + ), + migrations.AddField( + model_name='casalegislativa', + name='pesquisador', + field=models.ForeignKey(verbose_name='Pesquisador', blank=True, to='servidores.Servidor', null=True), + preserve_default=True, + ), + migrations.AlterField( + model_name='casalegislativa', + name='gerente_contas', + field=models.ForeignKey(related_name='casas_que_gerencia', verbose_name=b'Gerente de contas', blank=True, to='servidores.Servidor', null=True), + preserve_default=True, + ), + migrations.AlterField( + model_name='funcionario', + name='ult_alteracao', + field=models.DateTimeField(auto_now=True, verbose_name='\xdaltima altera\xe7\xe3o', null=True), + preserve_default=True, + ), + ] diff --git a/sigi/apps/casas/models.py b/sigi/apps/casas/models.py index c1e5dab..b199579 100644 --- a/sigi/apps/casas/models.py +++ b/sigi/apps/casas/models.py @@ -35,6 +35,14 @@ class CasaLegislativa(models.Model): """ Modelo para representar uma Casa Legislativa """ + + INCLUSAO_DIGITAL_CHOICES = ( + ('NAO PESQUISADO', u'Não pesquisado'), + ('NAO POSSUI PORTAL', u'Não possui portal'), + ('PORTAL MODELO', u'Possui Portal Modelo'), + ('OUTRO PORTAL', u'Possui outro portal'), + ) + nome = models.CharField( max_length=60, help_text='Exemplo: Câmara Municipal de Pains.' @@ -72,6 +80,10 @@ class CasaLegislativa(models.Model): help_text='Exemplo: http://www.camarapains.mg.gov.br.', blank=True, ) + inclusao_digital = models.CharField(max_length=30, choices=INCLUSAO_DIGITAL_CHOICES, default=INCLUSAO_DIGITAL_CHOICES[0][0]) + data_levantamento = models.DateTimeField(u"Data/hora da pesquisa", null=True, blank=True) + pesquisador = models.ForeignKey(Servidor, verbose_name=u"Pesquisador", null=True, blank=True) + obs_pesquisa = models.TextField(u"Observações do pesquisador", blank=True) ult_alt_endereco = models.DateTimeField(u'Última alteração do endereço', null=True, blank=True, editable=True) telefones = generic.GenericRelation('contatos.Telefone') diff --git a/sigi/settings/dev.py b/sigi/settings/dev.py index c5b35e9..6c203f2 100644 --- a/sigi/settings/dev.py +++ b/sigi/settings/dev.py @@ -6,8 +6,11 @@ SECRET_KEY = '0$ip1fb5xtq%a=)-k_4r^(#jn0t^@+*^kihkxkozg-mip7+w3+' DATABASES = { 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': os.path.join(BASE_DIR, 'sigi.db'), + 'ENGINE': 'django.db.backends.postgresql_psycopg2', + 'NAME': 'sigi', + 'USER': 'sigi', + 'PASSWORD': '123456', + 'HOST': 'localhost', }, 'moodle': { 'ENGINE': 'django.db.backends.sqlite3', @@ -28,3 +31,7 @@ CACHES = { 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', } } + +PENTAHO_SERVER = 'http://localhost.com/pentaho/' +PENTAHO_DASHBOARDS = ('saberes',) +PENTAHO_USERNAME_PASSWORD = 'root@root'