Source code for sme_sigpae_api.cardapio.base.models

from django.db import models
from django_prometheus.models import ExportModelOperationsMixin

from sme_sigpae_api.cardapio.base.behaviors import TemLabelDeTiposDeAlimentacao
from sme_sigpae_api.dados_comuns.behaviors import (
    Ativavel,
    CriadoEm,
    Descritivel,
    Nomeavel,
    Posicao,
    TemChaveExterna,
    TemData,
)


[docs] class TipoAlimentacao( ExportModelOperationsMixin("tipo_alimentacao"), Nomeavel, TemChaveExterna, Posicao ): """Compõe parte do cardápio. Dejejum Colação Almoço Refeição Sobremesa Lanche 4 horas Lanche 5 horas Lanche 6 horas Lanche Emergencial """ LANCHE_EMERGENCIAL = "Lanche Emergencial" LANCHE_4H = "Lanche 4h" @property def substituicoes_periodo_escolar(self): return self.substituicoes_periodo_escolar def __str__(self): return self.nome class Meta: verbose_name = "Tipo de alimentação" verbose_name_plural = "Tipos de alimentação" ordering = ["posicao"]
[docs] class HorarioDoComboDoTipoDeAlimentacaoPorUnidadeEscolar(TemChaveExterna): hora_inicial = models.TimeField(auto_now=False, auto_now_add=False) hora_final = models.TimeField(auto_now=False, auto_now_add=False) escola = models.ForeignKey( "escola.Escola", blank=True, null=True, on_delete=models.DO_NOTHING ) tipo_alimentacao = models.ForeignKey( "cardapio.TipoAlimentacao", blank=True, null=True, on_delete=models.DO_NOTHING ) periodo_escolar = models.ForeignKey( "escola.PeriodoEscolar", blank=True, null=True, on_delete=models.DO_NOTHING ) def __str__(self): return f"{self.tipo_alimentacao.nome} DE: {self.hora_inicial} ATE: {self.hora_final}"
[docs] class ComboDoVinculoTipoAlimentacaoPeriodoTipoUE( ExportModelOperationsMixin("substituicoes_vinculo_alimentacao"), TemChaveExterna, TemLabelDeTiposDeAlimentacao, ): tipos_alimentacao = models.ManyToManyField( "TipoAlimentacao", related_name="%(app_label)s_%(class)s_possibilidades", help_text="Tipos de alimentacao do combo.", blank=True, ) vinculo = models.ForeignKey( "VinculoTipoAlimentacaoComPeriodoEscolarETipoUnidadeEscolar", null=True, on_delete=models.CASCADE, related_name="combos", )
[docs] def pode_excluir(self): # TODO: incrementar esse método, impedir exclusão se tiver # solicitações em cima desse combo também. return not self.substituicoes.exists()
def __str__(self): tipos_alimentacao_nome = [ nome for nome in self.tipos_alimentacao.values_list("nome", flat=True) ] return f"TiposAlim.: {tipos_alimentacao_nome}" class Meta: verbose_name = "Combo do vínculo tipo alimentação" verbose_name_plural = "Combos do vínculo tipo alimentação"
[docs] class SubstituicaoDoComboDoVinculoTipoAlimentacaoPeriodoTipoUE( TemChaveExterna, TemLabelDeTiposDeAlimentacao ): tipos_alimentacao = models.ManyToManyField( "TipoAlimentacao", related_name="%(app_label)s_%(class)s_possibilidades", help_text="Tipos de alimentacao das substituições dos combos.", blank=True, ) combo = models.ForeignKey( "ComboDoVinculoTipoAlimentacaoPeriodoTipoUE", null=True, on_delete=models.CASCADE, related_name="substituicoes", )
[docs] def pode_excluir(self): # TODO: incrementar esse método, impedir exclusão se tiver # solicitações em cima dessa substituição do combo. return True
def __str__(self): tipos_alimentacao_nome = [ nome for nome in self.tipos_alimentacao.values_list("nome", flat=True) ] return f"TiposAlim.:{tipos_alimentacao_nome}" class Meta: verbose_name = "Substituição do combo do vínculo tipo alimentação" verbose_name_plural = "Substituições do combos do vínculo tipo alimentação"
[docs] class VinculoTipoAlimentacaoComPeriodoEscolarETipoUnidadeEscolar( ExportModelOperationsMixin("vinculo_alimentacao_periodo_escolar_tipo_ue"), Ativavel, TemChaveExterna, ): """Vincular vários tipos de alimentação a um periodo e tipo de U.E. Dado o tipo_unidade_escolar (EMEI, EMEF...) e em seguida o periodo_escolar(MANHA, TARDE..), trazer os tipos de alimentação que podem ser servidos. Ex.: Para CEI(creche) pela manhã (período) faz sentido ter mingau e não café da tarde. """ # TODO: Refatorar para usar EscolaPeriodoEscolar tipo_unidade_escolar = models.ForeignKey( "escola.TipoUnidadeEscolar", null=True, on_delete=models.DO_NOTHING ) periodo_escolar = models.ForeignKey( "escola.PeriodoEscolar", null=True, on_delete=models.DO_NOTHING ) tipos_alimentacao = models.ManyToManyField( "TipoAlimentacao", related_name="vinculos", blank=True ) def __str__(self): return f"{self.tipo_unidade_escolar.iniciais} - {self.periodo_escolar.nome}" class Meta: unique_together = [["periodo_escolar", "tipo_unidade_escolar"]] verbose_name = "Vínculo tipo alimentação" verbose_name_plural = "Vínculos tipo alimentação"
[docs] class Cardapio( ExportModelOperationsMixin("cardapio"), Descritivel, Ativavel, TemData, TemChaveExterna, CriadoEm, ): """Cardápio escolar. tem 1 data pra acontecer ex (26/06) tem 1 lista de tipos de alimentação (Dejejum, Colação, Almoço, LANCHE DE 4 HS OU 8 HS; LANCHE DE 5HS OU 6 HS; REFEIÇÃO). !!!OBS!!! PARA CEI varia por faixa de idade. """ tipos_alimentacao = models.ManyToManyField(TipoAlimentacao) edital = models.ForeignKey( "terceirizada.Edital", on_delete=models.DO_NOTHING, related_name="editais" ) @property # type: ignore def tipos_unidade_escolar(self): return self.tipos_unidade_escolar def __str__(self): if self.descricao: return f"{self.data} - {self.descricao}" return f"{self.data}" class Meta: verbose_name = "Cardápio" verbose_name_plural = "Cardápios"
[docs] class MotivoDRENaoValida( ExportModelOperationsMixin("motivo_dre_nao_valida"), Nomeavel, TemChaveExterna ): """Usado em conjunto com Solicitações que passam por validação da DRE. Exemplos: - Em desacordo com o contrato - Preenchimento incorreto - Outro """ def __str__(self): return self.nome class Meta: verbose_name = "Motivo de não validação da DRE" verbose_name_plural = "Motivos de não validação da DRE"