Browse Source

Acrescenta rotina de verificação de uso dos serviços SEIT pelas Casas

stable/1.0
Sesostris Vieira 12 years ago
parent
commit
cfe42a9686
  1. 30
      etc/cron/atualiza_data_uso.py
  2. 2
      sigi/apps/casas/models.py
  3. 21
      sigi/apps/servicos/admin.py
  4. 96
      sigi/apps/servicos/models.py

30
etc/cron/atualiza_data_uso.py

@ -0,0 +1,30 @@
# -*- coding: utf-8 -*-
# Atualiza a data de último uso dos serviços SEIT realizados pelas Casas Legislativas
# Colocar no CRON - basta executar uma vez por dia
#
import sys
from django.core.management import setup_environ
# Produção
sys.path.insert(0, '/var/interlegis/sigi')
sys.path.insert(0, '/var/interlegis/sigi/sigi')
# Dev
import os
BASE_DIR = os.path.abspath(os.path.dirname(__file__) + '../..')
PROJECT_DIR = BASE_DIR + '/sigi'
print BASE_DIR, PROJECT_DIR
sys.path.insert(0, BASE_DIR)
sys.path.insert(0, PROJECT_DIR)
# Faça!
from sigi import settings
setup_environ(settings)
from sigi.apps.servicos.models import Servico
queryset = Servico.objects.exclude(url="").exclude(tipo_servico__string_pesquisa="")
for obj in queryset:
obj.atualiza_data_uso()
print obj.url, obj.data_ultimo_uso, obj.erro_atualizacao

2
sigi/apps/casas/models.py

@ -6,7 +6,7 @@ from sigi.apps.utils import SearchField
from datetime import datetime from datetime import datetime
import random import random
from unicodedata import normalize from unicodedata import normalize
from apps.contatos.models import Municipio from sigi.apps.contatos.models import Municipio
class TipoCasaLegislativa(models.Model): class TipoCasaLegislativa(models.Model):
""" Modelo para representar o tipo da Casa Legislativa """ Modelo para representar o tipo da Casa Legislativa

21
sigi/apps/servicos/admin.py

@ -48,7 +48,9 @@ class TipoServicoAdmin(admin.ModelAdmin):
class ServicoAdmin(admin.ModelAdmin): class ServicoAdmin(admin.ModelAdmin):
form = ServicoFormAdmin form = ServicoFormAdmin
list_display = ('casa_legislativa','getUf', 'tipo_servico', 'hospedagem_interlegis', 'data_ativacao', 'data_desativacao', 'getUrl') actions = ['calcular_data_uso',]
list_display = ('casa_legislativa','getUf', 'tipo_servico', 'hospedagem_interlegis', 'data_ativacao', 'data_desativacao',
'getUrl', 'data_ultimo_uso', 'erro_atualizacao')
fieldsets = (( None, { fieldsets = (( None, {
'fields': ('casa_legislativa', 'data_ativacao',) 'fields': ('casa_legislativa', 'data_ativacao',)
}), }),
@ -62,10 +64,9 @@ class ServicoAdmin(admin.ModelAdmin):
'fields': ('data_alteracao', 'data_desativacao', 'motivo_desativacao',) 'fields': ('data_alteracao', 'data_desativacao', 'motivo_desativacao',)
})) }))
readonly_fields = ('casa_legislativa', 'data_ativacao', 'data_alteracao') readonly_fields = ('casa_legislativa', 'data_ativacao', 'data_alteracao')
list_filter = ('tipo_servico', 'hospedagem_interlegis', 'casa_legislativa') list_filter = ('tipo_servico', 'hospedagem_interlegis', 'data_ultimo_uso', 'casa_legislativa', )
list_display_links = [] list_display_links = []
ordering = ('casa_legislativa__municipio__uf', 'casa_legislativa', 'tipo_servico',) ordering = ('casa_legislativa__municipio__uf', 'casa_legislativa', 'tipo_servico',)
actions = None
inlines = (LogServicoInline,) inlines = (LogServicoInline,)
def getUf(self, obj): def getUf(self, obj):
@ -78,6 +79,20 @@ class ServicoAdmin(admin.ModelAdmin):
getUrl.short_description = 'Url' getUrl.short_description = 'Url'
getUrl.allow_tags = True getUrl.allow_tags = True
def calcular_data_uso(self, request, queryset):
for servico in queryset:
servico.atualiza_data_uso()
self.message_user(request, "Atualização concluída. Os sites que não responderam foram deixados com a data em branco" )
return HttpResponseRedirect('.')
calcular_data_uso.short_description = u"Atualizar a data do último uso do(s) serviço(s)"
def get_actions(self, request):
from django.utils.datastructures import SortedDict
actions = [self.get_action(action) for action in self.actions]
actions = filter(None, actions)
actions.sort(lambda a,b: cmp(a[2].lower(), b[2].lower()))
actions = SortedDict([ (name, (func, name, desc)) for func, name, desc in actions ])
return actions
def lookup_allowed(self, lookup, value): def lookup_allowed(self, lookup, value):
return super(ServicoAdmin, self).lookup_allowed(lookup, value) or \ return super(ServicoAdmin, self).lookup_allowed(lookup, value) or \

96
sigi/apps/servicos/models.py

@ -6,14 +6,16 @@ from django.core.mail import send_mail
from sigi.settings import DEFAULT_FROM_EMAIL from sigi.settings import DEFAULT_FROM_EMAIL
class TipoServico(models.Model): class TipoServico(models.Model):
email_help = '''Use:<br/> email_help = u'''Use:<br/>
{url} para incluir a URL do serviço,<br/> {url} para incluir a URL do serviço,<br/>
{senha} para incluir a senha inicial do serviço''' {senha} para incluir a senha inicial do serviço'''
nome = models.CharField('Nome', max_length=60) nome = models.CharField(u'Nome', max_length=60)
sigla = models.CharField('Sigla', max_length='12') sigla = models.CharField(u'Sigla', max_length='12')
template_email_ativa = models.TextField('Template de email de ativação', help_text = email_help, blank=True) string_pesquisa = models.CharField(u'String de pesquisa', blank=True, max_length=200,
template_email_altera = models.TextField('Template de email de alteração', help_text = email_help, blank=True) help_text=u'Sufixo para pesquisa RSS para averiguar a data da última atualização do serviço')
template_email_desativa = models.TextField('Template de email de desativação', help_text = email_help + '<br/>{motivo} para incluir o motivo da desativação do serviço', blank=True) template_email_ativa = models.TextField(u'Template de email de ativação', help_text = email_help, blank=True)
template_email_altera = models.TextField(u'Template de email de alteração', help_text = email_help, blank=True)
template_email_desativa = models.TextField(u'Template de email de desativação', help_text = email_help + u'<br/>{motivo} para incluir o motivo da desativação do serviço', blank=True)
@property @property
def qtde_casas_atendidas(self): def qtde_casas_atendidas(self):
@ -21,29 +23,81 @@ class TipoServico(models.Model):
return self.servico_set.filter(data_desativacao=None).count() return self.servico_set.filter(data_desativacao=None).count()
class Meta: class Meta:
verbose_name = 'Tipo de serviço' verbose_name = u'Tipo de serviço'
verbose_name_plural = 'Tipos de serviço' verbose_name_plural = u'Tipos de serviço'
def __unicode__(self): def __unicode__(self):
return self.nome; return self.nome;
class Servico(models.Model): class Servico(models.Model):
casa_legislativa = models.ForeignKey(CasaLegislativa, verbose_name='Casa legislativa') casa_legislativa = models.ForeignKey(CasaLegislativa, verbose_name=u'Casa legislativa')
tipo_servico = models.ForeignKey(TipoServico, verbose_name='Tipo de serviço') tipo_servico = models.ForeignKey(TipoServico, verbose_name=u'Tipo de serviço')
contato_tecnico = models.ForeignKey(Funcionario, verbose_name='Contato técnico', related_name='contato_tecnico') contato_tecnico = models.ForeignKey(Funcionario, verbose_name=u'Contato técnico', related_name='contato_tecnico')
contato_administrativo = models.ForeignKey(Funcionario, verbose_name='Contato administrativo', related_name='contato_administrativo') contato_administrativo = models.ForeignKey(Funcionario, verbose_name=u'Contato administrativo', related_name='contato_administrativo')
url = models.URLField('URL do serviço', verify_exists=False, blank=True) url = models.URLField(u'URL do serviço', verify_exists=False, blank=True)
hospedagem_interlegis = models.BooleanField('Hospedagem no Interlegis?') hospedagem_interlegis = models.BooleanField(u'Hospedagem no Interlegis?')
nome_servidor = models.CharField('Hospedado em', max_length=60, blank=True, help_text='Se hospedado no Interlegis, informe o nome do servidor.<br/>Senão, informe o nome do provedor de serviços.') nome_servidor = models.CharField(u'Hospedado em', max_length=60, blank=True,
porta_servico = models.PositiveSmallIntegerField('Porta de serviço (instância)', blank=True, null=True) help_text=u'Se hospedado no Interlegis, informe o nome do servidor.<br/>Senão, informe o nome do provedor de serviços.')
senha_inicial = models.CharField('Senha inicial', max_length=33, blank=True) porta_servico = models.PositiveSmallIntegerField(u'Porta de serviço (instância)', blank=True, null=True)
data_ativacao = models.DateField('Data de ativação', default=date.today) senha_inicial = models.CharField(u'Senha inicial', max_length=33, blank=True)
data_alteracao = models.DateField('Data da última alteração', blank=True, null=True, auto_now=True) data_ativacao = models.DateField(u'Data de ativação', default=date.today)
data_desativacao = models.DateField('Data de desativação', blank=True, null=True) data_alteracao = models.DateField(u'Data da última alteração', blank=True, null=True, auto_now=True)
motivo_desativacao = models.TextField('Motivo da desativação', blank=True) data_desativacao = models.DateField(u'Data de desativação', blank=True, null=True)
motivo_desativacao = models.TextField(u'Motivo da desativação', blank=True)
data_ultimo_uso = models.DateField(u'Data da última utilização', blank=True, null=True,
help_text=u'Data em que o serviço foi utilizado pela Casa Legislativa pela última vez<br/><strong>NÃO É ATUALIZADO AUTOMATICAMENTE!</strong>')
erro_atualizacao = models.CharField(u"Erro na atualização", blank=True, max_length=200,
help_text=u"Erro ocorrido na última tentativa de atualizar a data de último acesso")
casa_legislativa.casa_uf_filter = True casa_legislativa.casa_uf_filter = True
def atualiza_data_uso(self):
def reset(erro=u""):
if self.data_ultimo_uso is None and not erro:
return
self.data_ultimo_uso = None
self.erro_atualizacao = erro
self.save()
return
if self.tipo_servico.string_pesquisa == "":
reset()
return
url = self.url
if not url:
reset()
return
if url[-1] != '/':
url += '/'
url += self.tipo_servico.string_pesquisa
import urllib2
from xml.dom.minidom import parseString
try:
try: # Tentar conxão sem proxy
req = urllib2.urlopen(url=url, timeout=5)
except: # Tentar com proxy
proxy = urllib2.ProxyHandler()
opener = urllib2.build_opener(proxy)
req = opener.open(fullurl=url, timeout=5)
rss = req.read()
xml = parseString(rss)
items = xml.getElementsByTagName('item')
first_item = items[0]
date_list = first_item.getElementsByTagName('dc:date')
date_item = date_list[0]
date_text = date_item.firstChild.nodeValue
self.data_ultimo_uso = date_text[:10] # Apenas YYYY-MM-DD
self.erro_atualizacao = ""
self.save()
except Exception as e:
reset(erro=e.message)
def __unicode__(self): def __unicode__(self):
return "%s (%s)" % (self.tipo_servico.nome, 'ativo' if self.data_desativacao is None else 'Desativado') return "%s (%s)" % (self.tipo_servico.nome, 'ativo' if self.data_desativacao is None else 'Desativado')

Loading…
Cancel
Save