diff --git a/account/admin.py b/account/admin.py index 52ee85f..203c45e 100644 --- a/account/admin.py +++ b/account/admin.py @@ -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'] diff --git a/account/models.py b/account/models.py index 3244701..1de54e8 100644 --- a/account/models.py +++ b/account/models.py @@ -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})" diff --git a/api/models.py b/api/models.py index 31daf02..6c744c2 100644 --- a/api/models.py +++ b/api/models.py @@ -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):