195 lines
5.5 KiB
Python
195 lines
5.5 KiB
Python
"""Back account serializers"""
|
|
from rest_framework import serializers
|
|
from django.db import transaction
|
|
|
|
from account import models
|
|
from account.serializers import RoleBaseSerializer, UserSerializer, subscriptions_handler
|
|
from main.models import SiteSettings
|
|
|
|
|
|
class _SiteSettingsSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = SiteSettings
|
|
fields = (
|
|
'id',
|
|
'subdomain',
|
|
'country_code',
|
|
)
|
|
|
|
|
|
class BackUserSerializer(UserSerializer):
|
|
last_country = _SiteSettingsSerializer(read_only=True)
|
|
roles = RoleBaseSerializer(many=True)
|
|
|
|
class Meta(UserSerializer.Meta):
|
|
fields = (
|
|
'id',
|
|
'last_login',
|
|
'is_superuser',
|
|
'username',
|
|
'last_name',
|
|
'first_name',
|
|
'is_active',
|
|
'date_joined',
|
|
'image_url',
|
|
'cropped_image_url',
|
|
'email',
|
|
'email_confirmed',
|
|
'unconfirmed_email',
|
|
'email_confirmed',
|
|
'newsletter',
|
|
'password',
|
|
'city',
|
|
'locale',
|
|
'last_ip',
|
|
'last_country',
|
|
'roles',
|
|
'subscriptions',
|
|
'phone',
|
|
'country_calling_code',
|
|
'national_calling_number',
|
|
|
|
)
|
|
extra_kwargs = {
|
|
'password': {'write_only': True},
|
|
}
|
|
read_only_fields = (
|
|
'old_password',
|
|
'last_login',
|
|
'date_joined',
|
|
'city',
|
|
'locale',
|
|
'last_ip',
|
|
'last_country',
|
|
)
|
|
|
|
def create(self, validated_data):
|
|
subscriptions_list = []
|
|
if 'subscription_types' in validated_data:
|
|
subscriptions_list = validated_data.pop('subscription_types')
|
|
|
|
user = super().create(validated_data)
|
|
user.set_password(validated_data['password'])
|
|
user.save()
|
|
|
|
subscriptions_handler(subscriptions_list, user)
|
|
return user
|
|
|
|
|
|
class BackDetailUserSerializer(BackUserSerializer):
|
|
class Meta(BackUserSerializer.Meta):
|
|
fields = (
|
|
'id',
|
|
'last_country',
|
|
'roles',
|
|
'last_login',
|
|
'is_superuser',
|
|
'first_name',
|
|
'last_name',
|
|
'is_staff',
|
|
'is_active',
|
|
'date_joined',
|
|
'username',
|
|
'image_url',
|
|
'cropped_image_url',
|
|
'email',
|
|
'unconfirmed_email',
|
|
'email_confirmed',
|
|
'newsletter',
|
|
'old_id',
|
|
'locale',
|
|
'city',
|
|
'last_ip',
|
|
'groups',
|
|
'user_permissions',
|
|
'subscriptions',
|
|
'phone',
|
|
'country_calling_code',
|
|
'national_calling_number',
|
|
)
|
|
read_only_fields = (
|
|
'old_password',
|
|
'last_login',
|
|
'date_joined',
|
|
'last_ip',
|
|
'last_country',
|
|
)
|
|
|
|
def create(self, validated_data):
|
|
subscriptions_list = []
|
|
|
|
if 'subscription_types' in validated_data:
|
|
subscriptions_list = validated_data.pop('subscription_types')
|
|
|
|
user = super().create(validated_data)
|
|
user.set_password(validated_data['password'])
|
|
user.save()
|
|
|
|
subscriptions_handler(subscriptions_list, user)
|
|
return user
|
|
|
|
def update(self, instance, validated_data):
|
|
subscriptions_list = []
|
|
|
|
if 'subscription_types' in validated_data:
|
|
subscriptions_list = validated_data.pop('subscription_types')
|
|
|
|
if 'roles' in validated_data:
|
|
roles_ids = [role['id'] for role in validated_data.pop('roles') if 'id' in role]
|
|
instance.set_roles(roles_ids)
|
|
|
|
instance = super().update(instance, validated_data)
|
|
subscriptions_handler(subscriptions_list, instance)
|
|
|
|
return instance
|
|
|
|
|
|
class UserRoleSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = models.UserRole
|
|
fields = [
|
|
'role',
|
|
'user',
|
|
'establishment'
|
|
]
|
|
|
|
|
|
class UserCSVSerializer(serializers.ModelSerializer):
|
|
created_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True, source='date_joined')
|
|
last_seen_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True, source='last_login')
|
|
confirmed_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True,)
|
|
country = serializers.CharField(allow_blank=True, allow_null=True, source='country_name')
|
|
roles_list = serializers.CharField(allow_blank=True, allow_null=True, source='locale_roles')
|
|
|
|
class Meta:
|
|
model = models.User
|
|
fields = [
|
|
'id',
|
|
'username',
|
|
'email',
|
|
'locale',
|
|
'country',
|
|
'created_at',
|
|
'confirmed_at',
|
|
'last_seen_at',
|
|
'last_ip',
|
|
'roles_list',
|
|
]
|
|
|
|
|
|
class InviteTeamSerializer(serializers.ModelSerializer):
|
|
email = serializers.EmailField(required=True, allow_blank=False, allow_null=False)
|
|
|
|
class Meta:
|
|
model = models.User
|
|
fields = (
|
|
'id',
|
|
'email',
|
|
)
|
|
|
|
def create(self, validated_data):
|
|
with transaction.atomic():
|
|
establishment = self.context['view'].kwargs['establishment']
|
|
country_code = self.context['request'].country_code
|
|
return models.User.objects.invite_for_team(validated_data['email'], establishment, country_code)
|