Files
RasadDam_Backend/apps/pos_device/pos/api/v1/viewsets/device.py
2025-08-17 15:11:58 +03:30

109 lines
3.7 KiB
Python

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
})