diff --git a/plain-admin/plain/admin/views/base.py b/plain-admin/plain/admin/views/base.py index f221ecad50..9f23c58894 100644 --- a/plain-admin/plain/admin/views/base.py +++ b/plain-admin/plain/admin/views/base.py @@ -68,6 +68,23 @@ def has_permission(cls, user: Model) -> bool: # Set dynamically by AdminViewset.get_views() viewset: type[AdminViewset] | None = None + # Set dynamically by AdminViewset.get_views() to the sibling view's + # get_view_url, when that sibling view exists on the viewset. + def get_list_url(self) -> str: + return "" + + def get_create_url(self) -> str: + return "" + + def get_detail_url(self, obj: Any) -> str: + return "" + + def get_update_url(self, obj: Any) -> str: + return "" + + def get_delete_url(self, obj: Any) -> str: + return "" + template_name = "admin/page.html" cards: tuple[Card, ...] = () diff --git a/plain-admin/plain/admin/views/objects.py b/plain-admin/plain/admin/views/objects.py index c3deebe195..88bc7f58dc 100644 --- a/plain-admin/plain/admin/views/objects.py +++ b/plain-admin/plain/admin/views/objects.py @@ -246,21 +246,6 @@ def get_filter_names(self) -> tuple[str, ...]: def get_object_id(self, obj: Any) -> Any: return self.get_field_value(obj, "id") - def get_list_url(self) -> str: - return "" - - def get_create_url(self) -> str: - return "" - - def get_detail_url(self, obj: Any) -> str: - return "" - - def get_update_url(self, obj: Any) -> str: - return "" - - def get_delete_url(self, obj: Any) -> str: - return "" - def get_object_url(self, obj: Any) -> str: if url := self.get_detail_url(obj): return url @@ -294,21 +279,6 @@ class AdminCreateView(AdminView, CreateView): template_name = None nav_section = None - def get_list_url(self) -> str: - return "" - - def get_create_url(self) -> str: - return "" - - def get_detail_url(self, obj: Any) -> str: - return "" - - def get_update_url(self, obj: Any) -> str: - return "" - - def get_delete_url(self, obj: Any) -> str: - return "" - def get_success_url(self, form: "BaseForm") -> str: if list_url := self.get_list_url(): return list_url @@ -335,21 +305,6 @@ def get_template_names(self) -> list[str]: "admin/detail.html", # A generic detail view for rendering any object ] - def get_list_url(self) -> str: - return "" - - def get_create_url(self) -> str: - return "" - - def get_detail_url(self, obj: Any) -> str: - return "" - - def get_update_url(self, obj: Any) -> str: - return "" - - def get_delete_url(self, obj: Any) -> str: - return "" - def get_fields(self) -> tuple[str, ...]: return self.fields @@ -372,21 +327,6 @@ class AdminUpdateView(AdminView, UpdateView): template_name = None nav_section = None - def get_list_url(self) -> str: - return "" - - def get_create_url(self) -> str: - return "" - - def get_detail_url(self, obj: Any) -> str: - return "" - - def get_update_url(self, obj: Any) -> str: - return "" - - def get_delete_url(self, obj: Any) -> str: - return "" - def get_links(self) -> dict[str, str]: links = super().get_links() @@ -418,21 +358,6 @@ class AdminDeleteView(AdminView, DeleteView): template_name = "admin/delete.html" nav_section = None - def get_list_url(self) -> str: - return "" - - def get_create_url(self) -> str: - return "" - - def get_detail_url(self, obj: Any) -> str: - return "" - - def get_update_url(self, obj: Any) -> str: - return "" - - def get_delete_url(self, obj: Any) -> str: - return "" - def get_links(self) -> dict[str, str]: links = super().get_links() diff --git a/plain-admin/plain/admin/views/registry.py b/plain-admin/plain/admin/views/registry.py index c6cf140dcc..171d3fe06d 100644 --- a/plain-admin/plain/admin/views/registry.py +++ b/plain-admin/plain/admin/views/registry.py @@ -15,7 +15,7 @@ from .base import AdminView from .viewsets import AdminViewset -T = TypeVar("T") +T = TypeVar("T", bound="AdminView") VS = TypeVar("VS", bound="AdminViewset") @@ -41,7 +41,7 @@ def register_view( self, view: type[T] | None = None ) -> type[T] | Callable[[type[T]], type[T]]: def inner(view: type[T]) -> type[T]: - self.registered_views.add(view) # ty: ignore[invalid-argument-type] + self.registered_views.add(view) # Invalidate lookup caches self.__dict__.pop("slug_to_view", None) self.__dict__.pop("path_to_view", None) diff --git a/plain-admin/plain/admin/views/viewsets.py b/plain-admin/plain/admin/views/viewsets.py index c50e7d4292..ee359d960e 100644 --- a/plain-admin/plain/admin/views/viewsets.py +++ b/plain-admin/plain/admin/views/viewsets.py @@ -1,9 +1,9 @@ -from plain.views import View +from .base import AdminView class AdminViewset: @classmethod - def get_views(cls) -> list[type[View]]: + def get_views(cls) -> list[type[AdminView]]: """Views are defined as inner classes on the viewset class.""" # Primary views that we can interlink automatically @@ -27,29 +27,28 @@ def get_views(cls) -> list[type[View]]: DeleteView.parent_view_class = DetailView # Now iterate all inner view classes - views: list[type[View]] = [] + views: list[type[AdminView]] = [] for attr in cls.__dict__.values(): - if isinstance(attr, type) and issubclass(attr, View): + if isinstance(attr, type) and issubclass(attr, AdminView): views.append(attr) for view in views: - # Dynamic attributes stamped onto the view class by the viewset. - view.viewset = cls # ty: ignore[unresolved-attribute] + view.viewset = cls if ListView: - view.get_list_url = ListView.get_view_url # ty: ignore[unresolved-attribute] + view.get_list_url = ListView.get_view_url if CreateView: - view.get_create_url = CreateView.get_view_url # ty: ignore[unresolved-attribute] + view.get_create_url = CreateView.get_view_url if DetailView: - view.get_detail_url = DetailView.get_view_url # ty: ignore[unresolved-attribute] + view.get_detail_url = DetailView.get_view_url if UpdateView: - view.get_update_url = UpdateView.get_view_url # ty: ignore[unresolved-attribute] + view.get_update_url = UpdateView.get_view_url if DeleteView: - view.get_delete_url = DeleteView.get_view_url # ty: ignore[unresolved-attribute] + view.get_delete_url = DeleteView.get_view_url return views