class AgendaCriterio(Model): agenda = FK(_("Agenda"), Agenda) criterio = FK(_("Critério"), Criterio) active = BooleanField(_("Ativo")) class Meta: verbose_name = _("Critério da agenda") verbose_name_plural = _("Critérios das agendas") ordering = ['criterio__titulo'] unique_together = [['agenda', 'criterio']] def __str__(self): return f'{self.criterio}'
class Autorizacao(Model): agenda = FK(_('Agenda'), Agenda) grupo = FK(_('Papel'), Group) user = FK(_('Usuário'), get_user_model()) active = BooleanField('Ativo') class Meta: verbose_name = _("Autorização") verbose_name_plural = _("Autorizações") ordering = ['active', 'grupo', 'user'] unique_together = [['agenda', 'user']] def __str__(self): return f"O usuário {self.user} na agenda {self.agenda} tem o papel {self.grupo}"
class Turma(Model): curso = FK(_('Curso'), Curso) codigo = StringField('Código', unique=True) active = BooleanField('Ativo') class Meta: verbose_name = "Turma" verbose_name_plural = "Turmas" ordering = ['codigo'] def __str__(self): return f'{self.codigo}' def save(self, *args, **kwargs): parts = self.codigo.split(".") if len(parts) != 4: raise ValidationError( "O código do curso está errado, deve ser:" " 'AAAAO.P.CCCCCC.TT'. AAAA=Ano, O=Perído de oferta," " P=Periodo do curso, CCCCCC=Código do curso, TT=Turma") codigo_curso = parts[2] if codigo_curso != self.curso.codigo: raise ValidationError( f"O código do curso está errado é {self.curso.codigo}," f" mas você informou no código da turma é que o código curos é {codigo_curso}." ) super().save(*args, **kwargs)
class CriterioAvaliado(Model): solicitacao = FK(_("Solicitacao"), Solicitacao) criterio = FK(_("Critério"), AgendaCriterio) confere = BooleanField(_("Confere")) class Meta: verbose_name = _("Critério avaliado") verbose_name_plural = _("Critérios avaliados") ordering = ['criterio__criterio__titulo'] def __str__(self): return f'{self.criterio}' def save(self, *args, **kwargs): if self.solicitacao.agenda_id != self.criterio.agenda_id: raise ValidationError( _("Este critério não é da mesma agenda que esta solicitação")) super().save(*args, **kwargs)
class Curso(Model): diretoria = FK(_('Diretoria'), Diretoria) codigo = StringField('Código', unique=True) nome = StringField('Nome') descricao = StringField('Descrição') active = BooleanField('Ativo') class Meta: verbose_name = "Curso" verbose_name_plural = "Cursos" ordering = ['nome'] def __str__(self): return f'{self.codigo} - {self.nome}'
class Diretoria(Model): campus = FK(_('Campus'), Campus) sigla = StringField('Sigla') descricao = StringField(_('Descrição')) active = BooleanField('Ativo') class Meta: verbose_name = "Diretoria" verbose_name_plural = "Diretorias" ordering = ['sigla'] unique_together = [ ['campus', 'sigla'], ] def __str__(self): return f'{self.sigla}/{self.campus.sigla}'
class Vaga(Model): class DiaDaSemana(TextChoices): SEGUNDA = str(calendar.MONDAY), _('Seg') TERCA = str(calendar.TUESDAY), _('Ter') QUARTA = str(calendar.WEDNESDAY), _('Qua') QUINTA = str(calendar.THURSDAY), _('Qui') SEXTA = str(calendar.FRIDAY), _('Sex') SAB = str(calendar.SATURDAY), _('Sab') DOM = str(calendar.SUNDAY), _('Dom') agenda = FK(_('Agenda'), Agenda) dia = StringField(_('Dia da semana'), choices=DiaDaSemana.choices) inicio = TimeField(_('Início')) fim = TimeField(_('Fim')) atendimentos = PositiveIntegerField( _('Quantidade de atendimentos na janela')) class Meta: verbose_name = _("Vaga") verbose_name_plural = _("Vagas") ordering = ['dia', 'inicio'] def __str__(self): return f"Até {self.atendimentos} atendimentos no dia {self.dia}, das {self.inicio} às {self.fim}"
class Solicitacao(Model): class Status(TextChoices): SOLICITADO = 'Solicitado', _('Solicitado') DEFERIDO = 'Deferido', _('Deferido') INDEFERIDO = 'Indeferido', _('Indeferido') CANCELADO = 'Cancelado', _('Cancelado') bloqueantes = [Status.SOLICITADO, Status.DEFERIDO] agenda = FK(_('Agenda'), Agenda) inicio = DateTimeField(_("Agendado para")) fim = DateTimeField(_("Termina em")) solicitante = FK(_('Solicitante'), get_user_model(), related_name="solicitantes") status = StringField(_('Status'), choices=Status.choices, default=Status.SOLICITADO) avaliador = NullFK('Avaliador', get_user_model(), related_name="avaliadores") justificativa = TextField(_('Justificativa'), **nullable) avaliado_em = DateTimeField(_("Avaliado em"), **nullable) cancelado_em = DateTimeField(_("Cancelado"), **nullable) observacao = TextField(_("Observação"), **nullable) class Meta: verbose_name = _("Solicitação") verbose_name_plural = _("Solicitações") ordering = ['inicio'] def __str__(self): avaliado_por = f"por {self.avaliador}." if self.status != Solicitacao.Status.SOLICITADO else "." return f"De {self.inicio} às {self.fim}, horário reservado para {self.solicitante}. {self.status}" + avaliado_por def save(self, *args, **kwargs): if self.status == Solicitacao.Status.INDEFERIDO and self.justificativa == '': raise ValidationError( "A justificativa deve ser informada sempre que houver um indeferimento." ) if self.status in [ Solicitacao.Status.INDEFERIDO, Solicitacao.Status.DEFERIDO ]: self.avaliado_em = now() super().save(*args, **kwargs) if self.solicitante.email is not None and self.solicitante.email != '': if self.status == Solicitacao.Status.SOLICITADO: subject = _("Solicitação de agendamento") agora = localtime(now()).strftime('%d/%m/%Y às %H:%M') inicio = self.inicio.strftime('%d/%m/%Y às %H:%M') template = _( f'Você está recebendo esta mensagem pois em {agora} você SOLICITOU um agendamento para {inicio}. Lembre-se de chegar uns 15 minutos antes.' ) elif self.status == Solicitacao.Status.DEFERIDO: inicio = localtime(self.inicio).strftime('%d/%m/%Y às %H:%M') subject = _("Agendamento aprovado") template = _( f'Você está recebendo esta mensagem pois seu agendamento para {inicio} foi APROVADO. Lembre-se de chegar uns 15 minutos antes.' ) elif self.status == Solicitacao.Status.INDEFERIDO: inicio = localtime(self.inicio).strftime('%d/%m/%Y às %H:%M') subject = _("Agendamento negado") template = _( f'Você está recebendo esta mensagem pois seu agendamento para {inicio} foi NEGADO. O motivo foi: "{self.justificativa}".' ) elif self.status == Solicitacao.Status.CANCELADO: inicio = localtime(self.inicio).strftime('%d/%m/%Y às %H:%M') subject = _("Agendamento cancelado") template = _( f'Você está recebendo esta mensagem pois seu agendamento para {inicio} foi CANCELADO. Se não foi feito por você, favor realizar outro agendamento.' ) else: raise ValidationError("Status inválido") send_mail(subject, template, None, [self.solicitante.email], fail_silently=True)