diff --git a/apps/pos_device/exceptions.py b/apps/pos_device/exceptions.py index f5f8d10..d4986f9 100644 --- a/apps/pos_device/exceptions.py +++ b/apps/pos_device/exceptions.py @@ -2,6 +2,23 @@ from rest_framework import status 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): status_code = status.HTTP_403_FORBIDDEN default_detail = "این دستگاه قبلا به این کلاینت تخصیص داده شده است" # noqa diff --git a/apps/pos_device/migrations/0081_alter_device_serial.py b/apps/pos_device/migrations/0081_alter_device_serial.py new file mode 100644 index 0000000..313de18 --- /dev/null +++ b/apps/pos_device/migrations/0081_alter_device_serial.py @@ -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), + ), + ] diff --git a/apps/pos_device/models.py b/apps/pos_device/models.py index 771787b..38f83cb 100644 --- a/apps/pos_device/models.py +++ b/apps/pos_device/models.py @@ -36,7 +36,7 @@ class Device(BaseModel): acceptor = models.CharField(max_length=50, null=True) terminal = 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) multi_device = models.BooleanField(default=False) server_in = models.BooleanField(default=False) diff --git a/apps/pos_device/web/api/v1/serilaizers/device.py b/apps/pos_device/web/api/v1/serilaizers/device.py index 929384d..37c97bd 100644 --- a/apps/pos_device/web/api/v1/serilaizers/device.py +++ b/apps/pos_device/web/api/v1/serilaizers/device.py @@ -3,6 +3,7 @@ from rest_framework.serializers import ModelSerializer from apps.authentication.api.v1.serializers.serializer import BankAccountSerializer from apps.pos_device import exceptions as pos_exceptions 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.product.web.api.v1.serializers.quota_distribution_serializers import QuotaDistributionSerializer @@ -18,6 +19,19 @@ class DeviceSerializer(ModelSerializer): model = pos_models.Device 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): """ custom output of serializer """ representation = super().to_representation(instance)