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.
440 lines
17 KiB
440 lines
17 KiB
# -*- coding: utf-8 -*-
|
|
import pytils
|
|
import ast
|
|
import json
|
|
from django import forms
|
|
from django.db.models import Q
|
|
from django.utils import translation
|
|
from django.utils.translation import ugettext_lazy as _
|
|
from haystack.query import EmptySearchQuerySet, SearchQuerySet
|
|
from country.models import Area
|
|
from theme.models import Theme
|
|
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
|
|
from place_exposition.models import PlaceExposition
|
|
from place_conference.models import PlaceConference
|
|
|
|
|
|
class AbstactSearchForm(forms.Form):
|
|
q = forms.CharField(label=_(u'Я ищу'), required=False, widget=forms.TextInput(attrs={'placeholder':_(u'Тематика, слово или название')}))
|
|
w = forms.CharField(label=_(u'Где'), required=False)
|
|
models = None
|
|
data_with_parents = None
|
|
|
|
def get_form_data(self):
|
|
data = self.cleaned_data
|
|
area = data.get('area')
|
|
co = data.get('co')
|
|
ci = data.get('ci')
|
|
th = data.get('th')
|
|
tg = data.get('tg')
|
|
|
|
if area:
|
|
ar = Area.objects.filter(id__in=area)
|
|
areas = [{'name':'area', 'id':item.id, 'parent':None, 'text':item.name} for item in ar]
|
|
else:
|
|
areas = []
|
|
|
|
if th:
|
|
themes = Theme.objects.filter(id__in=th)
|
|
ths = [{'name':'th', 'id':item.id, 'parent':None, 'text':item.name} for item in themes]
|
|
else:
|
|
ths = []
|
|
|
|
if tg:
|
|
tgs = []
|
|
for item in tg:
|
|
try:
|
|
tag = Tag.objects.language().get(id=item)
|
|
tgs.append({'name':'th', 'id':tag.theme_id, 'text': tag.theme.name, 'children':{
|
|
'id': item, 'name':'tg', 'text': tag.name
|
|
}
|
|
})
|
|
except:
|
|
continue
|
|
else:
|
|
tgs = []
|
|
|
|
if co:
|
|
cos = []
|
|
for item in co:
|
|
try:
|
|
country = Country.objects.get(id=item)
|
|
cos.append({'name':'area', 'id':country.area_id, 'text': country.area.name, 'children':{
|
|
'id': item, 'name':'co', 'text': country.name
|
|
}
|
|
})
|
|
except:
|
|
continue
|
|
else:
|
|
cos = []
|
|
|
|
if ci:
|
|
cis = []
|
|
for item in ci:
|
|
try:
|
|
city = City.objects.language().get(id=item)
|
|
|
|
cis.append({'name':'area', 'id': city.country.area_id, 'text': city.country.area.name, 'children':{
|
|
'id': city.country_id, 'name':'co', 'text': city.country.name, 'children':{
|
|
'name':'ci', 'id':item, 'text':city.name
|
|
}
|
|
}
|
|
})
|
|
except:
|
|
continue
|
|
else:
|
|
cis = []
|
|
|
|
|
|
finale_list = areas + cos + cis + ths + tgs
|
|
result = {'inputs': finale_list}
|
|
result = json.dumps(result)
|
|
return result
|
|
|
|
|
|
|
|
|
|
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 clean_co(self):
|
|
|
|
co = self.cleaned_data.get('co')
|
|
if co:
|
|
res = ast.literal_eval(co)
|
|
return res
|
|
return co
|
|
"""
|
|
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(*self.models).all()
|
|
|
|
if q:
|
|
sqs = sqs.autocomplete(content_auto=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 ExpositionSearchForm(AbstactSearchForm):
|
|
search_url = '/expo/search/'
|
|
autocomplete_url = '/search-form/autosearch/exposition/'
|
|
title = _(u'ПОИСК СОБЫТИЙ')
|
|
models = [Exposition]
|
|
|
|
th = forms.MultipleChoiceField(label=_(u'Тематика'), choices=[(item.id, item.name) for item in Theme.active.all()],
|
|
required=False, widget=forms.CheckboxSelectMultiple())
|
|
tg = forms.CharField(label=_(u'Теги'), required=False, widget=forms.CheckboxSelectMultiple())
|
|
#co = forms.CharField(label=_(u'Страна'), 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.\
|
|
select_related('country', 'country__exposition_country').\
|
|
filter(country__exposition_country__country__isnull=False).\
|
|
distinct()],
|
|
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()}
|
|
|
|
def search(self):
|
|
|
|
if not self.is_valid():
|
|
return EmptySearchQuerySet()
|
|
data = self.cleaned_data
|
|
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.autocomplete(content_auto=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 PlaceSearchForm(AbstactSearchForm):
|
|
search_url = '/places/search/'
|
|
autocomplete_url = '/search-form/autosearch/place/'
|
|
title = _(u'ПОИСК МЕСТ')
|
|
models = [PlaceExposition, PlaceConference]
|
|
# place fields
|
|
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()]
|
|
)
|
|
#
|
|
place_type = forms.MultipleChoiceField(label=_(u'Тип'), required=False, choices=[])
|
|
|
|
def get_place_type_display(self):
|
|
return _(u'Не важно')
|
|
def search(self):
|
|
pass
|
|
|
|
|
|
class CompanySearchForm(AbstactSearchForm):
|
|
search_url = '/members/search/'
|
|
autocomplete_url = '/search-form/autosearch/company/'
|
|
title = _(u'ПОИСК УЧАСТНИКОВ')
|
|
models = [Company]
|
|
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()]
|
|
)
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super(CompanySearchForm, self).__init__(*args, **kwargs)
|
|
self.theme_classes = {item.id:item.generate_search_class() for item in Theme.objects.all()}
|
|
|
|
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
|
|
|
|
|
|
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 |