менил логику сохранения дефолтного описания событий

remotes/origin/HEAD
Slava Kyrachevsky 9 years ago
parent a264fd12b1
commit d34d38cc0f
  1. 23
      apps/conference/views.py
  2. 24
      apps/exposition/views.py
  3. 2
      apps/functions/translate.py
  4. 29
      apps/settings/admin.py
  5. 20
      apps/settings/admin_urls.py
  6. 54
      apps/settings/forms.py
  7. 97
      apps/settings/migrations/0002_auto__add_eventdefaultdescriptiontranslation__add_unique_eventdefaultd.py
  8. 16
      apps/settings/models.py
  9. 6
      proj/settings.py
  10. 2
      requirements.txt
  11. 64
      templates/c_admin/settings/default_description.html
  12. 0
      templates/client/includes/conference/default_description_en.html
  13. 0
      templates/client/includes/conference/default_description_ru.html
  14. 0
      templates/client/includes/exposition/default_description_en.html
  15. 0
      templates/client/includes/exposition/default_description_ru.html

@ -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):

@ -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()

@ -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

@ -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())

@ -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'),
)

@ -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

@ -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']

@ -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)

@ -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'Ежегодно'),

@ -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

@ -34,10 +34,10 @@
<div class="controls span3" id="m_e">
<ul class="nav nav-tabs" style="margin-bottom: -2px; margin-left: 10px;">
<li class="active">
<a href="#field_{{ form.e_description_ru.auto_id }}" data-toggle="tab">ru</a>
<a href="#field_{{ form.expo_description_ru.auto_id }}" data-toggle="tab">ru</a>
</li>
<li>
<a href="#field_{{ form.e_description_en.auto_id }}" data-toggle="tab">en</a>
<a href="#field_{{ form.expo_description_en.auto_id }}" data-toggle="tab">en</a>
</li>
</ul>
</div>
@ -45,35 +45,35 @@
<div class="tab-content" >
{# expo ru #}
<div class="tab-pane active" id="field_{{ form.e_description_ru.auto_id }}">
<div class="control-group {% if form.e_description_ru.errors %}error{% endif %}" >
<div class="tab-pane active" id="field_{{ form.expo_description_ru.auto_id }}">
<div class="control-group {% if form.expo_description_ru.errors %}error{% endif %}" >
<label class="control-label">
{% if form.e_description_ru.required %}
<b>{{ form.e_description_ru.label }}</b>:
{% if form.expo_description_ru.required %}
<b>{{ form.expo_description_ru.label }}</b>:
{% else %}
{{ form.e_description_ru.label }}:
{{ form.expo_description_ru.label }}:
{% endif %}
</label>
<div class="controls" style="border: 1px solid #ddd; padding: 10px; border-radius: 5px">
{{ form.e_description_ru }}
<span class="help-inline">{{ form.e_description_ru.errors }}</span>
{{ form.expo_description_ru }}
<span class="help-inline">{{ form.expo_description_ru.errors }}</span>
</div>
</div>
</div>
{# expo en #}
<div class="tab-pane" id="field_{{ form.e_description_en.auto_id }}">
<div class="control-group {% if form.e_description_en.errors %}error{% endif %}" >
<div class="tab-pane" id="field_{{ form.expo_description_en.auto_id }}">
<div class="control-group {% if form.expo_description_en.errors %}error{% endif %}" >
<label class="control-label">
{% if form.e_description_en.required %}
<b>{{ form.e_description_en.label }}</b>:
{% if form.expo_description_en.required %}
<b>{{ form.expo_description_en.label }}</b>:
{% else %}
{{ form.e_description_en.label }}:
{{ form.expo_description_en.label }}:
{% endif %}
</label>
<div class="controls" style="border: 1px solid #ddd; padding: 10px; border-radius: 5px">
{{ form.e_description_en }}
<span class="help-inline"> {{ form.e_description_en.errors }}</span></div>
{{ form.expo_description_en }}
<span class="help-inline"> {{ form.expo_description_en.errors }}</span></div>
</div>
</div>
</div>
@ -83,44 +83,44 @@
<div class="controls span3" id="m_c">
<ul class="nav nav-tabs" style="margin-bottom: -2px; margin-left: 10px;">
<li class="active">
<a href="#field_{{ form.c_description_ru.auto_id }}" data-toggle="tab">ru</a>
<a href="#field_{{ form.conf_description_ru.auto_id }}" data-toggle="tab">ru</a>
</li>
<li>
<a href="#field_{{ form.c_description_en.auto_id }}" data-toggle="tab">en</a>
<a href="#field_{{ form.conf_description_en.auto_id }}" data-toggle="tab">en</a>
</li>
</ul>
</div>
</div>
<div class="tab-content" >
{# conf ru #}
<div class="tab-pane active" id="field_{{ form.c_description_ru.auto_id }}">
<div class="control-group {% if form.c_description_ru.errors %}error{% endif %}" >
<div class="tab-pane active" id="field_{{ form.conf_description_ru.auto_id }}">
<div class="control-group {% if form.conf_description_ru.errors %}error{% endif %}" >
<label class="control-label">
{% if form.c_description_ru.required %}
<b>{{ form.c_description_ru.label }}</b>:
{% if form.conf_description_ru.required %}
<b>{{ form.conf_description_ru.label }}</b>:
{% else %}
{{ form.c_description_ru.label }}:
{{ form.conf_description_ru.label }}:
{% endif %}
</label>
<div class="controls" style="border: 1px solid #ddd; padding: 10px; border-radius: 5px">
{{ form.c_description_ru }}
<span class="help-inline">{{ form.c_description_ru.errors }}</span></div>
{{ form.conf_description_ru }}
<span class="help-inline">{{ form.conf_description_ru.errors }}</span></div>
</div>
</div>
{# conf en #}
<div class="tab-pane" id="field_{{ form.c_description_en.auto_id }}">
<div class="control-group {% if form.c_description_en.errors %}error{% endif %}" >
<div class="tab-pane" id="field_{{ form.conf_description_en.auto_id }}">
<div class="control-group {% if form.conf_description_en.errors %}error{% endif %}" >
<label class="control-label">
{% if form.c_description_en.required %}
<b>{{ form.c_description_en.label }}</b>:
{% if form.conf_description_en.required %}
<b>{{ form.conf_description_en.label }}</b>:
{% else %}
{{ form.c_description_en.label }}:
{{ form.conf_description_en.label }}:
{% endif %}
</label>
<div class="controls" style="border: 1px solid #ddd; padding: 10px; border-radius: 5px">
{{ form.c_description_en }}
<span class="help-inline"> {{ form.c_description_en.errors }}</span></div>
{{ form.conf_description_en }}
<span class="help-inline"> {{ form.conf_description_en.errors }}</span></div>
</div>
</div>
</div>

Loading…
Cancel
Save