filters.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. from __future__ import unicode_literals
  2. import datetime
  3. from collections import OrderedDict
  4. try:
  5. import pytz
  6. except ImportError:
  7. pytz = None
  8. from django import forms
  9. from django.conf import settings
  10. from django.contrib import admin
  11. from django.contrib.admin.widgets import AdminDateWidget
  12. from django.template.defaultfilters import slugify
  13. from django.utils.translation import ugettext as _
  14. from django.utils.encoding import smart_text
  15. from django.utils.html import format_html
  16. from django.core.urlresolvers import reverse
  17. from rangefilter.filter import DateRangeFilter
  18. try:
  19. from django.contrib.admin.utils import get_model_from_relation
  20. except ImportError: # Django 1.6
  21. from django.contrib.admin.util import get_model_from_relation
  22. try:
  23. from django.forms.utils import flatatt
  24. except ImportError: # Django 1.6
  25. from django.forms.util import flatatt
  26. class RelatedFieldAjaxListFilter(admin.RelatedFieldListFilter):
  27. ajax_attrs = None
  28. def has_output(self):
  29. return True
  30. def field_choices(self, field, request, model_admin):
  31. model = field.remote_field.model if hasattr(field, 'remote_field') else field.related_field.model
  32. app_label = model._meta.app_label
  33. model_name = model._meta.object_name
  34. self.ajax_attrs = format_html('{0}', flatatt({
  35. 'data-app-label': app_label,
  36. 'data-model': model_name,
  37. 'data-ajax--url': reverse('jet:model_lookup'),
  38. 'data-queryset--lookup': self.lookup_kwarg
  39. }))
  40. if self.lookup_val is None:
  41. return []
  42. other_model = get_model_from_relation(field)
  43. if hasattr(field, 'rel'):
  44. rel_name = field.rel.get_related_field().name
  45. else:
  46. rel_name = other_model._meta.pk.name
  47. queryset = model._default_manager.filter(**{rel_name: self.lookup_val}).all()
  48. return [(x._get_pk_val(), smart_text(x)) for x in queryset]
  49. class DateRangeFilter(DateRangeFilter):
  50. def get_template(self):
  51. return 'rangefilter/date_filter.html'
  52. def _get_form_fields(self):
  53. # this is here, because in parent DateRangeFilter AdminDateWidget
  54. # could be imported from django-suit
  55. return OrderedDict((
  56. (self.lookup_kwarg_gte, forms.DateField(
  57. label='',
  58. widget=AdminDateWidget(attrs={'placeholder': _('From date')}),
  59. localize=True,
  60. required=False
  61. )),
  62. (self.lookup_kwarg_lte, forms.DateField(
  63. label='',
  64. widget=AdminDateWidget(attrs={'placeholder': _('To date')}),
  65. localize=True,
  66. required=False
  67. )),
  68. ))
  69. @staticmethod
  70. def _get_media():
  71. css = [
  72. 'style.css',
  73. ]
  74. return forms.Media(
  75. css={'all': ['range_filter/css/%s' % path for path in css]}
  76. )