def to_representation(self, instance): data = app_settings.ORDER_ITEM_SERIALIZER(instance.item, context=self.context).data data['ordered_quantity'] = data.pop('quantity', None) data.update( super(DeliveryItemSerializer, self).to_representation(instance)) return data
class OrderDetailSerializer(OrderListSerializer): items = app_settings.ORDER_ITEM_SERIALIZER( many=True, read_only=True, ) extra = serializers.DictField(read_only=True) amount_paid = MoneyField(read_only=True) outstanding_amount = MoneyField(read_only=True) cancelable = serializers.BooleanField(read_only=True) is_partially_paid = serializers.SerializerMethodField( method_name='get_partially_paid', help_text="Returns true, if order has been partially paid", ) annotation = serializers.CharField( write_only=True, required=False, ) reorder = serializers.BooleanField( write_only=True, default=False, ) cancel = serializers.BooleanField( write_only=True, default=False, ) class Meta: model = OrderModel exclude = ['id', 'customer', 'stored_request', '_subtotal', '_total'] read_only_fields = ['shipping_address_text', 'billing_address_text'] # TODO: not part of OrderBase def get_partially_paid(self, order): return order.amount_paid > 0 def update(self, order, validated_data): order.extra.setdefault('addenum', []) if validated_data.get('annotation'): timestamp = timezone.now().isoformat() order.extra['addenum'].append((timestamp, validated_data['annotation'])) order.save() if validated_data['reorder'] is True: cart = CartModel.objects.get_from_request(self.context['request']) order.readd_to_cart(cart) if validated_data['cancel'] is True and order.cancelable(): order.cancel_order() order.save() return order