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.
 
 
 
 
 
 

203 lines
7.7 KiB

# -*- coding: utf-8 -*-
import json
from django import forms
from django.core.exceptions import (
MultipleObjectsReturned,
ObjectDoesNotExist,
ValidationError
)
from django.db.models import Q
from django.utils.encoding import force_text
from django.utils.translation import ugettext as _
from django.conf import settings
from django.core.urlresolvers import reverse
from django.core.cache import cache
from functions.forms import (
ExpoTranslatableModelForm,
ExpoTranslatableModelForm_,
ML_ModelMultipleChoiceField
)
from functions.translate import fill_trans_fields_all
from theme.models import Theme
from article.models import Article
from ckeditor.widgets import CKEditorWidget
from city.models import City
from country.models import Country
from .models import (
Html, LandingComment, ParticipationComment, EventDefaultDescription
)
class HtmlForm(ExpoTranslatableModelForm):
class Meta:
model = Html
widgets = {
'text': CKEditorWidget,
}
class CommentForm(ExpoTranslatableModelForm_):
class Meta:
model = LandingComment
@property
def verbose(self):
return _(u'Редактировать комментарий') if self.instance.pk else _(u'Создать комментарий')
class ParticipationCommentForm(CommentForm):
class Meta:
model = ParticipationComment
class OredredMixin(object):
def clean(self, value):
if self.required and not value:
raise ValidationError(self.error_messages['required'])
elif not self.required and not value:
return self.queryset.none()
if not isinstance(value, (list, tuple)):
raise ValidationError(self.error_messages['list'])
key = self.to_field_name or 'pk'
values = []
for pk in value:
try:
values.append(self.queryset.get(**{key: pk}))
except (ValueError, MultipleObjectsReturned, ObjectDoesNotExist, ):
raise ValidationError(self.error_messages['invalid_pk_value'] % pk)
# qs = self.queryset.filter(**{'%s__in' % key: value})
pks = set([force_text(getattr(o, key)) for o in values])
for val in value:
if force_text(val) not in pks:
raise ValidationError(self.error_messages['invalid_choice'] % val)
# Since this overrides the inherited ModelChoiceField.clean
# we run custom validators here
self.run_validators(value)
return values
class OrderedModelMultipleChoiceField(OredredMixin, forms.ModelMultipleChoiceField):
"""A Ordered MultipleChoiceField whose choices are a model QuerySet."""
pass
class OML_MMChoiceField(OredredMixin, ML_ModelMultipleChoiceField):
pass
class MainPageThemes(forms.Form):
exposition_themes = OrderedModelMultipleChoiceField(queryset=Theme.objects.filter(types=Theme.types.exposition),
required=False)
conference_themes = OrderedModelMultipleChoiceField(queryset=Theme.objects.filter(types=Theme.types.conference),
required=False)
def save(self):
data = self.cleaned_data
exposition_themes = data['exposition_themes']
conference_themes = data['conference_themes']
Theme.objects.filter(Q(main_page_expo__gt=0) | Q(main_page_conf__gt=0)).update(main_page_expo=0, main_page_conf=0)
attributes = {'exposition_themes': 'main_page_expo', 'conference_themes': 'main_page_conf'}
for obj_list in attributes.keys():
for i, obj in enumerate(data[obj_list], 1):
obj.__class__.objects.filter(pk=obj.pk).update(**{attributes[obj_list]: i})
class MainPageNews(forms.Form):
main_page_news = forms.CharField(label=_(u'Новости'), widget=forms.HiddenInput(), required=False,)
def save(self):
data = self.cleaned_data
news = data['main_page_news']
Article.objects.news().exclude(id__in=[item.id for item in news]).update(main_page=0)
news.update(main_page=1)
def clean_main_page_news(self):
news = self.cleaned_data['main_page_news']
if news:
news = news.split(',')
qs = Article.objects.news().filter(id__in=news)
else:
qs = Article.objects.none()
return qs
class MainPageArticle(forms.Form):
article = forms.ModelMultipleChoiceField(queryset=Article.objects.blogs(), required=False,
widget=forms.SelectMultiple(attrs={'style': 'width: 100%;'}))
def save(self):
data = self.cleaned_data
articles = data['article']
Article.objects.blogs().exclude(id__in=[item.id for item in articles]).update(main_page=0)
articles.update(main_page=1)
class EventSectionSettingsForm(forms.Form):
verbose = _(u'Блок "самые популярные"')
expo_city = OML_MMChoiceField(label=_(u'Каталог городов (выставки)'),
queryset=City.objects.all(), required=False)
conf_city = OML_MMChoiceField(label=_(u'Каталог городов (конференции)'),
queryset=City.objects.all(), required=False)
expo_country = OML_MMChoiceField(label=_(u'Каталог стран (выставки)'),
queryset=Country.objects.all(), required=False)
conf_country = OML_MMChoiceField(label=_(u'Каталог стран (конференции)'),
queryset=Country.objects.all(), required=False)
def __init__(self, *args, **kwargs):
super(EventSectionSettingsForm, self).__init__(*args, **kwargs)
for name, field in self.fields.iteritems():
model = field.queryset.model.__name__.lower()
field.widget.attrs.update({
'data-ajax-url': reverse('admin_{model}_search'.format(model=model)),
'select2': 'true',
})
# if self.initial[name]:
# field.c_queryset = field.queryset.filter(pk__in=self.initial[name])
# field.widget.choices = field.choices
def save(self):
INI_CONFIG = settings.INI_CONFIG
if not INI_CONFIG.has_section('sections'):
INI_CONFIG.add_section('sections')
for option in ['expo_city', 'conf_city', 'expo_country', 'conf_country']:
INI_CONFIG.set('sections', option, json.dumps(map(lambda x: x.pk, self.cleaned_data.get(option))))
with open(settings.INI_CONFIG_PATH, 'wb') as configfile:
INI_CONFIG.write(configfile)
for lang_code, name in settings.LANGUAGES:
for key_attr in ['C_CITY_CATALOG_KEY', 'C_COUNTRY_CATALOG_KEY', 'E_CITY_CATALOG_KEY', 'E_COUNTRY_CATALOG_KEY']:
cache.delete(getattr(settings, key_attr) + '_' + lang_code)
class EventDefaultDescriptionEditForm(forms.Form):
def __init__(self, *args, **kwargs):
super(EventDefaultDescriptionEditForm, self).__init__(*args, **kwargs)
for lid, (code, name) in enumerate(settings.LANGUAGES):
self.fields['expo_description_%s' % code] = forms.CharField(
label=_(u'Описание для выставки'),
required=False,
widget=CKEditorWidget
)
self.fields['conf_description_%s' % code] = forms.CharField(
label=_(u'Описание для конференции'),
required=False,
widget=CKEditorWidget
)
def save(self, obj=None):
if obj is None:
obj = EventDefaultDescription()
id = None
else:
id = obj.id
data = self.cleaned_data
fill_trans_fields_all(EventDefaultDescription, obj, data, id)
return obj