'new' TranslatableModelForm for work with translation widget

remotes/origin/1203
Ivan Kovalkovskyi 10 years ago
parent de9867b7a6
commit fcb1e31af6
  1. 13
      emencia/django/newsletter/forms.py
  2. 4
      emencia/django/newsletter/views/expo_views.py
  3. 80
      functions/forms.py
  4. 4
      proj/views.py
  5. 2
      templates/admin/newsletters/contact_list.html
  6. 16
      theme/views.py

@ -108,14 +108,15 @@ class ContactFilterForm(forms.Form):
city = forms.MultipleChoiceField( city = forms.MultipleChoiceField(
label="Город", label="Город",
choices=[(c.id, c.name) for c in list(set(City.objects.language('ru').filter(contactsettings__isnull=False)))], choices=[(c.id, c.name) for c in list(set(City.objects.language('ru').filter(contactsettings__isnull=False)))],
required=False required=False,
widget= forms.SelectMultiple(attrs={'id':'cities'})
) )
area = forms.MultipleChoiceField( area = forms.MultipleChoiceField(
label="Area", choices=[(c.id, c.name) for c in list(set(Area.objects.language()))], label="Area", choices=[(c.id, c.name) for c in list(set(Area.objects.language()))],
required=False required=False
) )
mailinglist = forms.ChoiceField( mailinglist = forms.ChoiceField(
choices=[(ml.id, ml.name) for ml in MailingList.objects.all()], choices=[("", "---")]+[(ml.id, ml.name) for ml in MailingList.objects.all()],
label="Список рассылки", label="Список рассылки",
required=False required=False
) )
@ -176,7 +177,7 @@ class ContactImportForm(forms.Form):
sheet = book.sheet_by_index(0) sheet = book.sheet_by_index(0)
row_list = [sheet.row_values(row_number) for row_number in range(1, sheet.nrows)] row_list = [sheet.row_values(row_number) for row_number in range(1, sheet.nrows)]
for row in row_list: for row in row_list:
c = Contact(email = row[0], first_name=row[1].split()[0], last_name=row[1].split()[-1], tester=is_tester, c = Contact(email = row[0], first_name=row[1], last_name="", tester=is_tester,
activated=activated, valid=True, subscriber=True) activated=activated, valid=True, subscriber=True)
try: try:
c.save() c.save()
@ -189,6 +190,7 @@ class ContactImportForm(forms.Form):
cs.country.add(country) cs.country.add(country)
cs.save() cs.save()
class AbstractSubscribeForm(forms.ModelForm): class AbstractSubscribeForm(forms.ModelForm):
email = forms.EmailField(widget=forms.TextInput(attrs={'placeholder': 'Email'})) email = forms.EmailField(widget=forms.TextInput(attrs={'placeholder': 'Email'}))
@ -226,8 +228,7 @@ class AbstractSubscribeForm(forms.ModelForm):
return Theme.objects.filter(id__in=themes) return Theme.objects.filter(id__in=themes)
class SubscribeAssideForm(AbstractSubscribeForm):
class SubsribeAssideForm(AbstractSubscribeForm):
city = forms.CharField( city = forms.CharField(
widget=forms.HiddenInput(attrs={'id': 'id_subscription_city', 'placeholder': _(u'Город')}), widget=forms.HiddenInput(attrs={'id': 'id_subscription_city', 'placeholder': _(u'Город')}),
required=False) required=False)
@ -237,7 +238,7 @@ class SubsribeAssideForm(AbstractSubscribeForm):
widget=forms.Select(attrs={'placeholder': _(u'Периодичность'), 'id': 'id_subscription_periodic'})) widget=forms.Select(attrs={'placeholder': _(u'Периодичность'), 'id': 'id_subscription_periodic'}))
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(SubsribeAssideForm, self).__init__(*args, **kwargs) super(SubscribeAssideForm, self).__init__(*args, **kwargs)
lang = translation.get_language() lang = translation.get_language()
self.fields['theme'] = forms.MultipleChoiceField( self.fields['theme'] = forms.MultipleChoiceField(
choices=[(item.pk, get_by_lang(item, 'name', lang)) for item in SearchQuerySet().models(Theme).all()], choices=[(item.pk, get_by_lang(item, 'name', lang)) for item in SearchQuerySet().models(Theme).all()],

@ -5,7 +5,7 @@ from django.http import HttpResponseRedirect, HttpResponse
from django.shortcuts import redirect from django.shortcuts import redirect
from emencia.django.newsletter.forms import ContactForm, ContactSettingsForm from emencia.django.newsletter.forms import ContactForm, ContactSettingsForm
from emencia.django.newsletter.models import Contact, ContactSettings from emencia.django.newsletter.models import Contact, ContactSettings
from emencia.django.newsletter.forms import SubsribeAssideForm from emencia.django.newsletter.forms import SubscribeAssideForm
from accounts.models import User from accounts.models import User
from country.models import Country from country.models import Country
@ -112,7 +112,7 @@ class ActivationView(TemplateView):
def subscribe_aside(request): def subscribe_aside(request):
if request.POST: if request.POST:
response = {'success': False} response = {'success': False}
form = SubsribeAssideForm(request.POST) form = SubscribeAssideForm(request.POST)
if form.is_valid(): if form.is_valid():
email = form.cleaned_data['email'] email = form.cleaned_data['email']
try: try:

@ -3,6 +3,7 @@ from django import forms
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from theme.models import Theme from theme.models import Theme
from haystack.query import SearchQuerySet from haystack.query import SearchQuerySet
from django.db.models import ObjectDoesNotExist
class AdminSearchForm(forms.Form): class AdminSearchForm(forms.Form):
search_name = forms.CharField(required=False, max_length=50) search_name = forms.CharField(required=False, max_length=50)
@ -62,3 +63,82 @@ from place_exposition.models import EXPOSITION_TYPE
class SearchPlaceExpositionForm(AbstractSearch): class SearchPlaceExpositionForm(AbstractSearch):
model = PlaceExposition model = PlaceExposition
type = forms.ChoiceField(choices=EXPOSITION_TYPE, required=False) type = forms.ChoiceField(choices=EXPOSITION_TYPE, required=False)
from django.conf import settings
from django.utils.translation import get_language
from django.forms.models import save_instance
class TranslatableModelForm(forms.ModelForm):
translatable_fields = []
def __init__(self, *args, **kwargs):
inst = kwargs.get('instance')
veto_fields= ['id', 'master', 'language_code']
self.all_tr_field_names = [field.name for field in self._meta.model.translations.related.editable_fields() if field.name not in veto_fields]
if inst:
init_tr_data = self.fill_init_field(inst)
if kwargs['initial']:
kwargs['initial'].update(init_tr_data)
else:
kwargs.update({'initial':init_tr_data})
super(TranslatableModelForm, self).__init__(*args, **kwargs)
if not self.translatable_fields:
self.translatable_fields = self.all_tr_field_names
fkwargs = {field.name: field for field in self._meta.model.translations.related.editable_fields() if field.name not in veto_fields}
for code, name in settings.LANGUAGES:
for tr_field in self.translatable_fields:
field = fkwargs[tr_field].formfield()
field.required=False
self.fields[tr_field+"_"+code] = field
def clean(self):
data = self.cleaned_data
init_lang = get_language()[:2]
data.update(self.data_by_lang[init_lang])
return data
def save(self, commit=True):
init_lang = get_language()[:2]
data = self.cleaned_data
langs = [code for code, _ in settings.LANGUAGES]
is_new = not self.instance.pk
inst = super(TranslatableModelForm, self).save()
if is_new:
for lang in self.data_by_lang:
if lang is not init_lang:
inst.translate(lang)
for key, value in self.data_by_lang[lang].items():
setattr(inst, key, value)
inst.save_translations(inst)
else:
translations = {obj.language_code:obj for obj in list(inst.translations.all())}
for lang in self.data_by_lang:
if lang is not init_lang:
try:
tr = translations[lang]
except KeyError: # there are no available translation in db
tr = inst.translate(lang)
for key, value in self.data_by_lang[lang].iteritems(): #{en:{name:adf, descr:jkdl}, ru:{name:fjfj, descr:jfjf}}
setattr(tr, key, value)
tr.save()
self.instance = inst.lazy_translation_getter(init_lang)
return self.instance
@property
def data_by_lang(self):
res = {}
for lang in [code for code, _ in settings.LANGUAGES]:
res[lang] = {key[:-3]:self.cleaned_data[key] for key in self.cleaned_data if key.endswith("_%s"%lang)and self.cleaned_data[key]}
result = {k: v for k, v in res.iteritems() if v}
return result
def fill_init_field(self, inst):
init_tr_data = {}
for code in inst.get_available_languages():
translation = inst.translations.get(language_code=code)
for field in self.all_tr_field_names:
init_tr_data[field+"_%s" % code] = getattr(translation,field)
return init_tr_data

@ -13,7 +13,7 @@ from theme.models import Theme
from article.models import Article from article.models import Article
from exposition.models import Exposition from exposition.models import Exposition
from conference.models import Conference from conference.models import Conference
from emencia.django.newsletter.forms import SubsribeAssideForm from emencia.django.newsletter.forms import SubscribeAssideForm
def clear_slashes(str_): def clear_slashes(str_):
@ -39,7 +39,7 @@ def expo_context(request):
cont = {'theme_search_form': ThemeSearch(), 'expo_catalog': Exposition.catalog, cont = {'theme_search_form': ThemeSearch(), 'expo_catalog': Exposition.catalog,
'book_aid': settings.BOOKING_AID, 'blogs': Article.objects.main_page_blogs(), 'book_aid': settings.BOOKING_AID, 'blogs': Article.objects.main_page_blogs(),
'news_list': Article.objects.main_page_news(), 'sng_countries': settings.SNG_COUNTRIES, 'news_list': Article.objects.main_page_news(), 'sng_countries': settings.SNG_COUNTRIES,
'seo_text': add_seo(request), 'announce_subscribe': SubsribeAssideForm() 'seo_text': add_seo(request), 'announce_subscribe': SubscribeAssideForm()
} }
user = request.user user = request.user

@ -142,7 +142,7 @@
$(document).ready(function () { $(document).ready(function () {
$("#id_theme").select2({width: 283, placeholder: 'Тематики'}); $("#id_theme").select2({width: 283, placeholder: 'Тематики'});
$("#id_country").select2({width: 283, placeholder: 'Страны'}); $("#id_country").select2({width: 283, placeholder: 'Страны'});
$("#id_city").select2({width: 283, placeholder: 'Города'}); $("#cities").select2({width: 283, placeholder: 'Города'});
$("#id_area").select2({width: 283, placeholder: 'Географическая зона'}); $("#id_area").select2({width: 283, placeholder: 'Географическая зона'});
$("#id_mailinglist").select2({width: 283, placeholder: 'Список рассылки'}); $("#id_mailinglist").select2({width: 283, placeholder: 'Список рассылки'});
var get_param = window.location.search; var get_param = window.location.search;

@ -7,7 +7,7 @@ def get_tag(request):
#if request.is_ajax(): #if request.is_ajax():
themes = request.GET.getlist('themes[]') themes = request.GET.getlist('themes[]')
term = request.GET['term'].capitalize() term = request.GET['term'].capitalize()
qs = Tag.objects.language().exclude(theme__article__id=None).distinct() qs = Tag.objects.language().distinct()
if term: if term:
qs = qs.filter(translations__name__contains=term) qs = qs.filter(translations__name__contains=term)
if themes: if themes:
@ -28,4 +28,18 @@ def get_article_tags(request):
result = [{'id': tag.id, 'label': '%s (%s)'%(tag.name, tag.theme.name)} for tag in qs] result = [{'id': tag.id, 'label': '%s (%s)'%(tag.name, tag.theme.name)} for tag in qs]
result = sorted(result, key=lambda x:x['label']) result = sorted(result, key=lambda x:x['label'])
return HttpResponse(json.dumps(result), content_type='application/json')
def get_news_tags(request):
themes = request.GET.getlist('themes[]')
term = request.GET['term'].capitalize()
qs = Tag.objects.language().exclude(article=None).filter(article__type=2).distinct()
if term:
qs = qs.filter(translations__name__contains=term)
if themes:
qs = qs.filter(theme__id__in=themes).order_by('translations__name')
result = [{'id': tag.id, 'label': '%s (%s)'%(tag.name, tag.theme.name)} for tag in qs]
result = sorted(result, key=lambda x:x['label'])
return HttpResponse(json.dumps(result), content_type='application/json') return HttpResponse(json.dumps(result), content_type='application/json')
Loading…
Cancel
Save