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.
89 lines
3.4 KiB
89 lines
3.4 KiB
# -*- 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
|
|
|