Exclude Statistic from form wizard, make some 'friendly' UI for selects, cheking for organiser to add exposition

remotes/origin/1203
Ivan Kovalkovskyi 11 years ago
parent a0e4654cf5
commit c6e45fbe3b
  1. 3
      accounts/models.py
  2. 46
      core/models.py
  3. 7
      meta/forms.py
  4. 53
      meta/models.py
  5. 1
      meta/views.py
  6. 1
      static/custom_js/place_city_ajax.js
  7. 167
      static/custom_js/wizard.js
  8. 16
      templates/admin/meta/create_seo_text.html
  9. 5
      templates/client/blank.html
  10. 5
      templates/client/includes/header.html
  11. 5
      templates/client/includes/meta.html
  12. 69
      templates/client/wizard/first_step.html
  13. 71
      templates/client/wizard/second_step.html
  14. 35
      wizard/forms.py
  15. 11
      wizard/urls.py
  16. 63
      wizard/views.py

@ -144,6 +144,9 @@ class User(AbstractBaseUser, PermissionsMixin):
class Meta: class Meta:
ordering=['-rating'] ordering=['-rating']
def is_organiser(self):
return bool(self.organiser)
def get_full_name(self): def get_full_name(self):
""" """
Returns the first_name plus the last_name, with a space in between. Returns the first_name plus the last_name, with a space in between.

@ -4,7 +4,7 @@ from django.shortcuts import get_object_or_404
from django.db import models from django.db import models
from exposition.models import Exposition from exposition.models import Exposition
from settings.models import create_transl_fields import copy
from theme.models import Theme from theme.models import Theme
from country.models import Country from country.models import Country
from city.models import City from city.models import City
@ -114,22 +114,38 @@ class Page(TranslatableModel):
def get_absolute_url(self): def get_absolute_url(self):
return reverse('page_view', args=[self.url]) return reverse('page_view', args=[self.url])
def __init__(self, *args, **kwargs):
super(Page, self).__init__(*args, **kwargs)
self.cache_fields = ['h1', 'body','title', 'description', 'keywords']
self.var_cache = {var: copy.copy(getattr(self, var)) for var in self.cache_fields}
self.is_new = True
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
super(Page,self).save(*args, **kwargs) super(Page,self).save(*args, **kwargs)
self.initial_language = 'ru'
all_field_names = list(self._translated_field_names)
clear_f_n = list(set(all_field_names) - {'master', 'master_id', 'id', 'language_code'}) new_values = {field: getattr(self, field) for field in self.cache_fields}
field_items = {} langs = [code for code, _ in settings.LANGUAGES]
for fname in clear_f_n: if self.is_new:
field_items[fname] = getattr(self, fname) for lang in langs:
if lang not in self.get_available_languages():
langs = [lan[0] for lan in settings.LANGUAGES] self.translate(lang)
for lang in langs: for key, value in new_values.items():
if lang not in self.get_available_languages(): setattr(self, key, value)
self.translate(lang) self.save_translations(self)
for key, value in field_items.items(): else:
setattr(self, key, value) translations = {obj.language_code:obj for obj in list(self.translations.all())}
self.save_translations(self) for lang in langs:
if lang is not self.initial_language:
tr = translations[lang]
for key, value in new_values.items():
#if u'%s' % getattr(self, key) is u'' or getattr(self, key) is u'%s' % self.var_cache[key]:
setattr(tr, key, value)
tr.save()
self.lazy_translation_getter(self.initial_language)
self.var_cache = {var: copy.copy(getattr(self, var)) for var in self.cache_fields}
self.is_new = False
return self return self
def __unicode__(self): def __unicode__(self):

@ -46,13 +46,14 @@ class MetaForm(forms.Form):
fill_with_signal(MetaSetting, meta, data) fill_with_signal(MetaSetting, meta, data)
meta.save() meta.save()
class MetaFilterForm(AdminFilterForm): class MetaFilterForm(AdminFilterForm):
model = MetaSetting model = MetaSetting
class SeoTextForm(TranslatableModelForm): class SeoTextForm(TranslatableModelForm):
# lang = forms.ChoiceField(choices=settings.LANGUAGES)
class Meta: class Meta:
model = SeoText model = SeoText
fields = ['url', 'title', 'body'] fields = ['url', 'title', 'page_title', 'description', 'body']
widgets = {'body':CKEditorWidget} widgets = {'body': CKEditorWidget}

