diff --git a/app/apps/api/serializers/accounts.py b/app/apps/api/serializers/accounts.py index 880c03c..afd59b1 100644 --- a/app/apps/api/serializers/accounts.py +++ b/app/apps/api/serializers/accounts.py @@ -1,4 +1,5 @@ from rest_framework import serializers +from rest_framework.permissions import IsAuthenticated from apps.api.serializers.currencies import CurrencySerializer from apps.accounts.models import AccountGroup, Account @@ -6,6 +7,8 @@ from apps.currencies.models import Currency class AccountGroupSerializer(serializers.ModelSerializer): + permission_classes = [IsAuthenticated] + class Meta: model = AccountGroup fields = "__all__" @@ -31,6 +34,8 @@ class AccountSerializer(serializers.ModelSerializer): allow_null=True, ) + permission_classes = [IsAuthenticated] + class Meta: model = Account fields = [ diff --git a/app/apps/api/serializers/currencies.py b/app/apps/api/serializers/currencies.py index 2d56ff0..33ed84a 100644 --- a/app/apps/api/serializers/currencies.py +++ b/app/apps/api/serializers/currencies.py @@ -1,8 +1,12 @@ from rest_framework import serializers +from rest_framework.permissions import IsAuthenticated + from apps.currencies.models import Currency, ExchangeRate class CurrencySerializer(serializers.ModelSerializer): + permission_classes = [IsAuthenticated] + class Meta: model = Currency fields = "__all__" @@ -24,6 +28,8 @@ class ExchangeRateSerializer(serializers.ModelSerializer): queryset=Currency.objects.all(), source="to_currency", write_only=True ) + permission_classes = [IsAuthenticated] + class Meta: model = ExchangeRate fields = "__all__" diff --git a/app/apps/api/serializers/dca.py b/app/apps/api/serializers/dca.py index 49a0b28..848d3e0 100644 --- a/app/apps/api/serializers/dca.py +++ b/app/apps/api/serializers/dca.py @@ -1,4 +1,6 @@ from rest_framework import serializers +from rest_framework.permissions import IsAuthenticated + from apps.dca.models import DCAEntry, DCAStrategy @@ -16,6 +18,8 @@ class DCAEntrySerializer(serializers.ModelSerializer): max_digits=42, decimal_places=30, read_only=True ) + permission_classes = [IsAuthenticated] + class Meta: model = DCAEntry fields = [ @@ -57,6 +61,8 @@ class DCAStrategySerializer(serializers.ModelSerializer): max_digits=42, decimal_places=30, read_only=True ) + permission_classes = [IsAuthenticated] + class Meta: model = DCAStrategy fields = [ diff --git a/app/apps/api/serializers/transactions.py b/app/apps/api/serializers/transactions.py index 467c0a0..e9bfa44 100644 --- a/app/apps/api/serializers/transactions.py +++ b/app/apps/api/serializers/transactions.py @@ -19,6 +19,7 @@ from apps.transactions.models import ( TransactionTag, InstallmentPlan, TransactionEntity, + RecurringTransaction, ) @@ -47,11 +48,77 @@ class TransactionEntitySerializer(serializers.ModelSerializer): class InstallmentPlanSerializer(serializers.ModelSerializer): + category = TransactionCategoryField(required=False) + tags = TransactionTagField(required=False) + entities = TransactionEntityField(required=False) + permission_classes = [IsAuthenticated] class Meta: model = InstallmentPlan - fields = "__all__" + fields = [ + "id", + "account", + "type", + "description", + "number_of_installments", + "installment_start", + "installment_total_number", + "start_date", + "reference_date", + "end_date", + "recurrence", + "installment_amount", + "category", + "tags", + "entities", + "notes", + ] + read_only_fields = ["installment_total_number", "end_date"] + + def create(self, validated_data): + instance = super().create(validated_data) + instance.create_transactions() + return instance + + def update(self, instance, validated_data): + instance = super().update(instance, validated_data) + instance.update_transactions() + return instance + + +class RecurringTransactionSerializer(serializers.ModelSerializer): + category = TransactionCategoryField(required=False) + tags = TransactionTagField(required=False) + entities = TransactionEntityField(required=False) + + class Meta: + model = RecurringTransaction + fields = [ + "id", + "is_paused", + "account", + "type", + "amount", + "description", + "category", + "tags", + "entities", + "notes", + "reference_date", + "start_date", + "end_date", + "recurrence_type", + "recurrence_interval", + "last_generated_date", + "last_generated_reference_date", + ] + read_only_fields = ["last_generated_date", "last_generated_reference_date"] + + def create(self, validated_data): + instance = super().create(validated_data) + instance.create_upcoming_transactions() + return instance class TransactionSerializer(serializers.ModelSerializer): diff --git a/app/apps/api/urls.py b/app/apps/api/urls.py index 4bf0457..b900064 100644 --- a/app/apps/api/urls.py +++ b/app/apps/api/urls.py @@ -9,6 +9,7 @@ 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"recurring-transactions", views.RecurringTransactionViewSet) router.register(r"account-groups", views.AccountGroupViewSet) router.register(r"accounts", views.AccountViewSet) router.register(r"currencies", views.CurrencyViewSet) diff --git a/app/apps/api/views/transactions.py b/app/apps/api/views/transactions.py index 92c12cf..000ae5e 100644 --- a/app/apps/api/views/transactions.py +++ b/app/apps/api/views/transactions.py @@ -1,4 +1,4 @@ -from rest_framework import permissions, viewsets +from rest_framework import viewsets from apps.api.serializers import ( TransactionSerializer, @@ -6,6 +6,7 @@ from apps.api.serializers import ( TransactionTagSerializer, InstallmentPlanSerializer, TransactionEntitySerializer, + RecurringTransactionSerializer, ) from apps.transactions.models import ( Transaction, @@ -13,6 +14,7 @@ from apps.transactions.models import ( TransactionTag, InstallmentPlan, TransactionEntity, + RecurringTransaction, ) from apps.rules.signals import transaction_updated, transaction_created @@ -53,10 +55,7 @@ class InstallmentPlanViewSet(viewsets.ModelViewSet): queryset = InstallmentPlan.objects.all() serializer_class = InstallmentPlanSerializer - def perform_create(self, serializer): - instance = serializer.save() - instance.create_transactions() - def perform_update(self, serializer): - instance = serializer.save() - instance.create_transactions() +class RecurringTransactionViewSet(viewsets.ModelViewSet): + queryset = RecurringTransaction.objects.all() + serializer_class = RecurringTransactionSerializer