import traceback from apps.pos_device.pos.api.v1.serializers.device import DeviceSerializer from apps.authentication.services.service import get_users_of_organization from apps.pos_device.mixins.pos_device_mixin import POSDeviceMixin from apps.pos_device import models as pos_models from rest_framework.permissions import AllowAny from rest_framework.decorators import action from rest_framework.response import Response from django.http.response import JsonResponse from common.generics import get_client_ip from rest_framework import viewsets from django.db import transaction from rest_framework import status def test_web_server(request): """ testing from pos device to check server status """ return JsonResponse({"message": "OK"}, status=status.HTTP_200_OK) class POSDeviceViewSet(viewsets.ModelViewSet, POSDeviceMixin): device_queryset = pos_models.Device.objects.all() session_queryset = pos_models.Sessions.objects.all() serializer_class = DeviceSerializer HEADERS = [ 'device-mac', 'device-serial', 'device-name', 'device-sdk', 'device-version', 'device-lng', 'device-lot', 'device-provider', # noqa 'device-vname', # noqa ] permission_classes = [AllowAny] @action( methods=['post'], detail=False, url_path='login', url_name='login', name='login' ) @transaction.atomic def login(self, request): """ login of pos device """ """ # get device owner (organization) organization = self.get_device_organization() """ try: # convert headers to dictionary headers_data = {key: request.headers.get(key) for key in self.HEADERS} serial = headers_data['device-serial'] mac = headers_data['device-mac'] psp_name = headers_data['device-provider'] # provider organization organization = pos_models.Organization.objects.get(en_name=psp_name) device = self.device_queryset.filter(serial=serial).first() if not device and 'device_identity' in request.data.keys() and request.data['device_identity'] != "": device = self.device_queryset.filter(device_identity=request.data['device_identity']).first() if device: if not device.is_activated and device.pre_registered and device.assigned_state: # activate device device.is_activated = True device.save() if device.is_activated and device.assigned_state: # when device is logged in, its has an organization owner client, if not it will show error device_owner_org = self.get_device_organization() session = self.session_queryset.filter(serial=serial).first() if not session: pos_models.Sessions.objects.create( device=device, name=headers_data['device-name'], version=headers_data['device-version'], mac=headers_data['device-mac'], ip=get_client_ip(request), sdk=headers_data['device-sdk'], serial=headers_data['device-serial'], latitude=headers_data['device-lot'], longitude=headers_data['device-lng'], ) else: session.name = headers_data['device-name'] session.version = headers_data['device-version'] session.mac = headers_data['device-mac'] session.ip = get_client_ip(request) session.sdk = headers_data['device-sdk'] session.latitude = headers_data['device-lot'] session.longitude = headers_data['device-lng'] session.save() org_data = { 'id': device_owner_org.id, 'name': device_owner_org.name, 'en_name': device_owner_org.en_name } return Response({ "message": "خوش آمدید", # noqa "device_identity": device.device_identity, "serial": device.serial, "password": device.password, "provider": organization.name, "provider_tell": organization.phone, "device_owner": org_data, "device_owner_users": get_users_of_organization(device_owner_org) }, status=status.HTTP_200_OK) return Response({ "message": "دستگاه در سیستم ثبت در انتظار فعال سازی توسط پذیرنده می باشد", # noqa "device_identity": device.device_identity, "password": "****", "serial": device.serial, "provider": organization.name, "provider_tell": organization.phone, }, status=status.HTTP_401_UNAUTHORIZED) else: pre_device = pos_models.Device.objects.create( serial=serial, mac=mac, organization=organization, pre_registered=True, is_activated=False ) return Response({ "message": "دستگاه در سیستم ثبت در انتظار فعال سازی توسط پذیرنده می باشد", # noqa "device_identity": pre_device.device_identity, "password": "****", "provider": organization.name, "provider_tell": organization.phone, }, status=status.HTTP_412_PRECONDITION_FAILED) except Exception as e: error_message = str(e) error_title = e.__class__.__name__ error_traceback = traceback.format_exc() print(error_message) print(error_title) print(error_traceback) return Response( { "result": "خطای سرور داخلی رخ داده است. لطفا بعدا تلاش کنید.", "error_message": error_message, "error_title": error_title, "error_traceback": error_traceback, }, status=status.HTTP_500_INTERNAL_SERVER_ERROR ) @action( methods=['post'], detail=False, url_path='merge_devices', url_name='merge_devices', name='merge_devices' ) @transaction.atomic def merge_devices(self, request): """ merge pre register device & device has registered by psp user """ pre_device = self.device_queryset.get(device_identity=request.data['pre_device_identity']) real_device = self.device_queryset.get(device_identity=request.data['real_device_identity']) real_device.device_identity = pre_device.device_identity real_device.is_activated = True real_device.save() pre_device.delete() return Response({ "message": "device merged successfully", "device_identity": real_device.device_identity, "serial": real_device.serial })