Merge branch 'develop' of git.general-servers.com:expomap/expomap into develop

remotes/origin/1203
Nazar Kotjuk 10 years ago
commit 529fff6560
  1. 1
      conference/models.py
  2. 54
      expobanner/admin.py
  3. 6
      expobanner/admin_urls.py
  4. 32
      expobanner/forms.py
  5. 8
      expobanner/models.py
  6. 2
      templates/admin/expobanner/default_form.html
  7. 23
      templates/admin/expobanner/main_list.html
  8. 33
      templates/admin/expobanner/paid_create.html
  9. 1
      templates/admin/includes/admin_nav.html
  10. 29
      templates/admin/theme/theme_blog_new.html
  11. 47
      theme/admin.py
  12. 4
      theme/admin_urls.py
  13. 34
      theme/forms.py
  14. 1
      theme/models.py

@ -111,6 +111,7 @@ class Conference(TranslatableModel, EventMixin, ExpoMixin):
keywords=models.CharField(max_length=250), keywords=models.CharField(max_length=250),
) )
main = models.ForeignKey('expobanner.MainPage', blank=True, null=True, on_delete=models.SET_NULL)
#fields saves information about creating and changing model #fields saves information about creating and changing model
created = models.DateTimeField(auto_now_add=True) created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True) modified = models.DateTimeField(auto_now=True)

@ -6,9 +6,9 @@ from django.shortcuts import get_object_or_404
from django.db.models import Sum from django.db.models import Sum
from expobanner.models import URL, BannerGroup, Banner, Paid, MainPage, Top from expobanner.models import URL, BannerGroup, Banner, Paid, MainPage, Top
from expobanner.forms import UrlCreateForm, BannerCreateGroupForm, BannerCreateForm, BannerGroupUpdateForm,\ from expobanner.forms import UrlCreateForm, BannerCreateGroupForm, BannerCreateForm, BannerGroupUpdateForm,\
PaidCreateForm, PaidUpdateForm, TopCreateForm, BannerLinkCreateForm, MainCreateForm, MainUpdateForm, TopUpdateForm PaidCreateForm, PaidUpdateForm, TopCreateForm, BannerLinkCreateForm, MainCreateForm, MainConfCreateForm, MainUpdateForm, TopUpdateForm
from exposition.models import Exposition from exposition.models import Exposition
from conference.models import Conference
class BannersControl(TemplateView): class BannersControl(TemplateView):
template_name = 'admin/expobanner/banners_control.html' template_name = 'admin/expobanner/banners_control.html'
@ -203,6 +203,8 @@ class PaidStat(DetailView):
return context return context
# ---------------------------------- # ----------------------------------
class MainList(ListView): class MainList(ListView):
model = Exposition model = Exposition
template_name = 'admin/expobanner/main_list.html' template_name = 'admin/expobanner/main_list.html'
@ -227,7 +229,6 @@ class MainUpdate(UpdateView):
template_name = 'admin/expobanner/default_form.html' template_name = 'admin/expobanner/default_form.html'
success_url = '/admin/expobanners/main/list/' success_url = '/admin/expobanners/main/list/'
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(MainUpdate, self).get_context_data(**kwargs) context = super(MainUpdate, self).get_context_data(**kwargs)
obj = self.object obj = self.object
@ -235,6 +236,50 @@ class MainUpdate(UpdateView):
return context return context
class MainConfList(ListView):
model = Conference
template_name = 'admin/expobanner/main_list.html'
paginate_by = settings.ADMIN_PAGINATION
def get_queryset(self):
qs = self.model.objects.language().filter(main__isnull=False).order_by('-main__public')
if self.request.GET.get('onlypublic'):
qs = qs.filter(main__public=True)
return qs
def get_context_data(self, **kwargs):
context = super(MainConfList, self).get_context_data(**kwargs)
context.update({'conf': True})
return context
from django.core.urlresolvers import reverse_lazy
class MainConfCreate(CreateView):
form_class = MainConfCreateForm
template_name = 'admin/expobanner/paid_create.html'
success_url = reverse_lazy('expobanner-conf-list_main')
def get_context_data(self, **kwargs):
context = super(MainConfCreate, self).get_context_data(**kwargs)
context.update({'conf': True})
return context
class MainConfUpdate(UpdateView):
model = MainPage
form_class = MainUpdateForm
template_name = 'admin/expobanner/default_form.html'
success_url = reverse_lazy('expobanner-conf-list_main')
def get_context_data(self, **kwargs):
context = super(MainConfUpdate, self).get_context_data(**kwargs)
obj = self.object
context['conference'] = obj.get_event()
return context
def main_turn(request, pk, status): def main_turn(request, pk, status):
main = get_object_or_404(MainPage, pk=pk) main = get_object_or_404(MainPage, pk=pk)
if status == 'on': if status == 'on':
@ -242,10 +287,11 @@ def main_turn(request, pk, status):
else: else:
main.public = False main.public = False
main.save() main.save()
return HttpResponseRedirect('/admin/expobanners/main/list/') return HttpResponseRedirect(request.META['HTTP_REFERER'])
from datetime import datetime from datetime import datetime
class MainStat(DetailView): class MainStat(DetailView):
model = MainPage model = MainPage
template_name = 'admin/expobanner/main_stat.html' template_name = 'admin/expobanner/main_stat.html'

