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.5 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_with_signal
from functions.admin_forms import AdminFilterForm
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)
#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)
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 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