diff --git a/sigi/apps/utils/admin.py b/sigi/apps/utils/admin.py index 0696222..a444852 100644 --- a/sigi/apps/utils/admin.py +++ b/sigi/apps/utils/admin.py @@ -67,6 +67,7 @@ class CronjobAdmin(admin.ModelAdmin): "get_runner", "destinatario_email", "digest", + "last_digest", ) fields = [ "job_name", @@ -76,6 +77,7 @@ class CronjobAdmin(admin.ModelAdmin): "manter_logs", "destinatario_email", "digest", + "last_digest", ] readonly_fields = ("job_name", "app_name", "get_help") inlines = [JobScheduleInline] @@ -161,7 +163,6 @@ class JobScheduleAdmin(admin.ModelAdmin): "iniciado", "tempo_gasto", "get_runner", - "enviado", ] fields = [ "job", @@ -169,7 +170,6 @@ class JobScheduleAdmin(admin.ModelAdmin): "iniciar", "iniciado", "tempo_gasto", - "enviado", ] readonly_fields = fields list_filter = ("status", "job") diff --git a/sigi/apps/utils/models.py b/sigi/apps/utils/models.py index 9fe630a..feb8c79 100644 --- a/sigi/apps/utils/models.py +++ b/sigi/apps/utils/models.py @@ -1,7 +1,6 @@ import io from contextlib import redirect_stderr, redirect_stdout from cron_converter import Cron -from pyexpat import model from django.db import models from django.contrib.auth.models import Group from django.utils import timezone @@ -72,12 +71,14 @@ class Cronjob(models.Model): ), default=30, ) - destinatario_email = models.TextField( _("destinatário(s) de e-mail"), help_text=_("Insira um endereço de e-mail por linha."), blank=True, ) + last_digest = models.DateTimeField( + _("último envio de digest"), blank=True, null=True + ) def get_emails_list(self): return [ @@ -86,9 +87,6 @@ class Cronjob(models.Model): if email.strip() ] - def __str__(self): - return f"Destinatários: {', '.join(self.get_emails_list())}" - class Meta: ordering = ("app_name", "job_name") verbose_name = _("Cron job") @@ -177,7 +175,6 @@ class JobSchedule(models.Model): resultado = models.TextField( _("resultado da execução"), blank=True, editable=False ) - enviado = models.BooleanField(_("enviado"), default=False) class Meta: ordering = ("-iniciar",) @@ -224,7 +221,10 @@ class JobSchedule(models.Model): if self.job.destinatario_email == "": return + now = timezone.localtime() + if self.job.digest == "N": + # Envia imediatamente sem acumular send_mail( subject=f"JOB: {self.job.job_name}", message=self.resultado, @@ -233,47 +233,47 @@ class JobSchedule(models.Model): fail_silently=True, html_message=self.resultado, ) - self.enviado = True - self.save() + self.job.last_digest = now + self.job.save() - elif self.job.digest == "D": - self.send_digest_email(frequency="daily") + else: + # Determina o período de digest + if self.job.digest == "D": + period = timedelta(days=1) + elif self.job.digest == "S": + period = timedelta(weeks=1) + else: + raise ValueError( + f"Valor inválido para digest: {self.job.digest}" + ) - elif self.job.digest == "S": - self.send_digest_email(frequency="weekly") + # Se o período foi atingido desde o último digest, envia + if ( + not self.job.last_digest + or now >= self.job.last_digest + period + ): + self.send_digest_email(frequency=self.job.digest) + self.job.last_digest = now + self.job.save() def send_digest_email(self, frequency): - """Envia email de digest diário ou semanal.""" + """Envia email de digest acumulando jobs desde o último digest.""" now = timezone.localtime() - # Definir horário estático - send_time = timezone.datetime.min.time() # Meia-noite - today = now.date() - - if frequency == "daily": - # Verifica se é meia-noite - if now.time() != send_time: - return - - # Definir início do período como o dia anterior - period_start = today - timedelta(days=1) - - elif frequency == "weekly": - # Verifica se é segunda-feira e se é meia-noite - if today.weekday() != 0 or now.time() != send_time: - return - - # Define o início do período como segunda-feira da semana passada - period_start = today - timedelta(days=7) - + # Determina o período de acumulação baseado no último digest + if self.job.last_digest: + period_start = self.job.last_digest else: - raise ValueError("Invalid frequency for digest email.") + period_start = ( + now - timedelta(days=1) + if frequency == "D" + else now - timedelta(weeks=1) + ) job_schedules = JobSchedule.objects.filter( job=self.job, status=JobSchedule.STATUS_CONCLUIDO, iniciado__gte=period_start, - enviado=False, ) if job_schedules.exists(): @@ -293,8 +293,6 @@ class JobSchedule(models.Model): html_message=message, ) - job_schedules.update(enviado=True) - class Config(models.Model): PARAMETRO_CHOICES = (