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.
192 lines
8.4 KiB
192 lines
8.4 KiB
# -*- coding: utf-8 -*-
|
|
from bitfield import BitField
|
|
from bitfield.forms import BitFieldCheckboxSelectMultiple, BitFormField
|
|
from bitfield.types import BitHandler
|
|
from ckeditor.widgets import CKEditorWidget
|
|
from django import forms
|
|
from django.conf import settings
|
|
from functions.admin_forms import AdminFilterForm
|
|
from functions.form_check import translit_with_separator
|
|
from functions.translate import fill_with_signal
|
|
from hvad.forms import TranslatableModelForm
|
|
|
|
from .models import Tag, Theme, ThemeBlog
|
|
|
|
|
|
class ThemeForm(forms.Form):
|
|
types = forms.MultipleChoiceField(label='Тип', required=False, choices=Theme.FLAGS, widget=forms.CheckboxSelectMultiple())
|
|
blogtheme_linking = forms.ModelChoiceField(
|
|
label=u'тема для блога', queryset=ThemeBlog.objects.all(), cache_choices=True, required=False,
|
|
help_text=u'''Выберите тему для блога, которая будет заменена на текущую тему.'''
|
|
u''' После миграции данных это поле будет удалено, а у всех статей у которых указана выбранная тема, будет заменена на текущую.''')
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super(ThemeForm, self).__init__(*args, **kwargs)
|
|
# creates translated form fields, 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):
|
|
# using enumerate for detect iteration number
|
|
# first iteration is a default lang so it required fields
|
|
required = True if lid == 0 else False
|
|
self.fields['name_%s' % code] = forms.CharField(label='Название', required=required)
|
|
self.fields['main_title_%s' % code] = forms.CharField(label='Заголовок', required=required)
|
|
self.fields['description_%s' % code] = forms.CharField(label='Описание', required=False, widget=CKEditorWidget)#with saving form
|
|
#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='Description', required=False, max_length=255,
|
|
widget=forms.TextInput(attrs={'style':'width: 550px'}))
|
|
self.fields['descriptions_%s' % code] = forms.CharField(label='Keywords', required=False, max_length=255,
|
|
widget=forms.TextInput(attrs={'style':'width: 550px'}))
|
|
|
|
def save(self, id=None):
|
|
data = self.cleaned_data
|
|
|
|
#create new Tag object or get exists
|
|
if not id:
|
|
theme = Theme()
|
|
else:
|
|
theme = Theme.objects.get(id=id)
|
|
|
|
if not getattr(theme, 'url'):
|
|
theme.url = translit_with_separator(data['name_ru'].strip()).lower()
|
|
|
|
|
|
#flag = 0
|
|
#for item in data['types']:
|
|
# flag = flag | getattr(Theme.types, item)
|
|
|
|
#generates bitfield
|
|
flag = reduce(lambda x,y: x|y, (getattr(Theme.types, item) for item in data['types']))
|
|
theme.types = flag
|
|
theme.blogtheme_linking = data['blogtheme_linking']
|
|
|
|
if theme.pk and theme.url:
|
|
theme.save()
|
|
|
|
fill_with_signal(Theme, theme, data)
|
|
if not theme.url:
|
|
theme.url = translit_with_separator(theme.name)
|
|
theme.save()
|
|
|
|
|
|
|
|
|
|
def clean_types(self):
|
|
"""
|
|
if not checked any of types automatic select all
|
|
"""
|
|
types = self.cleaned_data.get('types')
|
|
if not types:
|
|
types = [i for (i, k) in Theme.FLAGS]
|
|
return types
|
|
else:
|
|
return types
|
|
|
|
|
|
class TagForm(forms.Form):
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super(TagForm, self).__init__(*args, **kwargs)
|
|
# creates translated form fields, 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):
|
|
# using enumerate for detect iteration number
|
|
# first iteration is a default lang so it required fields
|
|
required = True if lid == 0 else False
|
|
self.fields['name_%s' % code] = forms.CharField(label='Название', required=required)
|
|
self.fields['main_title_%s' % code] = forms.CharField(label='Заголовок', required=required)
|
|
self.fields['description_%s' % code] = forms.CharField(label='Описание', required=False, widget=CKEditorWidget)#with saving form
|
|
#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='Description', required=False, max_length=255,
|
|
widget=forms.TextInput(attrs={'style':'width: 550px'}))
|
|
self.fields['descriptions_%s' % code] = forms.CharField(label='Keywords', required=False, max_length=255,)
|
|
|
|
themes = ((item.id, item.name) for item in Theme.objects.all())
|
|
self.fields['theme'] = forms.ChoiceField(label='Тема', choices=themes)
|
|
|
|
def save(self, id=None):
|
|
data = self.cleaned_data
|
|
#create new Tag object or get exists
|
|
if not id:
|
|
tag = Tag()
|
|
else:
|
|
tag = Tag.objects.get(id=id)
|
|
|
|
if not getattr(tag, 'url'):
|
|
tag.url = translit_with_separator(data['name_ru'].strip()).lower()
|
|
|
|
if data.get('theme'):
|
|
tag.theme = Theme.objects.get(id=data['theme'])
|
|
|
|
fill_with_signal(Tag, tag, data)
|
|
|
|
|
|
class ThemeDeleteForm(forms.ModelForm):
|
|
id = forms.CharField(widget=forms.HiddenInput())
|
|
|
|
class Meta:
|
|
model = Theme
|
|
fields = ('id',)
|
|
|
|
|
|
class TagDeleteForm(forms.ModelForm):
|
|
id = forms.CharField(widget=forms.HiddenInput())
|
|
|
|
class Meta:
|
|
model = Tag
|
|
fields = ('id',)
|
|
|
|
|
|
class ThemeFilterForm(AdminFilterForm):
|
|
model = Theme
|
|
|
|
|
|
class TagFilterForm(AdminFilterForm):
|
|
model = Tag
|
|
|
|
|
|
class _ThemeBlogForm(TranslatableModelForm):
|
|
class Meta:
|
|
model = ThemeBlog
|
|
fields = ['url', 'name', 'main_title', 'description', 'inflect']
|
|
widgets = {'url':forms.TextInput(attrs={'required':False})}
|
|
|
|
def save(self, commit= True):
|
|
if not 'url' in self.cleaned_data:
|
|
self.cleaned_data['url'] = translit_with_separator(self.cleaned_data['name'])
|
|
return super(_ThemeBlogForm, self).save(commit=True)
|
|
|
|
|
|
class ThemeBlogForm(forms.Form):
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super(ThemeBlogForm, self).__init__(*args, **kwargs)
|
|
# creates translated form fields, 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):
|
|
# using enumerate for detect iteration number
|
|
# first iteration is a default lang so it required fields
|
|
required = True if lid == 0 else False
|
|
self.fields['name_%s' % code] = forms.CharField(label='Название', required=required)
|
|
self.fields['main_title_%s' % code] = forms.CharField(label='Заголовок', required=required)
|
|
self.fields['description_%s' % code] = forms.CharField(label='Описание', required=False, widget=CKEditorWidget)#with saving form
|
|
|
|
def save(self, id=None):
|
|
data = self.cleaned_data
|
|
if not id:
|
|
theme = ThemeBlog()
|
|
else:
|
|
theme = ThemeBlog.objects.get(id=id)
|
|
if not getattr(theme, 'url'):
|
|
theme.url = translit_with_separator(data['name_ru'].strip()).lower()
|
|
|
|
fill_with_signal(ThemeBlog, theme, data)
|
|
if not theme.url:
|
|
theme.url = translit_with_separator(theme.name)
|
|
theme.save()
|
|
|