@ -142,11 +142,12 @@ class SeoTextManager(TranslationManager):
class SeoText(TranslatableModel): class SeoText(TranslatableModel):
cache_fields = ['title', 'body'] url = models.CharField(max_length=50, unique=True, verbose_name=u"URL: www.expomap.ru")
url = models.CharField(max_length=50, unique=True, verbose_name=u"URL: expomap.ru")
translations = TranslatedFields( translations = TranslatedFields(
title=models.CharField(max_length=255, verbose_name=u"Заголовок"), title=models.CharField(max_length=255, verbose_name=u"Заголовок"),
page_title=models.CharField(max_length=255, verbose_name=u"Тайтл страницы"),
description=models.CharField(max_length=1000, verbose_name=u"Дескрипшн"),
body=models.TextField(verbose_name=u"Текст") body=models.TextField(verbose_name=u"Текст")
) )
@ -154,36 +155,38 @@ class SeoText(TranslatableModel):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(SeoText, self).__init__(*args, **kwargs) super(SeoText, self).__init__(*args, **kwargs)
self.cache_fields = ['title', 'body', 'page_title', 'description']
self.is_new = True self.is_new = True
self.var_cache = {var: copy.copy(getattr(self, var)) for var in SeoText.cache_fields}
def get_absolute_url(self): def get_absolute_url(self):
return reverse_lazy('seo_all') return self.url
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
init_lang = self.language_code super(SeoText, self).save(*args, **kwargs)
self.is_new = bool(self.id) self.initial_language = 'ru'
if not self.is_new: super(SeoText, self).save(*args, **kwargs)
new_values = {field: getattr(self, field) for field in self.cache_fields}
field_items = {} langs = [code for code, _ in settings.LANGUAGES]
for fname in self.cache_fields: if self.is_new:
field_items[fname] = getattr(self, fname) for lang in langs:
if lang not in self.get_available_languages():
langs = [l[0] for l in settings.LANGUAGES] self.translate(lang)
for lang in langs: for key, value in new_values.items():
if lang not in self.get_available_languages():
self.translate(lang)
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) setattr(self, key, value)
if self.is_new:
self.save_translations(self) self.save_translations(self)
else: else:
super(SeoText, self).save(*args, **kwargs) translations = {obj.language_code:obj for obj in list(self.translations.all())}
for lang in langs:
self.translate(init_lang) if lang is not self.initial_language:
self.var_cache = {var: copy.copy(getattr(self, var)) for var in SeoText.cache_fields} tr = translations[lang]
for key, value in new_values.items():
#if u'%s' % getattr(self, key) is u'' or getattr(self, key) is u'%s' % self.var_cache[key]:
setattr(tr, key, value)
tr.save()
self.lazy_translation_getter(self.initial_language)
self.var_cache = {var: copy.copy(getattr(self, var)) for var in self.cache_fields}
self.is_new = False
return self return self
def __unicode__(self): def __unicode__(self):

@ -208,6 +208,7 @@ class EditSeoText(UpdateView):
template_name = "admin/meta/create_seo_text.html" template_name = "admin/meta/create_seo_text.html"
class DeleteSeoText(DeleteView): class DeleteSeoText(DeleteView):
model = SeoText model = SeoText
template_name = "admin/meta/seo_confirm_delete.html" template_name = "admin/meta/seo_confirm_delete.html"

@ -14,6 +14,5 @@
$('#id_city').attr('disabled', false); $('#id_city').attr('disabled', false);
}); });
}); });
}); });

@ -0,0 +1,167 @@
/**
* Created by dev on 07.09.2015.
*/
$(document).ready(function () {
$('select').select2({
width: 'element',
allowClear: true
});
$('#id_country').change(function () {
$.get(
"/admin/ajax_city/", {'id': $(this).val()}, function (j) {
$('#id_city').html(j);
$('#id_city').attr('disabled', false);
});
});
$('#id_place').select2({
placeholder:"Место проведения",
widht: 400
});
$('#id_city').select2({
placeholder: "Город",
width: 300,
ajax: {
url: "/admin/city/search/",
dataType: "json",
quietMillis: 200,
data: function (term, page, country) {
var country = $('#id_country').val()
return {
term: term,
page: page,
country: country
};
},
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});
}
});
$('#id_0-periodic').select2({
placeholder: "Периодичность",
width: '350px'
});
$('#id_tag').select2({
placeholder: "Теги",
width: '350px',
multiple: true,
ajax: {
url: "/admin/theme/tag/search/",
dataType: "json",
quietMillis: 200,
multiple: true,
data: function (term, page, theme) {
var theme = $('#id_theme').serialize().replace(/0-theme/g, 'theme');
return {
term: term,
page: page,
theme: theme
};
},
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 data = [];
$(element.val().split(",")).each(function (i) {
var item = this.split(':');
data.push({
id: item[0],
text: item[1]
});
});
callback(data);
}
});
// end selects
/*
*/
// theme change
$('#id_theme').change(function () {
$.get(
"/admin/ajax_tag/", {'id': $(this).serialize().replace(/0-theme/g, 'theme')}, function (data) {
var optionValues = [];
var getValues = [];
var selectedValues = [];
//push values sended from server in array
$.each(data, function (i, elem) {
getValues.push(elem[0].toString())
});
//delete options if they aren't in getvalues
//otherwise push it in array
//also push in array already selected values
$('#id_tag option').each(function () {
var check = $.inArray($(this), getValues);
if ($(this).is(':selected')) {
selectedValues.push($(this).val())
}
if (check == -1) {
$(this).remove()
}
else {
optionValues.push($(this).val());
}
});
//generate new options
//old options unchanged
var html = '';
$.each(data, function (i, elem) {
var check = $.inArray(elem[0].toString(), optionValues);
if (check == -1) {
html += '<option value="';
html += elem[0];
html += '">';
html += elem[1];
html += '</option>';
}
});
$('#id_tag').append(html);
//select previous selected values
$('#id_tag option').each(function () {
var check = $.inArray($(this).val(), selectedValues)
if (check != -1) {
$(this).attr('selected', 'selected');
}
});
});//end get
});//end change
console.log("hello from wizard.js");
});

