154 lines
4.9 KiB
Python
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__'
|