Skip to content
This repository has been archived by the owner on Mar 17, 2024. It is now read-only.

Commit

Permalink
Bug/SK-414 | Limit apps per project should not be based on user (#115)
Browse files Browse the repository at this point in the history
  • Loading branch information
niklastheman committed Apr 3, 2023
1 parent 8f19ad4 commit 02e9693
Show file tree
Hide file tree
Showing 5 changed files with 96 additions and 43 deletions.
22 changes: 0 additions & 22 deletions helpers/get_apps_limit_per_user.py

This file was deleted.

26 changes: 26 additions & 0 deletions helpers/get_apps_per_project_limit.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
from django.conf import settings


def get_apps_per_project_limit(slug):
"""get_apps_per_project_limit
Args:
slug (App.slug): slug for the app type
Returns:
Integer or None: returns the limit or None if not set
"""
try:
apps_per_project_limit = (
settings.APPS_PER_PROJECT_LIMIT
if settings.APPS_PER_PROJECT_LIMIT is not None
else {}
)
except Exception:
apps_per_project_limit = {}

return (
apps_per_project_limit[slug]
if slug in apps_per_project_limit
else None
)
5 changes: 2 additions & 3 deletions models.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from guardian.shortcuts import assign_perm, remove_perm
from tagulous.models import TagField

from apps.helpers.get_apps_limit_per_user import get_apps_limit_per_user
from apps.helpers.get_apps_per_project_limit import get_apps_per_project_limit


class AppCategories(models.Model):
Expand Down Expand Up @@ -58,10 +58,9 @@ def __str__(self):

class AppInstanceManager(models.Manager):
def user_can_create(self, user, project, app_slug):
limit = get_apps_limit_per_user(app_slug)
limit = get_apps_per_project_limit(app_slug)

num_of_app_instances = self.filter(
Q(owner=user),
~Q(state="Deleted"),
app__slug=app_slug,
project=project,
Expand Down
64 changes: 57 additions & 7 deletions tests/test_create_app_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ def get_data(self, user=None):
return project

@override_settings(
APPS_PER_USER_LIMIT={
APPS_PER_PROJECT_LIMIT={
"jupyter-lab": 1,
}
)
Expand All @@ -68,7 +68,7 @@ def test_has_permission(self):

self.assertEqual(response.status_code, 200)

@override_settings(APPS_PER_USER_LIMIT={"jupyter-lab": 0})
@override_settings(APPS_PER_PROJECT_LIMIT={"jupyter-lab": 0})
def test_has_reached_app_limit(self):
c = Client()

Expand All @@ -93,7 +93,7 @@ def test_has_reached_app_limit(self):

self.assertEqual(response.status_code, 403)

@override_settings(APPS_PER_USER_LIMIT={"jupyter-lab": 1})
@override_settings(APPS_PER_PROJECT_LIMIT={"jupyter-lab": 1})
def test_missing_access_to_project(self):
c = Client()

Expand Down Expand Up @@ -121,7 +121,7 @@ def test_missing_access_to_project(self):
self.assertEqual(response.status_code, 403)

@override_settings(
APPS_PER_USER_LIMIT={
APPS_PER_PROJECT_LIMIT={
"jupyter-lab": None,
}
)
Expand All @@ -143,7 +143,7 @@ def test_has_permission_when_none(self):

self.assertEqual(response.status_code, 200)

@override_settings(APPS_PER_USER_LIMIT={})
@override_settings(APPS_PER_PROJECT_LIMIT={})
def test_has_permission_when_not_specified(self):
c = Client()

Expand All @@ -163,7 +163,7 @@ def test_has_permission_when_not_specified(self):
self.assertEqual(response.status_code, 200)

@override_settings(
APPS_PER_USER_LIMIT={
APPS_PER_PROJECT_LIMIT={
"jupyter-lab": 1,
}
)
Expand Down Expand Up @@ -207,7 +207,7 @@ def test_has_permission_project_level(self):

self.assertEqual(response.status_code, 403)

@override_settings(APPS_PER_USER_LIMIT={"jupyter-lab": 0})
@override_settings(APPS_PER_PROJECT_LIMIT={"jupyter-lab": 0})
def test_permission_overrides_reached_app_limit(self):
c = Client()

Expand Down Expand Up @@ -249,3 +249,53 @@ def test_permission_overrides_reached_app_limit(self):
)

self.assertEqual(response.status_code, 200)

@override_settings(APPS_PER_PROJECT_LIMIT={"jupyter-lab": 1})
def test_app_limit_is_per_project(self):
c = Client()

project = self.get_data()

response = c.post(
"/accounts/login/", {"username": "foo1", "password": "bar"}
)
response.status_code

self.assertEqual(response.status_code, 302)

response = c.get(
f"/{self.user.username}/{project.slug}/apps/create/jupyter-lab"
)

self.assertEqual(response.status_code, 200)

user2 = User.objects.create_user("foo123", "foo123@test.com", "bar123")

project.authorized.add(user2)
project.save()

response = c.get(
f"/{user2.username}/{project.slug}/apps/create/jupyter-lab"
)

self.assertEqual(response.status_code, 200)

_ = AppInstance.objects.create(
access="private",
owner=self.user,
name="test_app_instance_private",
app=self.app,
project=project,
)

response = c.get(
f"/{self.user.username}/{project.slug}/apps/create/jupyter-lab"
)

self.assertEqual(response.status_code, 403)

response = c.get(
f"/{user2.username}/{project.slug}/apps/create/jupyter-lab"
)

self.assertEqual(response.status_code, 403)
22 changes: 11 additions & 11 deletions tests/test_helpers.py
Original file line number Diff line number Diff line change
@@ -1,39 +1,39 @@
from django.test import TestCase, override_settings

from apps.helpers.get_apps_limit_per_user import get_apps_limit_per_user
from apps.helpers.get_apps_per_project_limit import get_apps_per_project_limit


class HelpersTestCase(TestCase):
@override_settings(
APPS_PER_USER_LIMIT={
APPS_PER_PROJECT_LIMIT={
"vscode": 1,
"volumeK8s": 2,
"pytorch-serve": 0,
"tensorflow-serve": None,
}
)
def test_get_apps_limit_per_user(self):
result = get_apps_limit_per_user("vscode")
result = get_apps_per_project_limit("vscode")
self.assertEqual(1, result)

result = get_apps_limit_per_user("volumeK8s")
result = get_apps_per_project_limit("volumeK8s")
self.assertEqual(2, result)

result = get_apps_limit_per_user("pytorch-serve")
result = get_apps_per_project_limit("pytorch-serve")
self.assertEqual(0, result)

result = get_apps_limit_per_user("tensorflow-serve")
result = get_apps_per_project_limit("tensorflow-serve")
self.assertIsNone(result)

result = get_apps_limit_per_user("no-app")
result = get_apps_per_project_limit("no-app")
self.assertIsNone(result)

@override_settings(APPS_PER_USER_LIMIT={})
@override_settings(APPS_PER_PROJECT_LIMIT={})
def test_get_apps_limit_per_user_handle_empty(self):
result = get_apps_limit_per_user("vscode")
result = get_apps_per_project_limit("vscode")
self.assertIsNone(result)

@override_settings(APPS_PER_USER_LIMIT=None)
@override_settings(APPS_PER_PROJECT_LIMIT=None)
def test_get_apps_limit_per_user_handle_none(self):
result = get_apps_limit_per_user("vscode")
result = get_apps_per_project_limit("vscode")
self.assertIsNone(result)

0 comments on commit 02e9693

Please sign in to comment.