kopia lustrzana https://github.com/wagtail/wagtail
Add docs for `LockableMixin` and locking snippets
rodzic
1a09e2d70e
commit
8dcc292d26
|
@ -610,6 +610,50 @@ The model is added to allow snippets to have changes that are not immediately re
|
|||
.. automethod:: with_content_json
|
||||
```
|
||||
|
||||
## `LockableMixin`
|
||||
|
||||
`LockableMixin` is an abstract model that can be added to any non-page Django model to allow its instances to be locked.
|
||||
Pages already include this mixin, so there is no need to add it.
|
||||
|
||||
```{versionadded} 4.2
|
||||
The model is added to allow snippets to be locked. See [](wagtailsnippets_locking_snippets) for more details.
|
||||
```
|
||||
|
||||
### Database fields
|
||||
|
||||
```{eval-rst}
|
||||
.. class:: LockableMixin
|
||||
|
||||
.. attribute:: locked
|
||||
|
||||
(boolean)
|
||||
|
||||
A boolean that is set to ``True`` if the object is locked.
|
||||
|
||||
.. attribute:: locked_at
|
||||
|
||||
(date/time)
|
||||
|
||||
The date/time when the object was locked.
|
||||
|
||||
.. attribute:: locked_by
|
||||
|
||||
(foreign key to user model)
|
||||
|
||||
The user who locked the object.
|
||||
```
|
||||
|
||||
### Methods and properties
|
||||
|
||||
```{eval-rst}
|
||||
.. class:: LockableMixin
|
||||
:noindex:
|
||||
|
||||
.. automethod:: get_lock
|
||||
|
||||
.. automethod:: with_content_json
|
||||
```
|
||||
|
||||
(revision_model_ref)=
|
||||
|
||||
## `Revision`
|
||||
|
|
|
@ -15,6 +15,12 @@ depth: 1
|
|||
|
||||
Wagtail now provides a set of utilities for creating data migrations on StreamField data. For more information, see [StreamField data migrations](streamfield_data_migrations). This feature was developed by Sandil Ranasinghe, initially as the [wagtail-streamfield-migration-toolkit](https://github.com/wagtail/wagtail-streamfield-migration-toolkit) add-on package, as part of the Google Summer of Code 2022 initiative, with support from Jacob Topp-Mugglestone, Joshua Munn and Karl Hobley.
|
||||
|
||||
### Locking for snippets
|
||||
|
||||
Snippets can now be locked by users to prevent other users from editing, through the use of the `LockableMixin`. For more details, see [](wagtailsnippets_locking_snippets).
|
||||
|
||||
This feature was developed by Sage Abdullah.
|
||||
|
||||
### Other features
|
||||
|
||||
* Switch to using [Willow](https://github.com/wagtail/Willow/) instead of Pillow for images (Darrel O'Pry)
|
||||
|
|
|
@ -416,6 +416,44 @@ Publishing a snippet instance requires `publish` permission on the snippet model
|
|||
Wagtail does not yet have a mechanism to prevent editors from including unpublished ("draft") snippets in pages. When including a `DraftStateMixin`-enabled snippet in pages, make sure that you add necessary checks to handle how a draft snippet should be rendered (e.g. by checking its `live` field). We are planning to improve this in the future.
|
||||
```
|
||||
|
||||
(wagtailsnippets_locking_snippets)=
|
||||
|
||||
## Locking snippets
|
||||
|
||||
```{versionadded} 4.2
|
||||
The `LockableMixin` class was introduced.
|
||||
```
|
||||
|
||||
If a snippet model inherits from {class}`~wagtail.models.LockableMixin`, Wagtail will automatically add the ability to lock instances of the model. When editing, Wagtail will show the locking information in the "Status" side panel, and a button to lock/unlock the instance if the user has the permission to do so.
|
||||
|
||||
If the model is also configured to have scheduled publishing (as shown in [](wagtailsnippets_saving_draft_changes_of_snippets) above), Wagtail will lock any instances that are scheduled for publishing.
|
||||
|
||||
Similar to pages, users who locked a snippet can still edit it, unless [`WAGTAILADMIN_GLOBAL_EDIT_LOCK`](wagtailadmin_global_edit_lock) is set to `True`.
|
||||
|
||||
For example, instances of the `Advert` snippet could be locked by defining it as follows:
|
||||
|
||||
```python
|
||||
# ...
|
||||
|
||||
from wagtail.models import LockableMixin
|
||||
|
||||
# ...
|
||||
|
||||
@register_snippet
|
||||
class Advert(LockableMixin, models.Model):
|
||||
url = models.URLField(null=True, blank=True)
|
||||
text = models.CharField(max_length=255)
|
||||
|
||||
panels = [
|
||||
FieldPanel('url'),
|
||||
FieldPanel('text'),
|
||||
]
|
||||
```
|
||||
|
||||
The `LockableMixin` includes additional fields that need to be added to your database table. Make sure to run the `makemigrations` and `migrate` management commands after making the above changes to apply the changes to your database.
|
||||
|
||||
Locking and unlocking a snippet instance requires `lock` and `unlock` permissions on the snippet model, respectively. For models with `LockableMixin` applied, Wagtail automatically creates the corresponding `lock` and `unlock` permissions and display them in the 'Groups' area of the Wagtail admin interface. For more details on how to configure the permission, see [](permissions).
|
||||
|
||||
## Tagging snippets
|
||||
|
||||
Adding tags to snippets is very similar to adding tags to pages. The only difference is that {class}`taggit.manager.TaggableManager` should be used in the place of {class}`~modelcluster.contrib.taggit.ClusterTaggableManager`.
|
||||
|
|
|
@ -803,13 +803,8 @@ class LockableMixin(models.Model):
|
|||
|
||||
def with_content_json(self, content):
|
||||
"""
|
||||
Returns a new version of the object with field values updated to reflect changes
|
||||
in the provided ``content`` (which usually comes from a previously-saved revision).
|
||||
|
||||
Certain field values are preserved in order to prevent errors if the returned
|
||||
object is saved, such as ``id``. The following field values are also preserved,
|
||||
as they are considered to be meaningful to the object as a whole, rather than
|
||||
to a specific revision:
|
||||
Similar to :meth:`RevisionMixin.with_content_json`,
|
||||
but with the following fields also preserved:
|
||||
|
||||
* ``locked``
|
||||
* ``locked_at``
|
||||
|
@ -827,7 +822,7 @@ class LockableMixin(models.Model):
|
|||
|
||||
def get_lock(self):
|
||||
"""
|
||||
Returns a sub-class of BaseLock if the instance is locked, otherwise None
|
||||
Returns a sub-class of ``BaseLock`` if the instance is locked, otherwise ``None``.
|
||||
"""
|
||||
if isinstance(self, DraftStateMixin) and self.scheduled_revision:
|
||||
return ScheduledForPublishLock(self)
|
||||
|
|
Ładowanie…
Reference in New Issue