add product
This commit is contained in:
1 parent
423d4cf40e
commit
c8d45dd07c
58 files changed
+8309
-674
No files matched your search
+87
-98
@@ -1,110 +1,99 @@
|
||||
import uuid
|
||||
import random
|
||||
import secrets
|
||||
from datetime import timedelta
|
||||
|
||||
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.core.exceptions import ValidationError as DjangoValidationError
|
||||
from django.db import transaction
|
||||
from django.utils import timezone
|
||||
from rest_framework import exceptions
|
||||
import requests
|
||||
from datetime import timedelta
|
||||
|
||||
from apps.cuser.models import CuserRole, SmsOpt
|
||||
from apps.jwt_auth.models import CUserRoleLoginOpt
|
||||
from utils.services.sms import DefaultSmsProvider
|
||||
from utils.validations.mobile import normalize_mobile
|
||||
|
||||
CUser = get_user_model()
|
||||
|
||||
def login_by_username(username: str, password: str) -> CUserRoleLoginOpt:
|
||||
|
||||
class SmsDeliveryUnavailable(exceptions.APIException):
|
||||
status_code = 503
|
||||
default_detail = 'ارسال پیامک انجام نشد. لطفاً کمی بعد دوباره تلاش کنید.'
|
||||
default_code = 'sms_failed'
|
||||
|
||||
|
||||
def eligible_roles(user, customer_only=False):
|
||||
roles = CuserRole.objects.select_related('role_type', 'sys_ws', 'cuser').filter(
|
||||
cuser=user, is_active=True, mobile_verify=True, sys_ws__is_active=True,
|
||||
)
|
||||
if customer_only:
|
||||
roles = roles.filter(role_type__role_name_en='workspace_customer', customer_panel=True)
|
||||
return [role for role in roles if
|
||||
(not role.sys_ws.expire or role.sys_ws.expire > timezone.now()) and
|
||||
(role.role_type.role_name_en != 'workspace_customer' or role.customer_panel is True)]
|
||||
|
||||
|
||||
def create_login_options(user, roles):
|
||||
CUserRoleLoginOpt.objects.filter(cuser=user).delete()
|
||||
options = []
|
||||
for role in roles:
|
||||
options.append(CUserRoleLoginOpt.objects.create(
|
||||
cuser=user, cuser_role=role, expire=timezone.now() + timedelta(minutes=5),
|
||||
))
|
||||
return options
|
||||
|
||||
|
||||
@transaction.atomic
|
||||
def login_by_username(username: str, password: str):
|
||||
user = CUser.objects.select_for_update().filter(username=username).first()
|
||||
if not user or not user.check_password(password):
|
||||
raise exceptions.ValidationError({'error': 'نام کاربری یا رمز عبور اشتباه است.'})
|
||||
if not user.is_active:
|
||||
raise exceptions.PermissionDenied('حساب کاربری شما غیرفعال است.')
|
||||
roles = eligible_roles(user)
|
||||
if not roles:
|
||||
raise exceptions.PermissionDenied('نقش یا دسترسی فعال برای این حساب وجود ندارد.')
|
||||
return create_login_options(user, roles)
|
||||
|
||||
|
||||
def mobile_user(mobile):
|
||||
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"})
|
||||
mobile = normalize_mobile(mobile)
|
||||
except DjangoValidationError as error:
|
||||
raise exceptions.ValidationError(error.message_dict)
|
||||
user = CUser.objects.filter(mobile=mobile).first()
|
||||
if not user:
|
||||
raise exceptions.ValidationError({'mobile': 'کاربری با این شماره موبایل ثبت نشده است.'})
|
||||
if not user.is_active:
|
||||
raise exceptions.PermissionDenied('حساب کاربری شما غیرفعال است.')
|
||||
roles = eligible_roles(user, customer_only=True)
|
||||
if not roles:
|
||||
raise exceptions.PermissionDenied('دسترسی شما به پنل مشتریان فعال نیست.')
|
||||
return user, roles
|
||||
|
||||
|
||||
@transaction.atomic
|
||||
def login_by_mobile(mobile: int):
|
||||
try:
|
||||
|
||||
exists_cuser = CUser.objects.get(mobile=mobile)
|
||||
|
||||
random_number = random.randint(100000, 999999)
|
||||
user, _ = mobile_user(mobile)
|
||||
# Serialize code requests for this account, retaining the old valid code if
|
||||
# the provider refuses the new message.
|
||||
CUser.objects.select_for_update().get(pk=user.pk)
|
||||
code = secrets.randbelow(900000) + 100000
|
||||
if not DefaultSmsProvider().send_sms(str(user.mobile), f'کد ورود شما: {code}'):
|
||||
raise SmsDeliveryUnavailable()
|
||||
SmsOpt.objects.filter(mobile=user.mobile).delete()
|
||||
SmsOpt.objects.create(mobile=user.mobile, opt=code, expire=timezone.now() + timedelta(minutes=3))
|
||||
return user.mobile
|
||||
|
||||
|
||||
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)})
|
||||
@transaction.atomic
|
||||
def verify_mobile_and_get_token(mobile: int, opt: int):
|
||||
user, roles = mobile_user(mobile)
|
||||
CUser.objects.select_for_update().get(pk=user.pk)
|
||||
code = SmsOpt.objects.select_for_update().filter(
|
||||
mobile=user.mobile, opt=opt, expire__gt=timezone.now(),
|
||||
).first()
|
||||
if not code:
|
||||
raise exceptions.ValidationError({'opt': 'کد تأیید اشتباه است یا اعتبار آن تمام شده است.'})
|
||||
options = create_login_options(user, roles)
|
||||
SmsOpt.objects.filter(mobile=user.mobile).delete()
|
||||
return options
|
||||
Reference in new issue
Block a user