# -*- coding: utf-8 -*- from django import forms from models import Tag, Theme from bitfield.types import BitHandler from bitfield import BitField from bitfield.forms import BitFieldCheckboxSelectMultiple, BitFormField from django.conf import settings from ckeditor.widgets import CKEditorWidget from functions.translate import fill_with_signal from functions.admin_forms import AdminFilterForm from functions.form_check import translit_with_separator class ThemeForm(forms.Form): types = forms.MultipleChoiceField(label='Тип', required=False, choices=Theme.FLAGS, widget=forms.CheckboxSelectMultiple()) 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.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 from hvad.forms import TranslatableModelForm from .models import ThemeBlog 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()