122 lines
4.0 KiB
Python
122 lines
4.0 KiB
Python
|
|
|
|
from api.utils.storage_service import storage_service
|
|
from rest_framework import serializers
|
|
from .models import Vucem, CredencialesImportador
|
|
|
|
|
|
|
|
|
|
class VucemSerializer(serializers.ModelSerializer):
|
|
importadores = serializers.SerializerMethodField()
|
|
|
|
key = serializers.FileField(write_only=True, required=False, allow_null=True)
|
|
cer = serializers.FileField(write_only=True, required=False, allow_null=True)
|
|
|
|
key_download_url = serializers.SerializerMethodField(read_only=True)
|
|
cer_download_url = serializers.SerializerMethodField(read_only=True)
|
|
|
|
class Meta:
|
|
model = Vucem
|
|
fields = '__all__'
|
|
read_only_fields = ('created_at', 'updated_at', 'organizacion', 'created_by', 'updated_by')
|
|
|
|
def get_key_download_url(self, obj):
|
|
if obj.key:
|
|
return storage_service.get_file_url(obj.key)
|
|
return None
|
|
|
|
def get_cer_download_url(self, obj):
|
|
if obj.cer:
|
|
return storage_service.get_file_url(obj.cer)
|
|
return None
|
|
|
|
def create(self, validated_data):
|
|
key_file = validated_data.pop('key', None)
|
|
cer_file = validated_data.pop('cer', None)
|
|
organizacion = validated_data.get('organizacion')
|
|
|
|
vucem = super().create(validated_data)
|
|
|
|
if key_file:
|
|
ruta = storage_service.save_vucem_key(
|
|
file=key_file,
|
|
organizacion_id=organizacion.id,
|
|
metadata={'vucem_id': str(vucem.id)}
|
|
)
|
|
if ruta:
|
|
vucem.key = ruta
|
|
else:
|
|
vucem.delete()
|
|
raise serializers.ValidationError({"key": "Error al guardar la llave"})
|
|
|
|
if cer_file:
|
|
ruta = storage_service.save_vucem_cert(
|
|
file=cer_file,
|
|
organizacion_id=organizacion.id,
|
|
metadata={'vucem_id': str(vucem.id)}
|
|
)
|
|
if ruta:
|
|
vucem.cer = ruta
|
|
else:
|
|
vucem.delete()
|
|
raise serializers.ValidationError({"cer_file": "Error al guardar el certificado"})
|
|
|
|
vucem.save()
|
|
return vucem
|
|
|
|
def update(self, instance, validated_data):
|
|
key_file = validated_data.pop('key', None)
|
|
cer_file = validated_data.pop('cer', None)
|
|
organizacion = validated_data.get('organizacion', instance.organizacion)
|
|
|
|
instance = super().update(instance, validated_data)
|
|
|
|
if key_file:
|
|
if instance.key:
|
|
storage_service.delete_file(str(instance.key))
|
|
ruta = storage_service.save_vucem_key(
|
|
file=key_file,
|
|
organizacion_id=organizacion.id
|
|
)
|
|
if ruta:
|
|
instance.key = ruta
|
|
|
|
if cer_file:
|
|
if instance.cer:
|
|
storage_service.delete_file(str(instance.cer))
|
|
ruta = storage_service.save_vucem_cert(
|
|
file=cer_file,
|
|
organizacion_id=organizacion.id
|
|
)
|
|
if ruta:
|
|
instance.cer = ruta
|
|
|
|
instance.save()
|
|
return instance
|
|
|
|
def get_importadores(self, obj):
|
|
# Importar aquí para evitar importación circular
|
|
from api.customs.serializers import ImportadorSerializer
|
|
return [ImportadorSerializer(cred.rfc).data for cred in obj.usuarios_importadores.all()]
|
|
|
|
|
|
class CredencialesImportadorSimpleSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = CredencialesImportador
|
|
fields = ('__all__')
|
|
read_only_fields = ('updated_at',)
|
|
|
|
|
|
class CredencialesImportadorSerializer(serializers.ModelSerializer):
|
|
|
|
class Meta:
|
|
model = CredencialesImportador
|
|
fields = '__all__'
|
|
read_only_fields = ('updated_at',)
|
|
|
|
def to_representation(self, instance):
|
|
representation = super().to_representation(instance)
|
|
representation['vucem'] = VucemSerializer(instance.vucem).data
|
|
return representation
|