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.
 
 
 
 
 
 

164 lines
5.4 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
from django.db.models.loading import get_model
#
import xlwt
import xlrd
#
from custom_forms import ImportEventForm, ExportEventForm
from excel_settings import field_settings, get_cell
"""
import_settings = [
{'name': 'id'},
{'name': 'url'},
{'name': 'name'},
{'name': 'data_begin'},
{'name': 'data_end'},
{'name': 'main_title'},
{'name': 'description'},
{'name': 'audience'},
{'name': 'country'},
{'name': 'city'},
{'name': 'periodic'},
{'name': 'web_page'},
{'name': 'time'},
{'name': 'products'},
{'name': 'foundation_year'},
{'name': 'tax'},
{'name': 'currency'},
{'name': 'max_price'},
{'name': 'min_price'},
{'name': 'registration_payment'},
{'name': 'min_closed_area'},
{'name': 'max_closed_area'},
{'name': 'min_closed_equipped_area'},
{'name': 'max_closed_equipped_area'},
{'name': 'min_open_area'},
{'name': 'max_open_area'},
{'name': 'min_area'},
{'name': 'max_area'},
{'name': 'is_published'},
{'name': 'canceled_by_administrator'}
]
"""
@login_required
def import_event(request):
if request.POST:
form = ImportEventForm(request.POST, request.FILES)
if form.is_valid():
f = form.cleaned_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(request.POST['event'].split('.')[0], request.POST['event'].split('.')[1])
for row_number, row in enumerate(row_list):
# first two fields are verbose name and name
if row_number > 1:
object = model.objects.language(request.POST['language']).get(id=row[0])
for col_number, cell in enumerate(row):
value = get_cell(field_names[col_number], cell)
#
if not value:
pass
else:
setattr(object, field_names[col_number], value)
object.save()
else:
pass
return HttpResponse(request.POST['event'])
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
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):
# 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)
worksheet.write(row+2, col, field.get('type')(value))
col += 1
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)