Skip to content
Snippets Groups Projects
Commit 1d045dfb authored by Nik | Klampfradler's avatar Nik | Klampfradler
Browse files

Merge branch '273-let-apps-add-extra-permissions-to-models' into 'master'

Resolve "Let apps add extra permissions to models"

Closes #273

See merge request AlekSIS/official/AlekSIS!308
parents 7ba87e5a 97d76f59
No related branches found
No related tags found
1 merge request!308Resolve "Let apps add extra permissions to models"
Pipeline #2830 passed
......@@ -43,6 +43,8 @@ class _ExtensibleModelBase(models.base.ModelBase):
# Register all non-abstract models with django-reversion
mcls = reversion.register(mcls)
mcls.extra_permissions = []
return mcls
......@@ -100,6 +102,8 @@ class ExtensibleModel(models.Model, metaclass=_ExtensibleModelBase):
objects = CurrentSiteManager()
objects_all_sites = models.Manager()
extra_permissions = []
def get_absolute_url(self) -> str:
"""Get the URL o a view representing this model instance."""
pass
......@@ -226,6 +230,11 @@ class ExtensibleModel(models.Model, metaclass=_ExtensibleModelBase):
"""Collect all fields that can be synced on a model."""
return lazy(cls.syncable_fields_choices, tuple)
@classmethod
def add_permission(cls, name: str, verbose_name: str):
"""Dynamically add a new permission to a model."""
cls.extra_permissions.append((name, verbose_name))
class Meta:
abstract = True
......
......@@ -189,6 +189,9 @@ class AppConfig(django.apps.AppConfig):
pass
def _maintain_default_data(self):
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
if not self.models_module:
# This app does not have any models, so bail out early
return
......@@ -197,3 +200,11 @@ class AppConfig(django.apps.AppConfig):
if hasattr(model, "maintain_default_data"):
# Method implemented by each model object; can be left out
model.maintain_default_data()
if hasattr(model, "extra_permissions"):
ct = ContentType.objects.get_for_model(model)
for perm, verbose_name in model.extra_permissions:
Permission.objects.get_or_create(
codename=perm,
content_type=ct,
defaults={"name": verbose_name},
)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment