瀏覽代碼

Allow overriding related pages type with arguments (#569)

Vince Salvino 1 年之前
父節點
當前提交
e70d649193
共有 1 個文件被更改,包括 24 次插入19 次删除
  1. 24 19
      coderedcms/models/page_models.py

+ 24 - 19
coderedcms/models/page_models.py

@@ -227,8 +227,8 @@ class CoderedPage(WagtailCacheMixin, SeoMixin, Page, metaclass=CoderedPageMeta):
     # Related Page Fields
     #####################
 
-    # Subclasses can override this to query on a specific
-    # page model. By default sibling pages are used.
+    # Subclasses can override this to query on a specific page model, in the
+    # format "appname.Model". By default sibling pages are used.
     related_query_pagemodel = None
 
     # Subclasses can override this to enabled related pages by default.
@@ -505,27 +505,32 @@ class CoderedPage(WagtailCacheMixin, SeoMixin, Page, metaclass=CoderedPageMeta):
 
         return query
 
-    def get_related_pages(self) -> models.QuerySet:
+    def get_related_pages(
+        self, pagetype: str = None, num: int = None
+    ) -> models.QuerySet:
         """
         Returns a queryset of sibling pages, or the model type
-        defined by `self.related_query_pagemodel`. Ordered by number
-        of shared classifier terms.
+        defined by ``pagetype`` or ``self.related_query_pagemodel``,
+        ordered by number of shared classifier terms.
+
+        :param str pagetype: The model type to query on. This should
+          be a string in the format "appname.Model".
+          Overrides ``self.related_query_pagemodel``
+
+        :param int num: The number of results to return.
+          Overrides ``self.related_num``.
         """
 
+        if pagetype is None:
+            pagetype = self.related_query_pagemodel
+
+        if num is None:
+            num = self.related_num
+
         # Get our related query model, and queryset.
-        if self.related_query_pagemodel:
-            if isinstance(
-                self.related_query_pagemodel, Union[str, models.Model]
-            ):
-                querymodel = resolve_model_string(
-                    self.related_query_pagemodel, self._meta.app_label
-                )
-                r_qs = querymodel.objects.all().live()
-            else:
-                raise AttributeError(
-                    f"The related_querymodel should be a model or str."
-                    f" The related_querymodel of {self} is {type(self.related_querymodel)}"
-                )
+        if pagetype:
+            querymodel = resolve_model_string(pagetype, self._meta.app_label)
+            r_qs = querymodel.objects.all().live()
         else:
             r_qs = self.get_parent().specific.get_index_children()
 
@@ -552,7 +557,7 @@ class CoderedPage(WagtailCacheMixin, SeoMixin, Page, metaclass=CoderedPageMeta):
         if order_by:
             r_qs = r_qs.order_by(*order_by).distinct()
 
-        return r_qs[: self.related_num]
+        return r_qs[:num]
 
     def get_content_walls(self, check_child_setting=True):
         current_content_walls = []