Refactor settings. Add Html model

remotes/origin/1203
Nazar Kotjuk 10 years ago
parent adff441775
commit 867cd3def8
  1. 2
      emencia/django/newsletter/models.py
  2. 6
      emencia/django/newsletter/views/admin_views.py
  3. 17
      expobanner/admin.py
  4. 1
      expobanner/admin_urls.py
  5. 6
      expobanner/management/commands/banner_log_update.py
  6. 1
      expobanner/views.py
  7. 6
      functions/forms.py
  8. 41
      functions/signal_additional_func.py
  9. 3
      functions/signal_handlers.py
  10. 11
      proj/views.py
  11. 36
      settings/admin.py
  12. 3
      settings/admin_urls.py
  13. 156
      settings/forms.py
  14. 92
      settings/models.py
  15. 26
      templates/admin/expobanner/main_page_block.html
  16. 1
      templates/admin/includes/admin_nav.html
  17. 8
      templates/client/includes/main_page_video_block.html
  18. 12
      templates/client/index.html
  19. 4
      templates/client/popups/announce_subscription.html
  20. 10
      templates/client/popups/announces.html

@ -558,7 +558,7 @@ from theme.models import Theme
class PopupCount(models.Model):
theme = models.ForeignKey(Theme)
theme = models.ForeignKey(Theme, null=True)
date = models.DateField(auto_created=True)
cnt = models.PositiveIntegerField(default=0)

@ -332,9 +332,9 @@ from ..models import PopupCount
from theme.models import Theme
def count_popups(request):
if not request.is_ajax():
return HttpResponse("request is not ajax")
else:
#if not request.is_ajax():
# return HttpResponse("request is not ajax")
#else:
themes = request.GET.getlist('theme')
if themes:
for theme_id in themes:

@ -9,6 +9,8 @@ from expobanner.forms import UrlCreateForm, BannerCreateGroupForm, BannerCreateF
PaidCreateForm, PaidUpdateForm, TopCreateForm, BannerLinkCreateForm, MainCreateForm, MainConfCreateForm, MainUpdateForm, TopUpdateForm
from exposition.models import Exposition
from conference.models import Conference
from settings.models import Html
from settings.forms import HtmlForm
class BannersControl(TemplateView):
template_name = 'admin/expobanner/banners_control.html'
@ -344,9 +346,22 @@ class TopUpdate(UpdateView):
template_name = 'admin/expobanner/top_create.html'
success_url = '/admin/expobanners/top/list/'
def get_context_data(self, **kwargs):
context = super(TopUpdate, self).get_context_data(**kwargs)
obj = self.object
context['exposition'] = obj.get_event()
return context
class MainPageBlock(UpdateView):
model = Html
form_class = HtmlForm
template_name = 'admin/expobanner/main_page_block.html'
def get_context_data(self, **kwargs):
context = super(MainPageBlock, self).get_context_data(**kwargs)
context['languages'] = settings.LANGUAGES
return context
def get_success_url(self):
return '/admin/'

@ -42,4 +42,5 @@ urlpatterns = patterns('expobanner.admin',
url(r'^main/conf/$', MainConfCreate.as_view(), name='expobanner-conf-create_main'),
url(r'^main/conf/turn/(?P<pk>\d+)/(?P<status>.*)/$', main_turn, name='expobanner-conf-main-turn'),
#url(r'^main/conf/(?P<pk>\d+)/stat/$', MainStat.as_view(), name='expobanner_stat_main'),
url(r'^main/block/(?P<pk>\d+)/$', MainPageBlock.as_view()),
)

@ -1,12 +1,14 @@
# -*- coding: utf-8 -*-
from datetime import date
from django.core.management.base import BaseCommand
from expobanner.models import Log, LogStat, Banner, PaidStat
from exposition.models import Exposition
class Command(BaseCommand):
def handle(self, *args, **options):
from exposition.models import Exposition
from expobanner.models import Log, LogStat, Banner, PaidStat
today = date.today()
# banners
for banner in Banner.objects.select_related('group').filter(public=True):

