forked from rc/aircox
		
	breadcrumbs and page parenting
This commit is contained in:
		@ -1,10 +1,13 @@
 | 
				
			|||||||
 | 
					import urllib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from django.contrib import admin
 | 
					from django.contrib import admin
 | 
				
			||||||
 | 
					from django.http import QueryDict
 | 
				
			||||||
from django.utils.safestring import mark_safe
 | 
					from django.utils.safestring import mark_safe
 | 
				
			||||||
from django.utils.translation import gettext_lazy as _
 | 
					from django.utils.translation import gettext_lazy as _
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from adminsortable2.admin import SortableInlineAdminMixin
 | 
					from adminsortable2.admin import SortableInlineAdminMixin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ..models import Category, Article, NavItem
 | 
					from ..models import Category, NavItem, Page
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
__all__ = ['CategoryAdmin', 'PageAdmin', 'NavItemInline']
 | 
					__all__ = ['CategoryAdmin', 'PageAdmin', 'NavItemInline']
 | 
				
			||||||
@ -27,6 +30,9 @@ class PageAdmin(admin.ModelAdmin):
 | 
				
			|||||||
    list_filter = ('status', 'category')
 | 
					    list_filter = ('status', 'category')
 | 
				
			||||||
    prepopulated_fields = {"slug": ("title",)}
 | 
					    prepopulated_fields = {"slug": ("title",)}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # prepopulate fields using changelist's filters
 | 
				
			||||||
 | 
					    prepopulated_filters = ('parent',)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    search_fields = ['title', 'category__title']
 | 
					    search_fields = ['title', 'category__title']
 | 
				
			||||||
    fieldsets = [
 | 
					    fieldsets = [
 | 
				
			||||||
        ('', {
 | 
					        ('', {
 | 
				
			||||||
@ -44,6 +50,30 @@ class PageAdmin(admin.ModelAdmin):
 | 
				
			|||||||
        return mark_safe('<img src="{}"/>'.format(obj.cover.icons['64'])) \
 | 
					        return mark_safe('<img src="{}"/>'.format(obj.cover.icons['64'])) \
 | 
				
			||||||
            if obj.cover else ''
 | 
					            if obj.cover else ''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_changeform_initial_data(self, request):
 | 
				
			||||||
 | 
					        data = super().get_changeform_initial_data(request)
 | 
				
			||||||
 | 
					        filters = QueryDict(request.GET.get('_changelist_filters', ''))
 | 
				
			||||||
 | 
					        data['parent'] = filters.get('parent', None)
 | 
				
			||||||
 | 
					        return data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_common_context(self, query, extra_context=None):
 | 
				
			||||||
 | 
					        extra_context = extra_context or {}
 | 
				
			||||||
 | 
					        parent = query.get('parent', None)
 | 
				
			||||||
 | 
					        if parent is not None:
 | 
				
			||||||
 | 
					            extra_context['parent'] = Page.objects.get(id=parent)
 | 
				
			||||||
 | 
					        return extra_context
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def add_view(self, request, form_url='', extra_context=None):
 | 
				
			||||||
 | 
					        filters = QueryDict(request.GET.get('_changelist_filters', ''))
 | 
				
			||||||
 | 
					        extra_context = self.get_common_context(filters, extra_context)
 | 
				
			||||||
 | 
					        return super().add_view(request, form_url, extra_context)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # TODO: change_view => parent from object
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def changelist_view(self, request, extra_context=None):
 | 
				
			||||||
 | 
					        extra_context = self.get_common_context(request.GET, extra_context)
 | 
				
			||||||
 | 
					        return super().changelist_view(request, extra_context)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class NavItemInline(SortableInlineAdminMixin, admin.TabularInline):
 | 
					class NavItemInline(SortableInlineAdminMixin, admin.TabularInline):
 | 
				
			||||||
    model = NavItem
 | 
					    model = NavItem
 | 
				
			||||||
 | 
				
			|||||||
@ -40,7 +40,15 @@
 | 
				
			|||||||
        <div class="navbar-menu">
 | 
					        <div class="navbar-menu">
 | 
				
			||||||
            {% block usertools %}
 | 
					            {% block usertools %}
 | 
				
			||||||
            <div class="navbar-start">
 | 
					            <div class="navbar-start">
 | 
				
			||||||
                <a class="navbar-item" href="{% url "admin:aircox_program_changelist" %}">{% trans "Programs" %}</a>
 | 
					                <div class="navbar-item has-dropdown is-hoverable">
 | 
				
			||||||
 | 
					                    <a class="navbar-link" href="{% url "admin:aircox_program_changelist" %}">{% trans "Programs" %}</a>
 | 
				
			||||||
 | 
					                    <div class="navbar-dropdown is-boxed">
 | 
				
			||||||
 | 
					                        {% for program in programs %}
 | 
				
			||||||
 | 
					                        <a class="navbar-item" href="{% url "admin:aircox_program_change" program.pk %}">
 | 
				
			||||||
 | 
					                            {{ program.title }}</a>
 | 
				
			||||||
 | 
					                        {% endfor %}
 | 
				
			||||||
 | 
					                    </div>
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                <div class="navbar-item has-dropdown is-hoverable">
 | 
					                <div class="navbar-item has-dropdown is-hoverable">
 | 
				
			||||||
                    <a class="navbar-link" href="{% url "admin:aircox_article_changelist" %}">{% trans "Articles" %}</a>
 | 
					                    <a class="navbar-link" href="{% url "admin:aircox_article_changelist" %}">{% trans "Articles" %}</a>
 | 
				
			||||||
 | 
				
			|||||||
@ -27,9 +27,16 @@
 | 
				
			|||||||
{% if not is_popup %}
 | 
					{% if not is_popup %}
 | 
				
			||||||
{% block breadcrumbs %}
 | 
					{% block breadcrumbs %}
 | 
				
			||||||
<div class="breadcrumbs">
 | 
					<div class="breadcrumbs">
 | 
				
			||||||
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a>
 | 
					    <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a>
 | 
				
			||||||
› <a href="{% url 'admin:app_list' app_label=cl.opts.app_label %}">{{ cl.opts.app_config.verbose_name }}</a>
 | 
					    › <a href="{% url 'admin:app_list' app_label=cl.opts.app_label %}">{{ cl.opts.app_config.verbose_name }}</a>
 | 
				
			||||||
› {{ cl.opts.verbose_name_plural|capfirst }}
 | 
					    {% if parent %}
 | 
				
			||||||
 | 
					    › <a href="{% url cl.opts|admin_urlname:'changelist' %}">{{ cl.opts.verbose_name_plural|capfirst }}</a>
 | 
				
			||||||
 | 
					    <b>› {{ parent.title }}</b>
 | 
				
			||||||
 | 
					    {% else %}
 | 
				
			||||||
 | 
					    › {{ cl.opts.verbose_name_plural|capfirst }}
 | 
				
			||||||
 | 
					    {% endif %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
{% endblock %}
 | 
					{% endblock %}
 | 
				
			||||||
{% endif %}
 | 
					{% endif %}
 | 
				
			||||||
 | 
				
			|||||||
@ -15,6 +15,7 @@
 | 
				
			|||||||
{% endblock %}
 | 
					{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% block filters %}
 | 
					{% block filters %}
 | 
				
			||||||
 | 
					{# FIXME #}
 | 
				
			||||||
{% if filter_categories %}
 | 
					{% if filter_categories %}
 | 
				
			||||||
<form method="GET" action="" class="navbar-menu">
 | 
					<form method="GET" action="" class="navbar-menu">
 | 
				
			||||||
    <div class="navbar-start">
 | 
					    <div class="navbar-start">
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user