@ -36,4 +36,10 @@ urlpatterns = patterns('expobanner.admin',
url(r'^main/$', MainCreate.as_view(), name='expobanner-create_main'), url(r'^main/$', MainCreate.as_view(), name='expobanner-create_main'),
url(r'^main/turn/(?P<pk>\d+)/(?P<status>.*)/$', main_turn, name='expobanner-main-turn'), url(r'^main/turn/(?P<pk>\d+)/(?P<status>.*)/$', main_turn, name='expobanner-main-turn'),
url(r'^main/(?P<pk>\d+)/stat/$', MainStat.as_view(), name='expobanner_stat_main'), url(r'^main/(?P<pk>\d+)/stat/$', MainStat.as_view(), name='expobanner_stat_main'),
# conference on main page
url(r'^main/conf/list/$', MainConfList.as_view(), name='expobanner-conf-list_main'),
url(r'^main/conf/(?P<pk>\d+)/edit/$', MainConfUpdate.as_view(), name='expobanner-conf-update_main'),
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'),
) )

@ -2,6 +2,7 @@
from django import forms from django import forms
from expobanner.models import URL, BannerGroup, Banner, Paid, Top, MainPage from expobanner.models import URL, BannerGroup, Banner, Paid, Top, MainPage
from exposition.models import Exposition from exposition.models import Exposition
from conference.models import Conference
from country.models import Country from country.models import Country
from ckeditor.widgets import CKEditorWidget from ckeditor.widgets import CKEditorWidget
from theme.models import Theme, Tag from theme.models import Theme, Tag
@ -107,6 +108,7 @@ class PaidCreateForm(forms.ModelForm):
raise forms.ValidationError(u'Такой выставки не существует') raise forms.ValidationError(u'Такой выставки не существует')
return expo return expo
class MainCreateForm(forms.ModelForm): class MainCreateForm(forms.ModelForm):
verbose = u'Добавить выставку на главную' verbose = u'Добавить выставку на главную'
exposition = forms.CharField(label=u'Выставка', widget=forms.HiddenInput()) exposition = forms.CharField(label=u'Выставка', widget=forms.HiddenInput())
@ -137,6 +139,36 @@ class MainCreateForm(forms.ModelForm):
return expo return expo
class MainConfCreateForm(forms.ModelForm):
verbose = u'Добавить конференцию на главную'
conf = forms.CharField(label=u'Конференция', widget=forms.HiddenInput())
class Meta:
model = MainPage
fields = ['position', 'public']
def save(self, commit=True):
main = super(MainConfCreateForm, self).save(commit=False)
if commit:
conf = self.cleaned_data['conf']
link = conf.get_permanent_url()
link_b = Banner.objects.create_for_paid(conf, link, 'main_page_link')
main.link = link_b
main.save()
conf.main = main
conf.save()
return main
def clean_conf(self):
conf_id = self.cleaned_data['conf']
try:
conf = Conference.objects.get(id=conf_id)
except Conference.DoesNotExist:
raise forms.ValidationError(u'Такой конференции не существует')
return conf
class PaidUpdateForm(forms.ModelForm): class PaidUpdateForm(forms.ModelForm):
tickets = forms.URLField(label=u'Линк на билеты') tickets = forms.URLField(label=u'Линк на билеты')
participation = forms.URLField(label=u'Линк на участие') participation = forms.URLField(label=u'Линк на участие')

@ -297,7 +297,13 @@ class MainPage(models.Model, StatMixin):
try: try:
return self.exposition_set.all()[0] return self.exposition_set.all()[0]
except IndexError: except IndexError:
return None try:
return self.conference_set.all()[0]
except IndexError:
return None
def __unicode__(self):
return self.get_event().url
def generatePassword(length=5): def generatePassword(length=5):

