Skip to content
Snippets Groups Projects
Commit 57956aac authored by Hangzhi Yu's avatar Hangzhi Yu
Browse files

Add method to inject permissions to ExtensibleModels dynamically

Add method to inject permissions to ExtensibleModels dynamically
parent fab8ec67
No related branches found
No related tags found
2 merge requests!309Resolve "Rename template references",!308Resolve "Let apps add extra permissions to models"
Pipeline #2716 failed
......@@ -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,12 @@ 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,
name=verbose_name,
content_type=ct
)
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