mirror of
https://github.com/jazzband/django-admin2.git
synced 2026-04-22 15:44:43 +00:00
Drilling down works on a functional level. Gotta set up interface and
tests. On a related note, TAKE THAT DJANGO FILTERS.
This commit is contained in:
parent
555b022fb2
commit
29eaa661d5
7 changed files with 67 additions and 10 deletions
|
|
@ -4,6 +4,7 @@ from __future__ import division, absolute_import, unicode_literals
|
|||
import collections
|
||||
from itertools import chain
|
||||
|
||||
from django import forms
|
||||
from django.forms.util import flatatt
|
||||
from django.utils.html import format_html
|
||||
from django.utils.encoding import force_text
|
||||
|
|
@ -16,6 +17,10 @@ import django_filters
|
|||
LINK_TEMPLATE = '<a href=?{0}={1} {2}>{3}</a>'
|
||||
|
||||
|
||||
class NumericDateFilter(django_filters.DateFilter):
|
||||
field_class = forms.IntegerField
|
||||
|
||||
|
||||
class ChoicesAsLinksWidget(django_widgets.Select):
|
||||
"""Select form widget taht renders links for choices
|
||||
instead of select element with options.
|
||||
|
|
@ -95,6 +100,31 @@ def build_list_filter(request, model_admin, queryset):
|
|||
)(request.GET, queryset=queryset)
|
||||
|
||||
|
||||
def build_date_filter(request, model_admin, queryset):
|
||||
filterset_dict = {
|
||||
"year": NumericDateFilter(
|
||||
name="published_date",
|
||||
lookup_type="year",
|
||||
),
|
||||
"month": NumericDateFilter(
|
||||
name="published_date",
|
||||
lookup_type="month",
|
||||
),
|
||||
"day": NumericDateFilter(
|
||||
name="published_date",
|
||||
lookup_type="day",
|
||||
)
|
||||
}
|
||||
|
||||
newset = type(
|
||||
b'%sDateFilterSet' % queryset.model.__name__,
|
||||
(django_filters.FilterSet,),
|
||||
filterset_dict,
|
||||
)(request.GET, queryset=queryset)
|
||||
|
||||
return newset
|
||||
|
||||
|
||||
def get_filter_for_field_name(model, field_name):
|
||||
"""Returns filter for model field by field name.
|
||||
"""
|
||||
|
|
|
|||
|
|
@ -8,12 +8,11 @@ from django.conf import settings
|
|||
# views. This is a security feature.
|
||||
# See the docstring on djadmin2.types.ModelAdmin2 for more detail.
|
||||
MODEL_ADMIN_ATTRS = (
|
||||
'actions_selection_counter', 'list_display', 'list_display_links',
|
||||
'list_filter', 'admin', 'search_fields', 'field_renderers',
|
||||
'index_view', 'detail_view', 'create_view', 'update_view', 'delete_view',
|
||||
'get_default_view_kwargs', 'get_list_actions',
|
||||
'actions_on_bottom', 'actions_on_top',
|
||||
'save_on_top', 'save_on_bottom',
|
||||
'readonly_fields', )
|
||||
'actions_selection_counter', "date_hierarchy", 'list_display',
|
||||
'list_display_links', 'list_filter', 'admin', 'search_fields',
|
||||
'field_renderers', 'index_view', 'detail_view', 'create_view',
|
||||
'update_view', 'delete_view', 'get_default_view_kwargs',
|
||||
'get_list_actions', 'actions_on_bottom', 'actions_on_top',
|
||||
'save_on_top', 'save_on_bottom', 'readonly_fields', )
|
||||
|
||||
ADMIN2_THEME_DIRECTORY = getattr(settings, "ADMIN2_THEME_DIRECTORY", "djadmin2theme_default")
|
||||
|
|
|
|||
|
|
@ -59,6 +59,7 @@ class ModelAdmin2(with_metaclass(ModelAdminBase2)):
|
|||
bypass the blocking features of the ImmutableAdmin.
|
||||
"""
|
||||
actions_selection_counter = True
|
||||
date_hierarchy = False
|
||||
list_display = ('__str__',)
|
||||
list_display_links = ()
|
||||
list_filter = ()
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ from . import permissions, utils
|
|||
from .forms import AdminAuthenticationForm
|
||||
from .models import LogEntry
|
||||
from .viewmixins import Admin2Mixin, AdminModel2Mixin, Admin2ModelFormMixin
|
||||
from .filters import build_list_filter
|
||||
from .filters import build_list_filter, build_date_filter
|
||||
|
||||
|
||||
class AdminView(object):
|
||||
|
|
@ -155,6 +155,9 @@ class ModelListView(AdminModel2Mixin, generic.ListView):
|
|||
if self.model_admin.list_filter:
|
||||
queryset = self.build_list_filter(queryset).qs
|
||||
|
||||
if self.model_admin.date_hierarchy:
|
||||
queryset = self.build_date_filter(queryset).qs
|
||||
|
||||
queryset = self._modify_queryset_for_sort(queryset)
|
||||
|
||||
if search_use_distinct:
|
||||
|
|
@ -194,6 +197,18 @@ class ModelListView(AdminModel2Mixin, generic.ListView):
|
|||
)
|
||||
return self._list_filter
|
||||
|
||||
def build_date_filter(self, queryset=None):
|
||||
if not hasattr(self, "_date_filter"):
|
||||
if queryset is None:
|
||||
queryset = self.get_queryset()
|
||||
self._date_filter = build_date_filter(
|
||||
self.request,
|
||||
self.model_admin,
|
||||
queryset,
|
||||
)
|
||||
|
||||
return self._date_filter
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(ModelListView, self).get_context_data(**kwargs)
|
||||
context['model'] = self.get_model()
|
||||
|
|
@ -202,6 +217,15 @@ class ModelListView(AdminModel2Mixin, generic.ListView):
|
|||
context['search_term'] = self.request.GET.get('q', '')
|
||||
context['list_filter'] = self.build_list_filter()
|
||||
context['sort_term'] = self.request.GET.get('sort', '')
|
||||
|
||||
if self.model_admin.date_hierarchy:
|
||||
date_field = self.model_admin.date_hierarchy
|
||||
context['years'] = (
|
||||
context['object_list'].dates(date_field, "year")
|
||||
)
|
||||
context["days"] = (
|
||||
context['object_list'].dates(date_field, "day")
|
||||
)
|
||||
return context
|
||||
|
||||
def get_success_url(self):
|
||||
|
|
|
|||
|
|
@ -12,8 +12,9 @@ class CommentInline(admin.TabularInline):
|
|||
|
||||
class PostAdmin(admin.ModelAdmin):
|
||||
inlines = [CommentInline, ]
|
||||
search_fields = ('title', 'body')
|
||||
search_fields = ('title', 'body', "published_date")
|
||||
list_filter = ['published', 'title']
|
||||
date_hierarchy = "published_date"
|
||||
|
||||
admin.site.register(Post, PostAdmin)
|
||||
admin.site.register(Comment)
|
||||
|
|
|
|||
|
|
@ -29,11 +29,12 @@ class PostAdmin(djadmin2.ModelAdmin2):
|
|||
list_actions = [DeleteSelectedAction, CustomPublishAction, unpublish_items]
|
||||
inlines = [CommentInline]
|
||||
search_fields = ('title', '^body')
|
||||
list_display = ('title', 'body', 'published')
|
||||
list_display = ('title', 'body', 'published', "published_date",)
|
||||
field_renderers = {
|
||||
'title': renderers.title_renderer,
|
||||
}
|
||||
save_on_top = True
|
||||
date_hierarchy = "published_date"
|
||||
|
||||
|
||||
class CommentAdmin(djadmin2.ModelAdmin2):
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ class Post(models.Model):
|
|||
title = models.CharField(max_length=255, verbose_name=_('title'))
|
||||
body = models.TextField(verbose_name=_('body'))
|
||||
published = models.BooleanField(default=False, verbose_name=_('published'))
|
||||
published_date = models.DateField(auto_now=True)
|
||||
|
||||
def __unicode__(self):
|
||||
return self.title
|
||||
|
|
|
|||
Loading…
Reference in a new issue