def get_content_models(cls): """ Return all Page subclasses that are admin registered, ordered based on the ``ADD_PAGE_ORDER`` setting. """ models = [] for model in Package.get_content_models(): try: admin_url(model, "add") except NoReverseMatch: continue else: setattr(model, "meta_verbose_name", model._meta.verbose_name) setattr(model, "add_url", admin_url(model, "add")) models.append(model) order = [name.lower() for name in settings.ADD_PAGE_ORDER] def sort_key(package): name = "%s.%s" % (package._meta.app_label, package._meta.object_name) unordered = len(order) try: return (order.index(name.lower()), "") except ValueError: return (unordered, package.meta_verbose_name) return sorted(models, key=sort_key)
def get_content_models(self): """ Return all subclasses that are admin registered. """ models = [] for model in self.concrete_model.get_content_models(): try: admin_url(model, "add") except NoReverseMatch: continue else: setattr(model, "meta_verbose_name", model._meta.verbose_name) setattr(model, "add_url", admin_url(model, "add")) models.append(model) return models
def changelist_view(self, request, extra_context=None): """ Redirect to the ``Page`` changelist view for ``Page`` subclasses. """ if self.model is not Package: return HttpResponseRedirect(admin_url(Package, "changelist")) if not extra_context: extra_context = {} extra_context["package_models"] = self.get_content_models() return super(PackageAdmin, self).changelist_view(request, extra_context)
def changelist_view(self, request, extra_context=None): """ Redirect to the changelist view for subclasses. """ if self.model is not self.concrete_model: return HttpResponseRedirect( admin_url(self.concrete_model, "changelist")) extra_context = extra_context or {} extra_context["content_models"] = self.get_content_models() return super(ContentTypedAdmin, self).changelist_view(request, extra_context)
def change_view(self, request, object_id, **kwargs): """ For the concrete model, check ``get_content_model()`` for a subclass and redirect to its admin change view. """ instance = get_object_or_404(self.concrete_model, pk=object_id) content_model = instance.get_content_model() self.check_permission(request, content_model, "change") if content_model.__class__ != self.model: change_url = admin_url(content_model.__class__, "change", content_model.id) return HttpResponseRedirect(change_url) return super(ContentTypedAdmin, self).change_view(request, object_id, **kwargs)
def change_view(self, request, object_id, **kwargs): """ For the ``Page`` model, check ``page.get_content_model()`` for a subclass and redirect to its admin change view. Also enforce custom change permissions for the page instance. """ package = get_object_or_404(Package, pk=object_id) content_model = package.get_content_model() self._check_permission(request, content_model, "change") if self.model is Package: if content_model is not None: change_url = admin_url(content_model.__class__, "change", content_model.id) return HttpResponseRedirect(change_url) kwargs.setdefault("extra_context", {}) kwargs["extra_context"].update({ "hide_delete_link": not content_model.can_delete(request), "hide_slug_field": content_model.overridden(), }) return super(PackageAdmin, self).change_view(request, object_id, **kwargs)
def get_admin_url(self): return admin_url(self, "change", self.id)