# -*- 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): args = {} form = ImportEventForm() args.update(csrf(request)) args['form'] = form 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, request.POST['language']) # if not value: pass else: setattr(object, field_names[col_number], value) object.save() else: pass args['message'] = 'Success' return render_to_response('import_event.html', args) 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)