kopia lustrzana https://github.com/wagtail/bakerydemo
Merge 06961992d8
into afc8cf42a2
commit
21917ec565
|
@ -0,0 +1,10 @@
|
|||
from django_filters import DateFromToRangeFilter, FilterSet
|
||||
from wagtail.admin.filters import DateRangePickerWidget
|
||||
|
||||
|
||||
class RevisionFilterSetMixin(FilterSet):
|
||||
latest_revision_created_at = DateFromToRangeFilter(
|
||||
field_name="latest_revision__created_at",
|
||||
label="Date updated",
|
||||
widget=DateRangePickerWidget,
|
||||
)
|
|
@ -1434,6 +1434,20 @@
|
|||
"language_code": "en"
|
||||
}
|
||||
},
|
||||
{
|
||||
"model": "wagtailcore.locale",
|
||||
"pk": 2,
|
||||
"fields": {
|
||||
"language_code": "de"
|
||||
}
|
||||
},
|
||||
{
|
||||
"model": "wagtailcore.locale",
|
||||
"pk": 3,
|
||||
"fields": {
|
||||
"language_code": "ar"
|
||||
}
|
||||
},
|
||||
{
|
||||
"model": "wagtailcore.site",
|
||||
"pk": 2,
|
||||
|
|
|
@ -0,0 +1,59 @@
|
|||
# Generated by Django 4.2.dev20221115094701 on 2022-11-18 11:04
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("wagtailcore", "0078_referenceindex"),
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
("base", "0018_add_genericsettings_and_sitesettings"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name="UserApprovalTaskState",
|
||||
fields=[
|
||||
(
|
||||
"taskstate_ptr",
|
||||
models.OneToOneField(
|
||||
auto_created=True,
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
parent_link=True,
|
||||
primary_key=True,
|
||||
serialize=False,
|
||||
to="wagtailcore.taskstate",
|
||||
),
|
||||
),
|
||||
],
|
||||
bases=("wagtailcore.taskstate",),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name="UserApprovalTask",
|
||||
fields=[
|
||||
(
|
||||
"task_ptr",
|
||||
models.OneToOneField(
|
||||
auto_created=True,
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
parent_link=True,
|
||||
primary_key=True,
|
||||
serialize=False,
|
||||
to="wagtailcore.task",
|
||||
),
|
||||
),
|
||||
(
|
||||
"user",
|
||||
models.ForeignKey(
|
||||
null=True,
|
||||
on_delete=django.db.models.deletion.SET_NULL,
|
||||
to=settings.AUTH_USER_MODEL,
|
||||
),
|
||||
),
|
||||
],
|
||||
bases=("wagtailcore.task",),
|
||||
),
|
||||
]
|
|
@ -0,0 +1,19 @@
|
|||
# Generated by Django 5.1.dev20240316121317 on 2024-04-23 04:11
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
dependencies = [
|
||||
("base", "0019_userapprovaltask"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterModelOptions(
|
||||
name="footertext",
|
||||
options={
|
||||
"verbose_name": "footer text",
|
||||
"verbose_name_plural": "footer text",
|
||||
},
|
||||
),
|
||||
]
|
|
@ -1,5 +1,6 @@
|
|||
from __future__ import unicode_literals
|
||||
|
||||
from django.conf import settings
|
||||
from django.contrib.contenttypes.fields import GenericRelation
|
||||
from django.db import models
|
||||
from django.utils.translation import gettext as _
|
||||
|
@ -26,6 +27,8 @@ from wagtail.models import (
|
|||
Page,
|
||||
PreviewableMixin,
|
||||
RevisionMixin,
|
||||
Task,
|
||||
TaskState,
|
||||
TranslatableMixin,
|
||||
WorkflowMixin,
|
||||
)
|
||||
|
@ -203,7 +206,8 @@ class FooterText(
|
|||
return {"footer_text": self.body}
|
||||
|
||||
class Meta(TranslatableMixin.Meta):
|
||||
verbose_name_plural = "Footer Text"
|
||||
verbose_name = "footer text"
|
||||
verbose_name_plural = "footer text"
|
||||
|
||||
|
||||
class StandardPage(Page):
|
||||
|
@ -510,3 +514,58 @@ class SiteSettings(BaseSiteSetting):
|
|||
panels = [
|
||||
FieldPanel("title_suffix"),
|
||||
]
|
||||
|
||||
|
||||
class UserApprovalTaskState(TaskState):
|
||||
pass
|
||||
|
||||
|
||||
class UserApprovalTask(Task):
|
||||
user = models.ForeignKey(
|
||||
settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=False
|
||||
)
|
||||
|
||||
admin_form_fields = Task.admin_form_fields + ["user"]
|
||||
|
||||
task_state_class = UserApprovalTaskState
|
||||
|
||||
# prevent editing of `user` after the task is created
|
||||
# by default, this attribute contains the 'name' field to prevent tasks from being renamed
|
||||
admin_form_readonly_on_edit_fields = Task.admin_form_readonly_on_edit_fields + [
|
||||
"user"
|
||||
]
|
||||
|
||||
def user_can_access_editor(self, page, user):
|
||||
return user == self.user
|
||||
|
||||
def page_locked_for_user(self, page, user):
|
||||
return user != self.user
|
||||
|
||||
def get_actions(self, page, user):
|
||||
if user == self.user:
|
||||
return [
|
||||
("approve", "Approve", False),
|
||||
("reject", "Reject", False),
|
||||
("cancel", "Cancel", False),
|
||||
]
|
||||
else:
|
||||
return []
|
||||
|
||||
def on_action(self, task_state, user, action_name, **kwargs):
|
||||
if action_name == "cancel":
|
||||
return task_state.workflow_state.cancel(user=user)
|
||||
else:
|
||||
return super().on_action(task_state, user, action_name, **kwargs)
|
||||
|
||||
def get_task_states_user_can_moderate(self, user, **kwargs):
|
||||
if user == self.user:
|
||||
# get all task states linked to the (base class of) current task
|
||||
return TaskState.objects.filter(
|
||||
status=TaskState.STATUS_IN_PROGRESS, task=self.task_ptr
|
||||
)
|
||||
else:
|
||||
return TaskState.objects.none()
|
||||
|
||||
@classmethod
|
||||
def get_description(cls):
|
||||
return _("Only a specific user can approve this task")
|
||||
|
|
|
@ -1,8 +1,10 @@
|
|||
from wagtail import hooks
|
||||
from wagtail.admin.filters import WagtailFilterSet
|
||||
from wagtail.admin.userbar import AccessibilityItem
|
||||
from wagtail.snippets.models import register_snippet
|
||||
from wagtail.snippets.views.snippets import SnippetViewSet, SnippetViewSetGroup
|
||||
|
||||
from bakerydemo.base.filters import RevisionFilterSetMixin
|
||||
from bakerydemo.base.models import FooterText, Person
|
||||
|
||||
"""
|
||||
|
@ -42,6 +44,16 @@ def replace_userbar_accessibility_item(request, items):
|
|||
]
|
||||
|
||||
|
||||
class PersonFilterSet(RevisionFilterSetMixin, WagtailFilterSet):
|
||||
class Meta:
|
||||
model = Person
|
||||
fields = {
|
||||
"job_title": ["icontains"],
|
||||
"live": ["exact"],
|
||||
"locked": ["exact"],
|
||||
}
|
||||
|
||||
|
||||
class PersonViewSet(SnippetViewSet):
|
||||
# Instead of decorating the Person model class definition in models.py with
|
||||
# @register_snippet - which has Wagtail automatically generate an admin interface for this model - we can also provide our own
|
||||
|
@ -52,15 +64,22 @@ class PersonViewSet(SnippetViewSet):
|
|||
menu_label = "People" # ditch this to use verbose_name_plural from model
|
||||
icon = "group" # change as required
|
||||
list_display = ("first_name", "last_name", "job_title", "thumb_image")
|
||||
list_filter = {
|
||||
"job_title": ["icontains"],
|
||||
}
|
||||
list_export = ("first_name", "last_name", "job_title")
|
||||
filterset_class = PersonFilterSet
|
||||
|
||||
|
||||
class FooterTextFilterSet(RevisionFilterSetMixin, WagtailFilterSet):
|
||||
class Meta:
|
||||
model = FooterText
|
||||
fields = {
|
||||
"live": ["exact"],
|
||||
}
|
||||
|
||||
|
||||
class FooterTextViewSet(SnippetViewSet):
|
||||
model = FooterText
|
||||
search_fields = ("body",)
|
||||
filterset_class = FooterTextFilterSet
|
||||
|
||||
|
||||
class BakerySnippetViewSetGroup(SnippetViewSetGroup):
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
# Generated by Django 5.1.dev20240316121317 on 2024-04-23 03:33
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
dependencies = [
|
||||
("breads", "0006_breadingredient_expire_at_breadingredient_expired_and_more"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterModelOptions(
|
||||
name="breadingredient",
|
||||
options={
|
||||
"verbose_name": "bread ingredient",
|
||||
"verbose_name_plural": "bread ingredients",
|
||||
},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name="breadtype",
|
||||
options={
|
||||
"verbose_name": "bread type",
|
||||
"verbose_name_plural": "bread types",
|
||||
},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name="country",
|
||||
options={
|
||||
"verbose_name": "country of origin",
|
||||
"verbose_name_plural": "countries of origin",
|
||||
},
|
||||
),
|
||||
]
|
|
@ -28,7 +28,8 @@ class Country(models.Model):
|
|||
return self.title
|
||||
|
||||
class Meta:
|
||||
verbose_name_plural = "Countries of Origin"
|
||||
verbose_name = "country of origin"
|
||||
verbose_name_plural = "countries of origin"
|
||||
|
||||
|
||||
class BreadIngredient(DraftStateMixin, RevisionMixin, models.Model):
|
||||
|
@ -59,7 +60,8 @@ class BreadIngredient(DraftStateMixin, RevisionMixin, models.Model):
|
|||
return self.name
|
||||
|
||||
class Meta:
|
||||
verbose_name_plural = "Bread ingredients"
|
||||
verbose_name = "bread ingredient"
|
||||
verbose_name_plural = "bread ingredients"
|
||||
|
||||
|
||||
class BreadType(RevisionMixin, models.Model):
|
||||
|
@ -91,7 +93,8 @@ class BreadType(RevisionMixin, models.Model):
|
|||
return self.title
|
||||
|
||||
class Meta:
|
||||
verbose_name_plural = "Bread types"
|
||||
verbose_name = "bread type"
|
||||
verbose_name_plural = "bread types"
|
||||
|
||||
|
||||
class BreadPage(Page):
|
||||
|
|
|
@ -1,26 +1,52 @@
|
|||
from wagtail.admin.filters import WagtailFilterSet
|
||||
from wagtail.admin.panels import FieldPanel
|
||||
from wagtail.admin.viewsets.model import ModelViewSet
|
||||
from wagtail.snippets.models import register_snippet
|
||||
from wagtail.snippets.views.snippets import SnippetViewSet, SnippetViewSetGroup
|
||||
|
||||
from bakerydemo.base.filters import RevisionFilterSetMixin
|
||||
from bakerydemo.breads.models import BreadIngredient, BreadType, Country
|
||||
|
||||
|
||||
class BreadIngredientFilterSet(RevisionFilterSetMixin, WagtailFilterSet):
|
||||
class Meta:
|
||||
model = BreadIngredient
|
||||
fields = {
|
||||
"live": ["exact"],
|
||||
}
|
||||
|
||||
|
||||
class BreadIngredientSnippetViewSet(SnippetViewSet):
|
||||
model = BreadIngredient
|
||||
ordering = ("name",)
|
||||
search_fields = ("name",)
|
||||
filterset_class = BreadIngredientFilterSet
|
||||
inspect_view_enabled = True
|
||||
|
||||
|
||||
class BreadTypeFilterSet(RevisionFilterSetMixin, WagtailFilterSet):
|
||||
class Meta:
|
||||
model = BreadType
|
||||
fields = []
|
||||
|
||||
|
||||
class BreadTypeSnippetViewSet(SnippetViewSet):
|
||||
model = BreadType
|
||||
ordering = ("title",)
|
||||
search_fields = ("title",)
|
||||
filterset_class = BreadTypeFilterSet
|
||||
|
||||
|
||||
class CountrySnippetViewSet(SnippetViewSet):
|
||||
class CountryModelViewSet(ModelViewSet):
|
||||
model = Country
|
||||
ordering = ("title",)
|
||||
search_fields = ("title",)
|
||||
icon = "globe"
|
||||
inspect_view_enabled = True
|
||||
|
||||
panels = [
|
||||
FieldPanel("title"),
|
||||
]
|
||||
|
||||
|
||||
# We want to group several snippets together in the admin menu.
|
||||
|
@ -39,7 +65,7 @@ class BreadMenuGroup(SnippetViewSetGroup):
|
|||
items = (
|
||||
BreadIngredientSnippetViewSet,
|
||||
BreadTypeSnippetViewSet,
|
||||
CountrySnippetViewSet,
|
||||
CountryModelViewSet,
|
||||
)
|
||||
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue