# -*- 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 from django.utils.translation import ugettext as _ #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, ThemeBlog from exposition.models import Exposition from conference.models import Conference class BlogForm(forms.Form): type = Article.blog theme = forms.ModelMultipleChoiceField(label='Тематики', queryset=ThemeBlog.objects.all(), 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='Заголовок', required=required) self.fields['preview_%s' % code] = forms.CharField(label='Превью', required=False, widget=CKEditorWidget) self.fields['description_%s' % code] = forms.CharField(label='Описание', required=False, 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, author, article=None): data = self.cleaned_data # create new Article object or get exists if not article: article = Article() article.author = author article.type = self.type article.slug = data.get('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 if self.type == Article.blog: article.blog_theme.clear() article.blog_theme.add(*ThemeBlog.objects.filter(id__in=data['theme'])) else: 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) 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 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='Тематики', queryset=Theme.objects.all(), required=False, widget=forms.SelectMultiple(attrs={'style':'width: 550px'})) #exposition = forms.ModelChoiceField(label = u'Выставка', required=False, queryset=Exposition.objects.all()) #conference = forms.ModelChoiceField(label = u'Конференция', required=False, queryset=Conference.objects.all()) def save(self, author, article=None): article = super(NewsForm, self).save(author, article) exposition = self.cleaned_data.get('exposition') conference = self.cleaned_data.get('conference') article.exposition = exposition article.conference = conference 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 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 if not getattr(article, 'slug'): article.slug = 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',) #---------------------------------- """ from models import Blog class BlogForm(forms.ModelForm): class Meta: model = Blog exclude = ('created', 'modified', 'creator', 'theme', 'tag') 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): # 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'})) """ class ArticleFilterForm(forms.Form): theme = forms.MultipleChoiceField(label=_(u'Тематика:'), required=False, choices=[(item.id, item.name) for item in ThemeBlog.objects.language().distinct()]) tag = forms.CharField(label=_(u'Теги:'), widget=forms.HiddenInput(), required=False) ''' def __init__(self, *args, **kwargs): """ create dynamical translated fields fields """ super(ArticleFilterForm, self).__init__(*args, **kwargs) ids = [item['theme_id'] for item in list(Article.objects.blogs().values('theme_id').distinct())] 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 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 = [item['theme'] for item in list(Article.objects.blogs().values('theme').distinct())] self.fields['theme'] = forms.MultipleChoiceField(label=_(u'Тематика:'), required=False, choices=[(item.id, item.name) for item in ThemeBlog.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 = [item['theme'] for item in list(Article.objects.news().values('theme').distinct())] self.fields['theme'] = forms.MultipleChoiceField(label=_(u'Тематика:'), required=False, choices=[(item.id, item.name) for item in Theme.objects.language().exclude(article__id=None).filter(id__in=ids)])