Changeset 1427
- Timestamp:
- 11/24/05 21:18:11 (3 years ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/branches/new-admin/django/contrib/admin/filterspecs.py
r1287 r1427 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 1 9 from django.core import meta 2 10 import datetime … … 7 15 self.field = f 8 16 self.params = params 9 17 10 18 def register(cls, test, factory): 11 19 cls.filter_specs.append( (test, factory) ) 12 20 register = classmethod(register) 13 21 14 22 def create(cls, f, request, params): 15 23 for test, factory in cls.filter_specs: 16 24 if test(f): 17 return factory(f, request, params) 25 return factory(f, request, params) 18 26 create = classmethod(create) 19 27 20 28 def has_output(self): 21 29 return True 22 30 23 31 def choices(self, cl): 24 32 raise NotImplementedError() 25 33 26 34 def title(self): 27 35 return self.field.verbose_name 28 36 29 37 def output(self, cl): 30 38 t = [] 31 39 if self.has_output(): 32 40 t.append(_('<h3>By %s:</h3>\n<ul>\n') % self.title()) 33 41 34 42 for choice in self.choices(cl): 35 43 t.append('<li%s><a href="%s">%s</a></li>\n' % \ 36 44 ((choice['selected'] and ' class="selected"' or ''), 37 choice['query_string'] , 38 choice['display'])) 45 choice['query_string'] , 46 choice['display'])) 39 47 t.append('</ul>\n\n') 40 48 return "".join(t) 41 49 42 50 class RelatedFilterSpec(FilterSpec): 43 51 def __init__(self, f, request, params): 44 super(RelatedFilterSpec, self).__init__(f, request, params) 52 super(RelatedFilterSpec, self).__init__(f, request, params) 45 53 if isinstance(f, meta.ManyToManyField): 46 54 self.lookup_title = f.rel.to.verbose_name … … 50 58 self.lookup_val = request.GET.get(self.lookup_kwarg, None) 51 59 self.lookup_choices = f.rel.to.get_model_module().get_list() 52 60 53 61 def has_output(self): 54 62 return len(self.lookup_choices) > 1 55 63 56 64 def title(self): 57 return self.lookup_title 58 65 return self.lookup_title 66 59 67 def choices(self, cl): 60 68 yield {'selected': self.lookup_val is None, 61 'query_string': cl.get_query_string({}, [self.lookup_kwarg]), 62 'display': _('All') }69 'query_string': cl.get_query_string({}, [self.lookup_kwarg]), 70 'display': _('All')} 63 71 for val in self.lookup_choices: 64 72 pk_val = getattr(val, self.field.rel.to.pk.attname) 65 yield { 'selected': self.lookup_val == str(pk_val), 66 'query_string': cl.get_query_string( {self.lookup_kwarg: pk_val}), 67 'display' : val } 73 yield {'selected': self.lookup_val == str(pk_val), 74 'query_string': cl.get_query_string( {self.lookup_kwarg: pk_val}), 75 'display': val} 76 68 77 FilterSpec.register(lambda f: bool(f.rel), RelatedFilterSpec) 69 78 … … 73 82 self.lookup_kwarg = '%s__exact' % f.name 74 83 self.lookup_val = request.GET.get(self.lookup_kwarg, None) 75 84 76 85 def choices(self, cl): 77 yield {'selected' : self.lookup_val is None,78 'query_string': cl.get_query_string( {}, [self.lookup_kwarg]), 79 'display': _('All') }86 yield {'selected': self.lookup_val is None, 87 'query_string': cl.get_query_string( {}, [self.lookup_kwarg]), 88 'display': _('All')} 80 89 for k, v in self.field.choices: 81 yield {'selected': str(k) == self.lookup_val, 82 'query_string' : cl.get_query_string( {self.lookup_kwarg: k}), 83 'display' : v } 90 yield {'selected': str(k) == self.lookup_val, 91 'query_string': cl.get_query_string( {self.lookup_kwarg: k}), 92 'display': v} 93 84 94 FilterSpec.register(lambda f: bool(f.choices), ChoicesFilterSpec) 85 95 86 96 class DateFieldFilterSpec(FilterSpec): 87 88 97 def __init__(self, f, request, params): 89 98 super(DateFieldFilterSpec, self).__init__(f, request, params) 90 99 91 100 self.field_generic = '%s__' % self.field.name 92 101 93 102 self.date_params = dict([(k, v) for k, v in params.items() if k.startswith(self.field_generic)]) 94 103 95 104 today = datetime.date.today() 96 105 one_week_ago = today - datetime.timedelta(days=7) 97 106 today_str = isinstance(self.field, meta.DateTimeField) and today.strftime('%Y-%m-%d 23:59:59') or today.strftime('%Y-%m-%d') 98 107 99 108 self.links = ( 100 109 (_('Any date'), {}), 101 (_('Today'), {'%s__year' % self.field.name: str(today.year), 102 '%s__month' % self.field.name: str(today.month), 110 (_('Today'), {'%s__year' % self.field.name: str(today.year), 111 '%s__month' % self.field.name: str(today.month), 103 112 '%s__day' % self.field.name: str(today.day)}), 104 (_('Past 7 days'), {'%s__gte' % self.field.name: one_week_ago.strftime('%Y-%m-%d'), 113 (_('Past 7 days'), {'%s__gte' % self.field.name: one_week_ago.strftime('%Y-%m-%d'), 105 114 '%s__lte' % f.name: today_str}), 106 (_('This month'), {'%s__year' % self.field.name: str(today.year), 115 (_('This month'), {'%s__year' % self.field.name: str(today.year), 107 116 '%s__month' % f.name: str(today.month)}), 108 117 (_('This year'), {'%s__year' % self.field.name: str(today.year)}) 109 ) 110 118 ) 119 111 120 def title(self): 112 121 return self.field.verbose_name 113 122 114 123 def choices(self, cl): 115 124 for title, param_dict in self.links: 116 yield { 'selected' : self.date_params == param_dict,117 'query_string': cl.get_query_string( param_dict, self.field_generic),118 'display' : title}119 125 yield {'selected': self.date_params == param_dict, 126 'query_string': cl.get_query_string( param_dict, self.field_generic), 127 'display': title} 128 120 129 FilterSpec.register(lambda f: isinstance(f, meta.DateField), DateFieldFilterSpec) 121 130 … … 127 136 self.lookup_val = request.GET.get(self.lookup_kwarg, None) 128 137 self.lookup_val2 = request.GET.get(self.lookup_kwarg2, None) 129 138 130 139 def title(self): 131 140 return self.field.verbose_name 132 141 133 142 def choices(self, cl): 134 143 for k, v in ((_('All'), None), (_('Yes'), '1'), (_('No'), '0')): 135 yield { 'selected' : self.lookup_val == v and not self.lookup_val2, 136 'query_string' : cl.get_query_string( {self.lookup_kwarg: v}, [self.lookup_kwarg2]), 137 'display': k 138 } 144 yield {'selected': self.lookup_val == v and not self.lookup_val2, 145 'query_string': cl.get_query_string( {self.lookup_kwarg: v}, [self.lookup_kwarg2]), 146 'display': k} 139 147 if isinstance(self.field, meta.NullBooleanField): 140 yield { 'selected' : self.lookup_val2 == 'True', 141 'query_string' : cl.get_query_string( {self.lookup_kwarg2: 'True'}, [self.lookup_kwarg]), 142 'display': _('Unknown') 143 } 144 FilterSpec.register(lambda f: isinstance(f, meta.BooleanField) or 145 isinstance(f, meta.NullBooleanField), BooleanFieldFilterSpec) 148 yield {'selected': self.lookup_val2 == 'True', 149 'query_string': cl.get_query_string( {self.lookup_kwarg2: 'True'}, [self.lookup_kwarg]), 150 'display': _('Unknown')} 151 152 FilterSpec.register(lambda f: isinstance(f, meta.BooleanField) or isinstance(f, meta.NullBooleanField), BooleanFieldFilterSpec)
