# -*- coding: utf-8 -*- from django import forms from django.conf import settings from ckeditor.widgets import CKEditorWidget from django.core.exceptions import ValidationError from django.forms.util import ErrorList #functions from functions.translate import fill_with_signal from functions.files import check_tmp_files from functions.form_check import translit_with_separator #models from models import Article from accounts.models import User from theme.models import Theme, Tag class ArticleForm(forms.Form): """ Create Article form for creating conference __init__ uses for dynamic creates fields save function saves data in Article object. If it doesnt exist create new object """ #users that have organiser profile author = forms.ModelChoiceField(label='Автор',queryset=User.objects.exclude(organiser__isnull=True)) key = forms.CharField(required=False, widget=forms.HiddenInput()) theme = forms.ModelMultipleChoiceField(label='Тематики', queryset=Theme.objects.all()) #creates select input with empty choices cause it will be filled with ajax tag = forms.MultipleChoiceField(label='Теги', required=False) article_id = forms.CharField(required=False, widget=forms.HiddenInput()) def __init__(self, *args, **kwargs): """ create dynamical translated fields fields """ super(ArticleForm, 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='Заголовок', required=required) self.fields['preview_%s' % code] = forms.CharField(label='Превью', required=required, widget=CKEditorWidget) self.fields['description_%s' % code] = forms.CharField(label='Описание', required=required, widget=CKEditorWidget) #meta data self.fields['title_%s' % code] = forms.CharField(label='Тайтл', required=False, max_length=255, widget=forms.TextInput(attrs={'style':'width: 550px'})) self.fields['keywords_%s' % code] = forms.CharField(label='Дескрипшен', required=False, max_length=255, widget=forms.TextInput(attrs={'style':'width: 550px'})) self.fields['descriptions_%s' % code] = forms.CharField(label='Кейвордс', required=False, max_length=255, widget=forms.TextInput(attrs={'style':'width: 550px'})) def save(self, id=None): """ change Article object with id = id N/A add new Article object usage: form.save(obj) - if change article form.save() - if add article """ data = self.cleaned_data #create new Article object or get exists if not id: article = Article() else: article = Article.objects.get(id=id) #clear manytomany relations article.theme.clear() article.tag.clear() if data.get('author'): article.user = User.objects.get(id=data['author'].id)#.id cause select uses queryset #create slug field from russian language article.url = translit_with_separator(data['main_title_ru'].strip()).lower() # fill translated fields and save object fill_with_signal(Article, article, data) # fill manytomany fields for item in data['theme']: article.theme.add(item.id)#.id cause select uses queryset for item in data['tag']: article.tag.add(item) article.save() #save files check_tmp_files(article, data['key']) def clean(self): id = self.cleaned_data.get('article_id') main_title_ru = self.cleaned_data.get('main_title_ru') article = Article.objects.filter(url=translit_with_separator(main_title_ru)) if article and str(article[0].id) != id: msg = 'Статья с таким названием уже существует' self._errors['main_title_ru'] = ErrorList([msg]) del self.cleaned_data['main_title_ru'] return self.cleaned_data class ArticleDeleteForm(forms.ModelForm): url = forms.CharField(widget=forms.HiddenInput()) class Meta: model = Article fields = ('url',)