add product
This commit is contained in:
1 parent
423d4cf40e
commit
c8d45dd07c
58 files changed
+8309
-674
No files matched your search
+107
-255
@@ -1,297 +1,149 @@
|
||||
from django.shortcuts import render
|
||||
from django.utils import timezone
|
||||
from rest_framework.views import APIView
|
||||
from rest_framework import serializers
|
||||
from rest_framework.response import Response
|
||||
from django.db import transaction
|
||||
from apps.jwt_auth.models import JwtToken as JwtTokenModel, CUserRoleLoginOpt
|
||||
from apps.cuser.models import CuserRole as CuserRoleModel, RoleType as RoleTypeModel
|
||||
from apps.customer.models import Customer as CustomerModel, CustomerResponsible as CustomerResponsibleModel
|
||||
from rest_framework_simplejwt.tokens import RefreshToken, AccessToken, Token
|
||||
from rest_framework_simplejwt.authentication import JWTAuthentication
|
||||
from apps.workspace.models import Workspace as WorkspaceModel
|
||||
from django.utils import timezone
|
||||
from rest_framework import serializers, status
|
||||
from rest_framework.permissions import AllowAny, IsAuthenticated
|
||||
from rest_framework.response import Response
|
||||
from rest_framework.views import APIView
|
||||
from rest_framework_simplejwt.exceptions import InvalidToken, TokenError
|
||||
from rest_framework_simplejwt.tokens import RefreshToken
|
||||
|
||||
from apps.cuser.models import CUser, CuserRole, RoleType
|
||||
from apps.jwt_auth.models import JwtToken, CUserRoleLoginOpt
|
||||
from apps.jwt_auth.services import login_by_username, login_by_mobile, verify_mobile_and_get_token
|
||||
from django.contrib.auth import get_user_model
|
||||
from rest_framework import status
|
||||
CUser = get_user_model()
|
||||
|
||||
# Create your views here.
|
||||
from apps.jwt_auth.session import issue_tokens, validate_session_claims
|
||||
from apps.workspace.models import Workspace
|
||||
|
||||
|
||||
class VerifyMobileAndGetTokenView(APIView):
|
||||
|
||||
class InputSerializer(serializers.Serializer):
|
||||
mobile = serializers.IntegerField(required=True)
|
||||
opt = serializers.IntegerField(required=True)
|
||||
class RoleTypeSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = RoleType
|
||||
fields = ('role_name', 'role_name_en')
|
||||
|
||||
|
||||
class OutputSerializer(serializers.ModelSerializer):
|
||||
|
||||
class CUserRoleSerializer(serializers.ModelSerializer):
|
||||
|
||||
class RoleTypeSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = RoleTypeModel
|
||||
fields = ('role_name', )
|
||||
|
||||
role_type = RoleTypeSerializer()
|
||||
|
||||
class Meta:
|
||||
model = CuserRoleModel
|
||||
fields = ('name_family', 'title', 'role_type')
|
||||
|
||||
cuser_role = CUserRoleSerializer()
|
||||
|
||||
class RoleSerializer(serializers.ModelSerializer):
|
||||
class WorkspaceSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = CUserRoleLoginOpt
|
||||
fields = ('cuser_role', 'expire', 'uuid')
|
||||
model = Workspace
|
||||
fields = ('id', 'name')
|
||||
|
||||
def post(self, request):
|
||||
serializer = self.InputSerializer(data=request.data)
|
||||
serializer.is_valid(raise_exception=True)
|
||||
role_type = RoleTypeSerializer()
|
||||
sys_ws = WorkspaceSerializer()
|
||||
|
||||
login_opts = verify_mobile_and_get_token(**serializer.validated_data)
|
||||
|
||||
response_data = self.OutputSerializer(login_opts, many=True).data
|
||||
|
||||
return Response(response_data)
|
||||
class Meta:
|
||||
model = CuserRole
|
||||
fields = ('name_family', 'title', 'role_type', 'sys_ws')
|
||||
|
||||
|
||||
class LoginByMobileView(APIView):
|
||||
class LoginOptionSerializer(serializers.ModelSerializer):
|
||||
cuser_role = RoleSerializer()
|
||||
|
||||
class Meta:
|
||||
model = CUserRoleLoginOpt
|
||||
fields = ('cuser_role', 'expire', 'uuid')
|
||||
|
||||
|
||||
class PublicAuthView(APIView):
|
||||
authentication_classes = ()
|
||||
permission_classes = (AllowAny,)
|
||||
|
||||
def get_authenticate_header(self, request):
|
||||
return 'Bearer realm="api"'
|
||||
|
||||
|
||||
class VerifyMobileAndGetTokenView(PublicAuthView):
|
||||
class InputSerializer(serializers.Serializer):
|
||||
mobile = serializers.IntegerField(required=True)
|
||||
mobile = serializers.CharField(required=True)
|
||||
opt = serializers.IntegerField(required=True, min_value=100000, max_value=999999)
|
||||
|
||||
def post(self, request):
|
||||
serializer = self.InputSerializer(data=request.data)
|
||||
serializer.is_valid(raise_exception=True)
|
||||
|
||||
login_by_mobile(**serializer.validated_data)
|
||||
|
||||
output = {
|
||||
"result": {
|
||||
"mobile": serializer.validated_data.get('mobile'),
|
||||
"message": "opt code send"
|
||||
}
|
||||
}
|
||||
|
||||
return Response(output)
|
||||
options = verify_mobile_and_get_token(**serializer.validated_data)
|
||||
return Response(LoginOptionSerializer(options, many=True).data)
|
||||
|
||||
|
||||
class LoginByUserView(APIView):
|
||||
class LoginByMobileView(PublicAuthView):
|
||||
class InputSerializer(serializers.Serializer):
|
||||
mobile = serializers.CharField(required=True)
|
||||
|
||||
def post(self, request):
|
||||
serializer = self.InputSerializer(data=request.data)
|
||||
serializer.is_valid(raise_exception=True)
|
||||
mobile = login_by_mobile(**serializer.validated_data)
|
||||
return Response({'result': {'mobile': mobile, 'message': 'opt code send'}})
|
||||
|
||||
|
||||
class LoginByUserView(PublicAuthView):
|
||||
class InputSerializer(serializers.Serializer):
|
||||
username = serializers.CharField(required=True)
|
||||
password = serializers.CharField(required=True)
|
||||
|
||||
class OutputSerializer(serializers.ModelSerializer):
|
||||
|
||||
class CUserRoleSerializer(serializers.ModelSerializer):
|
||||
|
||||
class RoleTypeSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = RoleTypeModel
|
||||
fields = ('role_name', )
|
||||
|
||||
role_type = RoleTypeSerializer()
|
||||
|
||||
class Meta:
|
||||
model = CuserRoleModel
|
||||
fields = ('name_family', 'title', 'role_type')
|
||||
|
||||
cuser_role = CUserRoleSerializer()
|
||||
|
||||
class Meta:
|
||||
model = CUserRoleLoginOpt
|
||||
fields = ('cuser_role', 'expire', 'uuid')
|
||||
password = serializers.CharField(required=True, trim_whitespace=False, write_only=True)
|
||||
|
||||
def post(self, request):
|
||||
serializer = self.InputSerializer(data=request.data)
|
||||
serializer.is_valid(raise_exception=True)
|
||||
|
||||
username = serializer.validated_data.get('username')
|
||||
password = serializer.validated_data.get('password')
|
||||
|
||||
login_opts = login_by_username(username=username, password=password)
|
||||
|
||||
response_data = self.OutputSerializer(login_opts, many=True).data
|
||||
|
||||
return Response(response_data)
|
||||
options = login_by_username(**serializer.validated_data)
|
||||
return Response(LoginOptionSerializer(options, many=True).data)
|
||||
|
||||
|
||||
class CustomTokenObtainPairView(APIView):
|
||||
|
||||
class CustomTokenObtainPairView(PublicAuthView):
|
||||
class InputSerializer(serializers.Serializer):
|
||||
uuid_opt = serializers.CharField(required=True)
|
||||
|
||||
class OutputSerializer(serializers.Serializer):
|
||||
access = serializers.CharField(required=True)
|
||||
refresh = serializers.CharField(required=True)
|
||||
uuid_opt = serializers.UUIDField(required=True)
|
||||
|
||||
@transaction.atomic
|
||||
def post(self, request):
|
||||
serializer = self.InputSerializer(data=request.data)
|
||||
serializer.is_valid(raise_exception=True)
|
||||
|
||||
uuid_opt = serializer.validated_data.get('uuid_opt')
|
||||
|
||||
try:
|
||||
user_login_opt = CUserRoleLoginOpt.objects.get(uuid=uuid_opt)
|
||||
user = user_login_opt.cuser
|
||||
cuser_role = user_login_opt.cuser_role
|
||||
user_id = CUserRoleLoginOpt.objects.values_list('cuser_id', flat=True).get(
|
||||
uuid=serializer.validated_data['uuid_opt'], expire__gt=timezone.now())
|
||||
CUser.objects.select_for_update().get(pk=user_id)
|
||||
option = CUserRoleLoginOpt.objects.select_related(
|
||||
'cuser_role__cuser', 'cuser_role__role_type', 'cuser_role__sys_ws',
|
||||
).get(uuid=serializer.validated_data['uuid_opt'], expire__gt=timezone.now())
|
||||
except (CUserRoleLoginOpt.DoesNotExist, CUser.DoesNotExist):
|
||||
raise InvalidToken('اعتبار درخواست ورود تمام شده است. دوباره وارد شوید.')
|
||||
if option.cuser_id != option.cuser_role.cuser_id:
|
||||
raise InvalidToken('درخواست ورود معتبر نیست.')
|
||||
data = issue_tokens(option.cuser_role)
|
||||
CUserRoleLoginOpt.objects.filter(cuser_id=option.cuser_id).delete()
|
||||
return Response(data)
|
||||
|
||||
|
||||
workspace = cuser_role.sys_ws
|
||||
|
||||
if user_login_opt:
|
||||
refresh = RefreshToken.for_user(user)
|
||||
|
||||
#if 'user_id' in refresh:
|
||||
# del refresh['user_id']
|
||||
#print(cuser_role.uuid)
|
||||
|
||||
|
||||
'''try:
|
||||
#customerObj = CustomerModel.objects.get(cuser_role__uuid=str(cuser_role.uuid))
|
||||
# workspace = customerObj.sys_ws
|
||||
|
||||
workspace = cuser_role.sys_ws
|
||||
|
||||
except:
|
||||
operator = CustomerResponsibleModel.objects.get(cuser_role=cuser_role)
|
||||
workspace = operator.sys_ws'''
|
||||
|
||||
refresh['workspace_uuid'] = str(workspace.uuid)
|
||||
|
||||
refresh['cuser_role_uuid'] = str(cuser_role.uuid)
|
||||
|
||||
refresh['user_uuid'] = str(user.uuid)
|
||||
|
||||
#print(str(refresh))
|
||||
|
||||
try:
|
||||
jwt_db = JwtTokenModel(refresh=str(refresh), access=str(refresh.access_token),
|
||||
cuser=user, cuser_role=cuser_role)
|
||||
jwt_db.save()
|
||||
|
||||
try:
|
||||
CUserRoleLoginOpt.objects.filter(cuser=user).delete()
|
||||
except Exception as exp:
|
||||
pass
|
||||
|
||||
except Exception as exp:
|
||||
return Response({'error': str(exp)})
|
||||
|
||||
new_token_data = {
|
||||
'refresh': str(refresh),
|
||||
'access': str(refresh.access_token),
|
||||
}
|
||||
|
||||
out_data = self.OutputSerializer(data=new_token_data)
|
||||
out_data.is_valid(raise_exception=True)
|
||||
|
||||
return Response(out_data.data)
|
||||
else:
|
||||
return Response({"error": 'userpass is not True'})
|
||||
except CUserRoleLoginOpt.DoesNotExist:
|
||||
return Response({"error": 'Token not valid'})
|
||||
except Exception as exp:
|
||||
return Response({"error": 'user or pass is not true 2'})
|
||||
|
||||
|
||||
class CustomTokenRefreshView(APIView):
|
||||
|
||||
class CustomTokenRefreshView(PublicAuthView):
|
||||
class InputSerializer(serializers.Serializer):
|
||||
refresh = serializers.CharField(required=True)
|
||||
|
||||
class OutputSerializer(serializers.Serializer):
|
||||
access = serializers.CharField(required=True)
|
||||
@transaction.atomic
|
||||
def post(self, request):
|
||||
serializer = self.InputSerializer(data=request.data)
|
||||
serializer.is_valid(raise_exception=True)
|
||||
refresh_value = serializer.validated_data['refresh']
|
||||
try:
|
||||
refresh = RefreshToken(refresh_value)
|
||||
session = JwtToken.objects.select_for_update().select_related(
|
||||
'cuser_role__cuser', 'cuser_role__role_type', 'cuser_role__sys_ws',
|
||||
).get(refresh=refresh_value, is_blocked=False)
|
||||
except (TokenError, JwtToken.DoesNotExist):
|
||||
raise InvalidToken('نشست شما منقضی یا باطل شده است. دوباره وارد شوید.')
|
||||
validate_session_claims(session, refresh)
|
||||
return Response(issue_tokens(session.cuser_role, session=session))
|
||||
|
||||
|
||||
class LogoutView(PublicAuthView):
|
||||
class InputSerializer(serializers.Serializer):
|
||||
refresh = serializers.CharField(required=True)
|
||||
|
||||
def post(self, request):
|
||||
with transaction.atomic():
|
||||
try:
|
||||
|
||||
serializer = self.InputSerializer(data=request.data)
|
||||
serializer.is_valid(raise_exception=True)
|
||||
|
||||
refresh_token = serializer.validated_data.get('refresh')
|
||||
|
||||
print(refresh_token)
|
||||
|
||||
# check: token is valid?
|
||||
ref_token = RefreshToken(token=refresh_token)
|
||||
|
||||
print("ref")
|
||||
|
||||
# first token must exists in whitelist and not blocked
|
||||
token_exist = JwtTokenModel.objects.get(refresh=str(refresh_token))
|
||||
|
||||
print("exsist")
|
||||
|
||||
token_is_blocked = JwtTokenModel.objects.get(refresh=str(refresh_token)).is_blocked
|
||||
|
||||
print("yess")
|
||||
|
||||
if token_exist and token_is_blocked is False:
|
||||
JwtTokenModel.objects.get(refresh=str(refresh_token)).delete()
|
||||
else:
|
||||
raise ValueError('refresh token is not in whitelist or blocked!')
|
||||
|
||||
user_uuid = ref_token.payload.get('user_uuid')
|
||||
user_id = ref_token.payload.get('user_id')
|
||||
cuser_role_uuid = ref_token.payload.get('cuser_role_uuid')
|
||||
|
||||
token_exp_timestamp = ref_token.payload.get('exp')
|
||||
token_exp = timezone.make_aware(timezone.datetime.fromtimestamp(token_exp_timestamp), timezone.utc)
|
||||
user = CUser.objects.get(id=user_id)
|
||||
cuser_role = CuserRoleModel.objects.get(uuid=cuser_role_uuid)
|
||||
|
||||
|
||||
print("OKH###")
|
||||
|
||||
if ref_token:
|
||||
new_token = RefreshToken.for_user(user)
|
||||
|
||||
#if 'user_id' in new_token:
|
||||
#del new_token['user_id']
|
||||
|
||||
new_token['user_uuid'] = str(user.uuid)
|
||||
new_token['cuser_role_uuid'] = str(cuser_role.uuid)
|
||||
|
||||
print("OKOKKO 555")
|
||||
|
||||
#workspace = WorkspaceModel.objects.get(cuser_role_owner__uuid=str(cuser_role.uuid))
|
||||
|
||||
try:
|
||||
customerObj = CustomerModel.objects.get(cuser_role__uuid=str(cuser_role.uuid))
|
||||
new_token['workspace_uuid'] = str(customerObj.sys_ws.uuid)
|
||||
except:
|
||||
operator = CustomerResponsibleModel.objects.get(cuser_role__uuid=str(cuser_role.uuid))
|
||||
new_token['workspace_uuid'] = str(operator.sys_ws.uuid)
|
||||
|
||||
|
||||
new_access_token = new_token.access_token
|
||||
|
||||
new_token_data = {
|
||||
'refresh': str(new_token),
|
||||
'access': str(new_access_token),
|
||||
}
|
||||
|
||||
print("OKOKKO")
|
||||
|
||||
new_token_obj = JwtTokenModel(refresh=str(new_token),
|
||||
access=str(new_token_data.get('access')),
|
||||
expire=token_exp,
|
||||
cuser=user,
|
||||
cuser_role=cuser_role
|
||||
)
|
||||
|
||||
print("OKOKKO 222")
|
||||
new_token_obj.save()
|
||||
out_data = self.OutputSerializer(data=new_token_data)
|
||||
out_data.is_valid(raise_exception=True)
|
||||
return Response(out_data.data)
|
||||
|
||||
except Exception as e:
|
||||
transaction.set_rollback(True)
|
||||
return Response({"error": str(e)})
|
||||
serializer = self.InputSerializer(data=request.data)
|
||||
serializer.is_valid(raise_exception=True)
|
||||
value = serializer.validated_data['refresh']
|
||||
try:
|
||||
token = RefreshToken(value)
|
||||
except TokenError:
|
||||
return Response(status=status.HTTP_204_NO_CONTENT)
|
||||
# Possession of the signed refresh token permits logout even after access expires.
|
||||
if type(token.get('session_id')) is int and type(token.get('user_id')) is int:
|
||||
JwtToken.objects.filter(pk=token['session_id'], cuser_id=token['user_id']).update(is_blocked=True)
|
||||
else:
|
||||
JwtToken.objects.filter(refresh=value).update(is_blocked=True)
|
||||
return Response(status=status.HTTP_204_NO_CONTENT)
|
||||
Reference in new issue
Block a user