mirror of
https://github.com/HamzaSha1/zod-backend.git
synced 2025-07-16 18:36:18 +00:00
74 lines
3.4 KiB
Python
74 lines
3.4 KiB
Python
"""middleware file"""
|
|
"""Django import"""
|
|
from rest_framework import status
|
|
from rest_framework.response import Response
|
|
from rest_framework.renderers import JSONRenderer
|
|
"""App django"""
|
|
from account.utils import custom_error_response
|
|
from account.models import UserDeviceDetails, ForceUpdate
|
|
from base.messages import ERROR_CODE, SUCCESS_CODE
|
|
from base.constants import NUMBER
|
|
from junior.models import Junior
|
|
from guardian.models import Guardian
|
|
# Custom middleware
|
|
# when user login with
|
|
# multiple device simultaneously
|
|
# It restricted login in
|
|
# multiple devices only
|
|
# user can login in single
|
|
# device at a time"""
|
|
# force update
|
|
# use 308 status code for force update
|
|
|
|
def custom_response(custom_error, response_status = status.HTTP_404_NOT_FOUND):
|
|
"""custom response"""
|
|
response = Response(custom_error.data, status=response_status)
|
|
# Set content type header to "application/json"
|
|
response['Content-Type'] = 'application/json'
|
|
# Render the response as JSON
|
|
renderer = JSONRenderer()
|
|
response.content = renderer.render(response.data)
|
|
return response
|
|
class CustomMiddleware(object):
|
|
"""Custom middleware"""
|
|
def __init__(self, get_response):
|
|
"""response"""
|
|
self.get_response = get_response
|
|
|
|
def __call__(self, request):
|
|
# Code to be executed before the view is called
|
|
response = self.get_response(request)
|
|
# Code to be executed after the view is called
|
|
device_id = request.META.get('HTTP_DEVICE_ID')
|
|
user_type = request.META.get('HTTP_USER_TYPE')
|
|
version = request.META.get('HTTP_VERSION')
|
|
device_type = str(request.META.get('HTTP_TYPE'))
|
|
|
|
api_endpoint = request.path
|
|
unrestricted_api = ('/api/v1/user/login/', '/api/v1/logout/', '/api/v1/generate-token/')
|
|
if request.user.is_authenticated:
|
|
# device details
|
|
if device_id:
|
|
device_details = UserDeviceDetails.objects.filter(user=request.user, device_id=device_id).last()
|
|
if not device_details and api_endpoint not in unrestricted_api:
|
|
custom_error = custom_error_response(ERROR_CODE['2037'], response_status=status.HTTP_404_NOT_FOUND)
|
|
response = custom_response(custom_error)
|
|
if user_type and str(user_type) == str(NUMBER['one']):
|
|
junior = Junior.objects.filter(auth=request.user, is_active=False).last()
|
|
if junior:
|
|
custom_error = custom_error_response(ERROR_CODE['2075'], response_status=status.HTTP_404_NOT_FOUND)
|
|
response = custom_response(custom_error)
|
|
elif user_type and str(user_type) == str(NUMBER['two']):
|
|
guardian = Guardian.objects.filter(user=request.user, is_active=False).last()
|
|
if guardian:
|
|
custom_error = custom_error_response(ERROR_CODE['2075'], response_status=status.HTTP_404_NOT_FOUND)
|
|
response = custom_response(custom_error)
|
|
|
|
if version and device_type:
|
|
force_update = ForceUpdate.objects.filter(version=version, device_type=device_type).last()
|
|
if not force_update:
|
|
custom_error = custom_error_response(ERROR_CODE['2079'],
|
|
response_status=status.HTTP_308_PERMANENT_REDIRECT)
|
|
response = custom_response(custom_error, status.HTTP_308_PERMANENT_REDIRECT)
|
|
return response
|