diff --git a/core/forms.py b/core/forms.py index 6244f97e..d00f080e 100644 --- a/core/forms.py +++ b/core/forms.py @@ -61,21 +61,12 @@ class PageForm(TranslatableModelForm): class Meta: model = Page - fields = ['url','title','h1','descriptions','keywords', 'body' ] + fields = ['url','title','h1','descriptions','keywords', 'body'] widgets = { 'body':CKEditorWidget, 'keywords':Textarea, 'descriptions':Textarea, } - def clean_url(self): - url = self.cleaned_data.get('url', None) - if url[0] == '/': - url = url[1:] - if url[-1] == '/': - url = url[:-1] - if ' ' in url: - url.replace(' ', '_') - return url diff --git a/core/models.py b/core/models.py index 7d302d93..6d20823b 100644 --- a/core/models.py +++ b/core/models.py @@ -118,20 +118,19 @@ class Page(TranslatableModel): super(Page,self).save(*args, **kwargs) all_field_names = list(self._translated_field_names) - clear_f_n = [] - for field_name in all_field_names: - if field_name not in ['master', 'master_id',u'id', 'language_code']: - clear_f_n.append(field_name) - field_items = {field_name:getattr(self, field_name) for field_name in clear_f_n} + clear_f_n = list(set(all_field_names) - {'master', 'master_id', 'id', 'language_code'}) + field_items = {} + for fname in clear_f_n: + field_items[fname] = getattr(self, fname) langs = [lan[0] for lan in settings.LANGUAGES] for lang in langs: if lang not in self.get_available_languages(): self.translate(lang) - for field in clear_f_n: - setattr(self, field, field_items.get(field, '')) + for key, value in field_items.items(): + setattr(self, key, value) self.save_translations(self) - + return self def __unicode__(self): return self.url diff --git a/core/views.py b/core/views.py index 9e0af308..1c53d73d 100644 --- a/core/views.py +++ b/core/views.py @@ -218,11 +218,14 @@ class PageList(ListView): template_name = 'page_admin_list.html' model = Page order = 'created' -from django import forms + + from django.http import HttpResponseRedirect + + class EditPage(UpdateView): model = Page - template_name = 'new_page.html' + template_name = 'admin/page/new_page.html' form_class = PageForm slug_url_kwarg = 'url' slug_field = 'url' @@ -233,7 +236,8 @@ class EditPage(UpdateView): return context def get_success_url(self): - return HttpResponseRedirect('/admin/page/all/') + return reverse_lazy('page_list') + class DeletePage(DeleteView): template_name = 'admin/page/page_confirm_delete.html' @@ -244,7 +248,7 @@ class DeletePage(DeleteView): class PageDetailed(DetailView): model = Page - template_name = 'client/base_catalog.html' + template_name = 'admin/page/page_template_view.html' slug_field = 'url' slug_url_kwarg = 'url' diff --git a/expobanner/models.py b/expobanner/models.py index d125ee1b..c45737de 100644 --- a/expobanner/models.py +++ b/expobanner/models.py @@ -95,8 +95,10 @@ class Banner(models.Model, StatMixin): html = models.BooleanField(verbose_name=_('HTML?'), default=False) flash = models.BooleanField(verbose_name=_('Flash?'), default=False) - js = models.BooleanField(verbose_name=_('Javascript?'), default=False) + popup = models.BooleanField(verbose_name=_('Popup?'), default=False) paid = models.BooleanField(verbose_name=_('Is Paid event link?'), default=False) + # for detecting popups + cookie = models.CharField(max_length=30, blank=True, null=True, default=settings.DEFAULT_POPUP_COOKIE) public = models.BooleanField(verbose_name=u'Активный', default=True) created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True) diff --git a/expobanner/views.py b/expobanner/views.py index 232ff7d0..5d1c58af 100644 --- a/expobanner/views.py +++ b/expobanner/views.py @@ -46,7 +46,7 @@ def get_banners(request): for group, banners in group_banners.iteritems(): banner = get_banner_by_params(banners, good_urls, params) if banner: - if banner.js or banner.html: + if banner.html: text = banner.text img = '' alt = '' @@ -61,7 +61,7 @@ def get_banners(request): 'is_html': banner.html, 'is_flash': banner.flash, 'is_img': is_img, - 'is_js': banner.js, + 'is_popup': banner.popup, 'img': img, 'alt': alt, 'text': text diff --git a/meta/models.py b/meta/models.py index 2079be66..a8037849 100644 --- a/meta/models.py +++ b/meta/models.py @@ -3,9 +3,15 @@ from django.db import models from django.utils import translation from django.db.models.signals import post_save from django.utils.translation import ugettext_lazy as _ +from django.conf import settings +from django.core.urlresolvers import reverse_lazy +from django.core.cache import cache from hvad.models import TranslatableModel, TranslatedFields, TranslationManager from pymorphy.django_conf import default_morph as morph from functions.signal_handlers import post_save_handler +import copy + + # additional funcs MONTHES = {'jan': _(u'январе'), 'feb': _(u'феврале'), 'mar': _(u'марте'), 'apr': _(u'апреле'), @@ -118,13 +124,6 @@ post_save.connect(post_save_handler, sender=MetaSetting) # SEO - tests # -from django.db import models -from hvad.models import TranslatableModel, TranslatedFields -from django.conf import settings -from django.core.urlresolvers import reverse_lazy -from django.core.cache import cache - - class SeoTextManager(TranslationManager): cache_time = 120 @@ -143,7 +142,7 @@ class SeoTextManager(TranslationManager): class SeoText(TranslatableModel): - + cache_fields = ['title', 'body'] url = models.CharField(max_length=50, unique=True, verbose_name=u"URL: expomap.ru") translations = TranslatedFields( @@ -153,26 +152,39 @@ class SeoText(TranslatableModel): objects = SeoTextManager() + def __init__(self, *args, **kwargs): + super(SeoText, self).__init__(*args, **kwargs) + self.is_new = True + self.var_cache = {var: copy.copy(getattr(self, var)) for var in SeoText.cache_fields} + def get_absolute_url(self): return reverse_lazy('seo_all') def save(self, *args, **kwargs): - super(SeoText,self).save(*args, **kwargs) + init_lang = self.language_code + self.is_new = bool(self.id) + if not self.is_new: super(SeoText, self).save(*args, **kwargs) - all_field_names = list(self._translated_field_names) - clear_f_n = [] - for field_name in all_field_names: - if field_name not in ['master', 'master_id', 'id', 'language_code']: - clear_f_n.append(field_name) - field_items = {field_name:getattr(self, field_name) for field_name in clear_f_n} + field_items = {} + for fname in self.cache_fields: + field_items[fname] = getattr(self, fname) - langs = [lan[0] for lan in settings.LANGUAGES] + langs = [l[0] for l in settings.LANGUAGES] for lang in langs: if lang not in self.get_available_languages(): self.translate(lang) - for field in clear_f_n: - setattr(self, field, field_items.get(field, '')) - self.save_translations(self) + for key, value in field_items.items(): + if getattr(self, key) is '' or getattr(self, key) is self.var_cache[key]: + setattr(self, key, value) + + if self.is_new: + self.save_translations(self) + else: + super(SeoText, self).save(*args, **kwargs) + + self.translate(init_lang) + self.var_cache = {var: copy.copy(getattr(self, var)) for var in SeoText.cache_fields} + return self def __unicode__(self): return self.url diff --git a/proj/settings.py b/proj/settings.py index 2c8f2afb..0a679246 100644 --- a/proj/settings.py +++ b/proj/settings.py @@ -449,6 +449,8 @@ CLIENT_DATE_FORMAT = ["%d.%m.%Y"] # cache pages in random seconds. random in this range CACHE_RANGE = [60, 120] +DEFAULT_POPUP_COOKIE = 'expo_b_default_popup' + try: from local import * except ImportError, e: diff --git a/templates/admin/page/new_page.html b/templates/admin/page/new_page.html index 8d39c5fc..8fed1258 100644 --- a/templates/admin/page/new_page.html +++ b/templates/admin/page/new_page.html @@ -18,7 +18,7 @@ {% block body %} {# Uses multilang.html template for translated fields #} -
{% csrf_token %} + {% csrf_token %}
@@ -26,16 +26,16 @@
{# url/slug #} - {% if request.path == '/admin/page/new/' %} +{# {% if request.path == '/admin/page/new/' %}#}
- {{ form.langs }} {{ form.url }} {{ form.url.errors }}
- {% endif %} +{# {% endif %}#} + {# h1 #}
diff --git a/templates/admin/page/page_template_view.html b/templates/admin/page/page_template_view.html new file mode 100644 index 00000000..214b7ba0 --- /dev/null +++ b/templates/admin/page/page_template_view.html @@ -0,0 +1,14 @@ +{% extends 'client/base_catalog.html' %} +{% load static %} +{% load i18n %} +{% load template_filters %} + +{% block title %}{{ object.title }} {% endblock %} + +{% block content_list %} +
+ {{ object.h1 }} +
+
{{ object.body }}
+ +{% endblock %} \ No newline at end of file diff --git a/templates/client/blank.html b/templates/client/blank.html index 00219448..1be9b75a 100644 --- a/templates/client/blank.html +++ b/templates/client/blank.html @@ -87,7 +87,7 @@ This template include basic anf main styles and js files, "tag": "{{ tag }}" }; - + diff --git a/templates/client/includes/banners/popup.html b/templates/client/includes/banners/popup.html new file mode 100644 index 00000000..51d5d4ad --- /dev/null +++ b/templates/client/includes/banners/popup.html @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/templates/client/includes/banners/tops.html b/templates/client/includes/banners/tops.html index 142e63a4..f1678855 100644 --- a/templates/client/includes/banners/tops.html +++ b/templates/client/includes/banners/tops.html @@ -1,13 +1,7 @@ +{% load static %} +
- \ No newline at end of file + + \ No newline at end of file diff --git a/templates/client/popups/cemat_modal.html b/templates/client/popups/cemat_modal.html index fb497d72..d6c437d9 100644 --- a/templates/client/popups/cemat_modal.html +++ b/templates/client/popups/cemat_modal.html @@ -16,7 +16,7 @@
- +
diff --git a/templates/client/static_client/js/banners.js b/templates/client/static_client/js/rejs/banners.js similarity index 89% rename from templates/client/static_client/js/banners.js rename to templates/client/static_client/js/rejs/banners.js index 1f6126ca..df86bbb0 100644 --- a/templates/client/static_client/js/banners.js +++ b/templates/client/static_client/js/rejs/banners.js @@ -4,10 +4,17 @@ var API_URL_ROOT = "/expo-b/get-banners/"; var getUrl = function () { + var catalog = ""; + + var parts = /^\/([^\/]+)(?:\/|$)/i.exec(location.pathname); + if (parts) { + catalog = parts[1]; + } + var data = window.sendData; if (data instanceof Object) { - var search = []; + var search = ["catalog=" + catalog]; for (var key in data) { if (data.hasOwnProperty(key)) { @@ -23,9 +30,7 @@ } } - if (search.length) { - return API_URL_ROOT + "?" + search.join("&"); - } + return API_URL_ROOT + "?" + search.join("&"); } return API_URL_ROOT; diff --git a/templates/client/static_client/js/rejs/tops.js b/templates/client/static_client/js/rejs/tops.js new file mode 100644 index 00000000..db87aa6a --- /dev/null +++ b/templates/client/static_client/js/rejs/tops.js @@ -0,0 +1,72 @@ +(function () { + "use strict"; + + var API_URL_ROOT = "/expo-b/get-tops/"; + var PARENT_ID = "expo_top_events"; + + var getUrl = function () { + var catalog = ""; + + var parts = /^\/([^\/]+)(?:\/|$)/i.exec(location.pathname); + if (parts) { + catalog = parts[1]; + } + + var data = window.sendData; + + if (data instanceof Object) { + var search = ["catalog=" + catalog]; + + for (var key in data) { + if (data.hasOwnProperty(key)) { + var value = data[key]; + + if (value instanceof Array) { + for (var i = 0, l = value.length; i < l; i++) { + search.push(encodeURIComponent(key) + "=" + encodeURIComponent(value[i])); + } + } else { + search.push(encodeURIComponent(key) + "=" + encodeURIComponent(value)); + } + } + } + + return API_URL_ROOT + "?" + search.join("&"); + } + + return API_URL_ROOT; + }; + + var getTops = function (url, callback) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, true); + + xhr.onreadystatechange = function (event) { + if (event.target.readyState === 4) { + if (event.target.status === 200) { + try { + callback(event.target.responseText); + } catch (error) { + // do nothing + } + } + } + }; + + xhr.send(); + }; + + var insertTops = function (text) { + var parent = document.getElementById(PARENT_ID); + + if (parent) { + parent.innerHTML = text; + } + }; + + var main = function () { + getTops(getUrl(), insertTops); + }; + + window.addEventListener("load", main); +})();