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.
175 lines
5.9 KiB
175 lines
5.9 KiB
# -*- coding: utf-8 -*-
|
|
from django.core.context_processors import csrf
|
|
from django.shortcuts import render_to_response
|
|
from django.http import HttpResponseRedirect, HttpResponse
|
|
from django.contrib.auth.decorators import login_required
|
|
#
|
|
import xlwt
|
|
import xlrd
|
|
import tempfile
|
|
#
|
|
from custom_forms import ImportEventForm, ExportEventForm
|
|
|
|
from excel_settings import sort_by_names, get_cell_style, get_cell
|
|
from excel_settings import cols_width
|
|
|
|
|
|
|
|
@login_required
|
|
def import_event(request):
|
|
if request.POST:
|
|
form = ImportEventForm(request.POST, request.FILES)
|
|
temp_file = tempfile.TemporaryFile()
|
|
import_file = request.FILES.get(request.FILES.keys()[0])
|
|
book = xlrd.open_workbook(file_contents=import_file)
|
|
sheet = book.sheet_by_index(0)
|
|
row_list = [sheet.row_values(row_number) for row_number in range(sheet.nrows)]
|
|
|
|
return HttpResponse(row_list[0])
|
|
|
|
else:
|
|
form = ImportEventForm()
|
|
|
|
args = {}
|
|
args.update(csrf(request))
|
|
args['form'] = form
|
|
return render_to_response('import_event.html', args)
|
|
|
|
|
|
|
|
def xls_to_response(xls, fname):
|
|
response = HttpResponse(mimetype="application/ms-excel")
|
|
response['Content-Disposition'] = 'attachment; filename=%s' % fname
|
|
xls.save(response)
|
|
return response
|
|
|
|
|
|
import datetime
|
|
|
|
|
|
from excel_settings import field_settings
|
|
|
|
from django.db.models.loading import get_model
|
|
|
|
def export_event(request):
|
|
if request.POST:
|
|
form = ExportEventForm(request.POST)
|
|
if form.is_valid():
|
|
|
|
data = form.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
|
|
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):
|
|
for col, field in enumerate(field_settings):
|
|
try:
|
|
value = getattr(object, field['name'])
|
|
except AttributeError:
|
|
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)
|
|
|
|
worksheet.write(row+2, col, field.get('type', str)(value))
|
|
|
|
return xls_to_response(workbook, 'My Worksheet.xls')
|
|
else:
|
|
form = ExportEventForm()
|
|
|
|
|
|
args = {}
|
|
args.update(csrf(request))
|
|
|
|
args['form'] = form
|
|
|
|
return render_to_response('export_event.html', args)
|
|
"""
|
|
def export_event(request):
|
|
if request.POST:
|
|
form = ExportEventForm(request.POST)
|
|
|
|
if form.is_valid():
|
|
# dict of objects
|
|
objects = form.generate_dicts()
|
|
return HttpResponse(str(objects))
|
|
|
|
if not objects:
|
|
# empty dict
|
|
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
|
|
font = xlwt.Font()
|
|
font.name = 'Times New Roman'
|
|
font.bold = True
|
|
style = xlwt.XFStyle()
|
|
# Create the Style
|
|
style.font = font
|
|
|
|
# get names of fields sorted like in sorted_names list
|
|
fields = sorted(objects[0].keys(), key=sort_by_names)
|
|
|
|
# generate first row with verbose names
|
|
for i, field in enumerate(fields):
|
|
worksheet.write(0, i, objects[0][field]['verbose_name'], style)
|
|
# generate second row and set columns width
|
|
for i, field in enumerate(fields):
|
|
worksheet.write(1, i,field, style)
|
|
if field in cols_width:
|
|
worksheet.col(i).width = cols_width.get(field, 3333)
|
|
# fill row with objects
|
|
for row, object in enumerate(objects):
|
|
for key, value in object.iteritems():
|
|
# current row
|
|
col = fields.index(key)
|
|
# begins from third row
|
|
# get cell formats value (True -> 1, None -> '', ...)
|
|
worksheet.write(row+2, col, get_cell(key, value['value']), get_cell_style(key))
|
|
|
|
return xls_to_response(workbook, 'My Worksheet.xls')
|
|
else:
|
|
form = ExportEventForm()
|
|
|
|
args = {}
|
|
args.update(csrf(request))
|
|
|
|
args['form'] = form
|
|
|
|
return render_to_response('export_event.html', args)
|
|
""" |