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.
 
 
 
 
 
 

162 lines
7.1 KiB

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