# -*- 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.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, 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 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