Add logic for phone (without '+' or '+7')

This commit is contained in:
vlados31 2022-09-26 22:14:07 +03:00
parent 15e0466fb8
commit c2d0dc7b27
3 changed files with 45 additions and 14 deletions

View File

@ -2,4 +2,7 @@ from django.contrib import admin
from .models import *
admin.site.register(SiteUser)
@admin.register(SiteUser)
class DevEventAdmin(admin.ModelAdmin):
# fields = ['name', 'surname', 'phone', 'email', 'register_datetime']
readonly_fields = ['register_datetime']

View File

@ -9,6 +9,7 @@ import random
import traceback
from datetime import datetime
import requests
import re
class PhoneVerificationService:
@ -54,7 +55,7 @@ class PhoneVerificationService:
request_success = False
try:
params = {
"phone": phone,
"phone": lambda: phone[1:] if phone.startswith("+") else phone,
"ip": -1,
"api_id": PHONE_VERIFICATION_APP_ID
}
@ -154,8 +155,18 @@ class SiteAccountManager(BaseUserManager):
user.save(using=self._db)
return user
def get_by_natural_key(self, email_):
return self.get(email=email_)
def get_by_natural_key(self, phone_):
# Гоша попросил запилить фичу, чтобы принимались номера:
# +79991112233
# 79991112233
# 9991112233
if re.match("^[0-9]{10}$", phone_) is not None:
phone_ = f"+7{phone_}"
elif re.match("^7[0-9]{10}$", phone_) is not None:
phone_ = f"+{phone_}"
return self.get(phone=phone_)
class SiteUser(AbstractBaseUser, PermissionsMixin):
@ -167,8 +178,11 @@ class SiteUser(AbstractBaseUser, PermissionsMixin):
])
is_staff = models.BooleanField(default=False, verbose_name="Разрешение на вход в админку")
is_phone_verified = models.BooleanField(default=False, verbose_name="Телефон верифицирован")
REQUIRED_FIELDS = ['name', 'surname', 'phone']
USERNAME_FIELD = 'email'
register_datetime = models.DateTimeField(default=datetime.now, editable=False)
REQUIRED_FIELDS = ['name', 'surname', 'email']
USERNAME_FIELD = 'phone'
objects = SiteAccountManager()
@ -176,7 +190,21 @@ class SiteUser(AbstractBaseUser, PermissionsMixin):
return self.email
def natural_key(self):
return self.email
return self.phone
@staticmethod
def get_by_natural_key(key):
# Гоша попросил запилить фичу, чтобы принимались номера:
# +79991112233
# 79991112233
# 9991112233
if re.match("^[0-9]{10}$", key) is not None:
key = f"+7{key}"
elif re.match("^7[0-9]{10}$", key) is not None:
key = f"+{key}"
return SiteUser.objects.get(phone=key)
def __str__(self):
return self.email
return f"{self.name} {self.surname}: {self.phone} ({self.email})"

View File

@ -1,7 +1,7 @@
from datetime import datetime
from django.db import models
from account.models import SiteUser
from account.models import SiteUser, SiteAccountManager
from hashlib import sha512
from django.contrib.auth.hashers import check_password
@ -25,15 +25,15 @@ class UserToken(models.Model):
@staticmethod
def auth(login: str, password: str):
user = SiteUser.objects.filter(email=login)
if len(user) == 0:
try:
user = SiteUser.get_by_natural_key(login)
except Exception:
raise Exception(API_ERROR_INVALID_LOGIN)
if not check_password(password, user[0].password):
if not check_password(password, user.password):
raise Exception(API_ERROR_INVALID_PASSWORD)
return user[0]
return user
@staticmethod
def deauth(token: str):