|
|
|
|
@ -3,15 +3,48 @@ 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 |
|
|
|
|
import tempfile |
|
|
|
|
# |
|
|
|
|
from custom_forms import ImportEventForm, ExportEventForm |
|
|
|
|
from excel_settings import field_settings, get_cell |
|
|
|
|
|
|
|
|
|
from excel_settings import sort_by_names, get_cell_style, get_cell |
|
|
|
|
from excel_settings import cols_width |
|
|
|
|
""" |
|
|
|
|
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'} |
|
|
|
|
] |
|
|
|
|
""" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -19,14 +52,34 @@ from excel_settings import cols_width |
|
|
|
|
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]) |
|
|
|
|
|
|
|
|
|
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() |
|
|
|
|
|
|
|
|
|
@ -44,13 +97,6 @@ def xls_to_response(xls, fname): |
|
|
|
|
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) |
|
|
|
|
@ -87,18 +133,23 @@ def export_event(request): |
|
|
|
|
style.font = font |
|
|
|
|
|
|
|
|
|
for row, object in enumerate(objects): |
|
|
|
|
for col, field in enumerate(field_settings): |
|
|
|
|
# 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', str)(value)) |
|
|
|
|
worksheet.write(row+2, col, field.get('type')(value)) |
|
|
|
|
col += 1 |
|
|
|
|
|
|
|
|
|
return xls_to_response(workbook, 'My Worksheet.xls') |
|
|
|
|
else: |
|
|
|
|
@ -110,66 +161,4 @@ def export_event(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) |
|
|
|
|
""" |
|
|
|
|
return render_to_response('export_event.html', args) |