Skip to content

Instantly share code, notes, and snippets.

@Runinterface
Last active April 20, 2020 12:03
Show Gist options
  • Save Runinterface/6343998417c925bccdc78be9f42a0435 to your computer and use it in GitHub Desktop.
Save Runinterface/6343998417c925bccdc78be9f42a0435 to your computer and use it in GitHub Desktop.
from django.contrib.auth import get_user_model
from django.contrib.auth.password_validation import validate_password
from rest_framework import serializers
from rest_framework.exceptions import ValidationError
from rest_registration.settings import registration_settings
from rest_registration.utils import (
authenticate_by_login_and_password_or_none,
get_user_setting
)
from rest_registration.models import User
class MetaObj(object):
pass
class DefaultLoginSerializer(serializers.Serializer):
login = serializers.CharField()
password = serializers.CharField()
def get_authenticated_user(self):
data = self.validated_data
return authenticate_by_login_and_password_or_none(
data['login'], data['password'])
class UserProfileSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ("id", "username", "last_name", "first_name", "adress", "img", "email", "access_level")
class DefaultUserProfileSerializer(serializers.ModelSerializer):
def __init__(self, instance=None, *args, **kwargs):
user_class = get_user_model()
field_names = _get_field_names(allow_primary_key=False)
read_only_field_names = _get_field_names(
allow_primary_key=True,
non_editable=True)
self.Meta = MetaObj()
self.Meta.model = user_class
self.Meta.fields = field_names
self.Meta.read_only_fields = read_only_field_names
return super().__init__(instance=instance, **kwargs)
class DefaultRegisterUserSerializer(serializers.ModelSerializer):
def __init__(self, *args, **kwargs):
user_class = get_user_model()
field_names = _get_field_names(allow_primary_key=True)
field_names = field_names + ('password',)
read_only_field_names = _get_field_names(
allow_primary_key=True,
non_editable=True)
self.Meta = MetaObj()
self.Meta.model = user_class
self.Meta.fields = field_names
self.Meta.read_only_fields = read_only_field_names
super().__init__(*args, **kwargs)
@property
def has_password_confirm(self):
return registration_settings.REGISTER_SERIALIZER_PASSWORD_CONFIRM
def validate_password(self, password):
user = _build_initial_user(self.initial_data)
validate_password(password, user=user)
return password
def get_fields(self):
fields = super().get_fields()
if self.has_password_confirm:
fields['password_confirm'] = serializers.CharField(write_only=True)
return fields
def validate(self, data):
if self.has_password_confirm:
if data['password'] != data['password_confirm']:
raise ValidationError('Passwords don\'t match')
return data
def create(self, validated_data):
data = validated_data.copy()
if self.has_password_confirm:
del data['password_confirm']
return self.Meta.model.objects.create_user(**data)
def _build_initial_user(data):
user_field_names = _get_field_names(allow_primary_key=False)
user_data = {}
for field_name in user_field_names:
if field_name in data:
user_data[field_name] = data[field_name]
user_class = get_user_model()
return user_class(**user_data)
def _get_field_names(allow_primary_key=True, non_editable=False):
def not_in_seq(names):
return lambda name: name not in names
user_class = get_user_model()
fields = user_class._meta.get_fields()
default_field_names = [f.name for f in fields
if (getattr(f, 'serialize', False) or
getattr(f, 'primary_key', False))]
pk_field_names = [f.name for f in fields
if getattr(f, 'primary_key', False)]
hidden_field_names = set(get_user_setting('HIDDEN_FIELDS'))
hidden_field_names = hidden_field_names.union(['last_login', 'password'])
public_field_names = get_user_setting('PUBLIC_FIELDS')
editable_field_names = get_user_setting('EDITABLE_FIELDS')
field_names = (public_field_names if public_field_names is not None
else default_field_names)
if editable_field_names is None:
editable_field_names = field_names
editable_field_names = set(filter(not_in_seq(pk_field_names),
editable_field_names))
field_names = filter(not_in_seq(hidden_field_names), field_names)
if not allow_primary_key:
field_names = filter(not_in_seq(pk_field_names), field_names)
if non_editable:
field_names = filter(not_in_seq(editable_field_names), field_names)
field_names = tuple(field_names)
return field_names
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment