Source code for pagetools.widgets.admin

from django.contrib import admin
from django.contrib.contenttypes.models import ContentType
from django.http.response import HttpResponseRedirect
from django.urls import reverse

from pagetools.admin import TinyMCEMixin
from pagetools.utils import get_classname, get_perm_str

from .models import (
    BaseWidget,
    ContentWidget,
    PageType,
    TemplateTagWidget,
    TypeArea,
    WidgetInArea,
)
from .utils import itersubclasses


[docs]class WidgetInAreaAdmin(admin.TabularInline): model = WidgetInArea fields = ( "adminedit_url", "enabled", "position", ) sortable_field_name = "position" extra = 0 max_num = 0 readonly_fields = ("adminedit_url",)
[docs]class TypeAreaAdmin(admin.ModelAdmin): inlines = (WidgetInAreaAdmin,)
[docs] def save_model(self, request, obj, form, change): super().save_model(request, obj, form, change) objs_to_add = form.data.get("add_objs") if objs_to_add: pks = objs_to_add.split("_") contenttype = ContentType.objects.get_for_id(int(pks[0])) obj_id = int(pks[1]) pos = obj.widgets.all().count() WidgetInArea.objects.get_or_create(typearea=obj, content_type=contenttype, object_id=obj_id, position=pos)
[docs] def render_change_form(self, request, context, add=False, change=False, form_url="", obj=None): if obj: user = request.user clslist = itersubclasses(BaseWidget) context["addable_objs"] = [] context["addable_widgets"] = [] found = [widget.content_object for widget in obj.widgets.all()] self.readonly_fields = ("area", "pagetype") for cls in clslist: if not user.has_perm(get_perm_str(cls)): continue context["addable_widgets"].append( '<li>+ <a href="%s">%s</a></li>' % ( ( reverse("admin:%s_%s_add" % (cls._meta.app_label, cls._meta.model_name)) + "?typearea=%s" % (context["object_id"]) ), get_classname(cls), ) ) instances = cls.objects.all() ctpk = ContentType.objects.get_for_model(cls).pk for inst in instances: if inst in found: continue context["addable_objs"].append( '<option value="%s_%s">%s</option>' % ( ctpk, inst.pk, inst, ) ) self.change_form_template = "admin/widgets/typearea/change_form.html" else: self.change_form_template = "pagetools/admin/change_form_help_text.html" context["help_text"] = "[save] before adding widgets" return admin.ModelAdmin.render_change_form( self, request, context, add=add, change=change, form_url=form_url, obj=obj )
[docs] def get_readonly_fields(self, request, obj=None): return ["area", "pagetype"] if obj else []
[docs]class BaseWidgetAdmin(admin.ModelAdmin): save_as = True
[docs] def save_model(self, request, obj, form, change): obj.user = request.user obj.save() typearea_id = request.GET.get("typearea", None) if typearea_id: typearea = TypeArea.objects.get(pk=int(typearea_id)) WidgetInArea.objects.create( typearea=typearea, content_type=ContentType.objects.get_for_model(obj), object_id=obj.pk, position=typearea.widgets.count(), )
def _redirect(self, action, request, obj, *args, **kwargs): typearea_id = request.GET.get("typearea", None) if typearea_id and "_save" in request.POST: return HttpResponseRedirect(reverse("admin:widgets_typearea_change", args=(typearea_id,))) # see menus.admin._redirect return getattr(admin.ModelAdmin, "response_%s" % action)(self, request, obj, *args, **kwargs)
[docs] def response_add(self, request, obj, *args, **kwargs): return self._redirect("add", request, obj, *args, **kwargs)
[docs] def response_change(self, request, obj, *args, **kwargs): return self._redirect("change", request, obj, *args, **kwargs)
[docs]class PageTypeAdmin(admin.ModelAdmin): model = PageType
[docs]class ContentWidgetAdmin(BaseWidgetAdmin, TinyMCEMixin): pass
[docs]class TemplateTagWidgetAdmin(BaseWidgetAdmin):
[docs] def get_readonly_fields(self, request, obj=None): if obj: self.prepopulated_fields = {} return ["renderclasskey"] self.prepopulated_fields = {"name": ("renderclasskey",)} return []
admin.site.register(TypeArea, TypeAreaAdmin) admin.site.register(ContentWidget, ContentWidgetAdmin) admin.site.register(TemplateTagWidget, TemplateTagWidgetAdmin) admin.site.register(WidgetInArea) admin.site.register(PageType, PageTypeAdmin)