diff --git a/emencia/django/newsletter/forms.py b/emencia/django/newsletter/forms.py index 148336a0..4fd0a961 100644 --- a/emencia/django/newsletter/forms.py +++ b/emencia/django/newsletter/forms.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()], diff --git a/emencia/django/newsletter/views/expo_views.py b/emencia/django/newsletter/views/expo_views.py index a3909caa..6bc02642 100644 --- a/emencia/django/newsletter/views/expo_views.py +++ b/emencia/django/newsletter/views/expo_views.py @@ -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: diff --git a/functions/forms.py b/functions/forms.py index 4bff664f..bf185a04 100644 --- a/functions/forms.py +++ b/functions/forms.py @@ -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 \ No newline at end of file diff --git a/proj/views.py b/proj/views.py index 41eb433d..68d93090 100644 --- a/proj/views.py +++ b/proj/views.py @@ -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 diff --git a/templates/admin/newsletters/contact_list.html b/templates/admin/newsletters/contact_list.html index 155360b4..1525896f 100644 --- a/templates/admin/newsletters/contact_list.html +++ b/templates/admin/newsletters/contact_list.html @@ -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; diff --git a/theme/views.py b/theme/views.py index ce83a38a..29efa6bf 100644 --- a/theme/views.py +++ b/theme/views.py @@ -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') \ No newline at end of file