# -*- coding: utf-8 -*- from django import forms from django.conf import settings from django.forms.util import ErrorList from django.utils.translation import ugettext as _ from ckeditor.widgets import CKEditorWidget from functions.translate import fill_with_signal from functions.files import check_tmp_files from functions.form_check import translit_with_separator from .models import Article, Author from accounts.models import User from theme.models import Theme, Tag from exposition.models import Exposition from conference.models import Conference class _BlogForm(forms.Form): type = Article.blog theme = forms.ModelMultipleChoiceField( label=_(u'Тематики'), queryset=Theme.objects.filter(types=Theme.types.article), required=False, widget=forms.SelectMultiple(attrs={'style':'width: 550px'}) ) slug = forms.SlugField(label=_(u'URL'), max_length=255, min_length=1, required=False) publish_date = forms.DateField(label=_(u'Дата публикации'), input_formats=['%Y-%m-%d', '%d.%m.%Y'], required=False) tag = forms.CharField(label=_(u'Теги'), widget=forms.HiddenInput(), required=False) logo = forms.ImageField(label=_(u'Лого'), required=False) def __init__(self, *args, **kwargs): """ create dynamical translated fields fields """ super(_BlogForm, self).__init__(*args, **kwargs) #creates translated forms example: name_ru, name_en # len(10) is a hack for detect if settings.LANGUAGES is not configured it return all langs if len(settings.LANGUAGES) in range(10): for lid, (code, name) in enumerate(settings.LANGUAGES): # uses enumerate for detect iteration number # first iteration is a default lang so it required fields required = True if lid == 0 else False self.fields['main_title_%s' % code] = forms.CharField(label=_(u'Заголовок'), required=required) self.fields['preview_%s' % code] = forms.CharField(label=_(u'Превью'), required=False, widget=CKEditorWidget) self.fields['description_%s' % code] = forms.CharField(label=_(u'Описание'), required=False, widget=CKEditorWidget) #meta data self.fields['title_%s' % code] = forms.CharField(label=_(u'Тайтл'), required=False, max_length=255, widget=forms.TextInput(attrs={'style':'width: 550px'})) self.fields['keywords_%s' % code] = forms.CharField(label=_(u'Кейвордс'), required=False, max_length=255, widget=forms.TextInput(attrs={'style':'width: 550px'})) self.fields['descriptions_%s' % code] = forms.CharField(label=_(u'Дескрипшен'), required=False, max_length=255, widget=forms.TextInput(attrs={'style':'width: 550px'})) def save(self, author, article=None, commit=True): data = self.cleaned_data # create new Article object or get exists if not article: article = Article() article.author = author article.type = self.type if not getattr(article, 'slug', None): article.slug = data['slug'] if data['logo']: article.logo = data['logo'] article.publish_date = data['publish_date'] # fill translated fields and save object fill_with_signal(Article, article, data) # fill manytomany fields article.theme.clear() article.theme.add(*Theme.objects.filter(id__in=data['theme'])) article.tag.clear() article.tag.add(*Tag.objects.filter(id__in=data['tag'])) #for item in data['theme']: # article.theme.add(item.id)#.id cause select uses queryset #for item in data['tag']: # article.tag.add(item) if commit == True: article.save() return article def clean_tag(self): tags = self.cleaned_data.get('tag') if tags: res = [] for id in tags.split(','): try: res.append(int(id)) except: continue return res else: return [] class BlogForm(_BlogForm): author = forms.ModelChoiceField(label=_(u'Автор'), queryset=Author.objects.all()) draft = forms.BooleanField(label=_(u'Черновик'), required=False, localize=True) def __init__(self, *args, **kwargs): super(BlogForm, self).__init__(*args, **kwargs) if len(settings.LANGUAGES) in range(10): for lid, (code, name) in enumerate(settings.LANGUAGES): # required = True if lid == 0 else False self.fields['short_description_%s' % code] = forms.CharField(label=_(u'Краткое содержание'), required=False, widget=CKEditorWidget) def save(self, author, article=None, commit=True): article = super(BlogForm, self).save(author, article=article, commit=False) article.draft = self.cleaned_data['draft'] article.author_s = self.cleaned_data['author'] article.save() return article class NewsForm(_BlogForm): type = Article.news exposition = forms.CharField(label=_(u'Выставка'), widget=forms.HiddenInput(), required=False) conference = forms.CharField(label=_(u'Конференция'), widget=forms.HiddenInput(), required=False) theme = forms.ModelMultipleChoiceField(label=_(u'Тематики'), queryset=Theme.objects.all(), required=False, widget=forms.SelectMultiple(attrs={'style':'width: 550px'})) def save(self, author, article=None): article = super(NewsForm, self).save(author, article, commit=False) exposition = self.cleaned_data.get('exposition') conference = self.cleaned_data.get('conference') theme = self.cleaned_data.get('theme') article.exposition = exposition article.conference = conference article.theme = theme article.save() return article def clean_exposition(self): id = self.cleaned_data['exposition'] if not id: return None try: return Exposition.objects.get(id=id) except Exposition.DoesNotExist: return None def clean_conference(self): id = self.cleaned_data['conference'] if not id: return None try: return Conference.objects.get(id=id) except Conference.DoesNotExist: return None class BlogFilterForm(forms.Form): tag = forms.CharField(label=_(u'Теги:'), widget=forms.HiddenInput(), required=False) def __init__(self, *args, **kwargs): """ create dynamical translated fields fields """ super(BlogFilterForm, self).__init__(*args, **kwargs) ids = set(Article.objects.filter(type=Article.blog, theme__isnull=False).values_list('theme', flat=True)) # ids = set([item['theme'] for item in list(Article.objects.blogs().filter(theme__isnull=False).values('theme'))]) self.fields['theme'] = forms.MultipleChoiceField(label=_(u'Тематика:'), required=False, choices=[(item.id, item.name) for item in Theme.objects.language().filter(id__in=ids)]) class NewsFilterForm(forms.Form): tag = forms.CharField(label=_(u'Теги:'), widget=forms.HiddenInput(), required=False) def __init__(self, *args, **kwargs): """ create dynamical translated fields fields """ super(NewsFilterForm, self).__init__(*args, **kwargs) ids = set([item['theme'] for item in list(Article.objects.news().values('theme'))]) self.fields['theme'] = forms.MultipleChoiceField(label=_(u'Тематика:'), required=False, choices=[(item.id, item.name) for item in Theme.objects.language().filter(id__in=ids)])