diff --git a/sigi/apps/eventos/migrations/0046_tipoevento_gerar_turma_alter_evento_turma.py b/sigi/apps/eventos/migrations/0046_tipoevento_gerar_turma_alter_evento_turma.py new file mode 100644 index 0000000..8adb5bf --- /dev/null +++ b/sigi/apps/eventos/migrations/0046_tipoevento_gerar_turma_alter_evento_turma.py @@ -0,0 +1,38 @@ +# Generated by Django 4.2.4 on 2023-09-25 12:15 + +import django.core.validators +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("eventos", "0045_alter_evento_banner"), + ] + + operations = [ + migrations.AddField( + model_name="tipoevento", + name="gerar_turma", + field=models.BooleanField( + default=True, + help_text="Se o campo 'turma' for deixado em branco, o sistema deve gerar um número de turma automaticamente, com base no ano da data de início do evento?", + verbose_name="Gerar turma", + ), + ), + migrations.AlterField( + model_name="evento", + name="turma", + field=models.CharField( + blank=True, + help_text="Se deixado em branco e o evento tiver status CONFIRMADO e data de início definida, o número da turma será gerado automaticamente.", + max_length=100, + validators=[ + django.core.validators.RegexValidator( + "^\\d{2}/\\d{4}$", + "Formato inválido. Utilize nn/aaaa, onde 'nn' são dígitos numéricos e 'aaaa' o ano com quatro dígitos.", + ) + ], + verbose_name="turma", + ), + ), + ] diff --git a/sigi/apps/eventos/models.py b/sigi/apps/eventos/models.py index bc155e7..e4a5e89 100644 --- a/sigi/apps/eventos/models.py +++ b/sigi/apps/eventos/models.py @@ -39,6 +39,15 @@ class TipoEvento(models.Model): casa_solicita = models.BooleanField( _("casa pode solicitar"), default=False ) + gerar_turma = models.BooleanField( + _("Gerar turma"), + default=True, + help_text=_( + "Se o campo 'turma' for deixado em branco, o sistema deve gerar " + "um número de turma automaticamente, com base no ano da data de " + "início do evento?" + ), + ) duracao = models.PositiveIntegerField(_("Duração (dias)"), default=1) moodle_template_courseid = models.PositiveBigIntegerField( _("Curso protótipo"), @@ -335,6 +344,11 @@ class Evento(models.Model): ), ) ], + help_text=_( + "Se deixado em branco e o evento tiver status CONFIRMADO e " + "data de início definida, o número da turma será " + "gerado automaticamente." + ), ) descricao = models.TextField( _("Descrição do evento"), @@ -527,15 +541,34 @@ class Evento(models.Model): _("Data de término deve ser posterior à data de início") ) - super().save(*args, **kwargs) - save_again = False - - total = self.convite_set.aggregate(total=Sum("qtde_participantes")) - total = total["total"] - + if ( + self.turma == "" + and self.data_inicio + and self.status == Evento.STATUS_CONFIRMADO + and self.tipo_evento.gerar_turma + ): + ano = self.data_inicio.year + ultimo_evento = ( + Evento.objects.filter( + tipo_evento=self.tipo_evento, + turma__regex=f"\d{{2}}/{ano:04}$", + ) + .order_by("turma") + .last() + ) + if ultimo_evento is None: + proximo = 1 + else: + proximo = int(ultimo_evento.turma[:2]) + 1 + self.turma = f"{proximo:02}/{ano:04}" + + total = self.convite_set.aggregate(total=Sum("qtde_participantes"))[ + "total" + ] if total and total > 0: self.total_participantes = total - super().save(*args, **kwargs) + + super().save(*args, **kwargs) if self.status in [ Evento.STATUS_PLANEJAMENTO,