import datetime
from collections import OrderedDict
from django.db.models import Case, CharField, Q, Value, When
from rest_framework import serializers
from src.dados_comuns.fluxo_status import DocumentoDeRecebimentoWorkflow
from src.dados_comuns.utils import numero_com_agrupador_de_milhar_e_decimal
from src.pre_recebimento.cronograma_entrega.models import (
Cronograma,
EtapasDoCronograma,
InterrupcaoProgramadaEntrega,
ProgramacaoDoRecebimentoDoCronograma,
SolicitacaoAlteracaoCronograma,
UnidadeMedida,
)
from src.pre_recebimento.documento_recebimento.api.serializers.serializers import (
DocRecebimentoFichaDeRecebimentoSerializer,
)
from src.pre_recebimento.ficha_tecnica.api.serializers.serializers import (
FichaTecnicaCronogramaSerializer,
)
from src.pre_recebimento.qualidade.models import (
TipoEmbalagemQld,
)
from src.terceirizada.api.serializers.serializers import (
ContratoSimplesSerializer,
DistribuidorComEnderecoSimplesSerializer,
DistribuidorSimplesSerializer,
TerceirizadaLookUpSerializer,
)
from .....dados_comuns.api.serializers import (
LogSolicitacoesUsuarioSerializer,
)
[docs]
class ProgramacaoDoRecebimentoDoCronogramaSerializer(serializers.ModelSerializer):
[docs]
class EtapasDoCronogramaSerializer(serializers.ModelSerializer):
data_programada = serializers.SerializerMethodField()
etapa = serializers.SerializerMethodField()
parte = serializers.SerializerMethodField()
quantidade_estimada_disponivel = serializers.SerializerMethodField()
[docs]
def get_data_programada(self, obj):
if not obj.data_programada:
return None
if obj.cronograma and obj.cronograma.ponto_a_ponto:
return obj.data_programada.strftime("%m/%Y")
return obj.data_programada.strftime("%d/%m/%Y")
[docs]
def get_etapa(self, obj):
return f"Etapa {obj.etapa}" if obj.etapa is not None else None
[docs]
def get_parte(self, obj):
return f"Parte {obj.parte}" if obj.parte is not None else None
[docs]
def get_quantidade_estimada_disponivel(self, obj):
return obj.quantidade_estimada_disponivel
[docs]
class EtapasDoCronogramaCalendarioSerializer(serializers.ModelSerializer):
nome_produto = serializers.SerializerMethodField()
uuid_cronograma = serializers.SerializerMethodField()
numero_cronograma = serializers.SerializerMethodField()
nome_fornecedor = serializers.SerializerMethodField()
data_programada = serializers.SerializerMethodField()
status = serializers.SerializerMethodField()
unidade_medida = serializers.SerializerMethodField()
etapa = serializers.SerializerMethodField()
parte = serializers.SerializerMethodField()
programa_leve_leite = serializers.SerializerMethodField()
[docs]
def get_etapa(self, obj):
return f"Etapa {obj.etapa}" if obj.etapa is not None else None
[docs]
def get_parte(self, obj):
return f"Parte {obj.parte}" if obj.parte is not None else None
[docs]
def get_nome_produto(self, obj):
try:
return obj.cronograma.ficha_tecnica.produto.nome
except AttributeError:
return None
[docs]
def get_uuid_cronograma(self, obj):
return obj.cronograma.uuid if obj.cronograma else None
[docs]
def get_numero_cronograma(self, obj):
return str(obj.cronograma.numero) if obj.cronograma else None
[docs]
def get_nome_fornecedor(self, obj):
return obj.cronograma.empresa.nome_fantasia if obj.cronograma.empresa else None
[docs]
def get_data_programada(self, obj):
if not obj.data_programada:
return None
if obj.cronograma and obj.cronograma.ponto_a_ponto:
return obj.data_programada.strftime("%m/%Y")
return obj.data_programada.strftime("%d/%m/%Y")
[docs]
def get_status(self, obj):
return obj.cronograma.get_status_display() if obj.cronograma else None
[docs]
def get_unidade_medida(self, obj):
return obj.cronograma.unidade_medida.abreviacao if obj.cronograma else None
[docs]
def get_programa_leve_leite(self, obj):
try:
return obj.cronograma.ficha_tecnica.programa == "LEVE_LEITE"
except AttributeError:
return False
[docs]
class SolicitacaoAlteracaoCronogramaSerializer(serializers.ModelSerializer):
fornecedor = serializers.CharField(source="cronograma.empresa")
cronograma = serializers.CharField(source="cronograma.numero")
status = serializers.CharField(source="get_status_display")
programa_leve_leite = serializers.SerializerMethodField()
[docs]
def get_programa_leve_leite(self, obj):
try:
return obj.cronograma.ficha_tecnica.programa == "LEVE_LEITE"
except AttributeError:
return False
[docs]
class TipoEmbalagemQldSerializer(serializers.ModelSerializer):
[docs]
class TipoEmbalagemQldSimplesSerializer(serializers.ModelSerializer):
[docs]
class UnidadeMedidaSerialzer(serializers.ModelSerializer):
[docs]
class CronogramaSerializer(serializers.ModelSerializer):
etapas = EtapasDoCronogramaSerializer(many=True)
programacoes_de_recebimento = ProgramacaoDoRecebimentoDoCronogramaSerializer(
many=True
)
armazem = DistribuidorSimplesSerializer()
status = serializers.CharField(source="get_status_display")
empresa = TerceirizadaLookUpSerializer()
contrato = ContratoSimplesSerializer()
unidade_medida = UnidadeMedidaSerialzer()
ficha_tecnica = FichaTecnicaCronogramaSerializer()
tipo_embalagem_secundaria = TipoEmbalagemQldSimplesSerializer()
ponto_a_ponto = serializers.SerializerMethodField()
[docs]
def get_ponto_a_ponto(self, obj):
return obj.ponto_a_ponto
[docs]
class CronogramaComLogSerializer(serializers.ModelSerializer):
etapas = EtapasDoCronogramaSerializer(many=True)
programacoes_de_recebimento = ProgramacaoDoRecebimentoDoCronogramaSerializer(
many=True
)
armazem = DistribuidorComEnderecoSimplesSerializer()
status = serializers.CharField(source="get_status_display")
empresa = TerceirizadaLookUpSerializer()
contrato = ContratoSimplesSerializer()
unidade_medida = UnidadeMedidaSerialzer()
logs = LogSolicitacoesUsuarioSerializer(many=True)
ficha_tecnica = FichaTecnicaCronogramaSerializer()
tipo_embalagem_secundaria = TipoEmbalagemQldSimplesSerializer()
ponto_a_ponto = serializers.BooleanField(read_only=True)
[docs]
class SolicitacaoAlteracaoCronogramaCompletoSerializer(serializers.ModelSerializer):
fornecedor = serializers.CharField(source="cronograma.empresa")
cronograma = CronogramaSerializer()
status = serializers.CharField(source="get_status_display")
etapas_antigas = EtapasDoCronogramaSerializer(many=True)
etapas_novas = EtapasDoCronogramaSerializer(many=True)
logs = LogSolicitacoesUsuarioSerializer(many=True)
[docs]
class CronogramaRascunhosSerializer(serializers.ModelSerializer):
ponto_a_ponto = serializers.BooleanField(read_only=True)
[docs]
class CronogramaSimplesSerializer(serializers.ModelSerializer):
pregao_chamada_publica = serializers.SerializerMethodField()
nome_produto = serializers.SerializerMethodField()
programa_leve_leite = serializers.SerializerMethodField()
[docs]
def get_pregao_chamada_publica(self, obj):
return obj.contrato.pregao_chamada_publica if obj.contrato else None
[docs]
def get_nome_produto(self, obj):
return obj.ficha_tecnica.produto.nome if obj.ficha_tecnica else None
[docs]
def get_programa_leve_leite(self, obj):
try:
return obj.ficha_tecnica.programa == "LEVE_LEITE"
except AttributeError:
return False
[docs]
def get_ponto_a_ponto(self, obj):
return obj.ponto_a_ponto
[docs]
class EtapasDoCronogramaFichaDeRecebimentoSerializer(serializers.ModelSerializer):
qtd_total_empenho = serializers.SerializerMethodField()
data_programada = serializers.SerializerMethodField()
quantidade = serializers.SerializerMethodField()
total_embalagens = serializers.SerializerMethodField()
desvinculada_recebimento = serializers.SerializerMethodField()
etapa = serializers.SerializerMethodField()
parte = serializers.SerializerMethodField()
houve_ocorrencia = serializers.SerializerMethodField()
houve_reposicao = serializers.SerializerMethodField()
fichas_recebimento = serializers.SerializerMethodField()
foi_recebida = serializers.SerializerMethodField()
unidade_medida = serializers.SerializerMethodField()
[docs]
def get_etapa(self, obj):
return f"Etapa {obj.etapa}" if obj.etapa is not None else None
[docs]
def get_parte(self, obj):
return f"Parte {obj.parte}" if obj.parte is not None else None
[docs]
def get_qtd_total_empenho(self, obj):
try:
valor = numero_com_agrupador_de_milhar_e_decimal(obj.qtd_total_empenho)
return f"{valor} {obj.cronograma.unidade_medida.abreviacao}"
except AttributeError:
return valor
[docs]
def get_quantidade(self, obj):
try:
valor = numero_com_agrupador_de_milhar_e_decimal(obj.quantidade)
return f"{valor} {obj.cronograma.unidade_medida.abreviacao}"
except AttributeError:
return valor
[docs]
def get_total_embalagens(self, obj):
try:
valor = numero_com_agrupador_de_milhar_e_decimal(obj.total_embalagens)
return f"{valor} {obj.cronograma.tipo_embalagem_secundaria.abreviacao}"
except AttributeError:
return valor
[docs]
def get_data_programada(self, obj):
if not obj.data_programada:
return None
if obj.cronograma and obj.cronograma.ponto_a_ponto:
return obj.data_programada.strftime("%m/%Y")
return obj.data_programada.strftime("%d/%m/%Y")
[docs]
def get_desvinculada_recebimento(self, obj):
return not obj.ficha_recebimento.exists()
[docs]
def get_houve_ocorrencia(self, obj):
return obj.ficha_recebimento.filter(
houve_ocorrencia=True, status="ASSINADA"
).exists()
[docs]
def get_houve_reposicao(self, obj):
return obj.ficha_recebimento.filter(
Q(houve_ocorrencia=False) | Q(houve_ocorrencia__isnull=True),
reposicao_cronograma__isnull=False,
).exists()
[docs]
def get_foi_recebida(self, obj):
return obj.ficha_recebimento.filter(
Q(houve_ocorrencia=False) | Q(houve_ocorrencia__isnull=True)
).exists()
[docs]
def get_fichas_recebimento(self, obj):
return list(
obj.ficha_recebimento.values(
"uuid",
"houve_ocorrencia",
).annotate(
houve_reposicao=Q(reposicao_cronograma__isnull=False),
situacao=Case(
When(houve_ocorrencia=True, then=Value("Ocorrência")),
default=Value("Recebido"),
output_field=CharField(),
),
)
)
[docs]
def get_unidade_medida(self, obj):
try:
return obj.cronograma.unidade_medida.abreviacao
except AttributeError:
return "-"
[docs]
class CronogramaFichaDeRecebimentoSerializer(serializers.ModelSerializer):
fornecedor = serializers.SerializerMethodField()
contrato = serializers.SerializerMethodField()
pregao_chamada_publica = serializers.SerializerMethodField()
numero_chamada_publica = serializers.SerializerMethodField()
ata = serializers.SerializerMethodField()
produto = serializers.SerializerMethodField()
marca = serializers.SerializerMethodField()
qtd_total_programada = serializers.SerializerMethodField()
peso_liquido_embalagem_primaria = serializers.SerializerMethodField()
peso_liquido_embalagem_secundaria = serializers.SerializerMethodField()
embalagem_primaria = serializers.SerializerMethodField()
embalagem_secundaria = serializers.SerializerMethodField()
categoria = serializers.SerializerMethodField()
etapas = EtapasDoCronogramaFichaDeRecebimentoSerializer(many=True)
documentos_de_recebimento = serializers.SerializerMethodField()
sistema_vedacao_embalagem_secundaria = serializers.SerializerMethodField()
programa_leve_leite = serializers.SerializerMethodField()
[docs]
def get_fornecedor(self, obj):
return obj.empresa.nome_fantasia if obj.empresa else None
[docs]
def get_contrato(self, obj):
return obj.contrato.numero if obj.contrato else None
[docs]
def get_pregao_chamada_publica(self, obj):
return obj.contrato.pregao_chamada_publica if obj.contrato else None
[docs]
def get_numero_chamada_publica(self, obj):
return obj.contrato.numero_chamada_publica if obj.contrato else None
[docs]
def get_ata(self, obj):
return obj.contrato.ata if obj.contrato else None
[docs]
def get_produto(self, obj):
try:
return obj.ficha_tecnica.produto.nome
except AttributeError:
return None
[docs]
def get_marca(self, obj):
try:
return obj.ficha_tecnica.marca.nome if obj.ficha_tecnica else None
except AttributeError:
return None
[docs]
def get_qtd_total_programada(self, obj):
valor = numero_com_agrupador_de_milhar_e_decimal(obj.qtd_total_programada)
return (
f"{valor} {obj.unidade_medida.abreviacao}" if obj.unidade_medida else valor
)
[docs]
def get_peso_liquido_embalagem_primaria(self, obj):
try:
return f"{obj.ficha_tecnica.peso_liquido_embalagem_primaria} {obj.ficha_tecnica.unidade_medida_primaria.abreviacao}"
except AttributeError:
return None
[docs]
def get_peso_liquido_embalagem_secundaria(self, obj):
try:
return f"{obj.ficha_tecnica.peso_liquido_embalagem_secundaria} {obj.ficha_tecnica.unidade_medida_secundaria.abreviacao}"
except AttributeError:
return None
[docs]
def get_embalagem_primaria(self, obj):
return (
obj.ficha_tecnica.material_embalagem_primaria if obj.ficha_tecnica else None
)
[docs]
def get_embalagem_secundaria(self, obj):
return (
obj.ficha_tecnica.sistema_vedacao_embalagem_secundaria
if obj.ficha_tecnica
else None
)
[docs]
def get_categoria(self, obj):
return obj.ficha_tecnica.categoria if obj.ficha_tecnica else None
[docs]
def get_documentos_de_recebimento(self, obj):
return DocRecebimentoFichaDeRecebimentoSerializer(
obj.documentos_de_recebimento.filter(
status=DocumentoDeRecebimentoWorkflow.APROVADO
),
many=True,
).data
[docs]
def get_sistema_vedacao_embalagem_secundaria(self, obj):
return (
obj.ficha_tecnica.sistema_vedacao_embalagem_secundaria
if obj.ficha_tecnica
else None
)
[docs]
def get_programa_leve_leite(self, obj):
try:
return obj.ficha_tecnica.programa == "LEVE_LEITE"
except AttributeError:
return False
[docs]
class EtapaCronogramaRelatorioSerializer(serializers.ModelSerializer):
numero_cronograma = serializers.SerializerMethodField()
produto = serializers.SerializerMethodField()
empresa = serializers.SerializerMethodField()
marca = serializers.SerializerMethodField()
qtd_total_programada = serializers.SerializerMethodField()
unidade_medida = serializers.SerializerMethodField()
custo_unitario_produto = serializers.SerializerMethodField()
armazem = serializers.SerializerMethodField()
status_cronograma = serializers.SerializerMethodField()
total_embalagens = serializers.SerializerMethodField()
situacao = serializers.SerializerMethodField()
etapa = serializers.SerializerMethodField()
parte = serializers.SerializerMethodField()
numero_empenho = serializers.SerializerMethodField()
data_programada = serializers.SerializerMethodField()
[docs]
def get_data_programada(self, obj):
if not obj.data_programada:
return None
if obj.cronograma and obj.cronograma.ponto_a_ponto:
return obj.data_programada.strftime("%m/%Y")
return obj.data_programada.strftime("%d/%m/%Y")
[docs]
def get_etapa(self, obj):
return f"Etapa {obj.etapa}" if obj.etapa is not None else None
[docs]
def get_parte(self, obj):
return f"Parte {obj.parte}" if obj.parte is not None else None
[docs]
def get_numero_cronograma(self, obj):
try:
return obj.cronograma.numero
except AttributeError:
return "-"
[docs]
def get_produto(self, obj):
try:
return obj.cronograma.ficha_tecnica.produto.nome
except AttributeError:
return "-"
[docs]
def get_empresa(self, obj):
try:
return obj.cronograma.empresa.nome_fantasia
except AttributeError:
return "-"
[docs]
def get_marca(self, obj):
try:
return obj.cronograma.ficha_tecnica.marca.nome
except AttributeError:
return "-"
[docs]
def get_qtd_total_programada(self, obj):
try:
return obj.cronograma.qtd_total_programada
except AttributeError:
return "-"
[docs]
def get_unidade_medida(self, obj):
try:
return obj.cronograma.unidade_medida.abreviacao
except AttributeError:
return "-"
[docs]
def get_custo_unitario_produto(self, obj):
return (
f"R$ {numero_com_agrupador_de_milhar_e_decimal(obj.cronograma.custo_unitario_produto)}"
if obj.cronograma.custo_unitario_produto
else "-"
)
[docs]
def get_armazem(self, obj):
try:
return obj.cronograma.armazem.nome_fantasia
except AttributeError:
return "-"
[docs]
def get_status_cronograma(self, obj):
try:
return obj.cronograma.get_status_display()
except AttributeError:
return "-"
[docs]
def get_total_embalagens(self, obj):
try:
return f"{obj.total_embalagens} {obj.cronograma.tipo_embalagem_secundaria.abreviacao}"
except AttributeError:
return "-"
[docs]
def get_situacao(self, obj):
return "-"
[docs]
def get_numero_empenho(self, obj):
try:
return obj.numero_empenho
except AttributeError:
return "-"
[docs]
class CronogramaRelatorioSerializer(serializers.ModelSerializer):
etapas = EtapasDoCronogramaFichaDeRecebimentoSerializer(many=True)
numero_contrato = serializers.SerializerMethodField()
numero_processo = serializers.SerializerMethodField()
produto = serializers.SerializerMethodField()
empresa = serializers.SerializerMethodField()
armazem = serializers.SerializerMethodField()
marca = serializers.SerializerMethodField()
custo_unitario_produto = serializers.SerializerMethodField()
status = serializers.CharField(source="get_status_display")
programa_leve_leite = serializers.SerializerMethodField()
modalidade = serializers.SerializerMethodField()
[docs]
def get_programa_leve_leite(self, obj):
try:
return obj.ficha_tecnica.programa == "LEVE_LEITE"
except AttributeError:
return False
[docs]
def get_numero_contrato(self, obj):
try:
return obj.contrato.numero
except AttributeError:
return None
[docs]
def get_numero_processo(self, obj):
try:
return obj.contrato.processo
except AttributeError:
return None
[docs]
def get_produto(self, obj):
try:
return obj.ficha_tecnica.produto.nome
except AttributeError:
return None
[docs]
def get_empresa(self, obj):
try:
return obj.empresa.nome_fantasia
except AttributeError:
return None
[docs]
def get_armazem(self, obj):
try:
return obj.armazem.nome_fantasia
except AttributeError:
return None
[docs]
def get_marca(self, obj):
try:
return obj.ficha_tecnica.marca.nome if obj.ficha_tecnica else None
except AttributeError:
return None
[docs]
def get_custo_unitario_produto(self, obj):
return (
f"R$ {numero_com_agrupador_de_milhar_e_decimal(obj.custo_unitario_produto)}"
if obj.custo_unitario_produto
else None
)
[docs]
def get_modalidade(self, obj):
if not obj.contrato:
return "Não Informado"
if not obj.contrato.modalidade:
return "Não Informado"
return obj.contrato.modalidade.nome or "Não Informado"
[docs]
class PainelCronogramaSerializer(serializers.ModelSerializer):
produto = serializers.SerializerMethodField()
empresa = serializers.SerializerMethodField()
log_mais_recente = serializers.SerializerMethodField()
status = serializers.CharField(source="get_status_display")
programa_leve_leite = serializers.SerializerMethodField()
ponto_a_ponto = serializers.BooleanField(read_only=True)
[docs]
def get_produto(self, obj):
try:
return obj.ficha_tecnica.produto.nome
except AttributeError:
return None
[docs]
def get_empresa(self, obj):
return obj.empresa.nome_fantasia if obj.empresa else None
[docs]
def get_log_mais_recente(self, obj):
if obj.log_mais_recente:
if obj.log_mais_recente.criado_em.date() == datetime.date.today():
return datetime.datetime.strftime(
obj.log_mais_recente.criado_em, "%d/%m/%Y %H:%M"
)
return datetime.datetime.strftime(
obj.log_mais_recente.criado_em, "%d/%m/%Y"
)
else:
return datetime.datetime.strftime(obj.criado_em, "%d/%m/%Y")
[docs]
def get_programa_leve_leite(self, obj):
try:
return obj.ficha_tecnica.programa == "LEVE_LEITE"
except AttributeError:
return None
[docs]
class PainelSolicitacaoAlteracaoCronogramaSerializerItem(serializers.ModelSerializer):
empresa = serializers.CharField(source="cronograma.empresa")
cronograma = serializers.CharField(source="cronograma.numero")
produto = serializers.SerializerMethodField()
status = serializers.CharField(source="get_status_display")
log_mais_recente = serializers.SerializerMethodField()
programa_leve_leite = serializers.SerializerMethodField()
ponto_a_ponto = serializers.SerializerMethodField()
[docs]
def get_produto(self, obj):
try:
return obj.cronograma.ficha_tecnica.produto.nome
except AttributeError:
return None
[docs]
def get_log_mais_recente(self, obj):
if obj.log_criado_em:
if obj.log_criado_em.date() == datetime.date.today():
return datetime.datetime.strftime(obj.log_criado_em, "%d/%m/%Y %H:%M")
return datetime.datetime.strftime(obj.log_criado_em, "%d/%m/%Y")
else:
return datetime.datetime.strftime(obj.log_criado_em, "%d/%m/%Y")
[docs]
def get_programa_leve_leite(self, obj):
try:
return obj.cronograma.ficha_tecnica.programa == "LEVE_LEITE"
except AttributeError:
return None
[docs]
def get_ponto_a_ponto(self, obj):
try:
return obj.cronograma.ponto_a_ponto
except AttributeError:
return False
[docs]
class PainelSolicitacaoAlteracaoCronogramaSerializer(serializers.Serializer):
status = serializers.CharField()
dados = serializers.SerializerMethodField()
total = serializers.IntegerField(allow_null=True)
[docs]
def get_dados(self, obj):
return PainelSolicitacaoAlteracaoCronogramaSerializerItem(
obj["dados"], many=True
).data
[docs]
def to_representation(self, instance):
result = super(
PainelSolicitacaoAlteracaoCronogramaSerializer, self
).to_representation(instance)
return OrderedDict(
[(key, result[key]) for key in result if result[key] is not None]
)
[docs]
class InterrupcaoProgramadaEntregaSerializer(serializers.ModelSerializer):
motivo_display = serializers.CharField(source="get_motivo_display", read_only=True)
tipo_calendario_display = serializers.CharField(
source="get_tipo_calendario_display", read_only=True
)
[docs]
class InterrupcaoProgramadaEntregaCreateSerializer(serializers.ModelSerializer):
[docs]
def validate(self, attrs):
if attrs.get("motivo") == "OUTROS" and not attrs.get("descricao_motivo"):
raise serializers.ValidationError(
{"descricao_motivo": "Descrição é obrigatória quando motivo é 'Outros'"}
)
return attrs
[docs]
class CronogramaMensalAssinadoSerializer(serializers.ModelSerializer):
"""Serializer para listar cronogramas mensal Ponto a Ponto assinados"""
produto_nome = serializers.SerializerMethodField()
fornecedor_nome = serializers.SerializerMethodField()
numero_contrato = serializers.SerializerMethodField()
[docs]
def get_produto_nome(self, obj):
if obj.ficha_tecnica and obj.ficha_tecnica.produto:
return obj.ficha_tecnica.produto.nome
return None
[docs]
def get_fornecedor_nome(self, obj):
if obj.empresa:
return obj.empresa.nome_fantasia
return None
[docs]
def get_numero_contrato(self, obj):
if obj.contrato:
return obj.contrato.numero
return None
[docs]
class CronogramaDetalhePosRecebimentoSerializer(serializers.ModelSerializer):
"""Dados do cronograma para preenchimento automático do cadastro do
Termo de Recebimento Definitivo (Pós-Recebimento).
Produto e unidade de medida vêm da ficha técnica; o número do processo
SEI vem do contrato vinculado ao cronograma. As relações são opcionais
(blank/null) e os campos são protegidos contra ausência.
"""
produto = serializers.SerializerMethodField()
processo_sei = serializers.SerializerMethodField()
unidade_medida = serializers.SerializerMethodField()
unidade_medida_abreviacao = serializers.SerializerMethodField()
[docs]
def get_produto(self, obj):
if obj.ficha_tecnica and obj.ficha_tecnica.produto:
return obj.ficha_tecnica.produto.nome
return None
[docs]
def get_processo_sei(self, obj):
if obj.contrato:
return obj.contrato.processo
return None
[docs]
def get_unidade_medida(self, obj):
if obj.unidade_medida:
return obj.unidade_medida.nome
return None
[docs]
def get_unidade_medida_abreviacao(self, obj):
if obj.unidade_medida:
return obj.unidade_medida.abreviacao
return None