@ -87,6 +87,7 @@ def get_banners(request):
return response
def get_top(request):
params = {'theme': request.GET.getlist('theme', []),
'tag': request.GET.get('tag'),

@ -69,7 +69,7 @@ from django.conf import settings
from django.utils.translation import get_language
from django.forms.models import save_instance
class TranslatableModelForm(forms.ModelForm):
class ExpoTranslatableModelForm(forms.ModelForm):
translatable_fields = []
@ -88,7 +88,7 @@ class TranslatableModelForm(forms.ModelForm):
else:
kwargs.update({'initial': init_tr_data})
super(TranslatableModelForm, self).__init__(*args, **kwargs)
super(ExpoTranslatableModelForm, self).__init__(*args, **kwargs)
if not self.translatable_fields:
self.translatable_fields = self._all_tr_field_names
@ -113,7 +113,7 @@ class TranslatableModelForm(forms.ModelForm):
# todo: fix commit False error
init_lang = get_language()[:2]
is_new = not self.instance.pk
inst = super(TranslatableModelForm, self).save()
inst = super(ExpoTranslatableModelForm, self).save()
if is_new:
for lang in self.data_by_lang:

@ -1,10 +1,8 @@
# -*- coding: utf-8 -*-
from settings.models import settings_dict, Setting
from django.conf import settings
from functions.translate import get_translated_fields
def fill_missing_languages(obj):
"""
looking for missing languages
@ -30,39 +28,4 @@ def fill_missing_languages(obj):
for field in fields:
setattr(obj, field, getattr(translation, field))
obj.save()
def fill_meta_information(obj):
"""
looking for available settings for this object
and fill empty field with settings rules
"""
# return list of settings for this object
s_list = settings_dict.get(obj.__class__.__name__)
if s_list:
for s in s_list:
# get Setting model object
setting = Setting.objects.get(key=s.get('key'))
field = s.get('field_name')
if setting.type != 'transl':
# simple field
if getattr(obj, field)=="":
setattr(obj, field, setting.get_value())
obj.save()
else:
# translated field
for code, lang in settings.LANGUAGES:
# get translation object
tr = obj._meta.translations_model.objects.get(language_code=code, master__id=getattr(obj, 'id'))
if getattr(tr, field)=="":
value = setting.get_value(code)
try:
value = value%tr.__dict__
except KeyError:
pass
# ! charfield -> textfield
setattr(tr, field, value[:250])
tr.save()
obj.save()

@ -1,7 +1,7 @@
import random
import string
from django.db.models.fields.files import FieldFile
from signal_additional_func import fill_missing_languages, fill_meta_information
from signal_additional_func import fill_missing_languages
from functions.form_check import translit_with_separator
@ -34,7 +34,6 @@ def post_save_handler(sender, **kwargs):
"""
obj = kwargs['instance']
fill_missing_languages(obj)
fill_meta_information(obj)
def file_cleanup(sender, instance, *args, **kwargs):

@ -16,6 +16,8 @@ from conference.models import Conference
from emencia.django.newsletter.forms import SubscribeAssideForm
from django.db.models.loading import get_model
def clear_slashes(str_):
if str_[0] == r'/':
str_ = str_[1:]
@ -73,6 +75,12 @@ class MainPageView(JitterCacheMixin, TemplateView):
conf = Conference.objects.conf_main()
ev = ex + conf
events = sorted(ev, key=lambda x: x.main.position)
Html = get_model('settings', 'Html')
try:
main_page_block = Html.objects.language().get(id=22)
except Html.DoesNotExist:
main_page_block = None
# update main_page counter
for event in events:
event.main.link.log(self.request, 1)
@ -80,7 +88,8 @@ class MainPageView(JitterCacheMixin, TemplateView):
conference_themes = Theme.objects.language().order_by('-main_page').filter(types=Theme.types.conference)[:6]
args = {'events': events, 'exposition_themes': exposition_themes, 'conference_themes': conference_themes,
'search_form': ExpositionSearchForm, 'search_action': '/expo/search/'}
'search_form': ExpositionSearchForm, 'search_action': '/expo/search/',
'main_page_block': main_page_block}
context.update(args)

