Files
crmApi/apps/shop/management_serializers.py
T
2026-10-08 16:37:45 +03:30

90 lines
4.7 KiB
Python

from rest_framework import serializers
from apps.shop.models import Product, ProductCategory
class CategoryManagementSerializer(serializers.ModelSerializer):
order_cat = serializers.IntegerField(required=False, allow_null=True, min_value=0, max_value=2147483647)
excel_order = serializers.IntegerField(required=False, allow_null=True, min_value=0, max_value=2147483647)
product_count = serializers.IntegerField(read_only=True)
child_count = serializers.IntegerField(read_only=True)
parent = serializers.PrimaryKeyRelatedField(queryset=ProductCategory.objects.all(), allow_null=True, required=False)
class Meta:
model = ProductCategory
fields = ('id', 'name', 'parent', 'image', 'order_cat', 'excel_order', 'product_count', 'child_count')
def validate(self, attrs):
workspace = self.context['workspace']
parent = attrs.get('parent', self.instance.parent if self.instance else None)
if parent and parent.sys_ws_id != workspace.pk:
raise serializers.ValidationError({'parent': 'دسته والد متعلق به فضای کاری دیگری است.'})
visited = set()
cursor = parent
while cursor:
if cursor.pk in visited or self.instance and cursor.pk == self.instance.pk:
raise serializers.ValidationError({'parent': 'انتخاب این والد باعث چرخه در دسته‌ها می‌شود.'})
visited.add(cursor.pk)
cursor = cursor.parent
name = attrs.get('name', self.instance.name if self.instance else '')
matches = ProductCategory.objects.filter(sys_ws=workspace, name=name, parent=parent)
if self.instance:
matches = matches.exclude(pk=self.instance.pk)
if matches.exists():
raise serializers.ValidationError({'name': 'این نام در همین دسته والد قبلاً ثبت شده است.'})
return attrs
class ProductManagementSerializer(serializers.ModelSerializer):
order_prd = serializers.IntegerField(required=False, allow_null=True, min_value=0, max_value=2147483647)
excel_order = serializers.IntegerField(required=False, allow_null=True, min_value=0, max_value=2147483647)
category_name = serializers.CharField(source='category.name', read_only=True)
price = serializers.IntegerField(min_value=0, max_value=9223372036854775807)
category = serializers.PrimaryKeyRelatedField(queryset=ProductCategory.objects.all())
acc_code = serializers.CharField(required=False, allow_blank=True, allow_null=True)
class Meta:
model = Product
fields = ('id', 'name', 'price', 'category', 'category_name', 'acc_code', 'attr', 'view_only', 'order_prd', 'excel_order', 'created_at', 'updated_at')
read_only_fields = ('id', 'created_at', 'updated_at')
def validate_category(self, category):
if category.sys_ws_id != self.context['workspace'].pk:
raise serializers.ValidationError('دسته متعلق به فضای کاری دیگری است.')
return category
def validate_acc_code(self, code):
if code:
matches = Product.objects.filter(sys_ws=self.context['workspace'], acc_code=code)
if self.instance:
matches = matches.exclude(pk=self.instance.pk)
if matches.exists():
raise serializers.ValidationError('کد محصول در این فضای کاری تکراری است.')
return code
def validate_attr(self, value):
if value is not None and not isinstance(value, dict):
raise serializers.ValidationError('ویژگی‌ها باید یک شیء JSON باشد.')
return value
def to_representation(self, instance):
data = super().to_representation(instance)
data['price'] = str(instance.price)
return data
class ImportOptionsSerializer(serializers.Serializer):
file = serializers.FileField()
sheet = serializers.CharField(required=False, allow_blank=True, default='')
header_row = serializers.IntegerField(min_value=1, max_value=100, default=1)
mode = serializers.ChoiceField(choices=('create', 'upsert', 'update'), default='create')
create_categories = serializers.BooleanField(default=True)
errors = serializers.ChoiceField(choices=('atomic', 'skip'), default='atomic')
ordering = serializers.ChoiceField(choices=('preserve', 'rows', 'append'), default='preserve')
mapping = serializers.JSONField(default=dict)
def validate_mapping(self, value):
if not isinstance(value, dict) or not all(isinstance(key, str) and isinstance(item, str) for key, item in value.items()):
raise serializers.ValidationError('نگاشت ستون‌ها باید شیء JSON با مقدارهای متنی باشد.')
return value