device validation by serial - DeviceException

This commit is contained in:
2026-01-26 10:27:19 +03:30
parent e218c550e4
commit eaba79ee91
4 changed files with 50 additions and 1 deletions

View File

@@ -2,6 +2,23 @@ from rest_framework import status
from rest_framework.exceptions import APIException from rest_framework.exceptions import APIException
class DeviceException(APIException):
status_code = status.HTTP_400_BAD_REQUEST
default_detail = "خطا در اطلاعات پلاک" # noqa
default_code = 'error'
def __init__(self, message=None, status_code=None, code=None):
if status_code is not None:
self.status_code = status_code
detail = {
"message": message,
"status_code": status_code
}
super().__init__(detail)
class DeviceAlreadyAssigned(APIException): class DeviceAlreadyAssigned(APIException):
status_code = status.HTTP_403_FORBIDDEN status_code = status.HTTP_403_FORBIDDEN
default_detail = "این دستگاه قبلا به این کلاینت تخصیص داده شده است" # noqa default_detail = "این دستگاه قبلا به این کلاینت تخصیص داده شده است" # noqa

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.0 on 2026-01-26 06:47
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('pos_device', '0080_bankaccountdevicelink'),
]
operations = [
migrations.AlterField(
model_name='device',
name='serial',
field=models.TextField(null=True),
),
]

View File

@@ -36,7 +36,7 @@ class Device(BaseModel):
acceptor = models.CharField(max_length=50, null=True) acceptor = models.CharField(max_length=50, null=True)
terminal = models.CharField(max_length=50, null=True) terminal = models.CharField(max_length=50, null=True)
mac = models.CharField(max_length=50, null=True) mac = models.CharField(max_length=50, null=True)
serial = models.TextField(null=True, unique=True) serial = models.TextField(null=True)
password = models.CharField(max_length=25, null=True) password = models.CharField(max_length=25, null=True)
multi_device = models.BooleanField(default=False) multi_device = models.BooleanField(default=False)
server_in = models.BooleanField(default=False) server_in = models.BooleanField(default=False)

View File

@@ -3,6 +3,7 @@ from rest_framework.serializers import ModelSerializer
from apps.authentication.api.v1.serializers.serializer import BankAccountSerializer from apps.authentication.api.v1.serializers.serializer import BankAccountSerializer
from apps.pos_device import exceptions as pos_exceptions from apps.pos_device import exceptions as pos_exceptions
from apps.pos_device import models as pos_models from apps.pos_device import models as pos_models
from apps.pos_device.exceptions import DeviceException
from apps.pos_device.web.api.v1.serilaizers import client as client_serializer from apps.pos_device.web.api.v1.serilaizers import client as client_serializer
from apps.product.web.api.v1.serializers.quota_distribution_serializers import QuotaDistributionSerializer from apps.product.web.api.v1.serializers.quota_distribution_serializers import QuotaDistributionSerializer
@@ -18,6 +19,19 @@ class DeviceSerializer(ModelSerializer):
model = pos_models.Device model = pos_models.Device
fields = '__all__' fields = '__all__'
def validate(self, attrs):
serial = attrs['serial']
if not self.instance:
if self.Meta.model.objects.filter(serial=serial).exists():
raise DeviceException("دستگاه یا این شماره سریال از قبل ثبت شده است.", status_code=403) # noqa
if self.instance:
if serial != self.instance.serial and self.Meta.model.objects.filter(serial=serial).exists():
raise DeviceException("دستگاهی با این شماره سریال وجود دارد.", status_code=403) # noqa
return attrs
def to_representation(self, instance): def to_representation(self, instance):
""" custom output of serializer """ """ custom output of serializer """
representation = super().to_representation(instance) representation = super().to_representation(instance)