# -*- coding: utf-8 -*- from datetime import timedelta from conference.models import Conference from django import forms from django.contrib.contenttypes.models import ContentType from django.utils.translation import ugettext_lazy as _ from exposition.models import Exposition _all = (('', _(u'Все')), ) section_choices = ( ('expo', _(u'Конференции')), ('conf', _(u'Выставки')), ) kind_choices = ( ('city', _(u'Город')), ('country', _(u'Страна')), ('tag', _(u'Тег')), ('theme', _(u'Тема')), ) class BaseDateFilter(forms.Form): date_begin = forms.DateField(label=_(u'Дата начала'), input_formats=['%Y-%m-%d', '%d.%m.%Y'], required=False) date_end = forms.DateField(label=_(u'Дата окончания'), input_formats=['%Y-%m-%d', '%d.%m.%Y'], required=False) def clean(self): date_begin = self.cleaned_data['date_begin'] date_end = self.cleaned_data['date_end'] if not date_begin and date_end: self.cleaned_data['date_begin'] = date_end - timedelta(days=14) elif date_begin and date_end and date_begin > date_end: raise forms.ValidationError( _(u'Дата начала должна быть меньше либо соответствовать дате окончания.'), code='invalid') return self.cleaned_data class DateFilter(BaseDateFilter): section = forms.ChoiceField(label=_(u'Раздел'), choices=_all + section_choices, required=False) kind = forms.ChoiceField(label=_(u'Тип'), choices=_all + kind_choices, required=False) class ByContentObjectsFilter(forms.Form): content_type = forms.IntegerField(label=_(u'Тип объекта'), widget=forms.HiddenInput(), required=False) ct_objects = forms.TypedMultipleChoiceField(label=_(u'Объект'), required=False, coerce=int) def __init__(self, *args, **kwargs): choices = kwargs.pop('choices') super(ByContentObjectsFilter, self).__init__(*args, **kwargs) self.fields['ct_objects'].choices = choices def clean_content_type(self): pk = self.cleaned_data['content_type'] if pk: return ContentType.objects.get_for_id(pk) return None event_choices = ( ('conference', _(u'Конференции')), ('exposition', _(u'Выставки')) ) class EventsDateFilter(BaseDateFilter): event = forms.ChoiceField(label=_(u'Событие'), choices=_all + event_choices, required=False) class EventsParamsFilter(forms.Form): country = forms.TypedMultipleChoiceField(label=_(u'Страна'), required=False, coerce=int) city = forms.TypedMultipleChoiceField(label=_(u'Город'), required=False, coerce=int) theme = forms.TypedMultipleChoiceField(label=_(u'Тема'), required=False, coerce=int) tag = forms.TypedMultipleChoiceField(label=_(u'Тег'), required=False, coerce=int) def __init__(self, *args, **kwargs): country_choices = kwargs.pop('country_choices', []) city_choices = kwargs.pop('city_choices', []) theme_choices = kwargs.pop('theme_choices', []) tag_choices = kwargs.pop('tag_choices', []) super(EventsParamsFilter, self).__init__(*args, **kwargs) self.fields['country'].choices = country_choices self.fields['city'].choices = city_choices self.fields['theme'].choices = theme_choices self.fields['tag'].choices = tag_choices