@ -51,7 +51,7 @@
<div class="box span8"> <div class="box span8">
<div class="box-header well"> <div class="box-header well">
<h2><i class="icon-pencil"></i>{{ form.verbose }}</h2> <h2><i class="icon-pencil"></i> {% if form.verbose %} {{ form.verbose }} {% else %} {{ object.get_event }} {% endif %}</h2>
</div> </div>
<div class="box-content"> <div class="box-content">
{% for field in form %} {% for field in form %}

@ -4,13 +4,17 @@
<div class="box span8"> <div class="box span8">
<div class="box-header well"> <div class="box-header well">
<h2><i class="icon-arrow-down"></i>Список выставок на главной</h2> <h2><i class="icon-arrow-down"></i>Список {% if conf %}конференций{% else %}выставок{% endif %} на главной</h2>
</div> </div>
<div class="box-content"> <div class="box-content">
{% block list_table %} {% block list_table %}
<div style="float:left;"> <div style="float:left;">
{% if conf %}
<a class="btn btn-success" href="{% url 'expobanner-conf-create_main' %}"><i class="icon-plus-sign icon-white"></i> Добавить конференцию</a>
{% else %}
<a class="btn btn-success" href="{% url 'expobanner-create_main' %}"><i class="icon-plus-sign icon-white"></i> Добавить выставку</a> <a class="btn btn-success" href="{% url 'expobanner-create_main' %}"><i class="icon-plus-sign icon-white"></i> Добавить выставку</a>
</div> {% endif %}
</div>
<div style="float:right;"> <div style="float:right;">
<form method="get" id="form"> <form method="get" id="form">
Только опубликование<input id="public" type="checkbox" name="onlypublic" value="true"> Только опубликование<input id="public" type="checkbox" name="onlypublic" value="true">
@ -19,7 +23,11 @@
<table class="table table-hover"> <table class="table table-hover">
<thead> <thead>
<tr> <tr>
<th>Выставка</th> {% if conf %}
<th>Конференция</th>
{% else %}
<th>Выставка</th>
{% endif %}
<th>Позиция</th> <th>Позиция</th>
<th>&nbsp;</th> <th>&nbsp;</th>
<th>&nbsp;</th> <th>&nbsp;</th>
@ -31,8 +39,13 @@
<tr> <tr>
<td>{{ item }}</td> <td>{{ item }}</td>
<td>{{ item.main.position }}</td> <td>{{ item.main.position }}</td>
<td><a href="{% url 'expobanner-update_main' item.main.id %}">Изменить</a> </td> {% if conf %}
<td>{% if item.main.public %}<a href="{% url 'expobanner-main-turn' item.main.id 'off' %}">отключить</a>{% else %}<a href="{% url 'expobanner-main-turn' item.main.id 'on' %}">включить</a>{% endif %} </td> <td><a href="{% url 'expobanner-conf-update_main' item.main.id %}">Изменить</a> </td>
<td>{% if item.main.public %}<a href="{% url 'expobanner-conf-main-turn' item.main.id 'off' %}">отключить</a>{% else %}<a href="{% url 'expobanner-conf-main-turn' item.main.id 'on' %}">включить</a>{% endif %} </td>
{% else %}
<td><a href="{% url 'expobanner-update_main' item.main.id %}">Изменить</a> </td>
<td>{% if item.main.public %}<a href="{% url 'expobanner-main-turn' item.main.id 'off' %}">отключить</a>{% else %}<a href="{% url 'expobanner-main-turn' item.main.id 'on' %}">включить</a>{% endif %} </td>
{% endif %}
<td><a href="{% url 'expobanner_stat_main' item.main.id %}">Статистика</a> </td> <td><a href="{% url 'expobanner_stat_main' item.main.id %}">Статистика</a> </td>
</tr> </tr>
{% endfor %} {% endfor %}

@ -39,6 +39,39 @@
} }
}); });
$('#id_conf').select2({
placeholder: 'Найти',
width: 'element',
ajax: {
url: '/admin/conference/search/',
dataType: "json",
quietMillis: 200,
multiple: true,
data: function(term, page){
return {term: term,
page: page};
},
results: function (data) {
var results = [];
$.each(data, function(index, item){
results.push({
id: item.id,
text: item.label
});
});
return {results: results};
}
},
initSelection : function(element, callback) {
var id= $(element).val();
var text = $(element).attr('data-init-text');
callback({id: id, text:text});
}
});
}); });
</script> </script>
{% endblock %} {% endblock %}

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

