From d34d38cc0f78b09cf0a9ca96cec72929c3d86d63 Mon Sep 17 00:00:00 2001 From: Slava Kyrachevsky Date: Mon, 13 Mar 2017 13:21:45 +0200 Subject: [PATCH] =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB=20=D0=BB=D0=BE?= =?UTF-8?q?=D0=B3=D0=B8=D0=BA=D1=83=20=D1=81=D0=BE=D1=85=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B4=D0=B5=D1=84=D0=BE=D0=BB=D1=82?= =?UTF-8?q?=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D1=81=D0=BE=D0=B1=D1=8B=D1=82=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/conference/views.py | 23 +++-- apps/exposition/views.py | 24 +++-- apps/functions/translate.py | 2 +- apps/settings/admin.py | 29 +++++- apps/settings/admin_urls.py | 20 ++-- apps/settings/forms.py | 54 +++++------ ...ontranslation__add_unique_eventdefaultd.py | 97 +++++++++++++++++++ apps/settings/models.py | 16 +++ proj/settings.py | 6 -- requirements.txt | 2 +- .../c_admin/settings/default_description.html | 64 ++++++------ .../conference/default_description_en.html | 0 .../conference/default_description_ru.html | 0 .../exposition/default_description_en.html | 0 .../exposition/default_description_ru.html | 0 15 files changed, 236 insertions(+), 101 deletions(-) create mode 100644 apps/settings/migrations/0002_auto__add_eventdefaultdescriptiontranslation__add_unique_eventdefaultd.py delete mode 100644 templates/client/includes/conference/default_description_en.html delete mode 100644 templates/client/includes/conference/default_description_ru.html delete mode 100644 templates/client/includes/exposition/default_description_en.html delete mode 100644 templates/client/includes/exposition/default_description_ru.html diff --git a/apps/conference/views.py b/apps/conference/views.py index 6631a7d7..b662e1c5 100644 --- a/apps/conference/views.py +++ b/apps/conference/views.py @@ -41,9 +41,9 @@ from stats_collector.mixin import ( ) from theme.models import Tag, Theme from events.mixin import ConfFilterMixin +from settings.models import EventDefaultDescription MONTHES = settings.MONTHES -description_templates = settings.DEFAULT_DESCRIPTION class ConferenceBy(ConfFilterMixin, ConfSectionMixin, JitterCacheMixin, MetadataMixin, ListView): @@ -438,14 +438,19 @@ class ConferenceDetail(ObjectStatMixin, CommentMixin, JitterCacheMixin, Metadata model = Conference slug_field = 'url' template_name = 'client/conference/conference_detail.html' - descriptions = { - 'ru': render_to_string( - settings.DEFAULT_DESCRIPTION.get('c_description_ru') - ), - 'en': render_to_string( - settings.DEFAULT_DESCRIPTION.get('c_description_en') - ), - } + descriptions = {} + try: + descriptions.update( + {'ru': EventDefaultDescription.objects.language('ru').all()[0].conf_description} + ) + except IndexError: + pass + try: + descriptions.update( + {'en': EventDefaultDescription.objects.language('en').all()[0].conf_description} + ) + except IndexError: + pass def dispatch(self, request, *args, **kwargs): diff --git a/apps/exposition/views.py b/apps/exposition/views.py index bfb82852..ce2bf073 100644 --- a/apps/exposition/views.py +++ b/apps/exposition/views.py @@ -40,8 +40,7 @@ from stats_collector.mixin import ( ) from theme.models import Tag, Theme from events.mixin import ExpoFilterMixin, SearchFilterMixin - -description_templates = settings.DEFAULT_DESCRIPTION +from settings.models import EventDefaultDescription class ExpositionBy(ExpoFilterMixin, ExpoSectionMixin, JitterCacheMixin, MetadataMixin, ListView): @@ -186,14 +185,19 @@ class ExpoDetail(ObjectStatMixin, JitterCacheMixin, MetadataMixin, DetailView): queryset = Exposition.objects.language()\ .select_related('place', 'city', 'country', 'paid_new')\ .prefetch_related('theme', 'tag') - descriptions = { - 'ru': render_to_string( - settings.DEFAULT_DESCRIPTION.get('e_description_ru') - ), - 'en': render_to_string( - settings.DEFAULT_DESCRIPTION.get('e_description_en') - ), - } + descriptions = {} + try: + descriptions.update( + {'ru': EventDefaultDescription.objects.language('ru').all()[0].expo_description} + ) + except IndexError: + pass + try: + descriptions.update( + {'en': EventDefaultDescription.objects.language('en').all()[0].expo_description} + ) + except IndexError: + pass def get_context_data(self, **kwargs): lang = translation.get_language() diff --git a/apps/functions/translate.py b/apps/functions/translate.py index 03f5dddb..25a92684 100644 --- a/apps/functions/translate.py +++ b/apps/functions/translate.py @@ -28,7 +28,7 @@ def fill_trans_fields(obj=None, data={}, lang=''): for field in list: n = data.get('%s_%s'%(field.name,lang)) if n != None: - setattr(obj,str(field.name), n) + setattr(obj, str(field.name), n) def fill_trans_fields_r(obj=None, data={}, lang=''): # filling and returnig an object diff --git a/apps/settings/admin.py b/apps/settings/admin.py index 20d176eb..9b921202 100644 --- a/apps/settings/admin.py +++ b/apps/settings/admin.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- import json -from django.shortcuts import render_to_response -from django.views.generic import FormView +from django.shortcuts import render_to_response, redirect +from django.views.generic import FormView, UpdateView from django.http import HttpResponseRedirect from django.core.urlresolvers import reverse, reverse_lazy from django.core.context_processors import csrf @@ -15,6 +15,9 @@ from .forms import MainPageNews from .forms import MainPageThemes from .forms import EventSectionSettingsForm from .forms import EventDefaultDescriptionEditForm +from .models import EventDefaultDescription + +from hvad.views import TranslatableModelFormMixin def handle_form(request, form): @@ -100,11 +103,27 @@ class EventSectionSettings(ContextMixin, FormView): return super(EventSectionSettings, self).form_valid(form) -class EventDefaultDescription(ContextMixin, FormView): +class EventDefaultDescriptionView(ContextMixin, FormView): form_class = EventDefaultDescriptionEditForm template_name = 'c_admin/settings/default_description.html' success_url = reverse_lazy('settings_default_description') + def get_object(self): + try: + return EventDefaultDescription.objects.language().all()[0] + except IndexError: + return None + + def get_initial(self): + data = super(EventDefaultDescriptionView, self).get_initial() + self.object = self.get_object() + if self.object is not None and self.request.method != 'POST': + for code, name in settings.LANGUAGES: + obj = EventDefaultDescription._meta.translations_model.objects.get(language_code=code, master_id=self.object.pk) + data['expo_description_%s' % code] = obj.expo_description + data['conf_description_%s' % code] = obj.conf_description + return data + def form_valid(self, form): - form.save() - return super(EventDefaultDescription, self).form_valid(form) + form.save(obj=self.get_object()) + return redirect(self.get_success_url()) diff --git a/apps/settings/admin_urls.py b/apps/settings/admin_urls.py index ed0cc041..88ac845a 100644 --- a/apps/settings/admin_urls.py +++ b/apps/settings/admin_urls.py @@ -1,20 +1,20 @@ # -*- coding: utf-8 -*- -from django.conf.urls import patterns, include, url +from django.conf.urls import patterns, url from .admin import handle_themes from .admin import handle_news from .admin import handle_articles from .admin import main_page from .admin import EventSectionSettings -from .admin import EventDefaultDescription +from .admin import EventDefaultDescriptionView -urlpatterns = patterns('', - url(r'^main-page/themes/', handle_themes, name='settings_main_page_themes'), - url(r'^main-page/news/$', handle_news, name='settings_main_page_news'), - url(r'^main-page/blogs/$', handle_articles, name='settings_main_page_articles'), - - url(r'^main-page/$', main_page, name='settings_main_page'), - url(r'^sections/$', EventSectionSettings.as_view(), name='settings_sections'), - url(r'^description/$', EventDefaultDescription.as_view(), name='settings_default_description'), +urlpatterns = patterns( + '', + url(r'^main-page/themes/', handle_themes, name='settings_main_page_themes'), + url(r'^main-page/news/$', handle_news, name='settings_main_page_news'), + url(r'^main-page/blogs/$', handle_articles, name='settings_main_page_articles'), + url(r'^main-page/$', main_page, name='settings_main_page'), + url(r'^sections/$', EventSectionSettings.as_view(), name='settings_sections'), + url(r'^description/$', EventDefaultDescriptionView.as_view(), name='settings_default_description'), ) diff --git a/apps/settings/forms.py b/apps/settings/forms.py index 81dc507b..92cb76fa 100644 --- a/apps/settings/forms.py +++ b/apps/settings/forms.py @@ -1,7 +1,5 @@ # -*- coding: utf-8 -*- -import os import json -from itertools import chain from django import forms from django.core.exceptions import ( @@ -11,10 +9,9 @@ from django.core.exceptions import ( ) from django.db.models import Q from django.utils.encoding import force_text -# from django.utils.html import format_html from django.utils.translation import ugettext as _ from django.conf import settings -from django.core.urlresolvers import reverse, reverse_lazy +from django.core.urlresolvers import reverse from django.core.cache import cache from functions.forms import ( @@ -22,6 +19,7 @@ from functions.forms import ( ExpoTranslatableModelForm_, ML_ModelMultipleChoiceField ) +from functions.translate import fill_trans_fields_all from theme.models import Theme from article.models import Article @@ -29,7 +27,9 @@ from ckeditor.widgets import CKEditorWidget from city.models import City from country.models import Country -from .models import Html, LandingComment, ParticipationComment +from .models import ( + Html, LandingComment, ParticipationComment, EventDefaultDescription +) class HtmlForm(ExpoTranslatableModelForm): @@ -174,30 +174,30 @@ class EventSectionSettingsForm(forms.Form): class EventDefaultDescriptionEditForm(forms.Form): - e_description_ru = forms.CharField(label=_(u'Описание для выставки'), required=False, widget=CKEditorWidget) - e_description_en = forms.CharField(label=_(u'Описание для выставки'), required=False, widget=CKEditorWidget) - c_description_ru = forms.CharField(label=_(u'Описание для конференции'), required=False, widget=CKEditorWidget) - c_description_en = forms.CharField(label=_(u'Описание для конференции'), required=False, widget=CKEditorWidget) def __init__(self, *args, **kwargs): super(EventDefaultDescriptionEditForm, self).__init__(*args, **kwargs) - templates = settings.DEFAULT_DESCRIPTION - for field_name, path in templates.iteritems(): - try: - with open(os.path.join(settings.SITE_ROOT, 'templates', path), 'r') as f: - self.initial[field_name] = f.read() - except Exception as e: - print(e) - # except: - # pass + for lid, (code, name) in enumerate(settings.LANGUAGES): + self.fields['expo_description_%s' % code] = forms.CharField( + label=_(u'Описание для выставки'), + required=False, + widget=CKEditorWidget + ) + self.fields['conf_description_%s' % code] = forms.CharField( + label=_(u'Описание для конференции'), + required=False, + widget=CKEditorWidget + ) + + def save(self, obj=None): + if obj is None: + obj = EventDefaultDescription() + id = None + else: + id = obj.id - def save(self): - templates = settings.DEFAULT_DESCRIPTION - for field_name, path in templates.iteritems(): - try: - with open(os.path.join(settings.SITE_ROOT, 'templates', path), 'w+') as f: - f.write(self.cleaned_data.get(field_name).encode('utf-8')) - except Exception as e: - print(e) - # pass + data = self.cleaned_data + + fill_trans_fields_all(EventDefaultDescription, obj, data, id) + return obj diff --git a/apps/settings/migrations/0002_auto__add_eventdefaultdescriptiontranslation__add_unique_eventdefaultd.py b/apps/settings/migrations/0002_auto__add_eventdefaultdescriptiontranslation__add_unique_eventdefaultd.py new file mode 100644 index 00000000..3bc218f0 --- /dev/null +++ b/apps/settings/migrations/0002_auto__add_eventdefaultdescriptiontranslation__add_unique_eventdefaultd.py @@ -0,0 +1,97 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding model 'EventDefaultDescriptionTranslation' + db.create_table(u'settings_eventdefaultdescription_translation', ( + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('expo_description', self.gf('django.db.models.fields.TextField')()), + ('conf_description', self.gf('django.db.models.fields.TextField')()), + ('language_code', self.gf('django.db.models.fields.CharField')(max_length=15, db_index=True)), + ('master', self.gf('django.db.models.fields.related.ForeignKey')(related_name='translations', null=True, to=orm['settings.EventDefaultDescription'])), + )) + db.send_create_signal(u'settings', ['EventDefaultDescriptionTranslation']) + + # Adding unique constraint on 'EventDefaultDescriptionTranslation', fields ['language_code', 'master'] + db.create_unique(u'settings_eventdefaultdescription_translation', ['language_code', 'master_id']) + + # Adding model 'EventDefaultDescription' + db.create_table(u'settings_eventdefaultdescription', ( + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + )) + db.send_create_signal(u'settings', ['EventDefaultDescription']) + + + def backwards(self, orm): + # Removing unique constraint on 'EventDefaultDescriptionTranslation', fields ['language_code', 'master'] + db.delete_unique(u'settings_eventdefaultdescription_translation', ['language_code', 'master_id']) + + # Deleting model 'EventDefaultDescriptionTranslation' + db.delete_table(u'settings_eventdefaultdescription_translation') + + # Deleting model 'EventDefaultDescription' + db.delete_table(u'settings_eventdefaultdescription') + + + models = { + u'settings.eventdefaultdescription': { + 'Meta': {'unique_together': '()', 'object_name': 'EventDefaultDescription', 'index_together': '()'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'settings.eventdefaultdescriptiontranslation': { + 'Meta': {'unique_together': "[('language_code', 'master')]", 'object_name': 'EventDefaultDescriptionTranslation', 'db_table': "u'settings_eventdefaultdescription_translation'", 'index_together': '()'}, + 'conf_description': ('django.db.models.fields.TextField', [], {}), + 'expo_description': ('django.db.models.fields.TextField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + 'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['settings.EventDefaultDescription']"}) + }, + u'settings.html': { + 'Meta': {'unique_together': '()', 'object_name': 'Html', 'index_together': '()'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}) + }, + u'settings.htmltranslation': { + 'Meta': {'unique_together': "[('language_code', 'master')]", 'object_name': 'HtmlTranslation', 'db_table': "u'settings_html_translation'", 'index_together': '()'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + 'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['settings.Html']"}), + 'text': ('django.db.models.fields.TextField', [], {}) + }, + u'settings.landingcomment': { + 'Meta': {'unique_together': '()', 'object_name': 'LandingComment', 'index_together': '()'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'logo': ('django.db.models.fields.files.ImageField', [], {'max_length': '255'}) + }, + u'settings.landingcommenttranslation': { + 'Meta': {'unique_together': "[('language_code', 'master')]", 'object_name': 'LandingCommentTranslation', 'db_table': "u'settings_landingcomment_translation'", 'index_together': '()'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + 'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['settings.LandingComment']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'position': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'text': ('django.db.models.fields.TextField', [], {}) + }, + u'settings.participationcomment': { + 'Meta': {'unique_together': '()', 'object_name': 'ParticipationComment', 'index_together': '()'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'logo': ('django.db.models.fields.files.ImageField', [], {'max_length': '255'}) + }, + u'settings.participationcommenttranslation': { + 'Meta': {'unique_together': "[('language_code', 'master')]", 'object_name': 'ParticipationCommentTranslation', 'db_table': "u'settings_participationcomment_translation'", 'index_together': '()'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + 'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['settings.ParticipationComment']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'position': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'text': ('django.db.models.fields.TextField', [], {}) + } + } + + complete_apps = ['settings'] \ No newline at end of file diff --git a/apps/settings/models.py b/apps/settings/models.py index a2fde021..47a42229 100644 --- a/apps/settings/models.py +++ b/apps/settings/models.py @@ -72,3 +72,19 @@ class ParticipationComment(TranslatableModel): def __unicode__(self): return self.lazy_translation_getter('name', self.pk) + + +class EventDefaultDescription(TranslatableModel): + translations = TranslatedFields( + expo_description=models.TextField( + _(u'Описание для выставки'), + blank=True + ), + conf_description=models.TextField( + _(u'Описание для конференции'), + blank=True + ) + ) + + def __unicode__(self): + return str(self.pk) diff --git a/proj/settings.py b/proj/settings.py index 63f364c6..4b684b90 100644 --- a/proj/settings.py +++ b/proj/settings.py @@ -486,12 +486,6 @@ C_CITY_CATALOG_KEY = 'conf_city_catalog' C_COUNTRY_CATALOG_KEY = 'conf_country_catalog' E_CITY_CATALOG_KEY = 'expo_city_catalog' E_COUNTRY_CATALOG_KEY = 'expo_country_catalog' -DEFAULT_DESCRIPTION = { - 'e_description_ru': 'client/includes/conference/default_description_ru.html', - 'e_description_en': 'client/includes/conference/default_description_en.html', - 'c_description_ru': 'client/includes/exposition/default_description_ru.html', - 'c_description_en': 'client/includes/exposition/default_description_en.html', -} PERIODIC = { 0: '', 1: _(u'Ежегодно'), diff --git a/requirements.txt b/requirements.txt index ee9cf97e..ccab8019 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,7 +12,7 @@ django-ckeditor==4.0.2 django-crontab==0.6.0 django-debug-toolbar==1.2.1 django-haystack==2.3.2 -django-hvad==1.2.0 +django-hvad==1.2.2 django-model-utils==2.2 django-modeltranslation==0.12 django-recaptcha==1.2.1 diff --git a/templates/c_admin/settings/default_description.html b/templates/c_admin/settings/default_description.html index fe9eb7b3..70a51b3f 100644 --- a/templates/c_admin/settings/default_description.html +++ b/templates/c_admin/settings/default_description.html @@ -34,10 +34,10 @@
@@ -45,35 +45,35 @@
{# expo ru #} -
-
+
+
- {{ form.e_description_ru }} - {{ form.e_description_ru.errors }} + {{ form.expo_description_ru }} + {{ form.expo_description_ru.errors }}
{# expo en #} -
-
+
+
- {{ form.e_description_en }} - {{ form.e_description_en.errors }}
+ {{ form.expo_description_en }} + {{ form.expo_description_en.errors }}
@@ -83,44 +83,44 @@
{# conf ru #} -
-
+
+
- {{ form.c_description_ru }} - {{ form.c_description_ru.errors }}
+ {{ form.conf_description_ru }} + {{ form.conf_description_ru.errors }}
{# conf en #} -
-
+
+
- {{ form.c_description_en }} - {{ form.c_description_en.errors }}
+ {{ form.conf_description_en }} + {{ form.conf_description_en.errors }}
diff --git a/templates/client/includes/conference/default_description_en.html b/templates/client/includes/conference/default_description_en.html deleted file mode 100644 index e69de29b..00000000 diff --git a/templates/client/includes/conference/default_description_ru.html b/templates/client/includes/conference/default_description_ru.html deleted file mode 100644 index e69de29b..00000000 diff --git a/templates/client/includes/exposition/default_description_en.html b/templates/client/includes/exposition/default_description_en.html deleted file mode 100644 index e69de29b..00000000 diff --git a/templates/client/includes/exposition/default_description_ru.html b/templates/client/includes/exposition/default_description_ru.html deleted file mode 100644 index e69de29b..00000000