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.
 
 
 
 
 
 

120 lines
4.3 KiB

# -*- coding: utf-8 -*-
from article.models import Article
from ckeditor.widgets import CKEditorWidget
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 functions.forms import (
ExpoTranslatableModelForm,
ExpoTranslatableModelForm_
)
from theme.models import Theme
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 OrderedModelMultipleChoiceField(forms.ModelMultipleChoiceField):
"""A Ordered MultipleChoiceField whose choices are a model QuerySet."""
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 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):
setattr(obj, attributes[obj_list], i)
obj.save()
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)