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.
 
 
 
 
 
 

175 lines
6.5 KiB

# -*- coding: utf-8 -*-
from bitfield import BitField
from bitfield.forms import BitFormField as _BitFormField
from bitfield.types import BitHandler
from ckeditor.widgets import CKEditorWidget
from django import forms
from django.conf import settings
from django.utils.translation import ugettext_lazy as _
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 django.utils.translation import ugettext as _
from .models import Tag, Theme
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=_(u'Название'), required=required)
self.fields['main_title_%s' % code] = forms.CharField(label=_(u'Заголовок'), required=required)
self.fields['description_%s' % code] = forms.CharField(label=_(u'Описание'), required=False, widget=CKEditorWidget)#with saving form
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
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=_(u'Название'), required=required)
self.fields['main_title_%s' % code] = forms.CharField(label=_(u'Заголовок'), required=required)
self.fields['description_%s' % code] = forms.CharField(label=_(u'Описание'), required=False, widget=CKEditorWidget)#with saving form
#meta data
self.fields['title_%s' % code] = forms.CharField(label=_(u'Тайтл'), required=False, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
self.fields['keywords_%s' % code] = forms.CharField(label=_(u'Description'), required=False, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
self.fields['descriptions_%s' % code] = forms.CharField(label=_(u'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 BitFormField(_BitFormField):
"""
instead int bit returns list witch we can query FOO__in
"""
def clean(self, value):
if not value:
return 0
# Assume an iterable which contains an item per flag that's enabled
result = []
l = [k for k, v in self.choices]
for k in value:
b = BitHandler(0, l)
try:
setattr(b, str(k), True)
except AttributeError:
raise ValidationError('Unknown choice: %r' % (k,))
result.append(int(b))
return result
class ThemeFilterForm(AdminFilterForm):
model = Theme
types = BitFormField(label=_(u'Тип'), required=False, choices=Theme.FLAGS)
def filter(self):
model = self.model
data = self.cleaned_data
qs = model.objects.all()
if data['types']:
qs = qs.filter(types__in=data['types'])
if data['exact_name']:
qs = qs.filter(translations__name=data['exact_name']).distinct()
return qs
if data['name']:
qs = qs.filter(translations__name__icontains=data['name']).distinct()
return qs
class TagFilterForm(AdminFilterForm):
model = Tag