@ -1,27 +1,9 @@
# -*- coding: utf-8 -*-
import json
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect, HttpResponse
from django.http import HttpResponseRedirect
from django.core.context_processors import csrf
from django.conf import settings
from django.contrib.auth.decorators import login_required
#
from forms import SettingsForm
@login_required
def change_settings(request):
if request.POST:
pass
else:
form = SettingsForm()
args = {'form': form, 'languages': settings.LANGUAGES}
args.update(csrf(request))
return render_to_response('settings.html', args)
from forms import MainPageEvent, MainPagePhotoreport, MainPageArticle, MainPageNews, MainPageThemes
from forms import MainPageArticle, MainPageNews, MainPageThemes
def handle_form(request, Form):
@ -36,21 +18,18 @@ def handle_form(request, Form):
return HttpResponseRedirect('/admin/settings/main-page/')
def handle_events(request):
return handle_form(request, MainPageEvent)
def handle_news(request):
return handle_form(request, MainPageNews)
def handle_articles(request):
return handle_form(request, MainPageArticle)
def handle_themes(request):
return handle_form(request, MainPageThemes)
def handle_photoreports(request):
return handle_form(request, MainPagePhotoreport)
from exposition.models import Exposition
from conference.models import Conference
@ -60,6 +39,7 @@ from theme.models import Theme
from article.models import Article
import datetime
def main_page(request):
now = datetime.datetime.now()
expositions = Exposition.objects.filter(main_page=1)
@ -83,10 +63,8 @@ def main_page(request):
news_form.fields['main_page_news'].widget.attrs['data-init-text'] = json.dumps(a)
article_form = MainPageArticle(initial={'article' : blogs})
event_data = {'expositions': ','.join(['%s:%s'%(item.id, item.name) for item in expositions])}
event_form = MainPageEvent(initial=event_data)
args = {'event_form' : event_form, 'theme_form' : MainPageThemes(initial=themes),
args = { 'theme_form' : MainPageThemes(initial=themes),
'article_form' : article_form,
'news_form' : news_form, 'photoreport_form' : MainPagePhotoreport(),}
'news_form' : news_form}
args.update(csrf(request))
return render_to_response('admin/settings/main_page.html', args)

@ -3,10 +3,7 @@ from django.conf.urls import patterns, include, url
urlpatterns = patterns('settings.admin',
url(r'^main-page/$', 'main_page'),
url(r'^main-page/events/$', 'handle_events'),
url(r'^main-page/photoreports/$', 'handle_photoreports'),
url(r'^main-page/themes/$', 'handle_themes'),
url(r'^main-page/news/$', 'handle_news'),
url(r'^main-page/blogs/$', 'handle_articles'),
url(r'^$', 'change_settings'),
)

