from apps.pos_device.pos.api.v1.serializers.device import DeviceSerializer 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 common.generics import get_client_ip from rest_framework import viewsets from django.db import transaction from rest_framework import status class POSDeviceViewSet(viewsets.ModelViewSet): 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 """ # convert headers to dictionary headers_data = {key: request.headers.get(key) for key in self.HEADERS} serial = headers_data['device-serial'] sdk = headers_data['device-sdk'] psp_name = headers_data['device-provider'] organization = pos_models.Organization.objects.get(en_name=psp_name) # check if device exists if 'device_identity' in request.data.keys(): device = self.device_queryset.filter(device_identity=request.data['device_identity']) else: device = self.device_queryset.filter(serial=serial).first() # activate device if device: if not device.is_activated: device.is_activated = True device.save() session = pos_models.Sessions.objects.create( device=device, password=device.password, 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'], ) return Response({ "message": "login success - session activated", "device_identity": device.device_identity, "serial": device.serial }, status=status.HTTP_200_OK) pre_device = pos_models.Device.objects.create( serial=serial, sdk=sdk, organization=organization, pre_regitered=True, is_activated=False ) return Response({ "message": "device pre-registered", "device_identity": pre_device.device_identity }, status=status.HTTP_200_OK) @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']) real_device = self.device_queryset.get(device_identity=request.data['real_device']) real_device.device_identity = pre_device.device_identity real_device.save() pre_device.delete() return Response({ "message": "device merged successfully", "device_identity": real_device.device_identity, "serial": real_device.serial })