# -*- 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_trans_fields, populate, ZERO_LANGUAGE, populate_all, fill_trans_fields_all class ThemeForm(forms.Form): types = forms.MultipleChoiceField(label='Тип', choices=Theme.FLAGS, widget=forms.CheckboxSelectMultiple())#initial=[item for item, name in Theme.FLAGS] 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) #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 # uses because in the next loop data will be overwritten theme.save() #populate fields with zero language zero_fields = {} fill_trans_fields_all(Theme, theme, data, id, zero_fields) #autopopulate #populate empty fields and fields which was already populated theme_id = getattr(theme, 'id') populate_all(Theme, data, theme_id, zero_fields) 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 data.get('theme'): tag.theme = Theme.objects.get(id=data['theme']) # uses because in the next loop data will be overwritten tag.save() #populate fields with zero language zero_fields = {} fill_trans_fields_all(Tag, tag, data, id, zero_fields) #autopopulate #populate empty fields and fields which was already populated tag_id = getattr(tag, 'id') populate_all(Tag, data, tag_id, zero_fields)