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.
 
 
 
 
 
 

134 lines
5.8 KiB

# -*- 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)
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',)