From f6eeadd7d4e55270c3f8fc996d7968d7e95181f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ses=C3=B3stris=20Vieira?= Date: Mon, 18 Dec 2023 12:12:19 -0300 Subject: [PATCH] Melhorias nos reports de cronjobs. --- .../convenios/jobs/hourly/importa_gescon.py | 2 +- sigi/apps/convenios/models.py | 19 +++++++++++++++-- sigi/apps/eventos/admin.py | 9 +++++++- sigi/apps/eventos/jobs/sample.py | 9 -------- .../0056_evento_origem_sincronizacao.py | 21 +++++++++++++++++++ sigi/apps/eventos/models.py | 6 +++++- sigi/apps/utils/management/jobs.py | 14 +++++++------ 7 files changed, 60 insertions(+), 20 deletions(-) delete mode 100644 sigi/apps/eventos/jobs/sample.py create mode 100644 sigi/apps/eventos/migrations/0056_evento_origem_sincronizacao.py diff --git a/sigi/apps/convenios/jobs/hourly/importa_gescon.py b/sigi/apps/convenios/jobs/hourly/importa_gescon.py index 9cc08d0..518c03c 100644 --- a/sigi/apps/convenios/jobs/hourly/importa_gescon.py +++ b/sigi/apps/convenios/jobs/hourly/importa_gescon.py @@ -12,5 +12,5 @@ class Job(JobReportMixin, HourlyJob): def do_job(self): gescon = Gescon.load() - gescon.importa_contratos() + self.send_report_mail = gescon.importa_contratos() self.report_data = gescon.ultima_importacao.splitlines() diff --git a/sigi/apps/convenios/models.py b/sigi/apps/convenios/models.py index 0b7756c..6dd5806 100644 --- a/sigi/apps/convenios/models.py +++ b/sigi/apps/convenios/models.py @@ -617,6 +617,12 @@ class Gescon(models.Model): self.save() def importa_contratos(self): + """Importa dados de convênios do GESCON + + Returns: + boolean: Indica se há o que reportar ao usuário (erro ou dados + importados/atualizados) + """ self.ultima_importacao = "" if self.checksums is None: self.checksums = {} @@ -635,12 +641,13 @@ class Gescon(models.Model): ), True, ) + return True if self.subespecies == "": self.add_message( _("Nenhuma subespécie definida - processo " "abortado."), True ) - return + return True if "{s}" not in self.url_gescon: self.add_message( @@ -651,7 +658,7 @@ class Gescon(models.Model): ), True, ) - return + return True palavras = self.palavras.splitlines() excludentes = self.palavras_excluir.splitlines() @@ -664,6 +671,7 @@ class Gescon(models.Model): } requests.packages.urllib3.disable_warnings() + report_user = False for sigla_gescon, sigla_sigi in subespecies: self.add_message(_(f"\n**Importando subespécie {sigla_gescon}**")) @@ -675,12 +683,14 @@ class Gescon(models.Model): response = requests.get(url, verify=False) except Exception as e: self.add_message(_(f"\tErro ao acessar {url}: {e.message}")) + report_user = True continue if not response.ok: self.add_message( _(f"\tErro ao acessar {url}: {response.reason}") ) + report_user = True continue if not "application/json" in response.headers.get("Content-Type"): @@ -690,6 +700,7 @@ class Gescon(models.Model): "retornou dados em formato json" ) ) + report_user = True continue md5sum = md5(response.text.encode(response.encoding)).hexdigest() @@ -945,6 +956,9 @@ class Gescon(models.Model): erros += 1 continue + if novos or erros or alertas or atualizados: + report_user = True + self.add_message( _( f"\t{novos} novos convenios adicionados ao SIGI, " @@ -955,6 +969,7 @@ class Gescon(models.Model): self.checksums[sigla_gescon] = md5sum self.save() + return report_user @classmethod def load(cls): diff --git a/sigi/apps/eventos/admin.py b/sigi/apps/eventos/admin.py index bc07fbe..f6553f9 100644 --- a/sigi/apps/eventos/admin.py +++ b/sigi/apps/eventos/admin.py @@ -904,6 +904,7 @@ class EventoAdmin(AsciifyQParameter, CartExportReportMixin, admin.ModelAdmin): "inscritos_saberes", "aprovados_saberes", "data_sincronizacao", + "origem_sincronizacao", "data_cancelamento", "motivo_cancelamento", ) @@ -985,6 +986,7 @@ class EventoAdmin(AsciifyQParameter, CartExportReportMixin, admin.ModelAdmin): "inscritos_saberes", "aprovados_saberes", "data_sincronizacao", + "origem_sincronizacao", ) inlines = ( EquipeInline, @@ -1869,7 +1871,12 @@ class EventoAdmin(AsciifyQParameter, CartExportReportMixin, admin.ModelAdmin): return redirect(change_url) try: - evento.sincroniza_saberes() + evento.sincroniza_saberes( + origem=_( + "Sincronizado manualmente por " + f"{request.user.get_full_name()}" + ) + ) except Evento.SaberesSyncException as e: self.message_user( request, diff --git a/sigi/apps/eventos/jobs/sample.py b/sigi/apps/eventos/jobs/sample.py deleted file mode 100644 index b1ae62c..0000000 --- a/sigi/apps/eventos/jobs/sample.py +++ /dev/null @@ -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 diff --git a/sigi/apps/eventos/migrations/0056_evento_origem_sincronizacao.py b/sigi/apps/eventos/migrations/0056_evento_origem_sincronizacao.py new file mode 100644 index 0000000..423e958 --- /dev/null +++ b/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", + ), + ), + ] diff --git a/sigi/apps/eventos/models.py b/sigi/apps/eventos/models.py index 2d8e09d..0a30821 100644 --- a/sigi/apps/eventos/models.py +++ b/sigi/apps/eventos/models.py @@ -414,6 +414,9 @@ class Evento(models.Model): null=True, editable=False, ) + origem_sincronizacao = models.CharField( + _("origem da sincronização"), max_length=100, blank=True + ) status = models.CharField( _("Status"), max_length=1, choices=STATUS_CHOICES ) @@ -545,7 +548,7 @@ class Evento(models.Model): + f"/course/view.php?id={self.moodle_courseid}" ) - def sincroniza_saberes(self): + def sincroniza_saberes(self, origem="Cronjob"): if self.moodle_courseid is None: raise Evento.SaberesSyncException( _("Este evento não tem curso associado no Saberes"), @@ -602,6 +605,7 @@ class Evento(models.Model): self.inscritos_saberes = len(participantes) self.aprovados_saberes = aprovados self.data_sincronizacao = timezone.localtime() + self.origem_sincronizacao = origem # O total de participantes em eventos que possuem curso no Saberes # é sempre o número de aprovados no Saberes, independente do que o diff --git a/sigi/apps/utils/management/jobs.py b/sigi/apps/utils/management/jobs.py index f9054aa..b52c93a 100644 --- a/sigi/apps/utils/management/jobs.py +++ b/sigi/apps/utils/management/jobs.py @@ -21,6 +21,7 @@ class JobReportMixin: report_template = "emails/base_report.rst" report_data = None sys_user = None + send_report_mail = True def execute(self): start_time = datetime.datetime.now() @@ -108,10 +109,11 @@ class JobReportMixin: "output_encoding": "unicode", }, ) - mail_admins( - subject=f"JOB: {self.help}", - message=rst, - html_message=html, - fail_silently=True, - ) + if self.send_report_mail: + mail_admins( + subject=f"JOB: {self.help}", + message=rst, + html_message=html, + fail_silently=True, + ) print(rst)