sag​e 2024-05-02 06:42:54 +10:00 zatwierdzone przez GitHub
commit 21917ec565
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: B5690EEEBB952194
9 zmienionych plików z 251 dodań i 9 usunięć

Wyświetl plik

@ -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,
)

Wyświetl plik

@ -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,

Wyświetl plik

@ -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",),
),
]

Wyświetl plik

@ -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",
},
),
]

Wyświetl plik

@ -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")

Wyświetl plik

@ -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):

Wyświetl plik

@ -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",
},
),
]

Wyświetl plik

@ -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):

Wyświetl plik

@ -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,
)