diff --git a/sigi/apps/servicos/admin.py b/sigi/apps/servicos/admin.py index 0234a15..4b7766b 100644 --- a/sigi/apps/servicos/admin.py +++ b/sigi/apps/servicos/admin.py @@ -75,6 +75,8 @@ class ServicoAdmin(CartExportMixin, admin.ModelAdmin): "data_ativacao", "data_desativacao", "getUrl", + "data_verificacao", + "resultado_verificacao", "data_ultimo_uso", "get_link_erro", ) @@ -94,6 +96,7 @@ class ServicoAdmin(CartExportMixin, admin.ModelAdmin): "hospedagem_interlegis", ("data_ativacao", DateRangeFilter), ("data_desativacao", ServicoAtivoFilter), + "resultado_verificacao", DataUtimoUsoFilter, ("casa_legislativa__gerentes_interlegis", GerentesInterlegisFilter), "casa_legislativa__municipio__uf", diff --git a/sigi/apps/servicos/management/commands/atualiza_uso_servico.py b/sigi/apps/servicos/management/commands/atualiza_uso_servico.py index 10723a0..5e6697f 100644 --- a/sigi/apps/servicos/management/commands/atualiza_uso_servico.py +++ b/sigi/apps/servicos/management/commands/atualiza_uso_servico.py @@ -1,26 +1,3 @@ -# -*- coding: utf-8 -*- -# -# sigi.apps.servicos.management.commands.atualiza_uso_servico -# -# Copyright (c) 2012 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. -# from django.core.management.base import BaseCommand from django.utils.translation import gettext as _ @@ -43,6 +20,6 @@ class Command(BaseCommand): verbosity > 1 ): self.stdout.write( - "%s \t %s \t %s\n" - % (obj.url, obj.data_ultimo_uso, obj.erro_atualizacao) + f"{obj.url} \t {obj.data_ultimo_uso} \t " + f"{obj.erro_atualizacao}" ) diff --git a/sigi/apps/servicos/migrations/0012_servico_data_verificacao_and_more.py b/sigi/apps/servicos/migrations/0012_servico_data_verificacao_and_more.py new file mode 100644 index 0000000..fca4216 --- /dev/null +++ b/sigi/apps/servicos/migrations/0012_servico_data_verificacao_and_more.py @@ -0,0 +1,23 @@ +# Generated by Django 4.0.4 on 2022-05-16 19:18 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('servicos', '0011_remove_servico_contato_administrativo_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='servico', + name='data_verificacao', + field=models.DateTimeField(blank=True, null=True, verbose_name='data da última verificação'), + ), + migrations.AddField( + model_name='servico', + name='resultado_verificacao', + field=models.CharField(choices=[('N', 'Não verificado'), ('F', 'Funcionando'), ('U', 'Nunca foi usado'), ('D', 'Acesso negado'), ('O', 'Fora do ar'), ('I', 'Dados imcompatíveis - não é serviço Interlegis')], default='N', max_length=1, verbose_name='resultado da verificação'), + ), + ] diff --git a/sigi/apps/servicos/models.py b/sigi/apps/servicos/models.py index a9811b0..c3d26f2 100644 --- a/sigi/apps/servicos/models.py +++ b/sigi/apps/servicos/models.py @@ -1,4 +1,4 @@ -from datetime import date +from django.utils import timezone from django.db import models from sigi.apps.casas.models import Orgao, Funcionario from django.utils.translation import gettext as _ @@ -48,6 +48,14 @@ class TipoServico(models.Model): class Servico(models.Model): + RESULTADO_CHOICES = ( + ("N", _("Não verificado")), + ("F", _("Funcionando")), + ("U", _("Nunca foi usado")), + ("D", _("Acesso negado")), + ("O", _("Fora do ar")), + ("I", _("Dados imcompatíveis - não é serviço Interlegis")), + ) casa_legislativa = models.ForeignKey( Orgao, on_delete=models.PROTECT, verbose_name=_("Casa Legislativa") ) @@ -58,7 +66,9 @@ class Servico(models.Model): hospedagem_interlegis = models.BooleanField( _("Hospedagem no Interlegis?"), default=False ) - data_ativacao = models.DateField(_("Data de ativação"), default=date.today) + data_ativacao = models.DateField( + _("Data de ativação"), default=timezone.localdate + ) data_alteracao = models.DateField( _("Data da última alteração"), blank=True, null=True, auto_now=True ) @@ -68,6 +78,15 @@ class Servico(models.Model): motivo_desativacao = models.TextField( _("Motivo da desativação"), blank=True ) + data_verificacao = models.DateTimeField( + _("data da última verificação"), blank=True, null=True + ) + resultado_verificacao = models.CharField( + _("resultado da verificação"), + choices=RESULTADO_CHOICES, + default="N", + max_length=1, + ) data_ultimo_uso = models.DateField( _("Data da última utilização"), blank=True, @@ -99,6 +118,8 @@ class Servico(models.Model): def reset(): if self.data_ultimo_uso is not None: + self.data_verificacao = None + self.resultado_verificacao = "N" self.data_ultimo_uso = None self.erro_atualizacao = "" self.save() @@ -109,6 +130,7 @@ class Servico(models.Model): if len(param_pesquisa) != 3: return { "data": "", + "resultado": "N", "erro": _("String de pesquisa mal configurada"), "comment": _("Corrija a string de pesquisa"), } @@ -124,6 +146,7 @@ class Servico(models.Model): except Exception as e: return { "data": "", + "resultado": "O", "erro": str(e), "comment": _( "Não foi possível conectar com o servidor. " @@ -135,6 +158,7 @@ class Servico(models.Model): if req.status_code != 200: return { "data": "", + "resultado": "D", "erro": req.reason, "comment": _( "Não foi possível receber os dados do " @@ -150,6 +174,7 @@ class Servico(models.Model): else: return { "data": "", + "resultado": "N", "erro": _("String de pesquisa mal configurada"), "comment": "", } @@ -159,6 +184,7 @@ class Servico(models.Model): if (len(data) - 1) < c: return { "data": "", + "resultado": "U", "erro": _("Sem dados para verificação"), "comment": _("Parece que nunca foi usado"), } @@ -173,10 +199,16 @@ class Servico(models.Model): data = data.firstChild.nodeValue data = data[:10] data = data.replace("/", "-") - return {"data": data, "erro": "", "comment": ""} + return { + "data": data, + "resultado": "F", + "erro": "", + "comment": "", + } except Exception as e: return { "data": "", + "resultado": "I", "erro": str(e), "comment": _( "Parece que não é um {tipo}".format( @@ -194,6 +226,7 @@ class Servico(models.Model): if not url: reset() self.erro_atualizacao = _("Serviço sem URL") + self.data_verificacao = timezone.localtime() self.save() return @@ -206,6 +239,12 @@ class Servico(models.Model): resultados.append(ultimo_uso(url, string_pesquisa)) data = max([r["data"] for r in resultados]) + resultado = {r["resultado"] for r in resultados} + + if "F" in resultado: + self.resultado_verificacao = "F" + else: + self.resultado_verificacao = resultado.pop() if data == "": # Nenhuma busca deu resultado, guardar log de erro @@ -213,20 +252,19 @@ class Servico(models.Model): self.erro_atualizacao = "
".join( set( [ - "{erro} ({comment})".format( - erro=r["erro"], comment=r["comment"] - ) + f"{r['erro']} ({r['comment']})" for r in resultados if r["erro"] != "" and r["comment"] != "" ] ) ) - self.save() else: # Atualiza a maior data de atualização self.data_ultimo_uso = data[:10] # Apenas YYYY-MM-DD self.erro_atualizacao = "" - self.save() + + self.data_verificacao = timezone.localtime() + self.save() return @@ -287,7 +325,7 @@ class LogServico(models.Model): Servico, on_delete=models.CASCADE, verbose_name=_("Serviço") ) descricao = models.CharField(_("Breve descrição da ação"), max_length=60) - data = models.DateField(_("Data da ação"), default=date.today) + data = models.DateField(_("Data da ação"), default=timezone.localdate) log = models.TextField(_("Log da ação")) def __str__(self):