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)