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