diff --git a/aircox/admin/filters.py b/aircox/admin/filters.py new file mode 100644 index 0000000..fa0bc12 --- /dev/null +++ b/aircox/admin/filters.py @@ -0,0 +1,32 @@ +from django.contrib.admin import filters +from django.utils.translation import gettext_lazy as _ + + +__all__ = ('DateFieldFilter',) + + +class DateFieldFilter(filters.FieldListFilter): + template = 'admin/aircox/filters/date_filter.html' + input_type = 'date' + + def __init__(self, field, request, params, model, model_admin, field_path): + self.field_generic = '%s__' % field_path + self.date_params = {k: v for k, v in params.items() + if k.startswith(self.field_generic)} + + self.links = ((_('Exact'), self.field_generic + 'exact'), + (_('Since'), self.field_generic + 'gte'), + (_('Until'), self.field_generic + 'lte')) + super().__init__(field, request, params, model, model_admin, field_path) + + def expected_parameters(self): + return [link[1] for link in self.links] + + def choices(self, changelist): + for link in self.links: + yield {'label': link[0], + 'name': link[1], + 'value': self.date_params.get(link[1]), + 'type': self.input_type,} + + diff --git a/aircox/admin/page.py b/aircox/admin/page.py index ffbd444..9b666cd 100644 --- a/aircox/admin/page.py +++ b/aircox/admin/page.py @@ -8,9 +8,10 @@ from django.utils.translation import gettext_lazy as _ from adminsortable2.admin import SortableInlineAdminMixin from ..models import Category, Comment, NavItem, Page, StaticPage +from .filters import DateFieldFilter -__all__ = ['CategoryAdmin', 'PageAdmin', 'NavItemInline'] +__all__ = ('CategoryAdmin', 'PageAdmin', 'NavItemInline') @admin.register(Category) @@ -82,7 +83,7 @@ class PageAdmin(BasePageAdmin): list_display = BasePageAdmin.list_display + ('category',) list_editable = BasePageAdmin.list_editable + ('category',) - list_filter = BasePageAdmin.list_editable + ('category',) + list_filter = BasePageAdmin.list_filter + ('category', ('pub_date', DateFieldFilter)) search_fields = ('category__title',) fieldsets = deepcopy(BasePageAdmin.fieldsets) diff --git a/aircox/models/page.py b/aircox/models/page.py index b1c5123..8939508 100644 --- a/aircox/models/page.py +++ b/aircox/models/page.py @@ -38,7 +38,7 @@ class Category(models.Model): return self.title -class PageQuerySet(InheritanceQuerySet): +class BasePageQuerySet(InheritanceQuerySet): def draft(self): return self.filter(status=Page.STATUS_DRAFT) @@ -86,7 +86,7 @@ class BasePage(models.Model): _('content'), blank=True, null=True, ) - objects = PageQuerySet.as_manager() + objects = BasePageQuerySet.as_manager() detail_url_name = None item_template_name = 'aircox/widgets/page_item.html' @@ -149,6 +149,12 @@ class BasePage(models.Model): return cls(**cls.get_init_kwargs_from(page, **kwargs)) +class PageQuerySet(BasePageQuerySet): + def published(self): + return self.filter(status=Page.STATUS_PUBLISHED, + pub_date__lte=tz.now()) + + class Page(BasePage): """ Base Page model used for articles and other dated content. """ category = models.ForeignKey( @@ -163,6 +169,8 @@ class Page(BasePage): _('allow comments'), default=True, ) + objects = PageQuerySet.as_manager() + class Meta: verbose_name = _('Publication') verbose_name_plural = _('Publications') diff --git a/aircox/templates/admin/aircox/filters/date_filter.html b/aircox/templates/admin/aircox/filters/date_filter.html new file mode 100644 index 0000000..edea836 --- /dev/null +++ b/aircox/templates/admin/aircox/filters/date_filter.html @@ -0,0 +1,20 @@ +{% extends "./filter.html" %} +{% load static %} +{% block content %} +{% with choices|first as choice %} +
+{% endwith %} +{% endblock %} diff --git a/aircox/templates/admin/aircox/filters/datetime_filter.html b/aircox/templates/admin/aircox/filters/datetime_filter.html new file mode 100644 index 0000000..c96db85 --- /dev/null +++ b/aircox/templates/admin/aircox/filters/datetime_filter.html @@ -0,0 +1,7 @@ +{% extends "admin/aircox/filter.html" %} +{% block content %} +{% with choices|first as choice %} + +{% endwith %} +{% endblock %} + diff --git a/aircox/templates/admin/aircox/filters/filter.html b/aircox/templates/admin/aircox/filters/filter.html new file mode 100644 index 0000000..a630813 --- /dev/null +++ b/aircox/templates/admin/aircox/filters/filter.html @@ -0,0 +1,4 @@ +{% load i18n %} +