# -*- coding: utf-8 -*- import pytils 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 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 import ast class AbstactSearchForm(forms.Form): q = forms.CharField(label=_(u'Поиск'), required=False) w = forms.CharField(label=_(u'Где'), required=False) class CompanySearchForm(AbstactSearchForm): th = forms.MultipleChoiceField(label=_(u'Тематика'), required=False, choices=[(theme.id, theme.name) for theme in Theme.objects.all()]) tg = forms.MultipleChoiceField(label=_(u'Теги'), required=False, choices=[(tag.id, tag.name) for tag in Tag.objects.all()]) c = forms.CharField(label=_(u'Страна'), required=False, widget=forms.SelectMultiple()) city = forms.CharField(label=_(u'город'), required=False, widget=forms.SelectMultiple()) def clean_city(self): city = self.cleaned_data.get('city') if city: res = ast.literal_eval(city) return res return city def clean_c(self): country = self.cleaned_data.get('c') if country: res = ast.literal_eval(country) return res return country 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 from country.models import Area from theme.models import Theme from django.utils import translation class ExpositionSearchForm(forms.Form): search_url = '/expo/search/' q = forms.CharField(label=_(u'Поиск'), required=False) w = forms.CharField(label=_(u'Где'), required=False) 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()] ) 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()} """ theme_with_tags = {} for tag in list(Tag.objects.language().filter()): if tag.theme_id in theme_with_tags: theme_with_tags[tag.theme_id].append({'name': tag.name, 'id':tag.id}) else: theme_with_tags[tag.theme_id] = [{'name': tag.name, 'id':tag.id}] #dsds self.theme_with_tags = theme_with_tags """ 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 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(Exposition).all() if q: sqs = sqs.auto_query(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 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