# -*- 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')