Files
RasadDam_Backend/apps/pos_device/web/api/v1/serilaizers/device.py

154 lines
4.9 KiB
Python

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
class ProviderCompanySerializer(ModelSerializer):
class Meta:
model = pos_models.ProviderCompany
fields = '__all__'
class DeviceSerializer(ModelSerializer):
class Meta:
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)
representation['organization'] = {
'name': instance.organization.name,
'id': instance.organization.id,
'province': instance.organization.province.id
}
representation['assignment'] = DeviceAssignmentSerializer(
instance.assignment.all().first()
).data
return representation
class DeviceVersionSerializer(ModelSerializer):
class Meta:
model = pos_models.DeviceVersion
fields = '__all__'
class SessionSerializer(ModelSerializer):
class Meta:
model = pos_models.Sessions
fields = '__all__'
class DeviceAssignmentSerializer(ModelSerializer):
class Meta:
model = pos_models.DeviceAssignment
fields = '__all__'
def validate(self, attrs):
device = attrs['device']
client = attrs['client']
if not self.instance:
if self.Meta.model.objects.filter(device=device, client=client).exists():
raise pos_exceptions.DeviceAlreadyAssigned()
return attrs
def to_representation(self, instance):
representation = super().to_representation(instance)
representation['client'] = client_serializer.POSClientSerializer(
instance.client
).data
return representation
class StakeHoldersSerializer(ModelSerializer):
class Meta:
model = pos_models.StakeHolders
fields = '__all__'
def to_representation(self, instance):
representation = super().to_representation(instance)
# get organization bank account that set to a device
bank_account_device_links = instance.organization.bank_account_device_links.filter(device=instance.device)
representation['bank_account'] = BankAccountSerializer(
instance.organization.bank_information.all().first()
if not bank_account_device_links.exists() else bank_account_device_links.first().bank_account
).data
representation['device'] = instance.device.device_identity
representation['device_id'] = instance.device.id
representation['organization'] = {
'name': instance.organization.name,
'id': instance.organization.id
}
if instance.broker:
representation['broker'] = {
'name': instance.broker.name,
'id': instance.broker.id
}
return representation
class StakeHolderShareAmountSerializer(ModelSerializer):
class Meta:
model = pos_models.StakeHolderShareAmount
fields = '__all__'
def validate(self, attrs):
# check organization has pos device
assigned_organization = attrs['quota_distribution'].assigned_organization
if not assigned_organization.has_pos:
raise pos_exceptions.OrganizationDeviceNotAssigned()
return attrs
def to_representation(self, instance):
representation = super().to_representation(instance)
# distribution information
representation['quota_distribution'] = QuotaDistributionSerializer(
instance.quota_distribution
).data
# stakeholders information
representation['stakeholders'] = StakeHoldersSerializer(instance.stakeholders).data
return representation
class BankAccountDeviceLinkSerializer(ModelSerializer):
class Meta:
model = pos_models.BankAccountDeviceLink
fields = '__all__'