"""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