From 7c1f49bcb518d76e659af1c67650e68b7dad85ea Mon Sep 17 00:00:00 2001 From: ngovinh2k2 Date: Wed, 15 Jul 2026 09:35:27 +0700 Subject: [PATCH] feat: implement quota --- apps/space/quotas.py | 9 +++++++++ apps/space/views.py | 9 ++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 apps/space/quotas.py diff --git a/apps/space/quotas.py b/apps/space/quotas.py new file mode 100644 index 0000000..8f5110b --- /dev/null +++ b/apps/space/quotas.py @@ -0,0 +1,9 @@ +from common.apps.billing.mixins import BaseQuota + + +class SpaceQuota(BaseQuota): + release_actions = {"destroy"} + rules = { + "create": "space.max_count", + "destroy": "space.max_count", + } diff --git a/apps/space/views.py b/apps/space/views.py index 681098f..4730d0a 100644 --- a/apps/space/views.py +++ b/apps/space/views.py @@ -1,5 +1,6 @@ import uuid +from common.apps.billing.mixins import QuotaMixin from common.apps.organization_user.models import OrganizationUser from common.apps.space.models import Space from common.apps.space_role.models import SpaceRole, SpaceRoleUser @@ -24,6 +25,7 @@ from rest_framework.views import APIView from rest_framework_simplejwt.tokens import AccessToken, UntypedToken +from apps.space.quotas import SpaceQuota from apps.space.serializers import InviteUserSerial, SpaceSerializer from apps.space.services import get_spaces_queryset_for_user from apps.space_role.services import clear_user_permission_cache @@ -31,7 +33,11 @@ console_client = ConsoleServiceClient() -class SpaceView(SpaceListCreateAPIView, SpaceRetrieveUpdateDestroyAPIView): +class SpaceView( + QuotaMixin, + SpaceListCreateAPIView, + SpaceRetrieveUpdateDestroyAPIView, +): model = Space serializer_class = SpaceSerializer queryset = Space.objects.all() @@ -39,6 +45,7 @@ class SpaceView(SpaceListCreateAPIView, SpaceRetrieveUpdateDestroyAPIView): filter_backends = [OrderingFilter, SearchFilter] ordering_fields = ["created_at"] search_fields = ["name"] + quota_classes = [SpaceQuota] def get_object(self): space_slug = self.request.headers.get("X-Space", None)