# -*- 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, import_settings relation_fields = ['city'] @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(): lang = request.POST['language'] 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): if row_number > 1: # first two fields are verbose name and name if row[0] != '': object = model.objects.language(lang).get(id=row[0]) else: object = model() object.translate(lang) for col_number, cell in enumerate(row): 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) value = func(cell, lang, getattr(object, extra_value)) else: value = func(cell) setattr(object, field_name, value) object.save() """ func = get_cell(field_names[col_number]) if not func: pass else: if field_name in relation_fields: value = func(cell, lang) else: value = func(cell) 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)