serializers.py 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. #coding=utf-8
  2. from rest_framework import serializers
  3. from apps import base
  4. from apps.base import Formater
  5. from apps.exceptions import CustomError
  6. from apps.foundation.models import BizLog
  7. from apps.serializer_errors import dump_serializer_errors
  8. from models import Goods, GoodsGodownEntry, GoodsGodownEntryDetail
  9. from libs.booleancharfield import BooleanCharField, PriceShowCharField, CountShowCharField, AmountShowCharField
  10. from apps.product.models import ProductBase
  11. from apps.warehouse.models import WarehouseStock
  12. class GoodsSerializer(serializers.ModelSerializer):
  13. name = serializers.CharField(source='product_base.name', read_only=True)
  14. model = serializers.CharField(source='product_base.model', read_only=True)
  15. option_type = serializers.CharField(source='product_base.option_type.id', read_only=True)
  16. option_type_text = serializers.CharField(source='product_base.option_type.name', read_only=True)
  17. warehouse_place = serializers.CharField(source='product_base.warehouse_place', allow_blank=True, read_only=True)
  18. retail_price = PriceShowCharField()
  19. enabled_text = BooleanCharField(source='product_base.enabled', read_only=True)
  20. enabled = serializers.BooleanField(source='product_base.enabled', read_only=True)
  21. notes = serializers.CharField(source='product_base.notes', allow_blank=True, read_only=True)
  22. unit = serializers.CharField(source='product_base.unit', read_only=True)
  23. code = serializers.CharField(source='product_base.code', read_only=True)
  24. class Meta:
  25. model = Goods
  26. fields = '__all__'
  27. @staticmethod
  28. def factory(user, data, id=None):
  29. if id:
  30. instance = Goods.getById(id)
  31. else:
  32. instance = None
  33. serializer = GoodsSerializer(instance, data=data)
  34. serializer.user = user
  35. return serializer
  36. def create(self, validated_data):
  37. product = Goods.objects.create(**validated_data)
  38. BizLog.objects.addnew(
  39. self.user,
  40. BizLog.INSERT,
  41. u"添加成品[%s],id=%d" % (product.product_base.name, product.id),
  42. validated_data
  43. )
  44. return product
  45. def update(self, instance, validated_data):
  46. instance = super(GoodsSerializer, self).update(instance, validated_data)
  47. BizLog.objects.addnew(
  48. self.user,
  49. BizLog.UPDATE,
  50. u"修改成品[%s],id=%d" % (instance.product_base.name, instance.id),
  51. validated_data
  52. )
  53. return instance
  54. def validSave(self):
  55. if self.is_valid():
  56. return self.save()
  57. else:
  58. raise CustomError(dump_serializer_errors(self))
  59. def validate(self, data):
  60. if 'retail_price' in data:
  61. data['retail_price'] = Formater.formatPrice(data['retail_price'])
  62. return data
  63. class GoodsGodownEntrySerializer(serializers.ModelSerializer):
  64. status = serializers.CharField(read_only=True)
  65. no = serializers.CharField(read_only=True)
  66. status_text = serializers.CharField(source='get_status_display', read_only=True)
  67. create_user_text = serializers.CharField(source='create_user.name', read_only=True)
  68. department_text = serializers.CharField(source='department.name', read_only=True)
  69. total_count = CountShowCharField(read_only=True)
  70. total_amount = AmountShowCharField(read_only=True)
  71. total_invoice_amount = AmountShowCharField(read_only=True)
  72. check_user_text = serializers.CharField(source='check_user.name', read_only=True)
  73. check_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  74. create_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  75. warehouse_text = serializers.CharField(source='warehouse.name', read_only=True)
  76. class Meta:
  77. model = GoodsGodownEntry
  78. fields = '__all__'
  79. @staticmethod
  80. def factory(user, data, id=None):
  81. if id:
  82. instance = GoodsGodownEntry.getById(id)
  83. else:
  84. instance = None
  85. serializer = GoodsGodownEntrySerializer(instance, data=data)
  86. serializer.user = user
  87. return serializer
  88. def create(self, validated_data):
  89. validated_data['create_user'] = self.user
  90. validated_data['department'] = self.user.department
  91. instance = GoodsGodownEntry.objects.create(**validated_data)
  92. BizLog.objects.addnew(
  93. self.user,
  94. BizLog.INSERT,
  95. u"添加成品入库单[%s],id=%d" % (instance.no, instance.id),
  96. validated_data
  97. )
  98. return instance
  99. def validSave(self):
  100. if self.is_valid():
  101. return self.save()
  102. else:
  103. raise CustomError(dump_serializer_errors(self))
  104. def update(self, instance, validated_data):
  105. instance = super(GoodsGodownEntrySerializer, self).update(instance, validated_data)
  106. BizLog.objects.addnew(
  107. self.user,
  108. BizLog.UPDATE,
  109. u"修改成品入库单[%s],id=%d" % (instance.no, instance.id),
  110. validated_data
  111. )
  112. return instance
  113. class GoodsGodownEntryDetailSerializer(serializers.ModelSerializer):
  114. goods_text = serializers.CharField(source='goods.product_base.name', read_only=True)
  115. goods_model = serializers.CharField(source='goods.product_base.model', read_only=True)
  116. count = CountShowCharField()
  117. price = PriceShowCharField()
  118. amount = AmountShowCharField(read_only=True)
  119. invoice_amount = AmountShowCharField()
  120. class Meta:
  121. model = GoodsGodownEntryDetail
  122. fields = '__all__'
  123. @staticmethod
  124. def factory(user, data):
  125. serializer = GoodsGodownEntryDetailSerializer(None, data=data)
  126. serializer.user = user
  127. return serializer
  128. def create(self, validated_data):
  129. instance = GoodsGodownEntryDetail.objects.create(**validated_data)
  130. BizLog.objects.addnew(
  131. self.user,
  132. BizLog.INSERT,
  133. u"添加成品入库明细[%s],id=%d" % (instance.goods.product_base.name, instance.id),
  134. validated_data
  135. )
  136. return instance
  137. def validSave(self):
  138. if self.is_valid():
  139. return self.save()
  140. else:
  141. raise CustomError(dump_serializer_errors(self))
  142. def validate(self, data):
  143. data['price'] = Formater.formatPrice(data['price'])
  144. data['count'] = Formater.formatCount(data['count'])
  145. data['amount'] = data['count'] * data['price']
  146. data['invoice_amount'] = Formater.formatAmount(data['invoice_amount'])
  147. warehouse = data['main'].warehouse
  148. product_base = data['goods'].product_base
  149. warehouse_stock = WarehouseStock.getByWarehouseAndProduct(warehouse, product_base)
  150. data['warehouse_stock'] = warehouse_stock
  151. return data
  152. class GoodsProductSerializer(serializers.ModelSerializer):
  153. option_type_text = serializers.CharField(source='option_type.name', read_only=True)
  154. stock_count = CountShowCharField()
  155. enabled_text = BooleanCharField(source='enabled', read_only=True)
  156. class Meta:
  157. model = ProductBase
  158. fields = '__all__'