from rest_framework import serializers from Auth.models import Profile, ProfileRole from Establishment.models import Establishment class ProfileSerializer(serializers.ModelSerializer): id = serializers.IntegerField(required=False) password = serializers.CharField(write_only=True) class Meta: model = Profile fields = ['id', 'password', 'email', 'code', 'datePeremption', 'username'] extra_kwargs = {'password': {'write_only': True}} def create(self, validated_data): user = Profile( username=validated_data['username'], email=validated_data['email'], code=validated_data.get('code', ''), datePeremption=validated_data.get('datePeremption', '') ) user.set_password(validated_data['password']) user.full_clean() user.save() return user def update(self, instance, validated_data): password = validated_data.pop('password', None) instance = super().update(instance, validated_data) if password: instance.set_password(password) instance.full_clean() instance.save() return instance def to_representation(self, instance): ret = super().to_representation(instance) ret['password'] = '********' return ret class ProfileRoleSerializer(serializers.ModelSerializer): profile = ProfileSerializer() establishment = serializers.PrimaryKeyRelatedField(queryset=Establishment.objects.all()) class Meta: model = ProfileRole fields = ['role_type', 'establishment', 'is_active', 'profile'] def create(self, validated_data): profile_data = validated_data.pop('profile') profile_serializer = ProfileSerializer(data=profile_data) profile_serializer.is_valid(raise_exception=True) profile = profile_serializer.save() profile_role = ProfileRole.objects.create(profile=profile, **validated_data) return profile_role def update(self, instance, validated_data): profile_data = validated_data.pop('profile') profile_serializer = ProfileSerializer(instance.profile, data=profile_data) profile_serializer.is_valid(raise_exception=True) profile = profile_serializer.save() instance.role_type = validated_data.get('role_type', instance.role_type) instance.establishment_id = validated_data.get('establishment', instance.establishment.id) instance.is_active = validated_data.get('is_active', instance.is_active) instance.save() return instance class ProfilUpdateSerializer(serializers.ModelSerializer): roles = ProfileRoleSerializer(many=True, required=False) class Meta: model = Profile fields = ['id', 'password', 'email', 'code', 'datePeremption', 'username', 'roles'] extra_kwargs = { 'password': {'write_only': True, 'required': False} } def update(self, instance, validated_data): roles_data = validated_data.pop('roles', []) password = validated_data.pop('password', None) instance = super().update(instance, validated_data) if password: instance.set_password(password) instance.full_clean() instance.save() for role_data in roles_data: ProfileRole.objects.update_or_create( profile=instance, establishment_id=role_data.get('establishment_id'), defaults={ 'role_type': role_data.get('role_type'), 'is_active': role_data.get('is_active', True) } ) return instance def to_representation(self, instance): ret = super().to_representation(instance) ret['password'] = '********' return ret