Beispiel #1
0
 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
Beispiel #2
0
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