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

Commit

Permalink
Feature/SK-393 | Limit apps per project (#102)
Browse files Browse the repository at this point in the history
  • Loading branch information
niklastheman committed Mar 21, 2023
1 parent 29a79a5 commit 1674a95
Show file tree
Hide file tree
Showing 10 changed files with 427 additions and 72 deletions.
2 changes: 1 addition & 1 deletion admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@


class AppsAdmin(admin.ModelAdmin):
list_display = ("name", "slug", "user_can_create")
list_display = ("name", "user_can_create", "slug", "revision")
list_filter = ("user_can_create",)


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


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

return apps_per_user_limit[slug] if slug in apps_per_user_limit else None
6 changes: 3 additions & 3 deletions helpers.py → helpers/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
from django.conf import settings
from django.template import engines

from .models import AppInstance, AppStatus
from .serialize import serialize_app
from .tasks import deploy_resource
from ..models import AppInstance, AppStatus
from ..serialize import serialize_app
from ..tasks import deploy_resource

ReleaseName = apps.get_model(app_label=settings.RELEASENAME_MODEL)

Expand Down
18 changes: 18 additions & 0 deletions models.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
from django.contrib.auth import get_user_model
from django.db import models
from django.db.models import Q
from django.db.models.signals import post_save
from django.dispatch import receiver
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


class AppCategories(models.Model):
name = models.CharField(max_length=512)
Expand Down Expand Up @@ -53,7 +56,22 @@ def __str__(self):
return str(self.name) + "({})".format(self.revision)


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

num_of_app_instances = self.filter(
Q(owner=user), app__slug=app_slug, project=project
).count()

has_perm = user.has_perm("apps.add_appinstance")

return limit is None or limit > num_of_app_instances or has_perm


class AppInstance(models.Model):
objects = AppInstanceManager()

access = models.CharField(
max_length=20, default="private", null=True, blank=True
)
Expand Down
Empty file added tests/__init__.py
Empty file.
71 changes: 71 additions & 0 deletions tests/test_app_instance.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
from django.contrib.auth import get_user_model
from django.test import TestCase

from projects.models import Project

from ..models import AppInstance, Apps

User = get_user_model()


class AppInstaceTestCase(TestCase):
def setUp(self):
self.user = User.objects.create_user("foo1", "foo@test.com", "bar")

def get_data(self, access):
project = Project.objects.create_project(
name="test-perm", owner=self.user, description="", repository=""
)
app = Apps.objects.create(name="FEDn Combiner", slug="combiner")

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

return [project, app, app_instance]

def test_permission_created_if_private(self):
project, app, app_instance = self.get_data("private")

result = self.user.has_perm("can_access_app", app_instance)

self.assertTrue(result)

def test_permission_do_note_created_if_project(self):
project, app, app_instance = self.get_data("project")

result = self.user.has_perm("can_access_app", app_instance)

self.assertFalse(result)

def test_permission_create_if_changed_to_private(self):
project, app, app_instance = self.get_data("project")

result = self.user.has_perm("can_access_app", app_instance)

self.assertFalse(result)

app_instance.access = "private"
app_instance.save()

result = self.user.has_perm("can_access_app", app_instance)

self.assertTrue(result)

def test_permission_remove_if_changed_from_project(self):
project, app, app_instance = self.get_data("private")

result = self.user.has_perm("can_access_app", app_instance)

self.assertTrue(result)

app_instance.access = "project"
app_instance.save()

result = self.user.has_perm("can_access_app", app_instance)

self.assertFalse(result)
65 changes: 0 additions & 65 deletions tests.py → tests/test_app_view_forbidden.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@

from projects.models import Project

from .models import AppInstance, Apps

User = get_user_model()


Expand Down Expand Up @@ -218,66 +216,3 @@ def test_forbidden_apps_publish(self):
)
self.assertTemplateUsed(response, "403.html")
self.assertEqual(response.status_code, 403)


class AppInstaceTestCase(TestCase):
def setUp(self):
self.user = User.objects.create_user("foo1", "foo@test.com", "bar")

def get_data(self, access):
project = Project.objects.create_project(
name="test-perm", owner=self.user, description="", repository=""
)
app = Apps.objects.create(name="FEDn Combiner")

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

return [project, app, app_instance]

def test_permission_created_if_private(self):
project, app, app_instance = self.get_data("private")

result = self.user.has_perm("can_access_app", app_instance)

self.assertTrue(result)

def test_permission_do_note_created_if_project(self):
project, app, app_instance = self.get_data("project")

result = self.user.has_perm("can_access_app", app_instance)

self.assertFalse(result)

def test_permission_create_if_changed_to_private(self):
project, app, app_instance = self.get_data("project")

result = self.user.has_perm("can_access_app", app_instance)

self.assertFalse(result)

app_instance.access = "private"
app_instance.save()

result = self.user.has_perm("can_access_app", app_instance)

self.assertTrue(result)

def test_permission_remove_if_changed_from_project(self):
project, app, app_instance = self.get_data("private")

result = self.user.has_perm("can_access_app", app_instance)

self.assertTrue(result)

app_instance.access = "project"
app_instance.save()

result = self.user.has_perm("can_access_app", app_instance)

self.assertFalse(result)
Loading

0 comments on commit 1674a95

Please sign in to comment.