remotes/origin/1203
Kotiuk Nazarii 11 years ago
parent d712d19117
commit 6a6f606b35
  1. 1
      conference/models.py
  2. 2
      core/simple_views.py
  3. 1
      exposition/models.py
  4. 18
      functions/signal_handlers.py
  5. 12
      import_xls/admin.py
  6. 4
      import_xls/excel_settings.py
  7. 132
      import_xls/import_forms.py
  8. 6
      import_xls/utils.py
  9. 22
      templates/admin/import templates/import_event.html
  10. 9
      templates/client/includes/exposition/exposition_object.html

@ -59,6 +59,7 @@ class Conference(TranslatableModel, EventMixin, ExpoMixin):
blank=True, null=True, related_name='conference_tags') blank=True, null=True, related_name='conference_tags')
organiser = models.ManyToManyField('organiser.Organiser', verbose_name='Организатор', organiser = models.ManyToManyField('organiser.Organiser', verbose_name='Организатор',
blank=True, null=True, related_name='conference_organisers') blank=True, null=True, related_name='conference_organisers')
org = models.CharField(max_length=255, blank=True, null=True)
company = models.ManyToManyField('company.Company', verbose_name='Компании', company = models.ManyToManyField('company.Company', verbose_name='Компании',
blank=True, null=True, related_name='conference_companies') blank=True, null=True, related_name='conference_companies')
users = models.ManyToManyField('accounts.User', verbose_name='Посетители выставки', users = models.ManyToManyField('accounts.User', verbose_name='Посетители выставки',

@ -13,7 +13,7 @@ class SeminarLendingView(TemplateView):
def send_to_organiser(request): def send_to_organiser(request):
mail_send = 'pavel.handleman@gmail.com' mail_send = 'kotzilla@ukr.net'
fname = request.POST.get('name') fname = request.POST.get('name')
lname = request.POST.get('surname') lname = request.POST.get('surname')
email = request.POST.get('email', '') email = request.POST.get('email', '')

@ -71,6 +71,7 @@ class Exposition(TranslatableModel, EventMixin, ExpoMixin):
blank=True, null=True, related_name='exposition_tags') blank=True, null=True, related_name='exposition_tags')
organiser = models.ManyToManyField('organiser.Organiser', verbose_name='Организатор', organiser = models.ManyToManyField('organiser.Organiser', verbose_name='Организатор',
blank=True, null=True, related_name='exposition_organisers') blank=True, null=True, related_name='exposition_organisers')
org = models.CharField(max_length=255, blank=True, null=True)
company = models.ManyToManyField('company.Company', verbose_name='Компании', company = models.ManyToManyField('company.Company', verbose_name='Компании',
blank=True, null=True, related_name='exposition_companies') blank=True, null=True, related_name='exposition_companies')
users = models.ManyToManyField('accounts.User', verbose_name='Посетители выставки', users = models.ManyToManyField('accounts.User', verbose_name='Посетители выставки',

@ -6,7 +6,8 @@ from functions.form_check import translit_with_separator
def pre_save_handler(sender, **kwargs): def pre_save_handler(sender, **kwargs):
obj = kwargs['instance'] obj = kwargs['instance']
url = getattr(obj, 'url') url = getattr(obj, 'url')
if url is not None:
if url:
return return
if hasattr(obj, 'language_code') and obj.language_code =='en': if hasattr(obj, 'language_code') and obj.language_code =='en':
@ -21,21 +22,6 @@ def pre_save_handler(sender, **kwargs):
obj.url = ''.join([random.choice(string.ascii_lowercase) for n in xrange(8)]) obj.url = ''.join([random.choice(string.ascii_lowercase) for n in xrange(8)])
"""
url = getattr(obj, 'url')
if url:
try:
en_name = obj._meta.translations_model.objects.get(language_code='en', master__id=getattr(obj, 'id'))
obj.url = translit_with_separator(en_name)
except:
pass
else:
# generate random url if url field is empty
obj.url = ''.join([random.choice(string.ascii_lowercase) for n in xrange(8)])
"""
def post_save_handler(sender, **kwargs): def post_save_handler(sender, **kwargs):
""" """
receiver function receiver function

@ -96,13 +96,17 @@ class ExportCity(ExportView):
from exposition.models import Exposition from exposition.models import Exposition
class ImportEvent(FormView): class ImportEvent(FormView):
form_class = ImportEventForm form_class = ImportEventForm
success_url = '/admin/import-event' success_url = '/admin/import-event/'
template_name = 'admin/import templates/import_event.html'
def form_valid(self, form): def form_valid(self, form):
result = form.save_file() errors = form.save_file_debug()
Exposition.imports.create_by_dict(result[0])
messages.success(self.request, 'Success') messages.success(self.request, 'Success')
context = self.get_context_data()
context['import_errors'] = errors
context['form'] = form
return render_to_response(self.template_name, context)
return super(ImportView, self).form_valid(form) #return super(ImportEvent, self).form_valid(form)
class ImportTheme(ImportView): class ImportTheme(ImportView):
form_class = ImportThemeForm form_class = ImportThemeForm

@ -469,10 +469,10 @@ event_sett = {
u'Дата окончания:(YYYY-MM-DD)':{u'field': u'data_end', u'func': to_date}, u'Дата окончания:(YYYY-MM-DD)':{u'field': u'data_end', u'func': to_date},
u'Страна':{u'field': u'country', u'func': to_country}, u'Страна':{u'field': u'country', u'func': to_country},
u'Город':{u'field': u'city_id', u'func': to_city, 'extra_values': 'country'}, u'Город':{u'field': u'city_id', u'func': to_city, 'extra_values': 'country'},
#u'Место проведения':{u'field': u'place', u'func': to_place}, u'Место проведения':{u'field': u'place', u'func': to_place},
u'ID Тематики':{u'field': u'theme', u'func': to_theme, u'method': True},### u'ID Тематики':{u'field': u'theme', u'func': to_theme, u'method': True},###
u'Теги':{u'field': u'tag', u'func': to_tag, u'method': True}, u'Теги':{u'field': u'tag', u'func': to_tag, u'method': True},
#u'Организатор №1':{u'field': u'organiser', u'func': to_tag},#### u'Организатор №1':{u'field': u'org', u'func': unicode},####
#u'Организатор №2':{u'field': u'organiser', u'func': to_tag},#### #u'Организатор №2':{u'field': u'organiser', u'func': to_tag},####
u'Описание события':{u'field': u'description', u'func': unicode}, u'Описание события':{u'field': u'description', u'func': unicode},
u'Основные темы':{u'field': u'main_themes', u'func': unicode}, u'Основные темы':{u'field': u'main_themes', u'func': unicode},

@ -9,6 +9,7 @@ from organiser.models import Organiser
from django.db.models.loading import get_model from django.db.models.loading import get_model
import xlrd, xlwt import xlrd, xlwt
from excel_settings import import_settings from excel_settings import import_settings
from functions.form_check import translit_with_separator
languages = [code for code in settings.LANGUAGES] languages = [code for code in settings.LANGUAGES]
@ -211,6 +212,10 @@ class ImportPlaceConferenceForm(ImportForm):
from import_xls.excel_settings import event_sett from import_xls.excel_settings import event_sett
typical_errors = {'(1048, "Column \'city_id\' cannot be null")':u'Неправильная страна или город',
'(1048, "Column \'country_id\' cannot be null")':u'Неправильная страна или город',
'(1048, "Column \'data_end\' cannot be null")':u'НЕправильный формат или не заполнена дата окончания',
'(1048, "Column \'data_end\' cannot be null")':u'НЕправильный формат или не заполнена дата начала'}
class ImportEventForm(ImportForm): class ImportEventForm(ImportForm):
""" """
@ -221,40 +226,132 @@ class ImportEventForm(ImportForm):
('conference.Conference', 'Конференция'), ('conference.Conference', 'Конференция'),
('seminar.Seminar', 'Семинар'), ('seminar.Seminar', 'Семинар'),
('webinar.Webinar', 'Вебинар')]) ('webinar.Webinar', 'Вебинар')])
def save_file(self):
""" def save_file_debug(self):
save events from excel file
in language from form
"""
data = self.cleaned_data data = self.cleaned_data
lang = data['language'] lang = data['language']
f = data['excel_file'] f = data['excel_file']
book = xlrd.open_workbook(file_contents=f.read()) book = xlrd.open_workbook(file_contents=f.read())
sheet = book.sheet_by_index(0) sheet = book.sheet_by_index(0)
row_list = [sheet.row_values(row_number) for row_number in range(sheet.nrows)] row_list = [sheet.row_values(row_number) for row_number in range(sheet.nrows)]
# all field names in excel file (must be in second row)
field_names = [name for name in row_list[0]] field_names = [name for name in row_list[0]]
# model # model
model = get_model(data['event'].split('.')[0], data['event'].split('.')[1]) model = get_model(data['event'].split('.')[0], data['event'].split('.')[1])
list_dicts = [] labels = [label for label in row_list[0]]
errors = []
for row_number, row in enumerate(row_list[1:]): for row_number, row in enumerate(row_list):
d = {} if row_number == 0:
continue
if row[0] != '':
# in first column id
try:
obj = self.model.objects.language(lang).get(id=int(row[0]))
except ValueError:
obj = self.model()
obj.translate(lang)
except self.model.DoesNotExist:
obj = self.model(id= int(row[0]))
obj.translate(lang)
else:
# if id blank - its a new event
obj = model()
obj.translate(lang)
methods = []
for col_number, cell in enumerate(row): for col_number, cell in enumerate(row):
# through row # go through row cells
field_name = field_names[col_number] # field name current cell
setting = event_sett.get(field_name) label = labels[col_number]
if setting:
d[setting['field']] = {'value':cell} setting = event_sett.get(label)
if setting is None:
continue
if setting.get('method'):
# this cell contains data that must be written after creating object
if cell != "":
methods.append({'func': setting['func'], 'value': cell, 'purpose': setting.get('purpose')})
continue
field_name = setting['field']
func = setting.get('func')
if func is None:
continue
extra_value = setting.get('extra_values')
if extra_value is not None:
# if setting has extra value then
# it is some field like city, theme, tag
# that has relation and can be created
# in function we add language(need for relation fields)
# and extra value from object (like for city need country)
try:
extra = getattr(obj, extra_value)
except Exception:
continue
value = func(cell, 'ru', extra)
elif setting.get('bitfield'):
value = func(obj, cell, setting['label'])
else:
value = func(cell)
try:
setattr(obj, field_name, value)
except ValueError:
continue
if not obj.url:
obj.url = translit_with_separator(obj.name)
try:
obj.save()
except IntegrityError, e:
error = str(e)
if typical_errors.get(error):
error = typical_errors[error]
if error.startswith('(1062, "Duplicate entry') and error.endswith('for key \'url\'")'):
error = u'Событие с таким названием или урлом уже существует'
errors.append([obj.name, error])
continue
for method in methods:
func = method['func']
if method.get('purpose'):
try:
func(obj, method['value'], method['purpose'])
except:
continue
else:
func(obj, method['value'])
d['lang'] = lang #-------------
list_dicts.append(d)
return list_dicts return errors
def save_file(self):
"""
save events from excel file
in language from form
"""
data = self.cleaned_data
lang = data['language']
f = data['excel_file']
book = xlrd.open_workbook(file_contents=f.read())
sheet = book.sheet_by_index(0)
row_list = [sheet.row_values(row_number) for row_number in range(sheet.nrows)]
# all field names in excel file (must be in second row)
field_names = [name for name in row_list[0]]
# model
model = get_model(data['event'].split('.')[0], data['event'].split('.')[1])
list_dicts = []
for row_number, row in enumerate(row_list): for row_number, row in enumerate(row_list):
# go through all rows in file # go through all rows in file
@ -320,7 +417,6 @@ class ImportEventForm(ImportForm):
""" """
#object.save() #object.save()
sadsa

