|
1 | 1 | from rest_framework import serializers
|
2 |
| -from orders.models import Order, WasteClaim |
| 2 | +from orders.models import Order, OrderItem, WasteClaim |
| 3 | + |
| 4 | + |
| 5 | + |
| 6 | +class OrderItemSerializer(serializers.ModelSerializer): |
| 7 | + class Meta: |
| 8 | + model = OrderItem |
| 9 | + fields = ['id', 'order', 'quantity', 'price'] |
| 10 | + |
| 11 | + def validate_quantity(self, value): |
| 12 | + if value <= 0: |
| 13 | + raise serializers.ValidationError("Quantity must be a positive integer.") |
| 14 | + return value |
3 | 15 |
|
4 | 16 | class OrderSerializer(serializers.ModelSerializer):
|
| 17 | + items = OrderItemSerializer(many=True, required=False, read_only=True) |
| 18 | + |
5 | 19 | class Meta:
|
6 | 20 | model = Order
|
7 |
| - fields = [ |
8 |
| - 'order_id', 'order_date', 'order_status', 'payment_status', |
9 |
| - 'total_amount', 'pin', 'created_at', 'updated_at' |
10 |
| - ] |
11 |
| - read_only_fields = ['order_id', 'pin', 'order_date', 'created_at', 'updated_at'] |
| 21 | + fields = ['order_id', 'order_date', 'order_status', 'payment_status', 'total_amount', 'pin', 'items'] |
| 22 | + read_only_fields = ['order_id', 'order_date', 'total_amount', 'pin'] |
| 23 | + |
| 24 | + def create(self, validated_data): |
| 25 | + items_data = validated_data.pop('items', []) |
| 26 | + order = Order.objects.create(total_amount=0, **validated_data) |
| 27 | + for item_data in items_data: |
| 28 | + OrderItem.objects.create(order=order, **item_data) |
| 29 | + order.update_total_amount() |
| 30 | + return order |
| 31 | + |
| 32 | + def update(self, instance, validated_data): |
| 33 | + |
| 34 | + allowed = ['order_status', 'payment_status'] |
| 35 | + for field in list(validated_data.keys()): |
| 36 | + if field not in allowed: |
| 37 | + validated_data.pop(field) |
| 38 | + for attr, value in validated_data.items(): |
| 39 | + setattr(instance, attr, value) |
| 40 | + instance.save() |
| 41 | + return instance |
12 | 42 |
|
13 | 43 | class WasteClaimSerializer(serializers.ModelSerializer):
|
14 | 44 | class Meta:
|
15 | 45 | model = WasteClaim
|
16 |
| - fields = [ |
17 |
| - 'waste_id', 'claim_status', 'claim_time', 'pickup_window_end', |
18 |
| - 'pin', 'created_at', 'updated_at' |
19 |
| - ] |
20 |
| - read_only_fields = ['waste_id', 'pin', 'claim_time', 'created_at', 'updated_at'] |
21 |
| - |
22 |
| - |
| 46 | + fields = '__all__' |
| 47 | + read_only_fields = ['waste_id', 'pin', 'created_at', 'updated_at'] |
0 commit comments