- New app/api with DRF: POST /api/v1/expenses/, GET categories and subcategories - Token auth via API_TOKEN env var (Bearer header) - Response format: type, data, errors, _links (HATEOAS) - Validates subcategory belongs to category - 11 tests covering auth, CRUD, and validation - API documentation in README.md
42 lines
1.1 KiB
Python
42 lines
1.1 KiB
Python
from rest_framework import serializers
|
|
|
|
from app.expenses.models import Category, Expense, Subcategory
|
|
|
|
|
|
class SubcategorySerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = Subcategory
|
|
fields = ["id", "name", "order"]
|
|
|
|
|
|
class CategorySerializer(serializers.ModelSerializer):
|
|
subcategories = SubcategorySerializer(many=True, read_only=True)
|
|
|
|
class Meta:
|
|
model = Category
|
|
fields = ["id", "name", "order", "subcategories"]
|
|
|
|
|
|
class ExpenseReadSerializer(serializers.ModelSerializer):
|
|
category = serializers.StringRelatedField()
|
|
subcategory = serializers.StringRelatedField()
|
|
|
|
class Meta:
|
|
model = Expense
|
|
fields = ["id", "concept", "amount", "category", "subcategory", "created_at"]
|
|
|
|
|
|
class ExpenseWriteSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = Expense
|
|
fields = ["concept", "amount", "category", "subcategory"]
|
|
|
|
def validate(self, data):
|
|
category = data.get("category")
|
|
subcategory = data.get("subcategory")
|
|
if subcategory and subcategory.category != category:
|
|
raise serializers.ValidationError(
|
|
{"subcategory": "Subcategory does not belong to the selected category."}
|
|
)
|
|
return data
|