class UserProfileSerializer(serializers.ModelSerializer): user = serializers.PrimaryKeyRelatedField(queryset=User.objects.all()) user_username = serializers.ReadOnlyField(source='user.username', read_only=True) verified = serializers.ReadOnlyField() address = AddressSerializer() class Meta: model = models.UserProfile fields = ('user', 'user_username', 'gender', 'birthday', 'verified', 'address', 'nationality', 'picture', 'friends', 'roles', 'created_timestamp', 'languages', 'id') def create(self, **kwargs): address_data = self.validated_data.pop('address') address = models.Address.objects.create(**address_data) user_data = self.validated_data.pop('user') user = User.objects.get(id=user_data.id) user_profile = models.UserProfile.objects.create(address=address, user=user, **self.validated_data) return user_profile def update(self, **kwargs): address = self.instance.address address_data = self.validated_data.pop('address') address.city = address_data.get('city', address.city) address.country = address_data.get('country', address.country) address.street = address_data.get('street', address.street) address.save() self.instance.gender = self.validated_data.get('gender', self.instance.gender) self.instance.birthday = self.validated_data.get( 'birthday', self.instance.birthday) self.instance.verified = self.validated_data.get( 'verified', self.instance.verified) self.instance.picture = self.validated_data.get( 'picture', self.instance.picture) self.instance.save(address=address) return self.instance
class UserProfileSerializer(serializers.ModelSerializer): user = UserSerializer(fields=('first_name', 'last_name', 'email')) user_username = serializers.ReadOnlyField(source='user.username', read_only=True) birthday = serializers.DateTimeField(allow_null=True) address = AddressSerializer(allow_null=True, required=False) location = LocationSerializer(allow_null=True, required=False) is_verified = serializers.BooleanField(read_only=True) financial_accounts = serializers.SerializerMethodField(read_only=True) class Meta: model = models.UserProfile fields = ('user', 'user_username', 'gender', 'birthday', 'is_verified', 'address', 'nationality', 'picture', 'created_at', 'id', 'financial_accounts', 'ethnicity', 'job_title', 'income', 'education', 'location', 'unspecified_responses', 'purpose_of_use', 'is_worker', 'is_requester', 'handle') def create(self, **kwargs): address_data = self.validated_data.pop('address') address = models.Address.objects.create(**address_data) user_data = self.validated_data.pop('user') user_profile = models.UserProfile.objects.create(address=address, user=user_data.id, **self.validated_data) return user_profile def update(self, **kwargs): user = self.validated_data.pop('user') if self.validated_data.get('location') is not None: location_data = self.validated_data.pop('location') city_name = None country_name = None country_code = None state_name = "" state_code = "" street_name = None postal_code = "" if 'city' in location_data: city_name = location_data.pop('city') if 'postal_code' in location_data: postal_code = location_data.pop('postal_code') if 'country' in location_data: country_name = location_data.pop('country') country_code = location_data.pop('country_code') if 'address' in location_data: street_name = location_data.pop('address') if 'state' in location_data: state_name = location_data.pop('state') state_code = location_data.pop('state_code') if country_name is not None and city_name is not None: country, created = models.Country.objects.get_or_create( name=country_name, code=country_code) city, created = models.City.objects.get_or_create( name=city_name, state=state_name, state_code=state_code, country=country) address, created = models.Address.objects.get_or_create( street=street_name, city=city, postal_code=postal_code) self.instance.address = address else: self.instance.address = None self.instance.gender = self.validated_data.get('gender', self.instance.gender) self.instance.birthday = self.validated_data.get( 'birthday', self.instance.birthday) self.instance.is_verified = self.validated_data.get( 'is_verified', self.instance.is_verified) self.instance.picture = self.validated_data.get( 'picture', self.instance.picture) self.instance.ethnicity = self.validated_data.get( 'ethnicity', self.instance.ethnicity) self.instance.purpose_of_use = self.validated_data.get( 'purpose_of_use', self.instance.purpose_of_use) self.instance.unspecified_responses = self.validated_data.get( 'unspecified_responses', self.instance.unspecified_responses) self.instance.education = self.validated_data.get( 'education', self.instance.education) self.instance.save() self.instance.user.first_name = user.get('first_name', self.instance.user.first_name) self.instance.user.last_name = user.get('last_name', self.instance.user.last_name) self.instance.user.save() update_worker_cache([self.instance.user_id], constants.ACTION_UPDATE_PROFILE, 'gender', self.instance.gender) if self.instance.birthday is not None: update_worker_cache([self.instance.user_id], constants.ACTION_UPDATE_PROFILE, 'birthday_year', self.instance.birthday.year) update_worker_cache([self.instance.user_id], constants.ACTION_UPDATE_PROFILE, 'ethnicity', self.instance.ethnicity) return self.instance @staticmethod def get_financial_accounts(obj): serializer = FinancialAccountSerializer( instance=obj.user.financial_accounts, many=True, read_only=True, fields=('id', 'type', 'type_detail', 'is_active', 'balance')) return serializer.data @staticmethod def create_worker(): pass