@ -1,146 +1,19 @@
# -*- coding: utf-8 -*-
from django import forms
from models import Setting, settings_dict
from django.conf import settings
from functions.translate import fill_trans_fields, populate, ZERO_LANGUAGE, populate_all, fill_trans_fields_all
class SettingsForm(forms.Form):
"""
Create Settings form for creating settings
__init__ uses for dynamic creates fields
save function saves data in Settings object. If it doesnt exist create new object
"""
def __init__(self, *args, **kwargs):
super(SettingsForm, self).__init__(*args, **kwargs)
# creates translated form fields, example: name_ru, name_en
# len(10) is a hack for detect if settings.LANGUAGES is not configured it return all langs
for model_name in settings_dict.values():
for setting in model_name:
item = Setting.objects.get(key=setting['key'])
if setting['type'] != 'transl':
self.fields[setting['key']] = forms.CharField(label=setting['verbose_name'], initial=item.get_value(),
required=False)
else:
if len(settings.LANGUAGES) in range(10):
for lid, (code, name) in enumerate(settings.LANGUAGES):
# using enumerate for detect iteration number
# first iteration is a default lang so it required fields
required = True if lid == 0 else False
self.fields['%s_%s' %(setting['key'], code)] = forms.CharField(label=setting['verbose_name'],
initial=item.get_value(code),
required=required,
widget=forms.TextInput(
attrs={'style':'width: 450px'}))
"""
settings_list = Setting.objects.all()
for item in settings_list:
if item.type != 'transl':
self.fields['%s'%item.key] = forms.CharField(label='%s'%item.key, initial=item.get_value(),
required=False)
else:
if len(settings.LANGUAGES) in range(10):
for lid, (code, name) in enumerate(settings.LANGUAGES):
# using enumerate for detect iteration number
# first iteration is a default lang so it required fields
required = True if lid == 0 else False
self.fields['%s_%s' %(item.key, code)] = forms.CharField(label=getattr(item, 'key'),
initial=item.get_value(code),
required=required,
widget=forms.TextInput(
attrs={'style':'width: 450px'}))
"""
def save(self):
"""
changes Settings model
"""
data = self.cleaned_data
capacity_tmpl = Setting.objects.get(key='hall_template')
for code, name in settings.LANGUAGES:
capacity_tmpl.set_value(data['hall_capacity_tmpl_%s'%code], code)
from exposition.models import Exposition
from conference.models import Conference
from seminar.models import Seminar
from webinar.models import Webinar
from photoreport.models import Photoreport
from news.models import News
from ckeditor.widgets import CKEditorWidget
from theme.models import Theme
from .models import Html
from article.models import Article
from functions.forms import ExpoTranslatableModelForm
import datetime
class MainPageEvent(forms.Form):
expositions = forms.CharField(label=u'Выставки', widget=forms.HiddenInput(), required=False)
conferences = forms.CharField(label=u'Конференции', widget=forms.HiddenInput(), required=False)
def save(self):
data = self.cleaned_data
expositions = data['expositions']
conferences = data['conferences']
Exposition.objects.filter(main_page=1).update(main_page=0)
Exposition.objects.filter(id__in=expositions).update(main_page=1)
#Conference.objects.filter(main_page=1).update(main_page=0)
#Conference.update(main_page=1)
class HtmlForm(ExpoTranslatableModelForm):
class Meta:
model = Html
widgets = {
'text': CKEditorWidget,
}
def clean_expositions(self):
expositions = self.cleaned_data.get('expositions')
if expositions:
res = []
for id in expositions.split(','):
try:
res.append(int(id))
except:
continue
return res
else:
return []
"""
class MainPageEvent(forms.Form):
def __init__(self, *args, **kwargs):
super(MainPageEvent, self).__init__(*args, **kwargs)
now = datetime.datetime.now
self.fields['expositions' ] = forms.ModelMultipleChoiceField(
queryset=Exposition.objects.all(),
required=False
)
self.fields['conferences' ] = forms.ModelMultipleChoiceField(
queryset=Conference.objects.all(),
required=False
)
self.fields['seminars' ] = forms.ModelMultipleChoiceField(
queryset=Seminar.objects.all(),
required=False
)
self.fields['webinars' ] = forms.ModelMultipleChoiceField(
queryset=Webinar.objects.all(),
required=False
)
def save(self):
data = self.cleaned_data
expositions = data['expositions']
conferences = data['conferences']
seminars = data['seminars']
webinars = data['webinars']
Exposition.objects.all().update(main_page=0)
expositions.update(main_page=1)
Conference.objects.all().update(main_page=0)
conferences.update(main_page=1)
Seminar.objects.all().update(main_page=0)
seminars.update(main_page=1)
Webinar.objects.all().update(main_page=0)
webinars.update(main_page=1)
"""
class MainPageThemes(forms.Form):
exposition_themes = forms.ModelMultipleChoiceField(queryset=Theme.objects.filter(types=Theme.types.exposition),
@ -163,17 +36,6 @@ class MainPageThemes(forms.Form):
#seminar_themes.update(main_page=1)
class MainPagePhotoreport(forms.Form):
photoreports = forms.ModelMultipleChoiceField(queryset=Photoreport.objects.all())
def save(self):
data = self.cleaned_data
photoreports = data['photoreports']
photoreports.update(main_page=1)
class MainPageNews(forms.Form):
main_page_news = forms.CharField(label=u'Новости', widget=forms.HiddenInput(), required=False,)

@ -4,95 +4,11 @@ from hvad.models import TranslatableModel, TranslatedFields
from functions.custom_fields import EnumField
class Setting(TranslatableModel):
"""
Create Settings model, which stores different settings of project
Uses hvad.TranslatableModel which is child of django.db.models class
Setting create only by admin
"""
VALUES = ('int', 'text', 'transl', 'date')
key = models.CharField(max_length=50)
type = EnumField(values=VALUES)
int = models.IntegerField(blank=True, null=True)
text = models.CharField(max_length=255, blank=True)
date = models.DateTimeField(blank=True, null=True)
class Html(TranslatableModel):
name = models.CharField(max_length=100, blank=True)
translations = TranslatedFields(
transl = models.CharField(max_length=255, blank=True,default='111'),
name = models.CharField(max_length=50),
text=models.TextField()
)
def __unicode__(self):
return self.key
def get_value(self, code=None):
"""
returns value of setting
value can be - int, text, date or translated field
"""
if self.type == 'transl':
obj = Setting._meta.translations_model.objects.get(language_code = code,master__id=getattr(self, 'id'))
return getattr(obj, self.type)
else:
return getattr(self,self.type)
def set_value(self, value, code=None):
"""
sets value of setting
"""
if self.type == 'transl':
obj = Setting._meta.translations_model.objects.get(language_code = code,master__id=getattr(self, 'id'))
setattr(obj, self.type, value)
obj.save()
else:
setattr(self, self.type, value)
# dictionaty of models settings
# every model have list of settings
# key: setting in db, field_name: field in model
settings_dict = dict(#City=[{'key': 'city_title', 'field_name': 'title', 'type': 'transl', 'verbose_name': 'title Городов'},
# {'key': 'city_keywords', 'field_name': 'keywords', 'type': 'transl', 'verbose_name': 'keywords'},
# {'key': 'city_descriptions', 'field_name': 'descriptions', 'type': 'transl', 'verbose_name': 'description'}],
#Exposition=[{'key': 'exposition_title', 'field_name': 'title', 'type': 'transl', 'verbose_name': 'title Выставок'},
# {'key': 'exposition_keywords', 'field_name': 'keywords', 'type': 'transl', 'verbose_name': 'keywords Выставок'}],
# Country=[{'key': 'country_title', 'field_name': 'title', 'type': 'transl', 'verbose_name': 'title'},
# {'key': 'country_keywords', 'field_name': 'keywords', 'type': 'transl', 'verbose_name': 'keywords'},
# {'key': 'country_descriptions', 'field_name': 'descriptions', 'type': 'transl', 'verbose_name': 'description'}]
# Exposition=[{'key': 'exposition_title', 'field_name': 'title', 'type': 'transl', 'verbose_name': 'Exposition title'},
# {'key': 'exposition_keywords', 'field_name': 'keywords', 'type': 'transl', 'verbose_name': 'Exposition keywords'},
# {'key': 'exposition_descriptions', 'field_name': 'descriptions', 'type': 'transl', 'verbose_name': 'Exposition description'}]
)
#from settings.models import settings, Setting
#country_set = settings.get('country')
#for s in country_set:
# set = Setting(key=s['key'], type=s['type'])
# set.save()
from django.db.models.signals import post_save
from django.dispatch import receiver
#@receiver(post_save, sender=Setting)
def create_transl_fields(sender, **kw):
"""
"""
setting = kw['instance']
setting.text = '111'
setting.save()
#if kwargs['created'] and setting.type == 'transl':
# setting.int = 1
#if len(setting.LANGUAGES) in range(10):
# for lid, (code, name) in enumerate(settings.LANGUAGES):
# using enumerate for detect iteration number
# first iteration is a default lang so it required fields
#post_save.connect(create_transl_fields, sender=Setting)
return self.name

@ -0,0 +1,26 @@
{% extends 'admin/base.html' %}
{% load static %}
{% load i18n %}
{% block body %}
<form method="post" class="form-horizontal" name="form2" id="form2" enctype="multipart/form-data"> {% csrf_token %}
<fieldset>
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-pencil"></i> Блок на главной</h2>
</div>
<div class="box-content">
{% include 'admin/forms/multilang.html' with field='text' form=form languages=languages %}
</div>
</div>
</fieldset>
<div class="controls">
<input class="btn btn-large btn-primary" type="submit" value="Готово">
<input class="btn btn-large" type="reset" value="Отмена">
</div>
</form>
{% endblock %}

@ -105,6 +105,7 @@
<li><a href="/admin/expobanners/top/list/">Выставки в топе</a></li>
<li><a href="/admin/expobanners/main/list/">Выставки на главной</a></li>
<li><a href="/admin/expobanners/main/conf/list/">Конференции на главной</a></li>
<li><a href="/admin/expobanners/main/block/22/">Блок на главной</a></li>
</ul>
</li>

@ -0,0 +1,8 @@
{% load i18n %}
<header class="clearfix">
<div class="pg-title"><a target="_blank" href="https://www.youtube.com/channel/UCE2QX9Q8YalEXHwaJoQf0MQ">{% trans ' Видеорепортажи' %}</a></div>
</header>
<div id="mp-photo-gallery" class="photo-gallery swiper-container">
<iframe width="100%" height="363" src="https://www.youtube.com/embed/4DUrpYvh3V4" frameborder="0" allowfullscreen></iframe>
</div>

@ -72,15 +72,9 @@
<div class="mcl">
<div class="mp-photo-gallery">
<header class="clearfix">
<div class="pg-title"><a target="_blank" href="https://www.youtube.com/channel/UCE2QX9Q8YalEXHwaJoQf0MQ">{% trans ' Видеорепортажи' %}</a></div>
</header>
<div id="mp-photo-gallery" class="photo-gallery swiper-container">
<iframe width="100%" height="363" src="https://www.youtube.com/embed/4DUrpYvh3V4" frameborder="0" allowfullscreen></iframe>
</div>
{% if main_page_block %}
{{ main_page_block.text|safe }}
{% endif %}
{% comment %}
<div id="mp-photo-gallery" class="photo-gallery swiper-container">
<ul class="swiper-wrapper">

@ -1,8 +1,8 @@
{% load static %}
{% load i18n %}
{% load template_filters %}
{% if not request.COOKIES.subscribe_popup %}#}
{% if not user.contact_set.exists %}#}
{% if not request.COOKIES.subscribe_popup %}
{% if not user.contact_set.exists %}
<div id="pw-subscribe-popup" class="popup-window subscribe-modal">
<header class="clearfix">
<div class="step1">

@ -1,8 +1,10 @@
{% load i18n %}
<div id="pw-subscribe" class="popup-window pw-subscribe">
<header class="clearfix">
<div class="pw-title">Получать анонсы </div>
<div class="pw-title">{% trans 'Получать анонсы' %} </div>
<ul class="tabs">
<li class="active"><a class="icon-big-email" href="#">по e-mail</a></li>
<li class="active"><a class="icon-big-email" href="#">{% trans 'по e-mail' %}</a></li>
</ul>
</header>
<div class="pw-body clearfix">
@ -12,7 +14,7 @@
<div class="pwf-line mail">
<div class="pwf-field">{{ announce_subscribe.email }}</div>
<div class="pwf-msg"><a target="_blank" href="/newsletters/test-letter/">Пример рассылки</a></div>
<div class="pwf-msg"><a target="_blank" href="/newsletters/test-letter/">{% trans 'Пример рассылки' %}</a></div>
</div>
<div class="pwf-line country">
@ -44,7 +46,7 @@
</div>
<div class="pwf-buttons-line">
<button type="submit" class="icon-check">подписаться</button>
<button type="submit" class="icon-check">{% trans 'подписаться' %}</button>
</div>

Loading…
Cancel
Save