Skip to content

Commit

Permalink
migrate to wagtail snippets (wip)
Browse files Browse the repository at this point in the history
  • Loading branch information
dinoperovic committed Jun 23, 2024
1 parent 8105e84 commit e87baec
Show file tree
Hide file tree
Showing 5 changed files with 152 additions and 112 deletions.
1 change: 0 additions & 1 deletion example/project/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,6 @@
# wagtail
"wagtail.contrib.forms",
"wagtail.contrib.redirects",
"wagtail.contrib.modeladmin",
"wagtail.embeds",
"wagtail.sites",
"wagtail.users",
Expand Down
8 changes: 4 additions & 4 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,13 @@ packages = [
include = ["LICENSE"]

[tool.poetry.dependencies]
python = ">=3.8.1,<4.0"
django = ">=4.1.3,<4.3"
djangorestframework = ">=3.11.1,<4.0"
python = ">=3.10,<4.0"
django = ">=5.0,<6.0"
djangorestframework = ">=3.15.2,<4.0"

# Optional
Pygments = {version = "^2.6", optional = true}
wagtail = {version = ">=4.0,<6.0", optional = true}
wagtail = {version = ">=6.0,<7.0", optional = true}
pytest = {version = "~7.3.1", optional = true}
pytest-django = {version = "~4.5.2", optional = true}
pytest-cov = {version = "~4.0.0", optional = true}
Expand Down
48 changes: 24 additions & 24 deletions salesman/admin/wagtail/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,27 @@

from django.contrib.auth.models import AbstractBaseUser
from django.utils.translation import gettext_lazy as _
from wagtail.contrib.modeladmin.helpers import (
AdminURLHelper,
ButtonHelper,
PermissionHelper,
)


class OrderPermissionHelper(PermissionHelper):
def user_can_create(self, user: AbstractBaseUser) -> bool:
return False

def user_can_delete_obj(self, user: AbstractBaseUser, obj: Any) -> bool:
return False


class OrderButtonHelper(ButtonHelper):
def edit_button(self, *args: Any, **kwargs: Any) -> Any:
button = super().edit_button(*args, **kwargs)
button.update({"label": _("View"), "title": _("View this Order")})
return button


class OrderAdminURLHelper(AdminURLHelper):
pass
# from wagtail.contrib.modeladmin.helpers import (
# AdminURLHelper,
# ButtonHelper,
# PermissionHelper,
# )


# class OrderPermissionHelper(PermissionHelper):
# def user_can_create(self, user: AbstractBaseUser) -> bool:
# return False
#
# def user_can_delete_obj(self, user: AbstractBaseUser, obj: Any) -> bool:
# return False
#
#
# class OrderButtonHelper(ButtonHelper):
# def edit_button(self, *args: Any, **kwargs: Any) -> Any:
# button = super().edit_button(*args, **kwargs)
# button.update({"label": _("View"), "title": _("View this Order")})
# return button
#
#
# class OrderAdminURLHelper(AdminURLHelper):
# pass
2 changes: 1 addition & 1 deletion salesman/admin/wagtail/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from django.utils.functional import cached_property
from django.utils.translation import gettext_lazy as _
from wagtail.admin import messages
from wagtail.contrib.modeladmin.views import DeleteView, EditView, IndexView
from wagtail.snippets.views.snippets import DeleteView, EditView, IndexView


class OrderIndexView(IndexView):
Expand Down
205 changes: 123 additions & 82 deletions salesman/admin/wagtail_hooks.py
Original file line number Diff line number Diff line change
@@ -1,99 +1,140 @@
from __future__ import annotations
from typing import Any

from typing import Type
from wagtail.admin.panels import FieldPanel
from wagtail.admin.ui.tables import Column, UpdatedAtColumn
from wagtail.snippets.models import register_snippet
from wagtail.snippets.views.snippets import SnippetViewSet

from wagtail.admin.panels import ObjectList, Panel
from wagtail.contrib.modeladmin.options import ModelAdmin, modeladmin_register

from salesman.conf import app_settings
from salesman.core.utils import get_salesman_model

from .filters import OrderIsPaidFilter, OrderStatusFilter
from .wagtail.forms import WagtailOrderModelForm
from .wagtail.helpers import (
OrderAdminURLHelper,
OrderButtonHelper,
OrderPermissionHelper,
)
from .wagtail.mixins import WagtailOrderAdminMixin, WagtailOrderAdminRefundMixin
from .wagtail.views import OrderEditView, OrderIndexView

Order = get_salesman_model("Order")


class BaseOrderAdmin(WagtailOrderAdminMixin, ModelAdmin):
class AdminColumn(Column):
"""
A Wagtail column that gets the value from `WagtaiOrderAdminMixin` instead
from a model instance so that custom admin display methods can be reused.
"""

def get_cell_context_data(
self, instance: Any, parent_context: Any
) -> dict[str, Any]:
context = super().get_cell_context_data(instance, parent_context)
admin = WagtailOrderAdminMixin(request=context["request"])
context["value"] = getattr(admin, self.accessor)(instance)
return context


class OrderAdmin(WagtailOrderAdminMixin, SnippetViewSet):
model = Order
menu_icon = "form"
index_view_class = OrderIndexView
edit_view_class = OrderEditView
icon = "form"
add_to_admin_menu = True

list_display = [
"__str__",
"email",
"status_display",
"total_display",
"is_paid_display",
AdminColumn("status_display"),
AdminColumn("total_display"),
AdminColumn("is_paid_display"),
"date_created",
]
list_filter = [OrderStatusFilter, OrderIsPaidFilter, "date_created", "date_updated"]
search_fields = ["ref", "email", "token"]
edit_template_name = "salesman/admin/wagtail_edit.html"
permission_helper_class = OrderPermissionHelper
button_helper_class = OrderButtonHelper
url_helper_class = OrderAdminURLHelper
form_view_extra_css = ["salesman/admin/wagtail_form.css"]

def get_base_form_class(
self,
form_class: Type[WagtailOrderModelForm] | None = None,
) -> Type[WagtailOrderModelForm]:
"""
Returns Model form class with model_admin instance attached.
Args:
form_class (Type[WagtailOrderModelForm], optional): Class. Defaults to None.
Returns:
type[WagtailOrderModelForm]: A model form class
"""
return type(
"WagtailOrderModelForm",
(form_class or WagtailOrderModelForm,),
{"model_admin": self},
)

def get_edit_handler(self) -> Panel:
"""
Returns edit handler with custom base form class attached.
Returns:
EditHandler: Edit handler
"""
if hasattr(self, "edit_handler"):
edit_handler = self.edit_handler
elif hasattr(self, "panels"):
panels = self.panels
edit_handler = ObjectList(panels)
elif hasattr(self.model, "edit_handler"):
edit_handler = self.model.edit_handler
elif hasattr(self.model, "panels"):
panels = self.model.panels
edit_handler = ObjectList(panels)
elif hasattr(self, "default_edit_handler") and self.default_edit_handler:
edit_handler = self.default_edit_handler
else:
edit_handler = super().get_edit_handler()

edit_handler.base_form_class = self.get_base_form_class(
form_class=getattr(edit_handler, "base_form_class", None)
)
return edit_handler


class OrderAdmin(WagtailOrderAdminRefundMixin, BaseOrderAdmin):
"""
Default Order admin with refund functionality.
"""


if app_settings.SALESMAN_ADMIN_REGISTER:
modeladmin_register(OrderAdmin)
register_snippet(OrderAdmin)

# from typing import Type
#
# from wagtail.admin.panels import ObjectList, Panel
#
# from salesman.conf import app_settings
# from salesman.core.utils import get_salesman_model
#
# from .filters import OrderIsPaidFilter, OrderStatusFilter
# from .wagtail.forms import WagtailOrderModelForm
# from .wagtail.helpers import (
# OrderAdminURLHelper,
# OrderButtonHelper,
# OrderPermissionHelper,
# )
# from .wagtail.mixins import WagtailOrderAdminMixin, WagtailOrderAdminRefundMixin
# from .wagtail.views import OrderEditView, OrderIndexView


# class BaseOrderAdmin(WagtailOrderAdminMixin, ModelAdmin):
# model = Order
# menu_icon = "form"
# index_view_class = OrderIndexView
# edit_view_class = OrderEditView
# list_display = [
# "__str__",
# "email",
# "status_display",
# "total_display",
# "is_paid_display",
# "date_created",
# ]
# list_filter = [OrderStatusFilter, OrderIsPaidFilter, "date_created", "date_updated"]
# search_fields = ["ref", "email", "token"]
# edit_template_name = "salesman/admin/wagtail_edit.html"
# permission_helper_class = OrderPermissionHelper
# button_helper_class = OrderButtonHelper
# url_helper_class = OrderAdminURLHelper
# form_view_extra_css = ["salesman/admin/wagtail_form.css"]
#
# def get_base_form_class(
# self,
# form_class: Type[WagtailOrderModelForm] | None = None,
# ) -> Type[WagtailOrderModelForm]:
# """
# Returns Model form class with model_admin instance attached.
#
# Args:
# form_class (Type[WagtailOrderModelForm], optional): Class. Defaults to None.
#
# Returns:
# type[WagtailOrderModelForm]: A model form class
# """
# return type(
# "WagtailOrderModelForm",
# (form_class or WagtailOrderModelForm,),
# {"model_admin": self},
# )
#
# def get_edit_handler(self) -> Panel:
# """
# Returns edit handler with custom base form class attached.
#
# Returns:
# EditHandler: Edit handler
# """
# if hasattr(self, "edit_handler"):
# edit_handler = self.edit_handler
# elif hasattr(self, "panels"):
# panels = self.panels
# edit_handler = ObjectList(panels)
# elif hasattr(self.model, "edit_handler"):
# edit_handler = self.model.edit_handler
# elif hasattr(self.model, "panels"):
# panels = self.model.panels
# edit_handler = ObjectList(panels)
# elif hasattr(self, "default_edit_handler") and self.default_edit_handler:
# edit_handler = self.default_edit_handler
# else:
# edit_handler = super().get_edit_handler()
#
# edit_handler.base_form_class = self.get_base_form_class(
# form_class=getattr(edit_handler, "base_form_class", None)
# )
# return edit_handler
#
#
# class OrderAdmin(WagtailOrderAdminRefundMixin, BaseOrderAdmin):
# """
# Default Order admin with refund functionality.
# """


# if app_settings.SALESMAN_ADMIN_REGISTER:
# modeladmin_register(OrderAdmin)

0 comments on commit e87baec

Please sign in to comment.