Browse Source

Melhorias nos reports de cronjobs.

pull/169/head 3.0.64
Sesóstris Vieira 1 year ago
parent
commit
f6eeadd7d4
  1. 2
      sigi/apps/convenios/jobs/hourly/importa_gescon.py
  2. 19
      sigi/apps/convenios/models.py
  3. 9
      sigi/apps/eventos/admin.py
  4. 9
      sigi/apps/eventos/jobs/sample.py
  5. 21
      sigi/apps/eventos/migrations/0056_evento_origem_sincronizacao.py
  6. 6
      sigi/apps/eventos/models.py
  7. 2
      sigi/apps/utils/management/jobs.py

2
sigi/apps/convenios/jobs/hourly/importa_gescon.py

@ -12,5 +12,5 @@ class Job(JobReportMixin, HourlyJob):
def do_job(self): def do_job(self):
gescon = Gescon.load() gescon = Gescon.load()
gescon.importa_contratos() self.send_report_mail = gescon.importa_contratos()
self.report_data = gescon.ultima_importacao.splitlines() self.report_data = gescon.ultima_importacao.splitlines()

19
sigi/apps/convenios/models.py

@ -617,6 +617,12 @@ class Gescon(models.Model):
self.save() self.save()
def importa_contratos(self): def importa_contratos(self):
"""Importa dados de convênios do GESCON
Returns:
boolean: Indica se o que reportar ao usuário (erro ou dados
importados/atualizados)
"""
self.ultima_importacao = "" self.ultima_importacao = ""
if self.checksums is None: if self.checksums is None:
self.checksums = {} self.checksums = {}
@ -635,12 +641,13 @@ class Gescon(models.Model):
), ),
True, True,
) )
return True
if self.subespecies == "": if self.subespecies == "":
self.add_message( self.add_message(
_("Nenhuma subespécie definida - processo " "abortado."), True _("Nenhuma subespécie definida - processo " "abortado."), True
) )
return return True
if "{s}" not in self.url_gescon: if "{s}" not in self.url_gescon:
self.add_message( self.add_message(
@ -651,7 +658,7 @@ class Gescon(models.Model):
), ),
True, True,
) )
return return True
palavras = self.palavras.splitlines() palavras = self.palavras.splitlines()
excludentes = self.palavras_excluir.splitlines() excludentes = self.palavras_excluir.splitlines()
@ -664,6 +671,7 @@ class Gescon(models.Model):
} }
requests.packages.urllib3.disable_warnings() requests.packages.urllib3.disable_warnings()
report_user = False
for sigla_gescon, sigla_sigi in subespecies: for sigla_gescon, sigla_sigi in subespecies:
self.add_message(_(f"\n**Importando subespécie {sigla_gescon}**")) self.add_message(_(f"\n**Importando subespécie {sigla_gescon}**"))
@ -675,12 +683,14 @@ class Gescon(models.Model):
response = requests.get(url, verify=False) response = requests.get(url, verify=False)
except Exception as e: except Exception as e:
self.add_message(_(f"\tErro ao acessar {url}: {e.message}")) self.add_message(_(f"\tErro ao acessar {url}: {e.message}"))
report_user = True
continue continue
if not response.ok: if not response.ok:
self.add_message( self.add_message(
_(f"\tErro ao acessar {url}: {response.reason}") _(f"\tErro ao acessar {url}: {response.reason}")
) )
report_user = True
continue continue
if not "application/json" in response.headers.get("Content-Type"): if not "application/json" in response.headers.get("Content-Type"):
@ -690,6 +700,7 @@ class Gescon(models.Model):
"retornou dados em formato json" "retornou dados em formato json"
) )
) )
report_user = True
continue continue
md5sum = md5(response.text.encode(response.encoding)).hexdigest() md5sum = md5(response.text.encode(response.encoding)).hexdigest()
@ -945,6 +956,9 @@ class Gescon(models.Model):
erros += 1 erros += 1
continue continue
if novos or erros or alertas or atualizados:
report_user = True
self.add_message( self.add_message(
_( _(
f"\t{novos} novos convenios adicionados ao SIGI, " f"\t{novos} novos convenios adicionados ao SIGI, "
@ -955,6 +969,7 @@ class Gescon(models.Model):
self.checksums[sigla_gescon] = md5sum self.checksums[sigla_gescon] = md5sum
self.save() self.save()
return report_user
@classmethod @classmethod
def load(cls): def load(cls):

9
sigi/apps/eventos/admin.py

@ -904,6 +904,7 @@ class EventoAdmin(AsciifyQParameter, CartExportReportMixin, admin.ModelAdmin):
"inscritos_saberes", "inscritos_saberes",
"aprovados_saberes", "aprovados_saberes",
"data_sincronizacao", "data_sincronizacao",
"origem_sincronizacao",
"data_cancelamento", "data_cancelamento",
"motivo_cancelamento", "motivo_cancelamento",
) )
@ -985,6 +986,7 @@ class EventoAdmin(AsciifyQParameter, CartExportReportMixin, admin.ModelAdmin):
"inscritos_saberes", "inscritos_saberes",
"aprovados_saberes", "aprovados_saberes",
"data_sincronizacao", "data_sincronizacao",
"origem_sincronizacao",
) )
inlines = ( inlines = (
EquipeInline, EquipeInline,
@ -1869,7 +1871,12 @@ class EventoAdmin(AsciifyQParameter, CartExportReportMixin, admin.ModelAdmin):
return redirect(change_url) return redirect(change_url)
try: try:
evento.sincroniza_saberes() evento.sincroniza_saberes(
origem=_(
"Sincronizado manualmente por "
f"{request.user.get_full_name()}"
)
)
except Evento.SaberesSyncException as e: except Evento.SaberesSyncException as e:
self.message_user( self.message_user(
request, request,

9
sigi/apps/eventos/jobs/sample.py

@ -1,9 +0,0 @@
from django_extensions.management.jobs import BaseJob
class Job(BaseJob):
help = "My sample job."
def execute(self):
# executing empty sample job
pass

21
sigi/apps/eventos/migrations/0056_evento_origem_sincronizacao.py

@ -0,0 +1,21 @@
# Generated by Django 4.2.4 on 2023-12-18 15:07
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("eventos", "0055_evento_reserva"),
]
operations = [
migrations.AddField(
model_name="evento",
name="origem_sincronizacao",
field=models.CharField(
blank=True,
max_length=100,
verbose_name="origem da sincronização",
),
),
]

6
sigi/apps/eventos/models.py

@ -414,6 +414,9 @@ class Evento(models.Model):
null=True, null=True,
editable=False, editable=False,
) )
origem_sincronizacao = models.CharField(
_("origem da sincronização"), max_length=100, blank=True
)
status = models.CharField( status = models.CharField(
_("Status"), max_length=1, choices=STATUS_CHOICES _("Status"), max_length=1, choices=STATUS_CHOICES
) )
@ -545,7 +548,7 @@ class Evento(models.Model):
+ f"/course/view.php?id={self.moodle_courseid}" + f"/course/view.php?id={self.moodle_courseid}"
) )
def sincroniza_saberes(self): def sincroniza_saberes(self, origem="Cronjob"):
if self.moodle_courseid is None: if self.moodle_courseid is None:
raise Evento.SaberesSyncException( raise Evento.SaberesSyncException(
_("Este evento não tem curso associado no Saberes"), _("Este evento não tem curso associado no Saberes"),
@ -602,6 +605,7 @@ class Evento(models.Model):
self.inscritos_saberes = len(participantes) self.inscritos_saberes = len(participantes)
self.aprovados_saberes = aprovados self.aprovados_saberes = aprovados
self.data_sincronizacao = timezone.localtime() self.data_sincronizacao = timezone.localtime()
self.origem_sincronizacao = origem
# O total de participantes em eventos que possuem curso no Saberes # O total de participantes em eventos que possuem curso no Saberes
# é sempre o número de aprovados no Saberes, independente do que o # é sempre o número de aprovados no Saberes, independente do que o

2
sigi/apps/utils/management/jobs.py

@ -21,6 +21,7 @@ class JobReportMixin:
report_template = "emails/base_report.rst" report_template = "emails/base_report.rst"
report_data = None report_data = None
sys_user = None sys_user = None
send_report_mail = True
def execute(self): def execute(self):
start_time = datetime.datetime.now() start_time = datetime.datetime.now()
@ -108,6 +109,7 @@ class JobReportMixin:
"output_encoding": "unicode", "output_encoding": "unicode",
}, },
) )
if self.send_report_mail:
mail_admins( mail_admins(
subject=f"JOB: {self.help}", subject=f"JOB: {self.help}",
message=rst, message=rst,

Loading…
Cancel
Save