- Add 'active' boolean field to Product model with default=True - Implement ProductView.get_queryset() to filter products by active status - Default behavior: return only active products - Support query params: ?active=true|false|all - Support variations: 1/0, yes/no for true/false - Detail operations (GET/PATCH/DELETE by ID) work with all products - Update ProductSerializer to include 'active' field - Add comprehensive test suite (11 new tests): - Test filtering by active/inactive/all products - Test parameter variations (1, yes, 0, no) - Test PATCH to activate/deactivate products - Test default list behavior after status changes - Update API documentation in doc/requests.org with examples - All tests passing (13 product tests + 8 API tests)
170 lines
4.2 KiB
Python
170 lines
4.2 KiB
Python
from rest_framework import serializers
|
|
|
|
from .models.sales import Sale, SaleLine
|
|
from .models.customers import Customer
|
|
from .models.sales import (
|
|
Sale,
|
|
SaleLine,
|
|
CatalogSale,
|
|
CatalogSaleLine,
|
|
Payment,
|
|
)
|
|
from .models.products import Product, ProductCategory
|
|
from .models.payments import ReconciliationJar
|
|
|
|
|
|
class SaleLineSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = SaleLine
|
|
fields = ["id", "sale", "product", "unit_price", "quantity"]
|
|
|
|
|
|
class SaleSerializer(serializers.ModelSerializer):
|
|
total = serializers.ReadOnlyField(source="get_total")
|
|
|
|
class Meta:
|
|
model = Sale
|
|
fields = [
|
|
"id",
|
|
"customer",
|
|
"date",
|
|
"saleline_set",
|
|
"total",
|
|
"payment_method",
|
|
"external_id",
|
|
]
|
|
|
|
|
|
class CatalogSaleLineSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = CatalogSaleLine
|
|
read_only_fields = ["catalog_sale"]
|
|
fields = [
|
|
"id",
|
|
"catalog_sale",
|
|
"product",
|
|
"unit_price",
|
|
"quantity",
|
|
]
|
|
|
|
|
|
class CatalogSaleSerializer(serializers.ModelSerializer):
|
|
catalogsaleline_set = CatalogSaleLineSerializer(
|
|
many=True, required=False
|
|
)
|
|
total = serializers.ReadOnlyField(source="get_total")
|
|
|
|
class Meta:
|
|
model = CatalogSale
|
|
fields = [
|
|
"id",
|
|
"customer",
|
|
"date",
|
|
"catalogsaleline_set",
|
|
"total",
|
|
]
|
|
|
|
def create(self, validated_data):
|
|
lines_data = validated_data.pop("catalogsaleline_set", [])
|
|
catalog_sale = CatalogSale.objects.create(**validated_data)
|
|
|
|
for line_data in lines_data:
|
|
CatalogSaleLine.objects.create(
|
|
catalog_sale=catalog_sale, **line_data
|
|
)
|
|
|
|
return catalog_sale
|
|
|
|
|
|
class ProductSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = Product
|
|
fields = [
|
|
"id",
|
|
"name",
|
|
"active",
|
|
"price",
|
|
"measuring_unit",
|
|
"categories",
|
|
"external_id",
|
|
]
|
|
|
|
|
|
class CustomerSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = Customer
|
|
fields = ["id", "name", "address", "email", "phone", "external_id"]
|
|
|
|
|
|
class ReconciliationJarSerializer(serializers.ModelSerializer):
|
|
Sales = SaleSerializer(many=True, read_only=True)
|
|
|
|
class Meta:
|
|
model = ReconciliationJar
|
|
fields = [
|
|
"id",
|
|
"date_time",
|
|
"reconcilier",
|
|
"cash_taken",
|
|
"cash_discrepancy",
|
|
"total_cash_purchases",
|
|
"Sales",
|
|
]
|
|
|
|
|
|
class PaymentMethodSerializer(serializers.Serializer):
|
|
text = serializers.CharField()
|
|
value = serializers.CharField()
|
|
|
|
def to_representation(self, instance):
|
|
return {
|
|
"text": instance[1],
|
|
"value": instance[0],
|
|
}
|
|
|
|
|
|
class SaleForRenconciliationSerializer(serializers.Serializer):
|
|
id = serializers.IntegerField()
|
|
date = serializers.DateTimeField()
|
|
payment_method = serializers.CharField()
|
|
customer = serializers.SerializerMethodField()
|
|
total = serializers.SerializerMethodField()
|
|
|
|
def get_customer(self, sale):
|
|
return {
|
|
"id": sale.customer.id,
|
|
"name": sale.customer.name,
|
|
}
|
|
|
|
def get_total(self, sale):
|
|
return sale.get_total()
|
|
|
|
|
|
class ListCustomerSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = Customer
|
|
fields = ["id", "name"]
|
|
|
|
|
|
class ListProductSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = Product
|
|
fields = ["id", "name"]
|
|
|
|
|
|
class SummarySaleLineSerializer(serializers.ModelSerializer):
|
|
product = ListProductSerializer()
|
|
|
|
class Meta:
|
|
model = SaleLine
|
|
fields = ["product", "quantity", "unit_price", "description"]
|
|
|
|
|
|
class SaleSummarySerializer(serializers.ModelSerializer):
|
|
customer = ListCustomerSerializer()
|
|
lines = SummarySaleLineSerializer(many=True, source="saleline_set")
|
|
|
|
class Meta:
|
|
model = Sale
|
|
fields = ["id", "date", "customer", "payment_method", "lines"]
|