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

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