filters.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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. try:
  18. from django.contrib.admin.utils import get_model_from_relation
  19. except ImportError: # Django 1.6
  20. from django.contrib.admin.util import get_model_from_relation
  21. try:
  22. from django.forms.utils import flatatt
  23. except ImportError: # Django 1.6
  24. from django.forms.util import flatatt
  25. def make_dt_aware(dt):
  26. if pytz is not None and settings.USE_TZ:
  27. timezone = pytz.timezone(settings.TIME_ZONE)
  28. if dt.tzinfo is not None:
  29. dt = timezone.normalize(dt)
  30. else:
  31. dt = timezone.localize(dt)
  32. return dt
  33. class RelatedFieldAjaxListFilter(admin.RelatedFieldListFilter):
  34. ajax_attrs = None
  35. def has_output(self):
  36. return True
  37. def field_choices(self, field, request, model_admin):
  38. model = field.remote_field.model if hasattr(field, 'remote_field') else field.related_field.model
  39. app_label = model._meta.app_label
  40. model_name = model._meta.object_name
  41. self.ajax_attrs = format_html('{0}', flatatt({
  42. 'data-app-label': app_label,
  43. 'data-model': model_name,
  44. 'data-ajax--url': reverse('jet:model_lookup'),
  45. 'data-queryset--lookup': self.lookup_kwarg
  46. }))
  47. if self.lookup_val is None:
  48. return []
  49. other_model = get_model_from_relation(field)
  50. if hasattr(field, 'rel'):
  51. rel_name = field.rel.get_related_field().name
  52. else:
  53. rel_name = other_model._meta.pk.name
  54. queryset = model._default_manager.filter(**{rel_name: self.lookup_val}).all()
  55. return [(x._get_pk_val(), smart_text(x)) for x in queryset]