mirror of
https://github.com/eitchtee/WYGIWYH.git
synced 2026-06-12 09:24:33 +02:00
feat: add Transaction Entity
This commit is contained in:
@@ -2,7 +2,11 @@ from drf_spectacular.types import OpenApiTypes
|
||||
from drf_spectacular.utils import extend_schema_field
|
||||
from rest_framework import serializers
|
||||
|
||||
from apps.transactions.models import TransactionCategory, TransactionTag
|
||||
from apps.transactions.models import (
|
||||
TransactionCategory,
|
||||
TransactionTag,
|
||||
TransactionEntity,
|
||||
)
|
||||
|
||||
|
||||
@extend_schema_field(
|
||||
@@ -67,3 +71,27 @@ class TransactionTagField(serializers.Field):
|
||||
)
|
||||
tags.append(tag)
|
||||
return tags
|
||||
|
||||
|
||||
class TransactionEntityField(serializers.Field):
|
||||
def to_representation(self, value):
|
||||
return [{"id": entity.id, "name": entity.name} for entity in value.all()]
|
||||
|
||||
def to_internal_value(self, data):
|
||||
entities = []
|
||||
for item in data:
|
||||
if isinstance(item, int):
|
||||
try:
|
||||
entity = TransactionEntity.objects.get(pk=item)
|
||||
except TransactionTag.DoesNotExist:
|
||||
raise serializers.ValidationError(
|
||||
f"Entity with ID {item} does not exist."
|
||||
)
|
||||
elif isinstance(item, str):
|
||||
entity, created = TransactionEntity.objects.get_or_create(name=item)
|
||||
else:
|
||||
raise serializers.ValidationError(
|
||||
"Invalid entity data. Provide an ID or name."
|
||||
)
|
||||
entities.append(entity)
|
||||
return entities
|
||||
|
||||
@@ -7,17 +7,21 @@ from rest_framework import serializers
|
||||
from rest_framework.permissions import IsAuthenticated
|
||||
|
||||
from apps.accounts.models import Account
|
||||
from apps.api.fields.transactions import TransactionTagField, TransactionCategoryField
|
||||
from apps.api.fields.transactions import (
|
||||
TransactionTagField,
|
||||
TransactionCategoryField,
|
||||
TransactionEntityField,
|
||||
)
|
||||
from apps.api.serializers.accounts import AccountSerializer
|
||||
from apps.transactions.models import (
|
||||
Transaction,
|
||||
TransactionCategory,
|
||||
TransactionTag,
|
||||
InstallmentPlan,
|
||||
TransactionEntity,
|
||||
)
|
||||
|
||||
|
||||
# Create serializers for other related models as needed
|
||||
class TransactionCategorySerializer(serializers.ModelSerializer):
|
||||
permission_classes = [IsAuthenticated]
|
||||
|
||||
@@ -34,6 +38,14 @@ class TransactionTagSerializer(serializers.ModelSerializer):
|
||||
fields = "__all__"
|
||||
|
||||
|
||||
class TransactionEntitySerializer(serializers.ModelSerializer):
|
||||
permission_classes = [IsAuthenticated]
|
||||
|
||||
class Meta:
|
||||
model = TransactionEntity
|
||||
fields = "__all__"
|
||||
|
||||
|
||||
class InstallmentPlanSerializer(serializers.ModelSerializer):
|
||||
permission_classes = [IsAuthenticated]
|
||||
|
||||
@@ -45,6 +57,7 @@ class InstallmentPlanSerializer(serializers.ModelSerializer):
|
||||
class TransactionSerializer(serializers.ModelSerializer):
|
||||
category = TransactionCategoryField(required=False)
|
||||
tags = TransactionTagField(required=False)
|
||||
entities = TransactionEntityField(required=False)
|
||||
|
||||
exchanged_amount = serializers.SerializerMethodField()
|
||||
|
||||
@@ -86,17 +99,24 @@ class TransactionSerializer(serializers.ModelSerializer):
|
||||
|
||||
def create(self, validated_data):
|
||||
tags = validated_data.pop("tags", [])
|
||||
entities = validated_data.pop("entities", [])
|
||||
transaction = Transaction.objects.create(**validated_data)
|
||||
transaction.tags.set(tags)
|
||||
transaction.entities.set(entities)
|
||||
return transaction
|
||||
|
||||
def update(self, instance, validated_data):
|
||||
tags = validated_data.pop("tags", None)
|
||||
entities = validated_data.pop("entities", None)
|
||||
for attr, value in validated_data.items():
|
||||
setattr(instance, attr, value)
|
||||
instance.save()
|
||||
|
||||
if tags is not None:
|
||||
instance.tags.set(tags)
|
||||
if entities is not None:
|
||||
instance.entities.set(entities)
|
||||
|
||||
return instance
|
||||
|
||||
@staticmethod
|
||||
|
||||
@@ -7,6 +7,7 @@ router = routers.DefaultRouter()
|
||||
router.register(r"transactions", views.TransactionViewSet)
|
||||
router.register(r"categories", views.TransactionCategoryViewSet)
|
||||
router.register(r"tags", views.TransactionTagViewSet)
|
||||
router.register(r"entities", views.TransactionEntityViewSet)
|
||||
router.register(r"installment-plans", views.InstallmentPlanViewSet)
|
||||
router.register(r"account-groups", views.AccountGroupViewSet)
|
||||
router.register(r"accounts", views.AccountViewSet)
|
||||
|
||||
@@ -5,12 +5,14 @@ from apps.api.serializers import (
|
||||
TransactionCategorySerializer,
|
||||
TransactionTagSerializer,
|
||||
InstallmentPlanSerializer,
|
||||
TransactionEntitySerializer,
|
||||
)
|
||||
from apps.transactions.models import (
|
||||
Transaction,
|
||||
TransactionCategory,
|
||||
TransactionTag,
|
||||
InstallmentPlan,
|
||||
TransactionEntity,
|
||||
)
|
||||
from apps.rules.signals import transaction_updated, transaction_created
|
||||
|
||||
@@ -42,6 +44,11 @@ class TransactionTagViewSet(viewsets.ModelViewSet):
|
||||
serializer_class = TransactionTagSerializer
|
||||
|
||||
|
||||
class TransactionEntityViewSet(viewsets.ModelViewSet):
|
||||
queryset = TransactionEntity.objects.all()
|
||||
serializer_class = TransactionEntitySerializer
|
||||
|
||||
|
||||
class InstallmentPlanViewSet(viewsets.ModelViewSet):
|
||||
queryset = InstallmentPlan.objects.all()
|
||||
serializer_class = InstallmentPlanSerializer
|
||||
|
||||
Reference in New Issue
Block a user