From f72844bdd496012bf0cd07a2efbf34b1738f757b Mon Sep 17 00:00:00 2001 From: Mathieu Pellerin Date: Wed, 1 Jan 2025 16:43:32 +0700 Subject: [PATCH] Add a API URL to retrieve basic subscription details for the logged in user --- .../qfieldcloud/subscription/serializers.py | 28 +++++++++++++++++++ docker-app/qfieldcloud/subscription/views.py | 25 +++++++++++++++++ docker-app/qfieldcloud/urls.py | 5 ++++ 3 files changed, 58 insertions(+) create mode 100644 docker-app/qfieldcloud/subscription/serializers.py create mode 100644 docker-app/qfieldcloud/subscription/views.py diff --git a/docker-app/qfieldcloud/subscription/serializers.py b/docker-app/qfieldcloud/subscription/serializers.py new file mode 100644 index 000000000..d0876771c --- /dev/null +++ b/docker-app/qfieldcloud/subscription/serializers.py @@ -0,0 +1,28 @@ +from qfieldcloud.subscription.models import CurrentSubscription +from rest_framework import serializers + + +class CurrentSubscriptionSerializer(serializers.ModelSerializer): + storage_used_bytes = serializers.SerializerMethodField() + active_plan_display_name = serializers.SerializerMethodField() + + def get_storage_used_bytes(self, obj): + return obj.account.storage_used_bytes + + def get_active_plan_display_name(self, obj): + return obj.plan.display_name if obj.plan else None + + class Meta: + model = CurrentSubscription + fields = ( + "storage_used_bytes", + "active_storage_total_bytes", + "active_plan_display_name", + "active_until", + ) + read_only_fields = ( + "storage_used_bytes", + "active_storage_total_bytes", + "active_plan_display_name", + "active_until", + ) diff --git a/docker-app/qfieldcloud/subscription/views.py b/docker-app/qfieldcloud/subscription/views.py new file mode 100644 index 000000000..8db3f09ef --- /dev/null +++ b/docker-app/qfieldcloud/subscription/views.py @@ -0,0 +1,25 @@ +from rest_framework.generics import RetrieveAPIView +from rest_framework.permissions import IsAuthenticated +from rest_framework.response import Response + +from qfieldcloud.subscription.serializers import CurrentSubscriptionSerializer + + +class CurrentSubscriptionView(RetrieveAPIView): + """Read current subscription information including storage details. + + Accepts nothing, returns the current subscription information. + """ + + serializer_class = CurrentSubscriptionSerializer + permission_classes = (IsAuthenticated,) + + def get_object(self): + return self.request.user.useraccount.current_subscription + + def get(self, request): + return Response( + CurrentSubscriptionSerializer( + self.request.user.useraccount.current_subscription + ).data + ) diff --git a/docker-app/qfieldcloud/urls.py b/docker-app/qfieldcloud/urls.py index 67ec49bf5..64ca3643d 100644 --- a/docker-app/qfieldcloud/urls.py +++ b/docker-app/qfieldcloud/urls.py @@ -28,6 +28,7 @@ SpectacularSwaggerView, ) from qfieldcloud.authentication import views as auth_views +from qfieldcloud.subscription import views as subscription_views from qfieldcloud.core.views import files_views from rest_framework import permissions @@ -75,6 +76,10 @@ path("api/v1/auth/token/", auth_views.LoginView.as_view()), path("api/v1/auth/user/", auth_views.UserView.as_view()), path("api/v1/auth/logout/", auth_views.LogoutView.as_view()), + path( + "api/v1/subscription/current/", + subscription_views.CurrentSubscriptionView.as_view(), + ), path("api/v1/", include("qfieldcloud.core.urls")), path("auth/", include("rest_framework.urls")), path("accounts/", include("allauth.urls")),