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