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): ...@@ -43,6 +43,8 @@ class _ExtensibleModelBase(models.base.ModelBase):
# Register all non-abstract models with django-reversion # Register all non-abstract models with django-reversion
mcls = reversion.register(mcls) mcls = reversion.register(mcls)
mcls.extra_permissions = []
return mcls return mcls
...@@ -100,6 +102,8 @@ class ExtensibleModel(models.Model, metaclass=_ExtensibleModelBase): ...@@ -100,6 +102,8 @@ class ExtensibleModel(models.Model, metaclass=_ExtensibleModelBase):
objects = CurrentSiteManager() objects = CurrentSiteManager()
objects_all_sites = models.Manager() objects_all_sites = models.Manager()
extra_permissions = []
def get_absolute_url(self) -> str: def get_absolute_url(self) -> str:
"""Get the URL o a view representing this model instance.""" """Get the URL o a view representing this model instance."""
pass pass
...@@ -226,6 +230,11 @@ class ExtensibleModel(models.Model, metaclass=_ExtensibleModelBase): ...@@ -226,6 +230,11 @@ class ExtensibleModel(models.Model, metaclass=_ExtensibleModelBase):
"""Collect all fields that can be synced on a model.""" """Collect all fields that can be synced on a model."""
return lazy(cls.syncable_fields_choices, tuple) 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: class Meta:
abstract = True abstract = True
......
...@@ -189,6 +189,9 @@ class AppConfig(django.apps.AppConfig): ...@@ -189,6 +189,9 @@ class AppConfig(django.apps.AppConfig):
pass pass
def _maintain_default_data(self): def _maintain_default_data(self):
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
if not self.models_module: if not self.models_module:
# This app does not have any models, so bail out early # This app does not have any models, so bail out early
return return
...@@ -197,3 +200,12 @@ class AppConfig(django.apps.AppConfig): ...@@ -197,3 +200,12 @@ class AppConfig(django.apps.AppConfig):
if hasattr(model, "maintain_default_data"): if hasattr(model, "maintain_default_data"):
# Method implemented by each model object; can be left out # Method implemented by each model object; can be left out
model.maintain_default_data() 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