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 * 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 import traceback
from datetime import datetime from datetime import datetime
import requests import requests
import re
class PhoneVerificationService: class PhoneVerificationService:
@ -54,7 +55,7 @@ class PhoneVerificationService:
request_success = False request_success = False
try: try:
params = { params = {
"phone": phone, "phone": lambda: phone[1:] if phone.startswith("+") else phone,
"ip": -1, "ip": -1,
"api_id": PHONE_VERIFICATION_APP_ID "api_id": PHONE_VERIFICATION_APP_ID
} }
@ -154,8 +155,18 @@ class SiteAccountManager(BaseUserManager):
user.save(using=self._db) user.save(using=self._db)
return user return user
def get_by_natural_key(self, email_): def get_by_natural_key(self, phone_):
return self.get(email=email_) # Гоша попросил запилить фичу, чтобы принимались номера:
# +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): class SiteUser(AbstractBaseUser, PermissionsMixin):
@ -167,8 +178,11 @@ class SiteUser(AbstractBaseUser, PermissionsMixin):
]) ])
is_staff = models.BooleanField(default=False, verbose_name="Разрешение на вход в админку") is_staff = models.BooleanField(default=False, verbose_name="Разрешение на вход в админку")
is_phone_verified = 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() objects = SiteAccountManager()
@ -176,7 +190,21 @@ class SiteUser(AbstractBaseUser, PermissionsMixin):
return self.email return self.email
def natural_key(self): 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): 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 datetime import datetime
from django.db import models from django.db import models
from account.models import SiteUser from account.models import SiteUser, SiteAccountManager
from hashlib import sha512 from hashlib import sha512
from django.contrib.auth.hashers import check_password from django.contrib.auth.hashers import check_password
@ -25,15 +25,15 @@ class UserToken(models.Model):
@staticmethod @staticmethod
def auth(login: str, password: str): def auth(login: str, password: str):
user = SiteUser.objects.filter(email=login) try:
user = SiteUser.get_by_natural_key(login)
if len(user) == 0: except Exception:
raise Exception(API_ERROR_INVALID_LOGIN) 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) raise Exception(API_ERROR_INVALID_PASSWORD)
return user[0] return user
@staticmethod @staticmethod
def deauth(token: str): def deauth(token: str):