示例#1
0
    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)
示例#2
0
    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
示例#3
0
 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)
示例#4
0
    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)
示例#5
0
    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)
示例#6
0
 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)
示例#7
0
 def get_admin_url(self):
     return admin_url(self, "change", self.id)