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.
 
 
 
 
 
 

338 lines
11 KiB

# -*- coding: utf-8 -*-
import pytils
import ast
import json
import datetime
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 country.models import Area
from exposition.models import Exposition
from conference.models import Conference
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
def get_by_lang(item, field, lang='ru'):
"""
:param item: searchresult object
field: translated field
:return:
"""
return getattr(item, field+'_'+lang)
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')
q = q.strip()
w = self.cleaned_data.get('w')
w = w.strip()
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 fr:
sqs = sqs.filter(data_begin__gte=fr)
if to:
sqs = sqs.filter(data_begin__lte=to)
if th or tg:
if th:
sqs = sqs.filter(theme__in=th)
if tg:
sqs = sqs.filter(tag__in=tg)
else:
if q:
sqs = sqs.autocomplete(content_auto=q)
if w:
sqs = sqs.filter(where__contains=w)
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.expo_themes()],
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.expo_countries()]
)
ci = forms.MultipleChoiceField(label=_(u'Город'), required=False, widget=forms.CheckboxSelectMultiple(),
choices=[(item.id, item.name) for item in City.used.expo_cities()]
)
fr = forms.DateField(required=False, input_formats=('%d.%m.%Y',),
widget=forms.DateInput(attrs={'class': 'date', 'id': 'dateFrom',
'placeholder': _(u'дд.мм.гггг')}))
to = forms.DateField(required=False, input_formats=('%d.%m.%Y',),
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.active.expo_themes()}
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')
if not fr:
fr = datetime.date.today()
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, Conference).all()
if fr:
sqs = sqs.filter(data_begin__gte=fr)
if to:
sqs = sqs.filter(data_begin__lte=to)
if th or tg:
if th:
sqs = sqs.filter(theme__in=th)
if tg:
sqs = sqs.filter(tag__in=tg)
else:
if q:
sqs = sqs.autocomplete(content_auto=q)
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)
else:
if w:
sqs = sqs.filter(where__contains=w)
return sqs.order_by('data_begin')