Files
WYGIWYH/app/apps/api/views/transactions.py
2026-01-08 22:51:49 +01:00

165 lines
5.8 KiB
Python

from copy import deepcopy
from rest_framework import viewsets
from apps.api.custom.pagination import CustomPageNumberPagination
from apps.api.serializers import (
TransactionSerializer,
TransactionCategorySerializer,
TransactionTagSerializer,
InstallmentPlanSerializer,
TransactionEntitySerializer,
RecurringTransactionSerializer,
)
from apps.transactions.models import (
Transaction,
TransactionCategory,
TransactionTag,
InstallmentPlan,
TransactionEntity,
RecurringTransaction,
)
from apps.rules.signals import transaction_updated, transaction_created
class TransactionViewSet(viewsets.ModelViewSet):
queryset = Transaction.objects.all()
serializer_class = TransactionSerializer
pagination_class = CustomPageNumberPagination
filterset_fields = {
'account': ['exact'],
'type': ['exact'],
'is_paid': ['exact'],
'date': ['exact', 'gte', 'lte', 'gt', 'lt'],
'reference_date': ['exact', 'gte', 'lte', 'gt', 'lt'],
'mute': ['exact'],
'amount': ['exact', 'gte', 'lte', 'gt', 'lt'],
'description': ['exact', 'icontains'],
'notes': ['exact', 'icontains'],
'category': ['exact', 'isnull'],
'installment_plan': ['exact', 'isnull'],
'installment_id': ['exact', 'gte', 'lte'],
'recurring_transaction': ['exact', 'isnull'],
'internal_note': ['exact', 'icontains'],
'internal_id': ['exact'],
'deleted': ['exact'],
'created_at': ['exact', 'gte', 'lte', 'gt', 'lt'],
'updated_at': ['exact', 'gte', 'lte', 'gt', 'lt'],
'deleted_at': ['exact', 'gte', 'lte', 'gt', 'lt', 'isnull'],
'owner': ['exact'],
}
search_fields = ['description', 'notes', 'internal_note']
ordering_fields = '__all__'
ordering = ['-id']
def perform_create(self, serializer):
instance = serializer.save()
transaction_created.send(sender=instance)
def perform_update(self, serializer):
old_data = deepcopy(self.get_object())
instance = serializer.save()
transaction_updated.send(sender=instance, old_data=old_data)
def partial_update(self, request, *args, **kwargs):
kwargs["partial"] = True
return self.update(request, *args, **kwargs)
class TransactionCategoryViewSet(viewsets.ModelViewSet):
queryset = TransactionCategory.objects.all()
serializer_class = TransactionCategorySerializer
pagination_class = CustomPageNumberPagination
filterset_fields = {
'name': ['exact', 'icontains'],
'mute': ['exact'],
'active': ['exact'],
'owner': ['exact'],
}
search_fields = ['name']
ordering_fields = '__all__'
ordering = ['id']
class TransactionTagViewSet(viewsets.ModelViewSet):
queryset = TransactionTag.objects.all()
serializer_class = TransactionTagSerializer
pagination_class = CustomPageNumberPagination
filterset_fields = {
'name': ['exact', 'icontains'],
'active': ['exact'],
'owner': ['exact'],
}
search_fields = ['name']
ordering_fields = '__all__'
ordering = ['id']
class TransactionEntityViewSet(viewsets.ModelViewSet):
queryset = TransactionEntity.objects.all()
serializer_class = TransactionEntitySerializer
pagination_class = CustomPageNumberPagination
filterset_fields = {
'name': ['exact', 'icontains'],
'active': ['exact'],
'owner': ['exact'],
}
search_fields = ['name']
ordering_fields = '__all__'
ordering = ['id']
class InstallmentPlanViewSet(viewsets.ModelViewSet):
queryset = InstallmentPlan.objects.all()
serializer_class = InstallmentPlanSerializer
pagination_class = CustomPageNumberPagination
filterset_fields = {
'account': ['exact'],
'type': ['exact'],
'description': ['exact', 'icontains'],
'number_of_installments': ['exact', 'gte', 'lte', 'gt', 'lt'],
'installment_start': ['exact', 'gte', 'lte', 'gt', 'lt'],
'installment_total_number': ['exact', 'gte', 'lte', 'gt', 'lt'],
'start_date': ['exact', 'gte', 'lte', 'gt', 'lt'],
'reference_date': ['exact', 'gte', 'lte', 'gt', 'lt', 'isnull'],
'end_date': ['exact', 'gte', 'lte', 'gt', 'lt', 'isnull'],
'recurrence': ['exact'],
'installment_amount': ['exact', 'gte', 'lte', 'gt', 'lt'],
'category': ['exact', 'isnull'],
'notes': ['exact', 'icontains'],
'add_description_to_transaction': ['exact'],
'add_notes_to_transaction': ['exact'],
}
search_fields = ['description', 'notes']
ordering_fields = '__all__'
ordering = ['-id']
class RecurringTransactionViewSet(viewsets.ModelViewSet):
queryset = RecurringTransaction.objects.all()
serializer_class = RecurringTransactionSerializer
pagination_class = CustomPageNumberPagination
filterset_fields = {
'is_paused': ['exact'],
'account': ['exact'],
'type': ['exact'],
'amount': ['exact', 'gte', 'lte', 'gt', 'lt'],
'description': ['exact', 'icontains'],
'category': ['exact', 'isnull'],
'notes': ['exact', 'icontains'],
'reference_date': ['exact', 'gte', 'lte', 'gt', 'lt', 'isnull'],
'start_date': ['exact', 'gte', 'lte', 'gt', 'lt'],
'end_date': ['exact', 'gte', 'lte', 'gt', 'lt', 'isnull'],
'recurrence_type': ['exact'],
'recurrence_interval': ['exact', 'gte', 'lte', 'gt', 'lt'],
'keep_at_most': ['exact', 'gte', 'lte', 'gt', 'lt'],
'last_generated_date': ['exact', 'gte', 'lte', 'gt', 'lt', 'isnull'],
'last_generated_reference_date': ['exact', 'gte', 'lte', 'gt', 'lt', 'isnull'],
'add_description_to_transaction': ['exact'],
'add_notes_to_transaction': ['exact'],
}
search_fields = ['description', 'notes']
ordering_fields = '__all__'
ordering = ['-id']