@ -41,6 +41,22 @@
<span class="help-inline">{{ form.title.errors }}</span> <span class="help-inline">{{ form.title.errors }}</span>
</div> </div>
</div> </div>
{# page title #}
<div class="control-group {% if form.page_title.errors %}error{% endif %}">
<label class="control-label">{{ form.page_title.label }}:</label>
<div class="controls">
{{ form.page_title }}
<span class="help-inline">{{ form.page_title.errors }}</span>
</div>
</div>
{# description #}
<div class="control-group {% if form.description.errors %}error{% endif %}">
<label class="control-label">{{ form.description.label }}:</label>
<div class="controls">
{{ form.description }}
<span class="help-inline">{{ form.description.errors }}</span>
</div>
</div>
{# body #} {# body #}
<div class="control-group {% if form.body.errors %}error{% endif %}"> <div class="control-group {% if form.body.errors %}error{% endif %}">
<label class="control-label">{{ form.body.label }}:</label> <label class="control-label">{{ form.body.label }}:</label>

@ -21,7 +21,7 @@ This template include basic anf main styles and js files,
<html class="no-js"> <!--<![endif]--> <html class="no-js"> <!--<![endif]-->
<!--if IE 8><script src="js/selectivizr-min.js"></script><![endif]--> <!--if IE 8><script src="js/selectivizr-min.js"></script><![endif]-->
<head> <head>
{% include 'includes/meta.html' %} {% include 'client/includes/meta.html' %}
<meta name="cmsmagazine" content="ca270688603566278c9006a1511705b1" /> <meta name="cmsmagazine" content="ca270688603566278c9006a1511705b1" />
<meta name="ktoprodvinul" content="7bf9e596b7b6707a" /> <meta name="ktoprodvinul" content="7bf9e596b7b6707a" />
<link rel="icon" href="{% static 'client/img/favicon.ico' %}" type="image/x-icon" /> <link rel="icon" href="{% static 'client/img/favicon.ico' %}" type="image/x-icon" />
@ -45,6 +45,9 @@ This template include basic anf main styles and js files,
<script src="{% static 'client/js/vendor/modernizr-2.6.2-respond-1.1.0.min.js' %}"></script> <script src="{% static 'client/js/vendor/modernizr-2.6.2-respond-1.1.0.min.js' %}"></script>
<script src="{% static 'client/js/vendor/jquery-1.10.1.min.js' %}"></script> <script src="{% static 'client/js/vendor/jquery-1.10.1.min.js' %}"></script>
<script src="{% static 'client/js/jquery-ui-1.10.4.custom.min.js' %}" type="text/javascript"></script> <script src="{% static 'client/js/jquery-ui-1.10.4.custom.min.js' %}" type="text/javascript"></script>
{% block head_scripts %}
{% endblock %}
{% if request.GET.debug == '1' %} {% if request.GET.debug == '1' %}
<script src="{% static 'client/js/_modules/block.common.js' %}"></script> <script src="{% static 'client/js/_modules/block.common.js' %}"></script>
{% else %} {% else %}

@ -11,11 +11,10 @@
<div class="header-body mcl"> <div class="header-body mcl">
<div class="header-top clearfix"> <div class="header-top clearfix">
<div class="ht-main"> <div class="ht-main">
{% if user.is_authenticated %} {% if user.is_authenticated %}
{% if user.organiser %} {% if user.is_organiser %}
<div class="add-link"><a class="l-button ico" href="#">{% trans 'добавить событие' %}</a></div> <div class="add-link"><a class="l-button ico" href="{% url "add_exposition" %}">добавить событие </a></div>
{% endif %} {% endif %}
{% endif %} {% endif %}

@ -2,7 +2,10 @@
{% load i18n %} {% load i18n %}
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
{% if meta %} {% if seotext %}
{% if seotext.description %}{% meta 'description' seotext.description %}{% endif %}
{% if seotext.page_title %}<title>{{ seotext.page_title }}</title>{% endif %}
{% elif meta %}
{% if meta.description %}{% meta 'description' meta.description %}{% endif %} {% if meta.description %}{% meta 'description' meta.description %}{% endif %}
{% if meta.keywords %}{% meta_list 'keywords' meta.keywords %}{% endif %} {% if meta.keywords %}{% meta_list 'keywords' meta.keywords %}{% endif %}
{% if meta.title %}<title>{{ meta.title }}</title>{% endif %} {% if meta.title %}<title>{{ meta.title }}</title>{% endif %}

@ -1,4 +1,10 @@
{% extends 'client/base_catalog.html' %} {% extends 'client/base_catalog.html' %}
{% load static %}
{% block head_scripts %}
<script src="{% static 'js/select/select2.js' %}"></script>
<script src="{% static 'custom_js/wizard.js' %}"></script>
{% endblock %}
{% block content_list %} {% block content_list %}
{{ form.errors }} {{ form.errors }}
@ -8,14 +14,8 @@
{{ wizard.form.media }} {{ wizard.form.media }}
<h3>Шаг {{ wizard.steps.step1 }}. Основная информация</h3> <h3>Шаг {{ wizard.steps.step1 }}. Основная информация</h3>
</div> </div>
<form action="" enctype="multipart/form-data" method="post">{% csrf_token %} <form action="" enctype="multipart/form-data" method="post">{% csrf_token %}
{{ wizard.management_form }} {{ wizard.management_form }}
{# {% if wizard.form.forms %}#}
{# {{ wizard.form.management_form }}#}
{# {% for form in wizard.form.forms %}#}
{# {{ form }}#}
{# {% endfor %}#}
{# {% else %}#}
{% with wizard.form as form %} {% with wizard.form as form %}
<div class="adm-form-body"> <div class="adm-form-body">
<div class="mf-line "> <div class="mf-line ">
@ -77,14 +77,14 @@
<div class="mf-line"> <div class="mf-line">
<div class="mf-field"> <div class="mf-field">
<h3>Место проведения:</h3> <h3>Место проведения:</h3>
{{ form.place }} {{ form.place }}
</div> </div>
</div> </div>
<div class="mf-line"> <div class="mf-line">
<div class="mf-field"> <div class="mf-field">
<h3>Страна:</h3> <h3>Страна:</h3>
{{ form.country }} {{ form.country }}
</div> </div>
@ -107,13 +107,14 @@
<div class="clearfix"> <div class="clearfix">
<div class="mff-col"> <div class="mff-col">
<label class="check">{{ form.audience1 }}специалисты</label> <label class="checkbox">{{ form.audience1 }}специалисты</label>
<label class="check">{{ form.audience2 }}специалисты и <label class="checkbox">{{ form.audience2 }}специалисты и
потребители</label> потребители</label>
<label class="check">{{ form.audience3 }}широкая публика</label> <label class="checkbox">{{ form.audience3 }}широкая публика</label>
</div> </div>
<div class="mff-col"> <div class="mff-col">
Периодичность:
{{ form.periodic }} {{ form.periodic }}
</div> </div>
</div> </div>
@ -127,9 +128,9 @@
<label>Членства и знаки качества:</label> <label>Членства и знаки качества:</label>
<div class="mf-field"> <div class="mf-field">
<label class="check">{{ form.membership1 }}Exporating</label> <label class="checkbox">{{ form.membership1 }}Exporating</label>
<label class="check">{{ form.membership2 }}RSVA</label> <label class="checkbox">{{ form.membership2 }}RSVA</label>
<label class="check">{{ form.membership3 }}UFI</label> <label class="checkbox">{{ form.membership3 }}UFI</label>
<hr/> <hr/>
</div> </div>
</div> </div>
@ -150,12 +151,6 @@
<div id="work-time" class="mf-field"> <div id="work-time" class="mf-field">
<div class="w-time"> <div class="w-time">
{# <div class="w-time-day">#}
{# <select name="d01">#}
{# <option value="12.04.2014">12.04.2014</option>#}
{# </select>#}
{# </div>#}
<div class="w-time-wrap"> <div class="w-time-wrap">
<label>c</label> <label>c</label>
{{ form.time_start }} {{ form.time_start }}
@ -165,10 +160,7 @@
<label>до</label> <label>до</label>
{{ form.time_end }} {{ form.time_end }}
</div> </div>
{# <label class="check"><input type="checkbox" class="w-time-switcher" name="c05" checked />Один график на все дни</label>#}
</div> </div>
</div> </div>
</div> </div>
@ -195,24 +187,23 @@
</div> </div>
</form> </form>
{% endwith %} {% endwith %}
</div> </div>
<div class="set-sect p-form adm-form not-active"> <div class="set-sect p-form adm-form not-active">
<div class="set-sect-title clearfix"> <div class="set-sect-title clearfix">
<h3>Шаг 2. Статистика и условия участия</h3> <h3>Шаг 2. Статистика и условия участия</h3>
</div> </div>
</div> </div>
<div class="set-sect p-form adm-form not-active"> <div class="set-sect p-form adm-form not-active">
<div class="set-sect-title clearfix"> <div class="set-sect-title clearfix">
<h3>Шаг 3. Добавление фото</h3> <h3>Шаг 3. Добавление фото</h3>
</div> </div>
</div> </div>
</div> </div>
<hr/> <hr/>
{# {% endif %}#}
{% endblock %} {% endblock %}

@ -1,4 +1,19 @@
{% extends 'client/base_catalog.html' %} {% extends 'client/base_catalog.html' %}
{% load static %}
{% block head_scripts %}
<script src="{% static 'js/select/select2.js' %}"></script>
<script>
$(document).ready(function () {
$('select').select2({
width: 'element',
allowClear: true
});
});
</script>
{% endblock %}
{% block content_list %} {% block content_list %}
{{ form.errors }} {{ form.errors }}
@ -51,62 +66,6 @@
</div> </div>
</div> </div>
<div class="mf-stat-item">
<hr/>
<div class="mf-line mf-prod">
<label class="h3">Статистика за</label>
<div class="mf-field">
<div class="mf-year">
{{ form.statistic_year }}
</div>
<div class="mf-stat-data">
<div class="sd-visitors">
{{ form.visitors }}
</div>
<div class="sd-participants">
{{ form.partisipants }}
</div>
<div class="sd-area">
{{ form.square }}
м²
</div>
</div>
</div>
</div>
<div class="mf-line mf-prod mf-stat-countries">
<label>Страны:</label>
<div class="mf-field">
<div class="csb-selected-items"></div>
<div class="csb-menu-wrap">
<div class="scroll-container csb-menu">
<div class="scroll-content clearfix">
{{ form.countries }}
</div>
</div>
</div>
</div>
</div>
</div>
<div class="mf-stat-add-button">
<a class="button big icon-add" href="#">добавить данные за другой период</a>
</div>
</div>
<hr/> <hr/>
<h2>Стоимость посещения и участия</h2> <h2>Стоимость посещения и участия</h2>

@ -1,8 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django import forms from django import forms
from theme.models import Theme, Tag from theme.models import Theme
from place_exposition.models import PlaceExposition from place_exposition.models import PlaceExposition
from city.models import City
from country.models import Country from country.models import Country
from multiupload.fields import MultiFileField, MultiFileInput from multiupload.fields import MultiFileField, MultiFileInput
@ -25,19 +24,19 @@ class ExpoForm1(forms.Form):
date_start = forms.DateField(widget=forms.TextInput(attrs={'class':'data dateFrom', 'placeholder':'дд.мм.гг'})) date_start = forms.DateField(widget=forms.TextInput(attrs={'class':'data dateFrom', 'placeholder':'дд.мм.гг'}))
date_end = forms.DateField(widget=forms.TextInput(attrs={'class':'data dateTo','placeholder':'дд.мм.гг'})) date_end = forms.DateField(widget=forms.TextInput(attrs={'class':'data dateTo','placeholder':'дд.мм.гг'}))
country = forms.ChoiceField(label=u'Страна', choices=[(c.id, c.name) for c in Country.objects.all()]) country = forms.ChoiceField(label=u'Страна', choices=[(c.id, c.name) for c in Country.objects.all()], widget=forms.Select(attrs={'id':'id_country'}))
theme = forms.MultipleChoiceField(label='Тематики', choices=[(item.id, item.name) for item in Theme.objects.language().all()]) theme = forms.MultipleChoiceField(label='Тематики', choices=[(item.id, item.name) for item in Theme.objects.language().all()], widget=forms.SelectMultiple(attrs={'id':'id_theme'}))
place = forms.ChoiceField(label=u'Место проведения', required=False, choices=places) place = forms.ChoiceField(label=u'Место проведения', required=False, choices=places, widget=forms.Select(attrs={'id':'id_place'}))
city = forms.CharField(label=u'Город', widget=forms.HiddenInput()) city = forms.CharField(label=u'Город', widget=forms.HiddenInput(attrs={'id':'id_city'}))
tag = forms.CharField(label=u'Теги', widget=forms.HiddenInput(), required=False) tag = forms.CharField(label=u'Теги', widget=forms.HiddenInput(attrs={'id':'id_tag'}), required=False)
audience1 = forms.BooleanField(required=False) audience1 = forms.BooleanField(required=False)
audience2 = forms.BooleanField(required=False) audience2 = forms.BooleanField(required=False)
audience3 = forms.BooleanField(required=False) audience3 = forms.BooleanField(required=False)
periodic = forms.ChoiceField(choices=choices, required=False, widget=forms.Select(attrs={'placeholder':u'Периодичность'})) periodic = forms.ChoiceField(choices=choices, required=False)
membership1= forms.BooleanField(required=False) membership1 = forms.BooleanField(required=False)
membership2= forms.BooleanField(required=False) membership2 = forms.BooleanField(required=False)
membership3= forms.BooleanField(required=False) membership3 = forms.BooleanField(required=False)
web_site = forms.URLField(required=False, widget=forms.TextInput(attrs={'placeholder': "Веб-сайт (необязательно)"})) web_site = forms.URLField(required=False, widget=forms.TextInput(attrs={'placeholder': "Веб-сайт (необязательно)"}))
products = forms.CharField(widget=forms.Textarea(attrs={'placeholder': "Экспонируемые продукты", 'cols':30, 'rows':10})) products = forms.CharField(widget=forms.Textarea(attrs={'placeholder': "Экспонируемые продукты", 'cols':30, 'rows':10}))
time_start = forms.TimeField() time_start = forms.TimeField()
@ -50,12 +49,6 @@ class ExpoForm2(forms.Form):
statistics statistics
""" """
found_year = forms.IntegerField() found_year = forms.IntegerField()
statistic_year = forms.IntegerField(widget=forms.TextInput(attrs={'placeholder':'введите год'}))
visitors = forms.IntegerField(widget=forms.TextInput(attrs={'placeholder':'количество посетителей'}))
partisipants = forms.IntegerField(widget=forms.TextInput(attrs={'placeholder':'количество учасников'}))
square = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'площадь'}))
countries = forms.ModelChoiceField(queryset=Country.objects.filter(id=50))
# ticket price # ticket price
pre_one_day = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'на один день'})) pre_one_day = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'на один день'}))
pre_all_days = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'на все дни'})) pre_all_days = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'на все дни'}))
@ -72,9 +65,11 @@ class ExpoForm2(forms.Form):
class ExpoForm3(forms.Form): class ExpoForm3(forms.Form):
attachments = MultiFileField(min_num=0, max_num=2, max_file_size=1024*1024*5, widget=MultiFileInput( """
attrs={'class':'button big icon-camera', 'value':u'выберите фотографии', 'id':'files'} photos from last expositions
"""
attachments = MultiFileField(min_num=0, max_num=6, max_file_size=1024*1024*5, widget=MultiFileInput(
attrs={'class':'button big icon-camera', 'value': u'выберите фотографии', 'id': 'files'}
)) ))
formlist = [ExpoForm1, ExpoForm2, ExpoForm3]

@ -1,8 +1,7 @@
from django.conf.urls import patterns, url, include from django.conf.urls import patterns, url
from .views import ExpoWizard
from .forms import ExpoForm1, ExpoForm2,ExpoForm3
from wizard.views import wizard_view formlist = [ExpoForm1,ExpoForm2, ExpoForm3]
urlpatterns = patterns('', urlpatterns = patterns('', url(r'^$', ExpoWizard.as_view(formlist), name = 'add_exposition'))
# url(r'^ajax/$', 'wizard.views.ajax_view'),
url(r'^$', wizard_view)
)

@ -1,13 +1,27 @@
from django.contrib.formtools.wizard.views import SessionWizardView from django.contrib.formtools.wizard.views import SessionWizardView
from django.core.files.storage import FileSystemStorage from django.core.files.storage import FileSystemStorage
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect, HttpResponseForbidden
from django.conf import settings from django.conf import settings
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.core.exceptions import PermissionDenied
import os import os
from photologue.models import Photo from photologue.models import Photo
from exposition.models import Exposition, Statistic from exposition.models import Exposition
from functions.form_check import translit_with_separator from functions.form_check import translit_with_separator
from accounts.models import User from accounts.models import User
from country.models import Country
from city.models import City
from place_exposition.models import PlaceExposition
from theme.models import Tag, Theme
class LoginRequiredMixin(object):
@method_decorator(login_required)
def dispatch(self, request, *args, **kwargs):
if not request.user.organiser:
raise PermissionDenied
return super(LoginRequiredMixin, self).dispatch(request, *args, **kwargs)
# defining different template for every form # defining different template for every form
@ -17,14 +31,15 @@ TEMPLATES = {
'2': 'client/wizard/third_step.html' '2': 'client/wizard/third_step.html'
} }
class ExpoWizard(SessionWizardView):
"main view that handle all data from 3 forms(steps) and finally create an Exposition" class ExpoWizard(LoginRequiredMixin, SessionWizardView):
"""main view that handle all data from 3 forms(steps) and finally create an Exposition"""
# storing temporary files during upload # storing temporary files during upload
location = os.path.join(settings.MEDIA_ROOT, 'temp') location = os.path.join(settings.MEDIA_ROOT, 'temp')
file_storage = FileSystemStorage(location, settings.MEDIA_URL) file_storage = FileSystemStorage(location, settings.MEDIA_URL)
SUCCES_URL = "/" SUCCESS_URL = "/"
def get_template_names(self): def get_template_names(self):
return [TEMPLATES[self.steps.current]] return [TEMPLATES[self.steps.current]]
@ -36,16 +51,19 @@ class ExpoWizard(SessionWizardView):
data = self.get_all_cleaned_data() data = self.get_all_cleaned_data()
# creating new exposition # creating new exposition
expo = Exposition.objects.language(self.request.LANGUAGE_CODE).create( lang = self.request.LANGUAGE_CODE
expo = Exposition.objects.language(lang).create(
name=data.get('name'), name=data.get('name'),
data_begin=data.get('date_start'), data_begin=data.get('date_start'),
data_end=data.get('date_end'), data_end=data.get('date_end'),
main_title=data.get('main_title'), main_title=data.get('main_title'),
description=data.get('description'), description=data.get('description'),
products=data.get('products'), products=data.get('products'),
country=data.get('country', 1),
city=data.get('city', 1), country=Country.objects.language(lang).get(id=data.get('country')),
place=data.get('place', 1), city=City.objects.language(lang).get(id=data.get('city')),
place=PlaceExposition.objects.language(lang).get(id=data.get('place')),
periodic=data.get('periodic'), periodic=data.get('periodic'),
web_page=data.get('web_site'), web_page=data.get('web_site'),
logo=data.get('logo'), logo=data.get('logo'),
@ -66,7 +84,7 @@ class ExpoWizard(SessionWizardView):
url=translit_with_separator(data.get('name')), url=translit_with_separator(data.get('name')),
quality_label=0, quality_label=0,
audience=0, audience=0,
creator = User.objects.get(id=self.request.user.id) creator=User.objects.get(id=self.request.user.id)
) )
# adding photo to gallery # adding photo to gallery
photos = [] photos = []
@ -78,24 +96,13 @@ class ExpoWizard(SessionWizardView):
for photo in photos: for photo in photos:
expo.upload_photo(photo) expo.upload_photo(photo)
# many to many relations saving expo.tag = Tag.objects.language(lang).filter(id__in=data.get('tag').split(','))
expo.tag = [data.get('tag')] expo.theme = Theme.objects.language(lang).filter(id__in=data.get('theme'))
expo.theme = [data.get('theme')]
# setting bit fields audience and quality_label # setting bit fields audience and quality_label
self.set_flags(expo, data) self.set_flags(expo, data)
expo.save() expo.save()
# ?
Statistic.objects.language(self.request.LANGUAGE_CODE).create(
exposition=expo,
year=data.get('statistic_year'),
visitors=data.get('visitors'),
members=data.get('partisipants'),
countries=data.get('countries'),
area=data.get('square')
)
# remove temporary files if it has any # remove temporary files if it has any
if upload_logo: if upload_logo:
self.file_storage.delete(upload_logo.name) self.file_storage.delete(upload_logo.name)
@ -103,11 +110,10 @@ class ExpoWizard(SessionWizardView):
for f in upload_images: for f in upload_images:
self.file_storage.delete(f.name) self.file_storage.delete(f.name)
return HttpResponseRedirect(self.SUCCES_URL) return HttpResponseRedirect(self.SUCCESS_URL)
@staticmethod
def set_flags(self, expo, data): def set_flags(expo, data):
if data['membership1']: if data['membership1']:
expo.quality_label = (expo.quality_label | Exposition.quality_label.exporating) expo.quality_label = (expo.quality_label | Exposition.quality_label.exporating)
if data['membership2']: if data['membership2']:
@ -122,5 +128,4 @@ class ExpoWizard(SessionWizardView):
if data['audience3']: if data['audience3']:
expo.audience = expo.audience | (getattr(Exposition.audience, 'general public')) expo.audience = expo.audience | (getattr(Exposition.audience, 'general public'))
from wizard.forms import formlist
wizard_view = ExpoWizard.as_view(formlist)

Loading…
Cancel
Save