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
8.2 KiB
203 lines
8.2 KiB
# -*- coding: utf-8 -*-
|
|
import os
|
|
import json
|
|
from itertools import chain
|
|
|
|
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.html import format_html
|
|
from django.utils.translation import ugettext as _
|
|
from django.conf import settings
|
|
from django.core.urlresolvers import reverse, reverse_lazy
|
|
from django.core.cache import cache
|
|
|
|
from functions.forms import (
|
|
ExpoTranslatableModelForm,
|
|
ExpoTranslatableModelForm_,
|
|
ML_ModelMultipleChoiceField
|
|
)
|
|
|
|
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
|
|
|
|
|
|
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):
|
|
e_description_ru = forms.CharField(label=_(u'Описание для выставки'), required=False, widget=CKEditorWidget)
|
|
e_description_en = forms.CharField(label=_(u'Описание для выставки'), required=False, widget=CKEditorWidget)
|
|
c_description_ru = forms.CharField(label=_(u'Описание для конференции'), required=False, widget=CKEditorWidget)
|
|
c_description_en = forms.CharField(label=_(u'Описание для конференции'), required=False, widget=CKEditorWidget)
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super(EventDefaultDescriptionEditForm, self).__init__(*args, **kwargs)
|
|
templates = settings.DEFAULT_DESCRIPTION
|
|
for field_name, path in templates.iteritems():
|
|
try:
|
|
with open(os.path.join(settings.SITE_ROOT, 'templates', path), 'r') as f:
|
|
self.initial[field_name] = f.read()
|
|
except Exception as e:
|
|
print(e)
|
|
|
|
# except:
|
|
# pass
|
|
|
|
def save(self):
|
|
templates = settings.DEFAULT_DESCRIPTION
|
|
for field_name, path in templates.iteritems():
|
|
try:
|
|
with open(os.path.join(settings.SITE_ROOT, 'templates', path), 'w+') as f:
|
|
f.write(self.cleaned_data.get(field_name).encode('utf-8'))
|
|
except Exception as e:
|
|
print(e)
|
|
# pass
|
|
|