approval.models.monitored
1from typing import List 2 3from django.core.exceptions import ObjectDoesNotExist 4from django.db import models 5import logging 6 7from django.utils.translation import pgettext_lazy 8 9 10logger = logging.getLogger("approval") 11 12 13class MonitoredModel(models.Model): 14 """ 15 Moderated table mixin. 16 17 If you want to mark a model to make it subject to a moderation stage, 18 you must make it inherit from ``MonitoredModel``. No need to make it 19 also inherit from ``django.db.models.Model``, since it's already 20 a parent class of the mixin. 21 22 .. code-block:: python 23 :linenos: 24 25 from approval.models import MonitoredModel 26 from django.db import models 27 28 class Post(MonitoredModel): # Inherit from MonitoredModel 29 # Add your own fields. Having a visibility field is a good idea. 30 user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="entries") 31 is_visible = models.BooleanField(default=True, verbose_name="visible") 32 content = models.TextField(blank=False, verbose_name="content") 33 34 Inheriting from ``MonitoredModel`` allows provided ``pre-save`` and ``post-save`` signal 35 hooks to automatically manage your model. 36 """ 37 38 class Meta: 39 abstract = True 40 41 def _get_authors(self) -> List[models.Model]: 42 """Get the authors of the current instance.""" 43 # Use user from request as author only if allowed 44 if self.approval.auto_approve_by_request: 45 if getattr(self, "request") and getattr(self.request, "user", None): 46 logger.debug(pgettext_lazy("approval", f"Using request user as author of {self}.")) 47 return [self.request.user] 48 return self.approval._get_authors() 49 50 def _revert(self) -> bool: 51 """ 52 Revert the instance to its last saved state. 53 54 This method deletes unsaved changes on source model instance, 55 by reloading what's stored in the database. 56 57 Returns: 58 `True` if revert was possible, `False` otherwise. 59 """ 60 try: 61 self.refresh_from_db() 62 logger.debug(pgettext_lazy("approval", "Monitored {obj} was reverted to last DB state.").format(obj=self)) 63 return True 64 except ObjectDoesNotExist: 65 return False
logger =
<Logger approval (DEBUG)>
class
MonitoredModel(django.db.models.base.Model):
14class MonitoredModel(models.Model): 15 """ 16 Moderated table mixin. 17 18 If you want to mark a model to make it subject to a moderation stage, 19 you must make it inherit from ``MonitoredModel``. No need to make it 20 also inherit from ``django.db.models.Model``, since it's already 21 a parent class of the mixin. 22 23 .. code-block:: python 24 :linenos: 25 26 from approval.models import MonitoredModel 27 from django.db import models 28 29 class Post(MonitoredModel): # Inherit from MonitoredModel 30 # Add your own fields. Having a visibility field is a good idea. 31 user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="entries") 32 is_visible = models.BooleanField(default=True, verbose_name="visible") 33 content = models.TextField(blank=False, verbose_name="content") 34 35 Inheriting from ``MonitoredModel`` allows provided ``pre-save`` and ``post-save`` signal 36 hooks to automatically manage your model. 37 """ 38 39 class Meta: 40 abstract = True 41 42 def _get_authors(self) -> List[models.Model]: 43 """Get the authors of the current instance.""" 44 # Use user from request as author only if allowed 45 if self.approval.auto_approve_by_request: 46 if getattr(self, "request") and getattr(self.request, "user", None): 47 logger.debug(pgettext_lazy("approval", f"Using request user as author of {self}.")) 48 return [self.request.user] 49 return self.approval._get_authors() 50 51 def _revert(self) -> bool: 52 """ 53 Revert the instance to its last saved state. 54 55 This method deletes unsaved changes on source model instance, 56 by reloading what's stored in the database. 57 58 Returns: 59 `True` if revert was possible, `False` otherwise. 60 """ 61 try: 62 self.refresh_from_db() 63 logger.debug(pgettext_lazy("approval", "Monitored {obj} was reverted to last DB state.").format(obj=self)) 64 return True 65 except ObjectDoesNotExist: 66 return False
Moderated table mixin.
If you want to mark a model to make it subject to a moderation stage,
you must make it inherit from MonitoredModel
. No need to make it
also inherit from django.db.models.Model
, since it's already
a parent class of the mixin.
.. code-block:: python :linenos:
from approval.models import MonitoredModel
from django.db import models
class Post(MonitoredModel): # Inherit from MonitoredModel
# Add your own fields. Having a visibility field is a good idea.
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="entries")
is_visible = models.BooleanField(default=True, verbose_name="visible")
content = models.TextField(blank=False, verbose_name="content")
Inheriting from MonitoredModel
allows provided pre-save
and post-save
signal
hooks to automatically manage your model.
Inherited Members
- django.db.models.base.Model
- Model
- from_db
- pk
- get_deferred_fields
- refresh_from_db
- arefresh_from_db
- serializable_value
- save
- asave
- save_base
- delete
- adelete
- prepare_database_save
- clean
- validate_unique
- date_error_message
- unique_error_message
- get_constraints
- validate_constraints
- full_clean
- clean_fields
- check
class
MonitoredModel.Meta: