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