1461: Этап №5: Фильтрация событий

ExtraWhere AND clause fix, now we can give OR or AND.
remotes/origin/stage5
Alexander Burdeiny 10 years ago
parent a1afad7e5f
commit af9ae8ecc4
  1. 12
      events/common.py
  2. 5
      events/forms.py

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from collections import OrderedDict from collections import OrderedDict
from django.db.models.sql.where import AND, OR
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from functions.model_utils import EnumChoices from functions.model_utils import EnumChoices
@ -46,3 +47,14 @@ PRICE = EnumChoices(**get_choices_kwargs(price_mapping))
# N2000=(5, _(u'более 2000')), # N2000=(5, _(u'более 2000')),
# ) # )
class ExtraWhere(object):
def __init__(self, sqls, params, operator=AND):
self.sqls = sqls
self.params = params
self.operator = operator
def as_sql(self, qn=None, connection=None):
sqls = ["(%s)" % sql for sql in self.sqls]
operator = " {operator} ".format(operator=self.operator)
return operator.join(sqls), tuple(self.params or ())

@ -14,7 +14,6 @@ from django.utils.encoding import smart_text, force_text
from django.utils.html import format_html from django.utils.html import format_html
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from django.db.models import Count, Sum, Q, ForeignKey, ManyToManyField from django.db.models import Count, Sum, Q, ForeignKey, ManyToManyField
from django.db.models.sql.where import ExtraWhere, AND, OR
from django.db import connection from django.db import connection
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
@ -28,6 +27,7 @@ from country.models import Country
from city.models import City from city.models import City
from events.common import MEMBERS, VISITORS, PRICE from events.common import MEMBERS, VISITORS, PRICE
from events.common import members_mapping, visitors_mapping, price_mapping from events.common import members_mapping, visitors_mapping, price_mapping
from events.common import ExtraWhere, OR, AND
class FilterCheckboxSelectMultiple(forms.CheckboxSelectMultiple): class FilterCheckboxSelectMultiple(forms.CheckboxSelectMultiple):
@ -261,7 +261,8 @@ class FilterForm(forms.Form):
having = [''' `count` > 0 '''] having = [''' `count` > 0 ''']
if 'selected' in values: if 'selected' in values:
having.append(''' `selected` = 1 ''') having.append(''' `selected` = 1 ''')
qs.query.having.add(ExtraWhere(having, []), OR)
qs.query.having.add(ExtraWhere(having, [], OR), AND)
qs = qs.values(*values).order_by(*order_by) qs = qs.values(*values).order_by(*order_by)
self.fields[field].queryset = qs self.fields[field].queryset = qs
print(self.fields[field].queryset.query) print(self.fields[field].queryset.query)

Loading…
Cancel
Save