|
|
|
|
@ -1,7 +1,11 @@ |
|
|
|
|
# -*- coding: utf-8 -*- |
|
|
|
|
from django import forms |
|
|
|
|
from django.conf import settings |
|
|
|
|
|
|
|
|
|
from theme.models import Theme |
|
|
|
|
from country.models import Country |
|
|
|
|
from django.db.models.loading import get_model |
|
|
|
|
import xlrd, xlwt |
|
|
|
|
from excel_settings import import_settings, field_settings |
|
|
|
|
languages = [code for code in settings.LANGUAGES] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -14,12 +18,58 @@ class ImportEventForm(forms.Form): |
|
|
|
|
('webinar.Webinar', 'Вебинар')]) |
|
|
|
|
language = forms.ChoiceField(label='Выберите язык', choices=languages) |
|
|
|
|
|
|
|
|
|
def save_events(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[1]] |
|
|
|
|
# model |
|
|
|
|
model = get_model(data['event'].split('.')[0], data['event'].split('.')[1]) |
|
|
|
|
|
|
|
|
|
for row_number, row in enumerate(row_list): |
|
|
|
|
# go through all rows in file |
|
|
|
|
if row_number > 1: |
|
|
|
|
# first two fields are verbose name and name |
|
|
|
|
if row[0] != '': |
|
|
|
|
# in first column ids |
|
|
|
|
object = model.objects.language(lang).get(id=row[0]) |
|
|
|
|
else: |
|
|
|
|
# if id blank - its a new event |
|
|
|
|
object = model() |
|
|
|
|
object.translate(lang) |
|
|
|
|
|
|
|
|
|
from theme.models import Theme |
|
|
|
|
from country.models import Country |
|
|
|
|
from django.db.models.loading import get_model |
|
|
|
|
import StringIO |
|
|
|
|
from functions.translate import get_all_fields, get_all_verbose_names |
|
|
|
|
for col_number, cell in enumerate(row): |
|
|
|
|
# go through row cells |
|
|
|
|
# field name current cell |
|
|
|
|
field_name = field_names[col_number] |
|
|
|
|
setting = import_settings.get(field_name) |
|
|
|
|
if setting is not None: |
|
|
|
|
# if setting exist for this field |
|
|
|
|
func = setting.get('func') |
|
|
|
|
if func is not None: |
|
|
|
|
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) |
|
|
|
|
value = func(cell, lang, getattr(object, extra_value)) |
|
|
|
|
else: |
|
|
|
|
value = func(cell) |
|
|
|
|
|
|
|
|
|
setattr(object, field_name, value) |
|
|
|
|
|
|
|
|
|
object.save() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ExportEventForm(forms.Form): |
|
|
|
|
@ -33,6 +83,61 @@ class ExportEventForm(forms.Form): |
|
|
|
|
theme = forms.ModelMultipleChoiceField(label='Направление', queryset=Theme.objects.all(), required=False) |
|
|
|
|
country = forms.ModelMultipleChoiceField(label='Страны', queryset=Country.objects.all(), required=False) |
|
|
|
|
|
|
|
|
|
def export_events(self): |
|
|
|
|
data = self.cleaned_data |
|
|
|
|
# get model |
|
|
|
|
model = get_model(data['event'].split('.')[0], data['event'].split('.')[1]) |
|
|
|
|
# get objects |
|
|
|
|
objects = model.objects.language(data['language']).filter(data_begin__range=[data['date_from'], data['date_to']], |
|
|
|
|
country__in=data['country'], |
|
|
|
|
theme__in=data['theme'] |
|
|
|
|
).distinct() |
|
|
|
|
|
|
|
|
|
if not objects: |
|
|
|
|
# not found any objects |
|
|
|
|
return None |
|
|
|
|
message = 'По даному запросу объектов не найдено' |
|
|
|
|
args = {} |
|
|
|
|
args.update(csrf(request)) |
|
|
|
|
args['message'] = message |
|
|
|
|
args['form'] = form |
|
|
|
|
return render_to_response('export_event.html', args) |
|
|
|
|
|
|
|
|
|
workbook = xlwt.Workbook(encoding = 'utf8') |
|
|
|
|
# new tab |
|
|
|
|
worksheet = workbook.add_sheet('My Worksheet') |
|
|
|
|
|
|
|
|
|
# Create the Font for first rows |
|
|
|
|
font = xlwt.Font() |
|
|
|
|
font.name = 'Times New Roman' |
|
|
|
|
font.bold = True |
|
|
|
|
style = xlwt.XFStyle() |
|
|
|
|
# Create the Style |
|
|
|
|
style.font = font |
|
|
|
|
|
|
|
|
|
for row, object in enumerate(objects): |
|
|
|
|
# column number |
|
|
|
|
col = 0 |
|
|
|
|
for field in field_settings: |
|
|
|
|
try: |
|
|
|
|
value = getattr(object, field['name']) |
|
|
|
|
except AttributeError: |
|
|
|
|
# doesnt have such field. exit from iteration |
|
|
|
|
continue |
|
|
|
|
|
|
|
|
|
if row == 0: |
|
|
|
|
# first iteration. set names. set columns width |
|
|
|
|
worksheet.write(0, col, field.get('verbose_name', 'default'), style) |
|
|
|
|
worksheet.write(1, col, field.get('name'), style) |
|
|
|
|
worksheet.col(col).width = field.get('width', 3333) |
|
|
|
|
if field['name']=='tag': |
|
|
|
|
worksheet.write(row+2, col, field.get('type')(value, object.theme)) |
|
|
|
|
else: |
|
|
|
|
worksheet.write(row+2, col, field.get('type')(value)) |
|
|
|
|
col += 1 |
|
|
|
|
|
|
|
|
|
return workbook |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def clean_theme(self): |
|
|
|
|
""" |
|
|
|
|
|