You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
168 lines
7.2 KiB
168 lines
7.2 KiB
# -*- 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]
|
|
|
|
|
|
|
|
class ImportEventForm(forms.Form):
|
|
excel_file = forms.FileField(label='Выберите файл')
|
|
event = forms.ChoiceField(label='Выберите тип события', choices=[('exposition.Exposition', 'Выставка'),
|
|
('conference.Conference', 'Конференция'),
|
|
('seminar.Seminar', 'Семинар'),
|
|
('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)
|
|
|
|
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)
|
|
# условие заглушка для мени ту мени
|
|
if object.id == None and (field_name=='theme' or field_name=='tag'):
|
|
pass
|
|
else:
|
|
value = func(cell, lang, getattr(object, extra_value))
|
|
else:
|
|
value = func(cell)
|
|
# условие заглушка для мени ту мени
|
|
if object.id == None and (field_name=='theme' or field_name=='tag'):
|
|
pass
|
|
else:
|
|
setattr(object, field_name, value)
|
|
|
|
object.save()
|
|
|
|
|
|
class ExportEventForm(forms.Form):
|
|
event = forms.ChoiceField(label='Выберите тип события', choices=[('exposition.Exposition', 'Выставка'),
|
|
('conference.Conference', 'Конференция'),
|
|
('seminar.Seminar', 'Семинар'),
|
|
('webinar.Webinar', 'Вебинар')])
|
|
language = forms.ChoiceField(label='Выберите язык', choices=languages)
|
|
date_from = forms.DateField(label='С')
|
|
date_to = forms.DateField(label='До')
|
|
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
|
|
|
|
|
|
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 get_fname(self):
|
|
data = self.cleaned_data
|
|
f_name = data['language']+'_'+data['event'].split('.')[1]\
|
|
+' from: %s'%data['date_from']+' to: %s'%data['date_to']+'.xls'
|
|
return f_name
|
|
|
|
|
|
def clean_theme(self):
|
|
"""
|
|
Set all themes if no theme selected
|
|
"""
|
|
theme = self.cleaned_data.get('theme')
|
|
if not theme:
|
|
theme = Theme.objects.all()
|
|
|
|
return theme
|
|
|
|
|
|
def clean_country(self):
|
|
"""
|
|
Set all countries if no country selected
|
|
"""
|
|
country = self.cleaned_data.get('country')
|
|
if not country:
|
|
country = Country.objects.all()
|
|
|
|
return country |