mirror of
https://github.com/himool/HimoolERP.git
synced 2024-09-20 14:56:00 +08:00
feat: 调整
This commit is contained in:
parent
9cf6e99adc
commit
c551d09e52
|
@ -12,7 +12,7 @@ class Warehouse(Model):
|
|||
phone = CharField(max_length=32, null=True, blank=True, verbose_name='电话')
|
||||
address = CharField(max_length=256, null=True, blank=True, verbose_name='地址')
|
||||
remark = CharField(max_length=256, null=True, blank=True, verbose_name='备注')
|
||||
order = IntegerField(default=100, verbose_name='顺序')
|
||||
order = IntegerField(default=100, verbose_name='排序')
|
||||
is_active = BooleanField(default=True, verbose_name='激活状态')
|
||||
is_locked = BooleanField(default=True, verbose_name='锁定状态')
|
||||
team = ForeignKey('system.Team', on_delete=CASCADE, related_name='warehouses')
|
||||
|
@ -65,7 +65,7 @@ class Client(Model):
|
|||
email = CharField(max_length=256, null=True, blank=True, verbose_name='邮箱')
|
||||
address = CharField(max_length=256, null=True, blank=True, verbose_name='地址')
|
||||
remark = CharField(max_length=256, null=True, blank=True, verbose_name='备注')
|
||||
order = IntegerField(default=100, verbose_name='顺序')
|
||||
order = IntegerField(default=100, verbose_name='排序')
|
||||
is_active = BooleanField(default=True, verbose_name='激活状态')
|
||||
initial_arrears_amount = AmountField(default=0, verbose_name='初期欠款金额')
|
||||
arrears_amount = AmountField(default=0, verbose_name='欠款金额')
|
||||
|
@ -113,7 +113,7 @@ class Supplier(Model):
|
|||
bank_account = CharField(max_length=64, null=True, blank=True, verbose_name='银行账户')
|
||||
bank_name = CharField(max_length=64, null=True, blank=True, verbose_name='开户行')
|
||||
remark = CharField(max_length=256, null=True, blank=True, verbose_name='备注')
|
||||
order = IntegerField(default=100, verbose_name='顺序')
|
||||
order = IntegerField(default=100, verbose_name='排序')
|
||||
is_active = BooleanField(default=True, verbose_name='激活状态')
|
||||
initial_arrears_amount = AmountField(default=0, verbose_name='初期欠款金额')
|
||||
arrears_amount = AmountField(default=0, verbose_name='欠款金额')
|
||||
|
@ -153,7 +153,7 @@ class Account(Model):
|
|||
type = CharField(max_length=32, choices=Type.choices, verbose_name='账户类型')
|
||||
holder = CharField(max_length=64, null=True, blank=True, verbose_name='开户人')
|
||||
remark = CharField(max_length=256, null=True, blank=True, verbose_name='备注')
|
||||
order = IntegerField(default=100, verbose_name='顺序')
|
||||
order = IntegerField(default=100, verbose_name='排序')
|
||||
is_active = BooleanField(default=True, verbose_name='激活状态')
|
||||
initial_balance_amount = AmountField(default=0, verbose_name='初期余额')
|
||||
balance_amount = AmountField(default=0, verbose_name='余额')
|
||||
|
|
|
@ -5,6 +5,14 @@ class NumberResponse(Serializer):
|
|||
number = CharField(label='编号')
|
||||
|
||||
|
||||
class DownloadResponse(Serializer):
|
||||
file = FileField(label='Excel文件')
|
||||
|
||||
|
||||
class UploadRequest(Serializer):
|
||||
file = FileField(label='Excel文件')
|
||||
|
||||
|
||||
__all__ = [
|
||||
'NumberResponse',
|
||||
'NumberResponse', 'DownloadResponse', 'UploadRequest',
|
||||
]
|
||||
|
|
|
@ -29,6 +29,51 @@ class WarehouseSerializer(BaseSerializer):
|
|||
return instance
|
||||
|
||||
|
||||
class WarehouseExportSerializer(BaseSerializer):
|
||||
number = CharField(label='仓库编号')
|
||||
name = CharField(label='仓库名称')
|
||||
manager_username = CharField(source='manager.username', label='管理员用户名')
|
||||
manager_name = CharField(source='manager.name', label='管理员名称')
|
||||
phone = CharField(label='电话')
|
||||
address = CharField(label='地址')
|
||||
remark = CharField(label='备注')
|
||||
order = IntegerField(label='排序')
|
||||
is_active = BooleanField(label='激活状态[TRUE/FALSE]')
|
||||
|
||||
class Meta:
|
||||
model = Warehouse
|
||||
fields = ['number', 'name', 'manager_username', 'manager_name', 'phone', 'address',
|
||||
'remark', 'order', 'is_active']
|
||||
|
||||
|
||||
class WarehouseImportSerializer(BaseSerializer):
|
||||
number = CharField(label='仓库编号(必填)')
|
||||
name = CharField(label='仓库名称(必填)')
|
||||
manager_username = CharField(required=False, label='管理员用户名')
|
||||
phone = CharField(required=False, label='电话')
|
||||
address = CharField(required=False, label='地址')
|
||||
remark = CharField(required=False, label='备注')
|
||||
order = IntegerField(required=False, label='排序(默认: 100)')
|
||||
is_active = BooleanField(required=False, label='激活状态[TRUE/FALSE](默认: TRUE)')
|
||||
|
||||
class Meta:
|
||||
model = Warehouse
|
||||
fields = ['number', 'name', 'manager_username', 'phone', 'address', 'remark',
|
||||
'order', 'is_active']
|
||||
|
||||
def validate(self, attrs):
|
||||
if manager_username := attrs.pop('manager_username', None):
|
||||
manager = User.objects.filter(username=manager_username, team=self.team).first()
|
||||
if not manager:
|
||||
raise ValidationError(f'管理员[{manager_username}]不存在')
|
||||
|
||||
attrs['manager'] = manager
|
||||
else:
|
||||
attrs['manager'] = None
|
||||
|
||||
return super().validate(attrs)
|
||||
|
||||
|
||||
class ClientCategorySerializer(BaseSerializer):
|
||||
|
||||
class Meta:
|
||||
|
@ -40,6 +85,25 @@ class ClientCategorySerializer(BaseSerializer):
|
|||
self.validate_unique({'name': value}, message=f'名称[{value}]已存在')
|
||||
return value
|
||||
|
||||
|
||||
class ClientCategoryExportSerializer(BaseSerializer):
|
||||
name = CharField(label='客户分类名称')
|
||||
remark = CharField(label='备注')
|
||||
|
||||
class Meta:
|
||||
model = ClientCategory
|
||||
fields = ['name', 'remark']
|
||||
|
||||
|
||||
class ClientCategoryImportSerializer(BaseSerializer):
|
||||
name = CharField(label='客户分类名称(必填)')
|
||||
remark = CharField(required=False, label='备注')
|
||||
|
||||
class Meta:
|
||||
model = ClientCategory
|
||||
fields = ['name', 'remark']
|
||||
|
||||
|
||||
class ClientSerializer(BaseSerializer):
|
||||
level_display = CharField(source='get_level_display', read_only=True, label='等级')
|
||||
category_name = CharField(source='category.name', read_only=True, label='分类名称')
|
||||
|
@ -74,6 +138,7 @@ class ClientSerializer(BaseSerializer):
|
|||
|
||||
return super().update(instance, validated_data)
|
||||
|
||||
|
||||
class SupplierCategorySerializer(BaseSerializer):
|
||||
|
||||
class Meta:
|
||||
|
@ -86,6 +151,24 @@ class SupplierCategorySerializer(BaseSerializer):
|
|||
return value
|
||||
|
||||
|
||||
class SupplierCategoryExportSerializer(BaseSerializer):
|
||||
name = CharField(label='供应商分类名称')
|
||||
remark = CharField(label='备注')
|
||||
|
||||
class Meta:
|
||||
model = SupplierCategory
|
||||
fields = ['name', 'remark']
|
||||
|
||||
|
||||
class SupplierCategoryImportSerializer(BaseSerializer):
|
||||
name = CharField(label='供应商分类名称(必填)')
|
||||
remark = CharField(required=False, label='备注')
|
||||
|
||||
class Meta:
|
||||
model = SupplierCategory
|
||||
fields = ['name', 'remark']
|
||||
|
||||
|
||||
class SupplierSerializer(BaseSerializer):
|
||||
category_name = CharField(source='category.name', read_only=True, label='分类名称')
|
||||
|
||||
|
@ -163,12 +246,32 @@ class ChargeItemSerializer(BaseSerializer):
|
|||
return value
|
||||
|
||||
|
||||
class ChargeItemExportSerializer(BaseSerializer):
|
||||
name = CharField(label='收支项目名称')
|
||||
type_display = CharField(source='get_type_display', label='收支项目名称')
|
||||
remark = CharField(label='备注')
|
||||
|
||||
class Meta:
|
||||
model = ChargeItem
|
||||
fields = ['name', 'remark']
|
||||
|
||||
|
||||
class ChargeItemImportSerializer(BaseSerializer):
|
||||
name = CharField(label='收支项目名称(必填)')
|
||||
type = CharField(label='收支类型[income/expenditure](必填)')
|
||||
remark = CharField(required=False, label='备注')
|
||||
|
||||
class Meta:
|
||||
model = ChargeItem
|
||||
fields = ['name', 'type', 'remark']
|
||||
|
||||
|
||||
__all__ = [
|
||||
'WarehouseSerializer',
|
||||
'ClientCategorySerializer', 'ClientSerializer',
|
||||
'SupplierCategorySerializer','SupplierSerializer',
|
||||
'AccountSerializer', 'ChargeItemSerializer',
|
||||
'ClientCategorySerializer', 'ClientCategoryExportSerializer', 'ClientCategoryImportSerializer',
|
||||
'ClientSerializer',
|
||||
'SupplierCategorySerializer', 'SupplierCategoryExportSerializer', 'SupplierCategoryImportSerializer',
|
||||
'SupplierSerializer',
|
||||
'AccountSerializer',
|
||||
'ChargeItemSerializer', 'ChargeItemExportSerializer', 'ChargeItemImportSerializer',
|
||||
]
|
||||
|
|
|
@ -11,7 +11,7 @@ from apps.data.models import *
|
|||
from apps.goods.models import *
|
||||
|
||||
|
||||
class WarehouseViewSet(ModelViewSet, DataProtectMixin):
|
||||
class WarehouseViewSet(ModelViewSet, DataProtectMixin, ExportMixin, ImportMixin):
|
||||
"""仓库"""
|
||||
|
||||
serializer_class = WarehouseSerializer
|
||||
|
@ -64,7 +64,7 @@ class WarehouseViewSet(ModelViewSet, DataProtectMixin):
|
|||
return Response(data=serializer.data, status=status.HTTP_200_OK)
|
||||
|
||||
|
||||
class ClientCategoryViewSet(ModelViewSet):
|
||||
class ClientCategoryViewSet(ModelViewSet, ExportMixin, ImportMixin):
|
||||
"""客户分类"""
|
||||
|
||||
serializer_class = ClientCategorySerializer
|
||||
|
@ -73,8 +73,49 @@ class ClientCategoryViewSet(ModelViewSet):
|
|||
ordering_fields = ['id', 'name']
|
||||
queryset = ClientCategory.objects.all()
|
||||
|
||||
@extend_schema(responses={200: DownloadResponse})
|
||||
@action(detail=False, methods=['get'])
|
||||
def export(self, request, *args, **kwargs):
|
||||
"""导出"""
|
||||
|
||||
class ClientViewSet(ModelViewSet, DataProtectMixin):
|
||||
return self.get_export_response(ClientCategoryExportSerializer)
|
||||
|
||||
@extend_schema(responses={200: DownloadResponse})
|
||||
@action(detail=False, methods=['get'])
|
||||
def import_template(self, request, *args, **kwargs):
|
||||
"""导入模板"""
|
||||
|
||||
return self.get_template_response(ClientCategoryImportSerializer)
|
||||
|
||||
@extend_schema(request=UploadRequest, responses={200: ClientCategorySerializer(many=True)})
|
||||
@action(detail=False, methods=['post'])
|
||||
@transaction.atomic
|
||||
def import_data(self, request, *args, **kwargs):
|
||||
"""导入数据"""
|
||||
|
||||
request_serializer = UploadRequest(data=request.data)
|
||||
request_serializer.is_valid(raise_exception=True)
|
||||
validated_data = request_serializer.validated_data
|
||||
|
||||
client_categories = []
|
||||
for import_serializer in self.load_data(validated_data['file'], ClientCategoryImportSerializer):
|
||||
validated_data = import_serializer.validated_data
|
||||
if client_category := ClientCategory.objects.filter(name=validated_data['name'],
|
||||
team=self.team).first():
|
||||
serializer = ClientCategorySerializer(instance=client_category, data=validated_data,
|
||||
context=self.context)
|
||||
else:
|
||||
serializer = ClientCategorySerializer(data=validated_data, context=self.context)
|
||||
|
||||
serializer.is_valid(raise_exception=True)
|
||||
client_category = serializer.save()
|
||||
client_categories.append(client_category)
|
||||
|
||||
serializer = ClientCategorySerializer(instance=client_categories, many=True)
|
||||
return Response(data=serializer.data, status=status.HTTP_200_OK)
|
||||
|
||||
|
||||
class ClientViewSet(ModelViewSet, DataProtectMixin, ExportMixin, ImportMixin):
|
||||
"""客户"""
|
||||
|
||||
serializer_class = ClientSerializer
|
||||
|
@ -95,7 +136,7 @@ class ClientViewSet(ModelViewSet, DataProtectMixin):
|
|||
return Response(data={'number': number}, status=status.HTTP_200_OK)
|
||||
|
||||
|
||||
class SupplierCategoryViewSet(ModelViewSet):
|
||||
class SupplierCategoryViewSet(ModelViewSet, ExportMixin, ImportMixin):
|
||||
"""供应商分类"""
|
||||
|
||||
serializer_class = SupplierCategorySerializer
|
||||
|
@ -104,8 +145,49 @@ class SupplierCategoryViewSet(ModelViewSet):
|
|||
ordering_fields = ['id', 'name']
|
||||
queryset = SupplierCategory.objects.all()
|
||||
|
||||
@extend_schema(responses={200: DownloadResponse})
|
||||
@action(detail=False, methods=['get'])
|
||||
def export(self, request, *args, **kwargs):
|
||||
"""导出"""
|
||||
|
||||
class SupplierViewSet(ModelViewSet, DataProtectMixin):
|
||||
return self.get_export_response(SupplierCategoryExportSerializer)
|
||||
|
||||
@extend_schema(responses={200: DownloadResponse})
|
||||
@action(detail=False, methods=['get'])
|
||||
def import_template(self, request, *args, **kwargs):
|
||||
"""导入模板"""
|
||||
|
||||
return self.get_template_response(SupplierCategoryImportSerializer)
|
||||
|
||||
@extend_schema(request=UploadRequest, responses={200: SupplierCategorySerializer(many=True)})
|
||||
@action(detail=False, methods=['post'])
|
||||
@transaction.atomic
|
||||
def import_data(self, request, *args, **kwargs):
|
||||
"""导入数据"""
|
||||
|
||||
request_serializer = UploadRequest(data=request.data)
|
||||
request_serializer.is_valid(raise_exception=True)
|
||||
validated_data = request_serializer.validated_data
|
||||
|
||||
supplier_categories = []
|
||||
for import_serializer in self.load_data(validated_data['file'], SupplierCategoryImportSerializer):
|
||||
validated_data = import_serializer.validated_data
|
||||
if supplier_category := SupplierCategory.objects.filter(name=validated_data['name'],
|
||||
team=self.team).first():
|
||||
serializer = SupplierCategorySerializer(instance=supplier_category, data=validated_data,
|
||||
context=self.context)
|
||||
else:
|
||||
serializer = SupplierCategorySerializer(data=validated_data, context=self.context)
|
||||
|
||||
serializer.is_valid(raise_exception=True)
|
||||
supplier_category = serializer.save()
|
||||
supplier_categories.append(supplier_category)
|
||||
|
||||
serializer = SupplierCategorySerializer(instance=supplier_categories, many=True)
|
||||
return Response(data=serializer.data, status=status.HTTP_200_OK)
|
||||
|
||||
|
||||
class SupplierViewSet(ModelViewSet, DataProtectMixin, ExportMixin, ImportMixin):
|
||||
"""供应商"""
|
||||
|
||||
serializer_class = SupplierSerializer
|
||||
|
@ -126,7 +208,7 @@ class SupplierViewSet(ModelViewSet, DataProtectMixin):
|
|||
return Response(data={'number': number}, status=status.HTTP_200_OK)
|
||||
|
||||
|
||||
class AccountViewSet(ModelViewSet, DataProtectMixin):
|
||||
class AccountViewSet(ModelViewSet, DataProtectMixin, ExportMixin, ImportMixin):
|
||||
"""结算账户"""
|
||||
|
||||
serializer_class = AccountSerializer
|
||||
|
@ -146,7 +228,7 @@ class AccountViewSet(ModelViewSet, DataProtectMixin):
|
|||
return Response(data={'number': number}, status=status.HTTP_200_OK)
|
||||
|
||||
|
||||
class ChargeItemViewSet(ModelViewSet):
|
||||
class ChargeItemViewSet(ModelViewSet, ExportMixin, ImportMixin):
|
||||
"""收支项目"""
|
||||
|
||||
serializer_class = ChargeItemSerializer
|
||||
|
@ -156,6 +238,47 @@ class ChargeItemViewSet(ModelViewSet):
|
|||
ordering_fields = ['id', 'name']
|
||||
queryset = ChargeItem.objects.all()
|
||||
|
||||
@extend_schema(responses={200: DownloadResponse})
|
||||
@action(detail=False, methods=['get'])
|
||||
def export(self, request, *args, **kwargs):
|
||||
"""导出"""
|
||||
|
||||
return self.get_export_response(ChargeItemExportSerializer)
|
||||
|
||||
@extend_schema(responses={200: DownloadResponse})
|
||||
@action(detail=False, methods=['get'])
|
||||
def import_template(self, request, *args, **kwargs):
|
||||
"""导入模板"""
|
||||
|
||||
return self.get_template_response(ChargeItemImportSerializer)
|
||||
|
||||
@extend_schema(request=UploadRequest, responses={200: ChargeItemSerializer(many=True)})
|
||||
@action(detail=False, methods=['post'])
|
||||
@transaction.atomic
|
||||
def import_data(self, request, *args, **kwargs):
|
||||
"""导入数据"""
|
||||
|
||||
request_serializer = UploadRequest(data=request.data)
|
||||
request_serializer.is_valid(raise_exception=True)
|
||||
validated_data = request_serializer.validated_data
|
||||
|
||||
charge_items = []
|
||||
for import_serializer in self.load_data(validated_data['file'], ChargeItemImportSerializer):
|
||||
validated_data = import_serializer.validated_data
|
||||
if charge_item := ChargeItem.objects.filter(name=validated_data['name'],
|
||||
team=self.team).first():
|
||||
serializer = ChargeItemSerializer(instance=charge_item, data=validated_data,
|
||||
context=self.context)
|
||||
else:
|
||||
serializer = ChargeItemSerializer(data=validated_data, context=self.context)
|
||||
|
||||
serializer.is_valid(raise_exception=True)
|
||||
charge_item = serializer.save()
|
||||
charge_items.append(charge_item)
|
||||
|
||||
serializer = ChargeItemSerializer(instance=charge_items, many=True)
|
||||
return Response(data=serializer.data, status=status.HTTP_200_OK)
|
||||
|
||||
|
||||
__all__ = [
|
||||
'WarehouseViewSet',
|
||||
|
|
|
@ -48,7 +48,7 @@ class Goods(Model):
|
|||
level_price3 = FloatField(verbose_name='等级价三')
|
||||
|
||||
remark = CharField(max_length=256, null=True, blank=True, verbose_name='备注')
|
||||
order = IntegerField(default=100, verbose_name='顺序')
|
||||
order = IntegerField(default=100, verbose_name='排序')
|
||||
is_active = BooleanField(default=True, verbose_name='激活状态')
|
||||
team = ForeignKey('system.Team', on_delete=CASCADE, related_name='goods_set')
|
||||
|
||||
|
|
|
@ -5,6 +5,14 @@ class NumberResponse(Serializer):
|
|||
number = CharField(label='编号')
|
||||
|
||||
|
||||
class DownloadResponse(Serializer):
|
||||
file = FileField(label='Excel文件')
|
||||
|
||||
|
||||
class UploadRequest(Serializer):
|
||||
file = FileField(label='Excel文件')
|
||||
|
||||
|
||||
__all__ = [
|
||||
'NumberResponse',
|
||||
'NumberResponse', 'DownloadResponse', 'UploadRequest',
|
||||
]
|
||||
|
|
|
@ -17,6 +17,24 @@ class GoodsCategorySerializer(BaseSerializer):
|
|||
return value
|
||||
|
||||
|
||||
class GoodsCategoryExportSerializer(BaseSerializer):
|
||||
name = CharField(label='商品分类名称')
|
||||
remark = CharField(label='备注')
|
||||
|
||||
class Meta:
|
||||
model = GoodsCategory
|
||||
fields = ['name', 'remark']
|
||||
|
||||
|
||||
class GoodsCategoryImportSerializer(BaseSerializer):
|
||||
name = CharField(label='商品分类名称(必填)')
|
||||
remark = CharField(required=False, label='备注')
|
||||
|
||||
class Meta:
|
||||
model = GoodsCategory
|
||||
fields = ['name', 'remark']
|
||||
|
||||
|
||||
class GoodsUnitSerializer(BaseSerializer):
|
||||
|
||||
class Meta:
|
||||
|
@ -29,6 +47,24 @@ class GoodsUnitSerializer(BaseSerializer):
|
|||
return value
|
||||
|
||||
|
||||
class GoodsUnitExportSerializer(BaseSerializer):
|
||||
name = CharField(label='商品单位名称')
|
||||
remark = CharField(label='备注')
|
||||
|
||||
class Meta:
|
||||
model = GoodsUnit
|
||||
fields = ['name', 'remark']
|
||||
|
||||
|
||||
class GoodsUnitImportSerializer(BaseSerializer):
|
||||
name = CharField(label='商品单位名称(必填)')
|
||||
remark = CharField(required=False, label='备注')
|
||||
|
||||
class Meta:
|
||||
model = GoodsUnit
|
||||
fields = ['name', 'remark']
|
||||
|
||||
|
||||
class GoodsSerializer(BaseSerializer):
|
||||
|
||||
class InventoryItemSerializer(BaseSerializer):
|
||||
|
@ -301,6 +337,9 @@ class InventorySerializer(BaseSerializer):
|
|||
|
||||
|
||||
__all__ = [
|
||||
'GoodsCategorySerializer', 'GoodsUnitSerializer', 'GoodsSerializer', 'GoodsImageSerializer',
|
||||
'GoodsCategorySerializer', 'GoodsCategoryExportSerializer', 'GoodsCategoryImportSerializer',
|
||||
'GoodsUnitSerializer', 'GoodsUnitExportSerializer', 'GoodsUnitImportSerializer',
|
||||
'GoodsSerializer',
|
||||
'GoodsImageSerializer',
|
||||
'BatchSerializer', 'InventorySerializer',
|
||||
]
|
||||
|
|
|
@ -11,7 +11,7 @@ from apps.goods.models import *
|
|||
from apps.data.models import *
|
||||
|
||||
|
||||
class GoodsCategoryViewSet(ModelViewSet):
|
||||
class GoodsCategoryViewSet(ModelViewSet, ExportMixin, ImportMixin):
|
||||
"""商品分类"""
|
||||
|
||||
serializer_class = GoodsCategorySerializer
|
||||
|
@ -20,8 +20,49 @@ class GoodsCategoryViewSet(ModelViewSet):
|
|||
ordering_fields = ['id', 'name']
|
||||
queryset = GoodsCategory.objects.all()
|
||||
|
||||
@extend_schema(responses={200: DownloadResponse})
|
||||
@action(detail=False, methods=['get'])
|
||||
def export(self, request, *args, **kwargs):
|
||||
"""导出"""
|
||||
|
||||
class GoodsUnitViewSet(ModelViewSet):
|
||||
return self.get_export_response(GoodsCategoryExportSerializer)
|
||||
|
||||
@extend_schema(responses={200: DownloadResponse})
|
||||
@action(detail=False, methods=['get'])
|
||||
def import_template(self, request, *args, **kwargs):
|
||||
"""导入模板"""
|
||||
|
||||
return self.get_template_response(GoodsCategoryImportSerializer)
|
||||
|
||||
@extend_schema(request=UploadRequest, responses={200: GoodsCategorySerializer(many=True)})
|
||||
@action(detail=False, methods=['post'])
|
||||
@transaction.atomic
|
||||
def import_data(self, request, *args, **kwargs):
|
||||
"""导入数据"""
|
||||
|
||||
request_serializer = UploadRequest(data=request.data)
|
||||
request_serializer.is_valid(raise_exception=True)
|
||||
validated_data = request_serializer.validated_data
|
||||
|
||||
goods_categories = []
|
||||
for import_serializer in self.load_data(validated_data['file'], GoodsCategoryImportSerializer):
|
||||
validated_data = import_serializer.validated_data
|
||||
if goods_category := GoodsCategory.objects.filter(name=validated_data['name'],
|
||||
team=self.team).first():
|
||||
serializer = GoodsCategorySerializer(instance=goods_category, data=validated_data,
|
||||
context=self.context)
|
||||
else:
|
||||
serializer = GoodsCategorySerializer(data=validated_data, context=self.context)
|
||||
|
||||
serializer.is_valid(raise_exception=True)
|
||||
goods_category = serializer.save()
|
||||
goods_categories.append(goods_category)
|
||||
|
||||
serializer = GoodsCategorySerializer(instance=goods_categories, many=True)
|
||||
return Response(data=serializer.data, status=status.HTTP_200_OK)
|
||||
|
||||
|
||||
class GoodsUnitViewSet(ModelViewSet, ExportMixin, ImportMixin):
|
||||
"""商品单位"""
|
||||
|
||||
serializer_class = GoodsUnitSerializer
|
||||
|
@ -30,8 +71,49 @@ class GoodsUnitViewSet(ModelViewSet):
|
|||
ordering_fields = ['id', 'name']
|
||||
queryset = GoodsUnit.objects.all()
|
||||
|
||||
@extend_schema(responses={200: DownloadResponse})
|
||||
@action(detail=False, methods=['get'])
|
||||
def export(self, request, *args, **kwargs):
|
||||
"""导出"""
|
||||
|
||||
class GoodsViewSet(ModelViewSet, DataProtectMixin):
|
||||
return self.get_export_response(GoodsUnitExportSerializer)
|
||||
|
||||
@extend_schema(responses={200: DownloadResponse})
|
||||
@action(detail=False, methods=['get'])
|
||||
def import_template(self, request, *args, **kwargs):
|
||||
"""导入模板"""
|
||||
|
||||
return self.get_template_response(GoodsUnitImportSerializer)
|
||||
|
||||
@extend_schema(request=UploadRequest, responses={200: GoodsUnitSerializer(many=True)})
|
||||
@action(detail=False, methods=['post'])
|
||||
@transaction.atomic
|
||||
def import_data(self, request, *args, **kwargs):
|
||||
"""导入数据"""
|
||||
|
||||
request_serializer = UploadRequest(data=request.data)
|
||||
request_serializer.is_valid(raise_exception=True)
|
||||
validated_data = request_serializer.validated_data
|
||||
|
||||
goods_units = []
|
||||
for import_serializer in self.load_data(validated_data['file'], GoodsUnitImportSerializer):
|
||||
validated_data = import_serializer.validated_data
|
||||
if goods_unit := GoodsUnit.objects.filter(name=validated_data['name'],
|
||||
team=self.team).first():
|
||||
serializer = GoodsUnitSerializer(instance=goods_unit, data=validated_data,
|
||||
context=self.context)
|
||||
else:
|
||||
serializer = GoodsUnitSerializer(data=validated_data, context=self.context)
|
||||
|
||||
serializer.is_valid(raise_exception=True)
|
||||
goods_unit = serializer.save()
|
||||
goods_units.append(goods_unit)
|
||||
|
||||
serializer = GoodsUnitSerializer(instance=goods_units, many=True)
|
||||
return Response(data=serializer.data, status=status.HTTP_200_OK)
|
||||
|
||||
|
||||
class GoodsViewSet(ModelViewSet, DataProtectMixin, ExportMixin, ImportMixin):
|
||||
"""商品"""
|
||||
|
||||
serializer_class = GoodsSerializer
|
||||
|
|
Loading…
Reference in a new issue