You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

287 lines
9.7 KiB

# -*- coding: utf-8 -*-
import pytils
from django import forms
from django.db.models import Q
from django.utils.translation import ugettext_lazy as _
from haystack.query import EmptySearchQuerySet, SearchQuerySet
from exposition.models import Exposition
from conference.models import Conference
from seminar.models import Seminar
from webinar.models import Webinar
from company.models import Company
from theme.models import Theme, Tag
from country.models import Country
from city.models import City
import ast
class AbstactSearchForm(forms.Form):
q = forms.CharField(label=_(u'Поиск'), required=False)
w = forms.CharField(label=_(u'Где'), required=False)
class CompanySearchForm(AbstactSearchForm):
th = forms.MultipleChoiceField(label=_(u'Тематика'), required=False,
choices=[(theme.id, theme.name) for theme in Theme.objects.all()])
tg = forms.MultipleChoiceField(label=_(u'Теги'), required=False,
choices=[(tag.id, tag.name) for tag in Tag.objects.all()])
c = forms.CharField(label=_(u'Страна'), required=False, widget=forms.SelectMultiple())
city = forms.CharField(label=_(u'город'), required=False, widget=forms.SelectMultiple())
def clean_city(self):
city = self.cleaned_data.get('city')
if city:
res = ast.literal_eval(city)
return res
return city
def clean_c(self):
country = self.cleaned_data.get('c')
if country:
res = ast.literal_eval(country)
return res
return country
def search(self):
q = self.cleaned_data.get('q')
w = self.cleaned_data.get('w')
th = self.cleaned_data.get('th')
tg = self.cleaned_data.get('tg')
c = self.cleaned_data.get('c')
city = self.cleaned_data.get('city')
sqs = SearchQuerySet().models(Company)
if q:
sqs = sqs.auto_query(q)
if w:
sqs = sqs.filter(where__contains=w)
if th:
sqs = sqs.filter(theme__in=th)
if tg:
sqs = sqs.filter(tag__in=tg)
if c:
sqs = sqs.filter(country__in=c)
if city:
sqs = sqs.filter(country__in=c)
return sqs
from country.models import Area
from theme.models import Theme
from django.utils import translation
class ExpositionSearchForm(forms.Form):
search_url = '/expo/search/'
q = forms.CharField(label=_(u'Поиск'), required=False)
w = forms.CharField(label=_(u'Где'), required=False)
th = forms.MultipleChoiceField(label=_(u'Тематика'), choices=[(item.id, item.name) for item in Theme.objects.all()],
required=False, widget=forms.CheckboxSelectMultiple())
tg = forms.CharField(label=_(u'Теги'), required=False, widget=forms.CheckboxSelectMultiple())
area = forms.MultipleChoiceField(label=_(u'Регион'), choices=[(item.id, item.name) for item in Area.objects.all_sorted()],
required=False, widget=forms.CheckboxSelectMultiple())
co = forms.MultipleChoiceField(label=_(u'Страна'), required=False, widget=forms.CheckboxSelectMultiple(),
choices=[(item.id, item.name) for item in Country.objects.select_related('exposition_country')\
.filter(exposition_country__country__isnull=False, translations__language_code=translation.get_language())\
.order_by('translations__name').distinct()]
)
ci = forms.MultipleChoiceField(label=_(u'Город'), required=False, widget=forms.CheckboxSelectMultiple(),
choices=[(item.id, item.name) for item in City.objects.select_related('exposition_city')\
.filter(exposition_city__city__isnull=False, translations__language_code=translation.get_language())\
.order_by('translations__name').distinct()]
)
fr = forms.DateField(required=False,
widget=forms.DateInput(attrs={'class': 'date', 'id': 'dateFrom',
'placeholder': _(u'дд.мм.гггг')}))
to = forms.DateField(required=False,
widget=forms.DateInput(attrs={'class': 'date', 'id': 'dateTo',
'placeholder': _(u'дд.мм.гггг')}))
def __init__(self, *args, **kwargs):
super(ExpositionSearchForm, self).__init__(*args, **kwargs)
self.theme_classes = {item.id:item.generate_search_class() for item in Theme.objects.all()}
"""
theme_with_tags = {}
for tag in list(Tag.objects.language().filter()):
if tag.theme_id in theme_with_tags:
theme_with_tags[tag.theme_id].append({'name': tag.name, 'id':tag.id})
else:
theme_with_tags[tag.theme_id] = [{'name': tag.name, 'id':tag.id}]
#dsds
self.theme_with_tags = theme_with_tags
"""
def get_places_display(self):
if self.is_valid():
area = self.cleaned_data['area']
area_choices = self.fields['area'].choices
places = [choice[1] for choice in area_choices if str(choice[0]) in area]
country = self.cleaned_data['co']
country_choices = self.fields['co'].choices
places += [choice[1] for choice in country_choices if str(choice[0]) in country]
city = self.cleaned_data['ci']
city_choices = self.fields['ci'].choices
places += [choice[1] for choice in city_choices if str(choice[0]) in city]
if not places:
return _(u'Не важно')
if len(places) == 1:
return ', '.join(places)
else:
st = _(u' и еще ')+str(len(places)-1)+u' %s'%pytils.numeral.choose_plural(len(places)-1, (_(u"позиция"), _(u"позиции"), _(u"позиций")))
return places[0]+ st
else:
return _(u'Не важно')
def get_themes_display(self):
if self.is_valid():
th = self.cleaned_data['th']
themes_choices = self.fields['th'].choices
themes = [choice[1] for choice in themes_choices if str(choice[0]) in th]
if not themes:
return _(u'Не важно')
if len(themes) == 1:
return ', '.join(themes)
else:
st = _(u' и еще ')+str(len(themes)-1)+u' %s'%pytils.numeral.choose_plural(len(themes)-1, (_(u"позиция"), _(u"позиции"), _(u"позиций")))
return themes[0]+ st
else:
return _(u'Не важно')
def clean_tg(self):
tg = self.cleaned_data.get('tg')
if tg:
res = ast.literal_eval(tg)
return res
return tg
def search(self):
if not self.is_valid():
return EmptySearchQuerySet()
q = self.cleaned_data.get('q')
w = self.cleaned_data.get('w')
fr = self.cleaned_data.get('fr')
to = self.cleaned_data.get('to')
th = self.cleaned_data.get('th')
tg = self.cleaned_data.get('tg')
co = self.cleaned_data.get('co')
ci = self.cleaned_data.get('ci')
area = self.cleaned_data.get('area')
sqs = SearchQuerySet().models(Exposition).all()
if q:
sqs = sqs.auto_query(q)
if w:
sqs = sqs.filter(where__contains=w)
if fr:
sqs = sqs.filter(data_begin__gte=fr)
if to:
sqs = sqs.filter(data_begin__lte=to)
if th:
sqs = sqs.filter(theme__in=th)
if tg:
sqs = sqs.filter(tag__in=tg)
place_filter = None
if area:
if place_filter:
place_filter = place_filter | Q(area_id__in=area)
else:
place_filter = Q(area_id__in=area)
#sqs = sqs.filter(area_id__in=area)
if co:
if place_filter:
place_filter = place_filter | Q(country_id__in=co)
else:
place_filter = Q(country_id__in=co)
#sqs = sqs.filter(country_id__in=co)
if ci:
if place_filter:
place_filter = place_filter | Q(city_id__in=ci)
else:
place_filter = Q(city_id__in=ci)
#sqs = sqs.filter(city_id__in=ci)
if place_filter:
sqs = sqs.filter(place_filter)
return sqs.order_by('data_begin')
class EventSearchForm(forms.Form):
q = forms.CharField(label=_(u'Поиск'), required=False)
w = forms.CharField(label=_(u'Где'), required=False)
fr = forms.DateField(required=False,
widget=forms.DateInput(attrs={'class': 'date', 'id': 'dateFrom',
'placeholder': _(u'дд.мм.гггг')}))
to = forms.DateField(required=False,
widget=forms.DateInput(attrs={'class': 'date', 'id': 'dateTo',
'placeholder': _(u'дд.мм.гггг')}))
def search(self):
if not self.is_valid():
return EmptySearchQuerySet()
q = self.cleaned_data.get('q')
w = self.cleaned_data.get('w')
if not q and not w:
return EmptySearchQuerySet()
sqs = SearchQuerySet().models(Exposition, Conference, Seminar, Webinar)
if q:
sqs = sqs.auto_query(q)
if w:
sqs = sqs.filter(where__contains=w)
return sqs