set username as non-required field on registration stage

(https://dev-krd.atlassian.net/browse/GM-304)
This commit is contained in:
Anatoly 2020-01-09 17:57:01 +03:00
parent 807f8b4169
commit 963e0597dc
6 changed files with 51 additions and 19 deletions

View File

@ -0,0 +1,18 @@
# Generated by Django 2.2.7 on 2020-01-09 13:54
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('account', '0028_merge_20191217_1127'),
]
operations = [
migrations.AlterField(
model_name='user',
name='username',
field=models.CharField(blank=True, default=None, error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and ./+/-/_ only.', max_length=150, null=True, verbose_name='username'),
),
]

View File

@ -69,11 +69,11 @@ class UserManager(BaseUserManager):
use_in_migrations = False use_in_migrations = False
def make(self, username: str, email: str, password: str, newsletter: bool) -> object: def make(self, email: str, password: str, newsletter: bool, username: str = '') -> object:
"""Register new user""" """Register new user"""
obj = self.model( obj = self.model(
username=username, username=username,
email=email, email=email.lower(),
newsletter=newsletter) newsletter=newsletter)
obj.set_password(password) obj.set_password(password)
obj.save() obj.save()
@ -112,6 +112,15 @@ class UserQuerySet(models.QuerySet):
class User(AbstractUser): class User(AbstractUser):
"""Base user model.""" """Base user model."""
username = models.CharField(
_('username'),
max_length=150,
blank=True, null=True, default=None,
help_text=_('Required. 150 characters or fewer. Letters, digits and ./+/-/_ only.'),
error_messages={
'unique': _("A user with that username already exists."),
},
)
image_url = models.URLField(verbose_name=_('Image URL path'), image_url = models.URLField(verbose_name=_('Image URL path'),
blank=True, null=True, default=None, blank=True, null=True, default=None,
max_length=500) max_length=500)

View File

@ -17,21 +17,15 @@ from utils import methods as utils_methods
class UserSerializer(serializers.ModelSerializer): class UserSerializer(serializers.ModelSerializer):
"""User serializer.""" """User serializer."""
# RESPONSE # RESPONSE
email_confirmed = serializers.BooleanField(read_only=True)
fullname = serializers.CharField(source='get_full_name', read_only=True) fullname = serializers.CharField(source='get_full_name', read_only=True)
# REQUEST # REQUEST
username = serializers.CharField( username = serializers.CharField(
validators=(rest_validators.UniqueValidator(queryset=models.User.objects.all()),), validators=(rest_validators.UniqueValidator(queryset=models.User.objects.all()),),
required=False) required=False)
first_name = serializers.CharField(required=False, write_only=True)
last_name = serializers.CharField(required=False, write_only=True)
image_url = serializers.URLField(required=False)
cropped_image_url = serializers.URLField(required=False)
email = serializers.EmailField( email = serializers.EmailField(
validators=(rest_validators.UniqueValidator(queryset=models.User.objects.all()),), validators=(rest_validators.UniqueValidator(queryset=models.User.objects.all()),),
required=False) required=False)
newsletter = serializers.BooleanField(required=False)
class Meta: class Meta:
model = models.User model = models.User
@ -46,6 +40,14 @@ class UserSerializer(serializers.ModelSerializer):
'email_confirmed', 'email_confirmed',
'newsletter', 'newsletter',
] ]
extra_kwargs = {
'first_name': {'required': False, 'write_only': True, },
'last_name': {'required': False, 'write_only': True, },
'email_confirmed': {'read_only': True, },
'image_url': {'required': False, },
'cropped_image_url': {'required': False, },
'newsletter': {'required': False, },
}
def create(self, validated_data): def create(self, validated_data):
user = super(UserSerializer, self).create(validated_data) user = super(UserSerializer, self).create(validated_data)

View File

@ -10,6 +10,7 @@ from account.models import User
logging.basicConfig(format='[%(levelname)s] %(message)s', level=logging.INFO) logging.basicConfig(format='[%(levelname)s] %(message)s', level=logging.INFO)
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
def send_email(user_id: int, subject: str, message_prop: str, country_code: str, emails=None): def send_email(user_id: int, subject: str, message_prop: str, country_code: str, emails=None):
try: try:
user = User.objects.get(id=user_id) user = User.objects.get(id=user_id)

View File

@ -58,11 +58,11 @@ class SignupSerializer(serializers.ModelSerializer):
return value return value
def create(self, validated_data): def create(self, validated_data):
"""Override create method""" """Overridden create method"""
obj = account_models.User.objects.make( obj = account_models.User.objects.make(
username=validated_data.get('username'), username=validated_data.get('username'),
password=validated_data.get('password'), password=validated_data.get('password'),
email=validated_data.get('email').lower(), email=validated_data.get('email'),
newsletter=validated_data.get('newsletter')) newsletter=validated_data.get('newsletter'))
# Send verification link on user email # Send verification link on user email
if settings.USE_CELERY: if settings.USE_CELERY:
@ -110,14 +110,16 @@ class LoginByUsernameOrEmailSerializer(SourceSerializerMixin,
password = attrs.pop('password') password = attrs.pop('password')
user_qs = account_models.User.objects.filter(Q(username=username_or_email) | user_qs = account_models.User.objects.filter(Q(username=username_or_email) |
Q(email=username_or_email)) Q(email=username_or_email))
if not user_qs.exists(): if not user_qs.exists():
raise utils_exceptions.WrongAuthCredentials() raise utils_exceptions.WrongAuthCredentials()
else:
user = user_qs.first() user = user_qs.first()
authentication = authenticate(username=user.get_username(), password_is_valid = user.check_password(password)
password=password)
if not authentication: if not password_is_valid:
raise utils_exceptions.WrongAuthCredentials() raise utils_exceptions.WrongAuthCredentials()
self.instance = user self.instance = user
return attrs return attrs

View File

@ -46,7 +46,7 @@ def get_token_from_request(request):
def username_validator(username: str) -> bool: def username_validator(username: str) -> bool:
"""Validate given username""" """Validate given username"""
pattern = r'[@,]+' pattern = r'[\s@,]'
if re.search(pattern=pattern, string=username): if re.search(pattern=pattern, string=username):
return False return False
else: else: