import uuid import random from django.contrib.auth import get_user_model from apps.jwt_auth.models import CUserRoleLoginOpt from apps.cuser.models import CuserRole as CuserRoleModel, SmsOpt as SmsOptModel from django.utils import timezone from rest_framework import exceptions import requests from datetime import timedelta CUser = get_user_model() def login_by_username(username: str, password: str) -> CUserRoleLoginOpt: try: print(username) user = CUser.objects.get(username=username) if user and user.check_password(password): cuser_roles = CuserRoleModel.objects.filter(cuser=user) CUserRoleLoginOpt.objects.filter(cuser_role__cuser=user).delete() if cuser_roles: for user_role_obj in cuser_roles: if not (user_role_obj.is_active and user_role_obj.mobile_verify): raise exceptions.ValidationError({"error": 'Not a valid user'}) expire_datetime = timezone.datetime.now() + timezone.timedelta(minutes=5) user_role_opt = CUserRoleLoginOpt() user_role_opt.cuser_role = user_role_obj user_role_opt.cuser = user_role_obj.cuser user_role_opt.expire = expire_datetime user_role_opt.uuid = uuid.uuid4() user_role_opt.save() login_opts = CUserRoleLoginOpt.objects.filter(cuser_role__cuser=user) return login_opts else: raise exceptions.ValidationError({'error': "User not have role"}) else: raise exceptions.ValidationError({'error': "Username or password is not correct"}) except CUser.DoesNotExist: raise exceptions.ValidationError({'error': "Username or password is not correct"}) def login_by_mobile(mobile: int): try: exists_cuser = CUser.objects.get(mobile=mobile) random_number = random.randint(100000, 999999) try: SmsOptModel.objects.filter(mobile=mobile).delete() except Exception as exp: pass expire_time = timezone.now() + timedelta(minutes=3) opt_code = SmsOptModel(mobile=mobile, opt=random_number, expire=expire_time) opt_code.save() sms_text = f' کد ورود شما: {random_number}' payload = { 'USERNAME': 'vsms7937', 'PASSWORD': '335577775533', 'FROM': '30005367', 'TO': int(mobile), 'TEXT': f'{sms_text}' } r = requests.get('http://www.0098sms.com/sendsmslink.aspx', params=payload) except Exception as exp: raise exceptions.ValidationError({'error': "mobile not found"}) def verify_mobile_and_get_token(mobile: int, opt: int) -> CUserRoleLoginOpt: try: time_now = timezone.now() opt_obj = SmsOptModel.objects.filter(mobile=mobile, opt=opt, expire__gte=time_now)[0] if opt_obj: cuser_roles = CuserRoleModel.objects.filter(cuser__mobile=mobile, is_active=True) CUserRoleLoginOpt.objects.filter(cuser_role__in=cuser_roles).delete() if cuser_roles: for user_role_obj in cuser_roles: expire_datetime = timezone.datetime.now() + timezone.timedelta(minutes=5) user_role_opt = CUserRoleLoginOpt() user_role_opt.cuser_role = user_role_obj user_role_opt.cuser = user_role_obj.cuser user_role_opt.expire = expire_datetime user_role_opt.uuid = uuid.uuid4() user_role_opt.save() login_opts = CUserRoleLoginOpt.objects.filter(cuser_role__in=cuser_roles) SmsOptModel.objects.filter(mobile=mobile).delete() return login_opts except Exception as exp: try: SmsOptModel.objects.filter(mobile=mobile).delete() except Exception as exp: pass raise exceptions.ValidationError({'error': "cannot verify this mobile and opt code:"+str(exp)})