from phonenumber_field.serializerfields import PhoneNumberField from rest_framework import serializers from drf_dynamic_fields import DynamicFieldsMixin from django.contrib.auth import get_user_model from api.v1.serializers.content import GallerySerializer, GalleryImageSerializer, GalleryImageCreateSerializer from . import Base64ImageField from apps.user.models import AuthorRequest from .mixins import DispatchGalleryMixin User = get_user_model() class UserSerializer(DynamicFieldsMixin, serializers.ModelSerializer): phone = PhoneNumberField(required=False, allow_null=True, allow_blank=True) class Meta: model = User fields = ( 'id', 'username', 'email', 'phone', 'first_name', 'last_name', 'is_staff', 'is_active', 'date_joined', 'role', 'gender', 'country', 'city', 'about', 'instagram', 'instagram_hashtag', 'facebook', 'twitter', 'pinterest', 'youtube', 'vkontakte', 'fb_id', 'fb_data', 'is_email_proved', 'photo', 'balance', 'show_in_mainpage', 'trial_lesson', 'review_url', ) read_only_fields = ( 'id', 'username', 'photo', 'date_joined', 'is_staff', 'fb_id', 'fb_data', 'balance', ) def create(self, validated_data): username = validated_data.get('username', None) if not username: validated_data['username'] = validated_data['email'] instance = super().create(validated_data) if not instance.password: password = User.objects.make_random_password() instance.set_password(password) instance.save() return instance def validate_phone(self, value): if not value and value is not None: value = None return value class UserPhotoSerializer(serializers.Serializer): photo = Base64ImageField( required=False, allow_empty_file=True, allow_null=True ) class AuthorRequestSerializer(serializers.ModelSerializer): class Meta: model = AuthorRequest fields = ( 'id', 'first_name', 'last_name', 'email', 'about', 'facebook', 'status', 'cause', 'accepted_send_at', 'declined_send_at', 'created_at', 'update_at', ) read_only_fields = ( 'id', 'accepted_send_at', 'declined_send_at', 'created_at', 'update_at', ) class UserGallerySerializer(serializers.ModelSerializer): class Meta: model = User fields = ( 'gallery', ) class UserGalleryUpdateSerializer(DispatchGalleryMixin, serializers.ModelSerializer): images = serializers.ListField() class Meta: model = User fields = ( 'images', ) def update(self, instance, validated_data): images = validated_data.pop('images', {}) self.dispatch_gallery(instance, { 'id': instance.gallery_id, 'images': images, }) return instance def to_representation(self, instance): return UserGallerySerializer(instance=instance, context=self.context).to_representation(instance)