X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=apps%2Fpatchwork%2Ffilters.py;h=8c9690eeaf22de4fbe152354ce1bdccea946cc8e;hb=a48f76a2d3a98c21d4b37f19cf84073e77db55c8;hp=b0b204ed68623b2b2384e9e0b02b0ce36c765f93;hpb=54a4ca3d5a3fcb99e8dae216dcba25c9cc05a914;p=patchwork diff --git a/apps/patchwork/filters.py b/apps/patchwork/filters.py index b0b204e..8c9690e 100644 --- a/apps/patchwork/filters.py +++ b/apps/patchwork/filters.py @@ -22,6 +22,7 @@ from patchwork.models import Person, State from django.utils.safestring import mark_safe from django.utils.html import escape from django.contrib.auth.models import User +from urllib import quote class Filter(object): def __init__(self, filters): @@ -143,21 +144,20 @@ class SubmitterFilter(Filter): class StateFilter(Filter): param = 'state' - action_req_key = '!' + any_key = '*' + action_req_str = 'Action Required' def __init__(self, filters): super(StateFilter, self).__init__(filters) self.name = 'State' self.state = None - self.action_req = None + self.applied = True def _set_key(self, str): - self.action_req = None self.state = None - if str == self.action_req_key: - self.action_req = True - self.applied = True + if str == self.any_key: + self.applied = False return try: @@ -168,34 +168,39 @@ class StateFilter(Filter): self.applied = True def kwargs(self): - if self.action_req == True: + if self.state is not None: + return {'state': self.state} + else: return {'state__in': \ State.objects.filter(action_required = True) \ .values('pk').query} - if self.state is not None: - return {'state': self.state} def condition(self): if self.state: return self.state.name - elif self.action_req == True: - return 'Action Required' - return None - + return self.action_req_str def key(self): - if self.action_req == True: - return self.action_req_key - if self.state is None: - return None - return self.state.id + if self.state is not None: + return self.state.id + if not self.applied: + return '*' + return None def _form(self): str = '' @@ -354,13 +363,14 @@ class DelegateFilter(Filter): if not self.applied: selected = 'selected' - str += '' % selected + str += '' % selected selected = '' - if self.delegate is None: + if self.applied and self.delegate is None: selected = 'selected' - str += '' % selected + str += '' % \ + (selected, self.no_delegate_key, self.no_delegate_str) for d in delegates: selected = '' @@ -368,7 +378,7 @@ class DelegateFilter(Filter): selected = ' selected' str += '' % (selected, - d.id, d.get_profile().name()) + d.id, d.profile.name()) str += '' return mark_safe(str) @@ -377,14 +387,8 @@ class DelegateFilter(Filter): if self.delegate: return self.delegate.id if self.applied: - return None - return '*' - - def url_without_me(self): - qs = self.filters.querystring_without_filter(self) - if qs != '?': - qs += '&' - return qs + ('%s=*' % self.param) + return self.no_delegate_key + return None def set_status(self, *args, **kwargs): if 'delegate' in kwargs: @@ -435,13 +439,21 @@ class Filters: for (k, v) in self.dict.iteritems(): if k not in params: - params[k] = v[0] + params[k] = v if remove is not None: if remove.param in params.keys(): del params[remove.param] - return '?' + '&'.join(['%s=%s' % x for x in params.iteritems()]) + pairs = params.iteritems() + + def sanitise(s): + if not isinstance(s, basestring): + s = unicode(s) + return quote(s.encode('utf-8')) + + return '?' + '&'.join(['%s=%s' % (sanitise(k), sanitise(v)) + for (k, v) in pairs]) def querystring_without_filter(self, filter): return self.querystring(filter)