'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(
label="Город",
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(
label="Area", choices=[(c.id, c.name) for c in list(set(Area.objects.language()))],
required=False
)
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="Список рассылки",
required=False
)
@ -176,7 +177,7 @@ class ContactImportForm(forms.Form):
sheet = book.sheet_by_index(0)
row_list = [sheet.row_values(row_number) for row_number in range(1, sheet.nrows)]
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)
try:
c.save()
@ -189,6 +190,7 @@ class ContactImportForm(forms.Form):
cs.country.add(country)
cs.save()
class AbstractSubscribeForm(forms.ModelForm):
email = forms.EmailField(widget=forms.TextInput(attrs={'placeholder': 'Email'}))
@ -226,8 +228,7 @@ class AbstractSubscribeForm(forms.ModelForm):
return Theme.objects.filter(id__in=themes)
class SubsribeAssideForm(AbstractSubscribeForm):
class SubscribeAssideForm(AbstractSubscribeForm):
city = forms.CharField(
widget=forms.HiddenInput(attrs={'id': 'id_subscription_city', 'placeholder': _(u'Город')}),
required=False)
@ -237,7 +238,7 @@ class SubsribeAssideForm(AbstractSubscribeForm):
widget=forms.Select(attrs={'placeholder': _(u'Периодичность'), 'id': 'id_subscription_periodic'}))
def __init__(self, *args, **kwargs):
super(SubsribeAssideForm, self).__init__(*args, **kwargs)
super(SubscribeAssideForm, self).__init__(*args, **kwargs)
lang = translation.get_language()
self.fields['theme'] = forms.MultipleChoiceField(
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 emencia.django.newsletter.forms import ContactForm, ContactSettingsForm
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 country.models import Country
@ -112,7 +112,7 @@ class ActivationView(TemplateView):
def subscribe_aside(request):
if request.POST:
response = {'success': False}
form = SubsribeAssideForm(request.POST)
form = SubscribeAssideForm(request.POST)
if form.is_valid():
email = form.cleaned_data['email']
try:

@ -3,6 +3,7 @@ from django import forms
from django.utils.translation import ugettext_lazy as _
from theme.models import Theme
from haystack.query import SearchQuerySet
from django.db.models import ObjectDoesNotExist
class AdminSearchForm(forms.Form):
search_name = forms.CharField(required=False, max_length=50)
@ -62,3 +63,82 @@ from place_exposition.models import EXPOSITION_TYPE
class SearchPlaceExpositionForm(AbstractSearch):
model = PlaceExposition
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 exposition.models import Exposition
from conference.models import Conference
from emencia.django.newsletter.forms import SubsribeAssideForm
from emencia.django.newsletter.forms import SubscribeAssideForm
def clear_slashes(str_):
@ -39,7 +39,7 @@ def expo_context(request):
cont = {'theme_search_form': ThemeSearch(), 'expo_catalog': Exposition.catalog,
'book_aid': settings.BOOKING_AID, 'blogs': Article.objects.main_page_blogs(),
'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

@ -142,7 +142,7 @@
$(document).ready(function () {
$("#id_theme").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_mailinglist").select2({width: 283, placeholder: 'Список рассылки'});
var get_param = window.location.search;

@ -7,7 +7,7 @@ def get_tag(request):
#if request.is_ajax():
themes = request.GET.getlist('themes[]')
term = request.GET['term'].capitalize()
qs = Tag.objects.language().exclude(theme__article__id=None).distinct()
qs = Tag.objects.language().distinct()
if term:
qs = qs.filter(translations__name__contains=term)
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 = 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')
Loading…
Cancel
Save