@ -7,7 +7,6 @@
{# selects #} {# selects #}
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/> <link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/>
<script src="{% static 'js/select/select2.js' %}"></script> <script src="{% static 'js/select/select2.js' %}"></script>
<script src="{% static 'custom_js/make_select.js' %}"></script>
@ -15,25 +14,27 @@
{% block body %} {% block body %}
<form method="post" class="form-horizontal"> {% csrf_token %}{{ form.errors }} <form method="post" class="form-horizontal" > {% csrf_token %}
<fieldset> <fieldset>
<legend><i class="icon-edit"></i>{% if object %} Изменить {% else %} Добавить {% endif %}тему</legend> <legend><i class="icon-edit"></i>{% if theme_id %} Изменить {% else %} Добавить {% endif %}тему</legend>
<div class="box span8"> <div class="box span8">
<div class="box-header well"> <div class="box-header well">
<h2><i class="icon-pencil"></i> Информация</h2> <h2><i class="icon-pencil"></i> Информация</h2>
</div> </div>
<div class="box-content"> <div class="box-content">
{% for field in form %} {# name #}
{% with field='name' form=form languages=languages %}
<div {% if object and forloop.first %} style="display:none;"{% endif %} class="control-group {% if field.errors %}error{% endif %}"> {% include 'admin/forms/multilang.html' %}
<label class="control-label">{{ field.label }}:</label> {% endwith %}
<div class="controls">
{{ field }} {# main_title #}
<span class="help-inline">{{ field.errors }}</span> {% with field='main_title' form=form languages=languages %}
</div> {% include 'admin/forms/multilang.html' %}
</div> {% endwith %}
{# description #}
{% endfor %} {% with field='description' form=form languages=languages %}
{% include 'admin/forms/multilang.html' %}
{% endwith %}
</div> </div>
</div> </div>

@ -182,13 +182,46 @@ class ThemeBlogListView(ListView):
paginate_by = settings.ADMIN_PAGINATION paginate_by = settings.ADMIN_PAGINATION
class ThemeBlogCreateView(CreateView): class ThemeBlogDeleteView(DeleteView):
template_name = "admin/theme/theme_blog_new.html" template_name = "admin/theme/theme_blog_confirm_delete.html"
model = ThemeBlog model = ThemeBlog
form_class = ThemeBlogForm
success_url = reverse_lazy("theme_blog_all") success_url = reverse_lazy("theme_blog_all")
pk_url_kwarg = "theme_id"
def blog_theme_add(request):
return add_object(request, ThemeBlogForm, 'theme_blog_new.html', reverse_lazy("theme_blog_all"))
@login_required
def blog_theme_change(request, theme_id=None):
try:
theme = ThemeBlog.objects.get(id=theme_id)
except:
return HttpResponseRedirect('theme_blog_all')
if request.POST:
form = ThemeBlogForm(request.POST)
if form.is_valid():
form.save(theme_id)
return HttpResponseRedirect(reverse_lazy("theme_blog_all"))
else:
data = {}
for code, name in settings.LANGUAGES:
obj = ThemeBlog._meta.translations_model.objects.get(language_code = code,master__id=theme_id) #access to translated fields
data['name_%s'%code] = obj.name
data['description_%s'%code] = obj.description
data['main_title_%s'%code] = obj.main_title
form = ThemeBlogForm(data)
args = {}
args.update(csrf(request))
args['form'] = form
args['languages'] = settings.LANGUAGES
args['theme_id'] = theme_id
return render_to_response('admin/theme/theme_blog_new.html', args)
# ======================================================
class ThemeBlogUpdateView(UpdateView): class ThemeBlogUpdateView(UpdateView):
template_name = "admin/theme/theme_blog_new.html" template_name = "admin/theme/theme_blog_new.html"
model = ThemeBlog model = ThemeBlog
@ -197,8 +230,8 @@ class ThemeBlogUpdateView(UpdateView):
pk_url_kwarg = "theme_id" pk_url_kwarg = "theme_id"
class ThemeBlogDeleteView(DeleteView): class ThemeBlogCreateView(CreateView):
template_name = "admin/theme/theme_blog_confirm_delete.html" template_name = "admin/theme/theme_blog_new.html"
model = ThemeBlog model = ThemeBlog
success_url = reverse_lazy("theme_blog_all") form_class = ThemeBlogForm
pk_url_kwarg = "theme_id" success_url = reverse_lazy("theme_blog_all")

@ -7,12 +7,12 @@ from .admin import ThemeBlogCreateView, ThemeBlogUpdateView, ThemeBlogDeleteView
urlpatterns = patterns('theme.admin', urlpatterns = patterns('theme.admin',
url(r'^theme/add.*/$', 'theme_add'), url(r'^theme/add.*/$', 'theme_add'),
url(r'^tag/add.*/$', 'tag_add'), url(r'^tag/add.*/$', 'tag_add'),
url(r'^blog_theme/add/$', ThemeBlogCreateView.as_view(), name = 'theme_blog_new'), url(r'^blog_theme/add/$', 'blog_theme_add', name = 'theme_blog_new'),
url(r'^theme/delete/(?P<theme_id>\d+)/$', 'theme_delete'), url(r'^theme/delete/(?P<theme_id>\d+)/$', 'theme_delete'),
url(r'^tag/delete/(?P<tag_id>\d+)/$', 'tag_delete'), url(r'^tag/delete/(?P<tag_id>\d+)/$', 'tag_delete'),
url(r'^blog_theme/delete/(?P<theme_id>\d+)/$', ThemeBlogDeleteView.as_view(), name = 'theme_blog_delete'), url(r'^blog_theme/delete/(?P<theme_id>\d+)/$', ThemeBlogDeleteView.as_view(), name = 'theme_blog_delete'),
url(r'^theme/change/(?P<theme_id>\d+).*/$', 'theme_change'), url(r'^theme/change/(?P<theme_id>\d+).*/$', 'theme_change'),
url(r'^blog_theme/change/(?P<theme_id>\d+).*/$', ThemeBlogUpdateView.as_view(), name= "theme_blog_change"), url(r'^blog_theme/change/(?P<theme_id>\d+).*/$', 'blog_theme_change', name= "theme_blog_change"),
url(r'^tag/change/(?P<tag_id>\d+).*/$', 'tag_change'), url(r'^tag/change/(?P<tag_id>\d+).*/$', 'tag_change'),
url(r'^theme/copy/(?P<theme_id>\d+).*/$', 'theme_copy'), url(r'^theme/copy/(?P<theme_id>\d+).*/$', 'theme_copy'),
url(r'^tag/copy/(?P<tag_id>\d+).*/$', 'tag_copy'), url(r'^tag/copy/(?P<tag_id>\d+).*/$', 'tag_copy'),

@ -149,7 +149,7 @@ from hvad.forms import TranslatableModelForm
from .models import ThemeBlog from .models import ThemeBlog
class ThemeBlogForm(TranslatableModelForm): class _ThemeBlogForm(TranslatableModelForm):
class Meta: class Meta:
model = ThemeBlog model = ThemeBlog
fields = ['url', 'name', 'main_title', 'description', 'inflect'] fields = ['url', 'name', 'main_title', 'description', 'inflect']
@ -158,4 +158,34 @@ class ThemeBlogForm(TranslatableModelForm):
def save(self, commit= True): def save(self, commit= True):
if not 'url' in self.cleaned_data: if not 'url' in self.cleaned_data:
self.cleaned_data['url'] = translit_with_separator(self.cleaned_data['name']) self.cleaned_data['url'] = translit_with_separator(self.cleaned_data['name'])
return super(ThemeBlogForm, self).save(commit=True) return super(_ThemeBlogForm, self).save(commit=True)
class ThemeBlogForm(forms.Form):
def __init__(self, *args, **kwargs):
super(ThemeBlogForm, 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
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['name_%s' % code] = forms.CharField(label='Название', required=required)
self.fields['main_title_%s' % code] = forms.CharField(label='Заголовок', required=required)
self.fields['description_%s' % code] = forms.CharField(label='Описание', required=False, widget=CKEditorWidget)#with saving form
def save(self, id=None):
data = self.cleaned_data
if not id:
theme = ThemeBlog()
else:
theme = ThemeBlog.objects.get(id=id)
if not getattr(theme, 'url'):
theme.url = translit_with_separator(data['name_ru'].strip()).lower()
fill_with_signal(ThemeBlog, theme, data)
if not theme.url:
theme.url = translit_with_separator(theme.name)
theme.save()

@ -273,6 +273,7 @@ def pre_save_handler(sender, **kwargs):
pre_save.connect(pre_save_handler, sender=Tag) pre_save.connect(pre_save_handler, sender=Tag)
post_save.connect(post_save_handler, sender=Theme) post_save.connect(post_save_handler, sender=Theme)
post_save.connect(post_save_handler, sender=ThemeBlog)
post_save.connect(post_save_handler, sender=Tag) post_save.connect(post_save_handler, sender=Tag)

Loading…
Cancel
Save