Package django :: Package contrib :: Package admin :: Module filterspecs
[hide private]
[frames] | no frames]

Source Code for Module django.contrib.admin.filterspecs

  1  """ 
  2  FilterSpec encapsulates the logic for displaying filters in the Django admin. 
  3  Filters are specified in models with the "list_filter" option. 
  4   
  5  Each filter subclass knows how to display a filter for a field that passes a 
  6  certain test -- e.g. being a DateField or ForeignKey. 
  7  """ 
  8   
  9  from django.db import models 
 10  from django.utils.encoding import smart_unicode, iri_to_uri 
 11  from django.utils.translation import ugettext as _ 
 12  from django.utils.html import escape 
 13  from django.utils.safestring import mark_safe 
 14  import datetime 
 15   
16 -class FilterSpec(object):
17 filter_specs = []
18 - def __init__(self, f, request, params, model):
19 self.field = f 20 self.params = params
21
22 - def register(cls, test, factory):
23 cls.filter_specs.append((test, factory))
24 register = classmethod(register) 25
26 - def create(cls, f, request, params, model):
27 for test, factory in cls.filter_specs: 28 if test(f): 29 return factory(f, request, params, model)
30 create = classmethod(create) 31
32 - def has_output(self):
33 return True
34
35 - def choices(self, cl):
36 raise NotImplementedError()
37
38 - def title(self):
39 return self.field.verbose_name
40
41 - def output(self, cl):
42 t = [] 43 if self.has_output(): 44 t.append(_(u'<h3>By %s:</h3>\n<ul>\n') % escape(self.title())) 45 46 for choice in self.choices(cl): 47 t.append(u'<li%s><a href="%s">%s</a></li>\n' % \ 48 ((choice['selected'] and ' class="selected"' or ''), 49 iri_to_uri(choice['query_string']), 50 choice['display'])) 51 t.append('</ul>\n\n') 52 return mark_safe("".join(t))
53
54 -class RelatedFilterSpec(FilterSpec):
55 - def __init__(self, f, request, params, model):
56 super(RelatedFilterSpec, self).__init__(f, request, params, model) 57 if isinstance(f, models.ManyToManyField): 58 self.lookup_title = f.rel.to._meta.verbose_name 59 else: 60 self.lookup_title = f.verbose_name 61 self.lookup_kwarg = '%s__%s__exact' % (f.name, f.rel.to._meta.pk.name) 62 self.lookup_val = request.GET.get(self.lookup_kwarg, None) 63 self.lookup_choices = f.rel.to._default_manager.all()
64
65 - def has_output(self):
66 return len(self.lookup_choices) > 1
67
68 - def title(self):
69 return self.lookup_title
70
71 - def choices(self, cl):
72 yield {'selected': self.lookup_val is None, 73 'query_string': cl.get_query_string({}, [self