feat: add Transaction Entity

This commit is contained in:
Herculino Trotta
2024-11-30 17:12:35 -03:00
parent 28c8a961bc
commit 2382abf3c0
21 changed files with 517 additions and 11 deletions
+29 -1
View File
@@ -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
+22 -2
View File
@@ -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
+1
View File
@@ -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)
+7
View File
@@ -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