Browse Source

Melhoria na verificação de serviços ativos

pull/159/head
Sesostris Vieira 3 years ago
parent
commit
7e29edd02f
  1. 3
      sigi/apps/servicos/admin.py
  2. 27
      sigi/apps/servicos/management/commands/atualiza_uso_servico.py
  3. 23
      sigi/apps/servicos/migrations/0012_servico_data_verificacao_and_more.py
  4. 56
      sigi/apps/servicos/models.py

3
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",

27
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}"
)

23
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'),
),
]

56
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 = "<br/>".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):

Loading…
Cancel
Save