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.
 
 
 
 
 
 

435 lines
16 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')
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')
import datetime
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())
area = forms.MultipleChoiceField(label=_(u'Регион'),
choices=[(item.id, item.name) for item in Area.objects.language().all()],
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.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')
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')
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 list(Area.objects.language().all())],
required=False, widget=forms.CheckboxSelectMultiple())
co = forms.MultipleChoiceField(label=_(u'Страна'), required=False, widget=forms.CheckboxSelectMultiple(),
choices=[(item.id, item.name) for item in list(Country.objects.expo_countries())]
)
ci = forms.MultipleChoiceField(label=_(u'Город'), required=False, widget=forms.CheckboxSelectMultiple(),
choices=[(item.id, item.name) for item in list(City.used.expo_cities())]
)
#
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.language().all()],
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()]
)
def __init__(self, *args, **kwargs):
super(CompanySearchForm, self).__init__(*args, **kwargs)
self.theme_classes = {item.id:item.generate_search_class() for item in list(Theme.objects.language().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