@ -33,7 +33,10 @@ def to_date(value):
try: try:
t = time.strptime(value, "%d.%m.%Y") t = time.strptime(value, "%d.%m.%Y")
except ValueError: except ValueError:
t = time.strptime(value, "%d/%m/%Y") try:
t = time.strptime(value, "%d/%m/%Y")
except ValueError:
return None
if isinstance(value, float): if isinstance(value, float):
t = xlrd.xldate_as_tuple(value, 0)+(0,0,0) t = xlrd.xldate_as_tuple(value, 0)+(0,0,0)
@ -103,6 +106,7 @@ def to_tag(obj,value):
def to_place(value): def to_place(value):
value = value.replace('/', '')
try: try:
place = PlaceExposition.objects.get(url=value) place = PlaceExposition.objects.get(url=value)
return place return place

@ -55,6 +55,28 @@
{{ message }} {{ message }}
</div> </div>
{% endif %} {% endif %}
{% if import_errors %}
<div id="import_errors">
<table class="table table-hover">
<thead>
<tr>
<th>Событие</th>
<th>Ошибка</th>
</tr>
</thead>
<tbody>
{% for error in import_errors %}
<tr>
<td>{{ error.0 }}</td>
<td>{{ error.1 }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endif %}
<script> <script>
$(document).ready(function(){ $(document).ready(function(){
setTimeout(function(){ setTimeout(function(){

@ -148,7 +148,7 @@
{% endif %} {% endif %}
</ul> </ul>
<dl class="add-info"> <dl class="add-info">
{% if exposition.organiser.all|length > 0 %} {% if exposition.organiser.all.exists %}
<dt>{% trans 'Организатор' %}:</dt> <dt>{% trans 'Организатор' %}:</dt>
<dd> <dd>
{% with organisers=exposition.organiser.all %} {% with organisers=exposition.organiser.all %}
@ -157,6 +157,13 @@
{% endfor %} {% endfor %}
{% endwith %} {% endwith %}
</dd> </dd>
{% else %}
{% if exposition.org %}
<dt>{% trans 'Организатор' %}:</dt>
<dd>
{{ exposition.org }}
</dd>
{% endif %}
{% endif %} {% endif %}
{% if exposition.web_page %} {% if exposition.web_page %}
<dt>{% trans 'Веб-сайт' %}:</dt> <dt>{% trans 'Веб-сайт' %}:</dt>

Loading…
Cancel
Save