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 -*-
from collections import OrderedDict
from django.db.models.sql.where import AND, OR
from django.utils.translation import ugettext as _
from functions.model_utils import EnumChoices
@ -46,3 +47,14 @@ PRICE = EnumChoices(**get_choices_kwargs(price_mapping))
# 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.safestring import mark_safe
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.core.exceptions import ValidationError
@ -28,6 +27,7 @@ from country.models import Country
from city.models import City
from events.common import MEMBERS, VISITORS, PRICE
from events.common import members_mapping, visitors_mapping, price_mapping
from events.common import ExtraWhere, OR, AND
class FilterCheckboxSelectMultiple(forms.CheckboxSelectMultiple):
@ -261,7 +261,8 @@ class FilterForm(forms.Form):
having = [''' `count` > 0 ''']
if 'selected' in values:
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)
self.fields[field].queryset = qs
print(self.fields[field].queryset.query)

Loading…
Cancel
Save