|
|
|
@ -1,3 +1,4 @@ |
|
|
|
|
|
|
|
# -*- coding: utf-8 -*- |
|
|
|
"""ExcelResponse for emencia.django.newsletter""" |
|
|
|
"""ExcelResponse for emencia.django.newsletter""" |
|
|
|
# Based on http://www.djangosnippets.org/snippets/1151/ |
|
|
|
# Based on http://www.djangosnippets.org/snippets/1151/ |
|
|
|
import datetime |
|
|
|
import datetime |
|
|
|
@ -5,6 +6,10 @@ import datetime |
|
|
|
from django.http import HttpResponse |
|
|
|
from django.http import HttpResponse |
|
|
|
from django.db.models.query import QuerySet |
|
|
|
from django.db.models.query import QuerySet |
|
|
|
from django.db.models.query import ValuesQuerySet |
|
|
|
from django.db.models.query import ValuesQuerySet |
|
|
|
|
|
|
|
# from ..models import ContactSettings |
|
|
|
|
|
|
|
from collections import OrderedDict |
|
|
|
|
|
|
|
from functions.translate import fill_trans_fields_r |
|
|
|
|
|
|
|
from theme.models import Theme |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ExcelResponse(HttpResponse): |
|
|
|
class ExcelResponse(HttpResponse): |
|
|
|
@ -13,19 +18,39 @@ class ExcelResponse(HttpResponse): |
|
|
|
def __init__(self, data, output_name='excel_data', headers=None, sheet_name = "Sheet1", default_style=None, |
|
|
|
def __init__(self, data, output_name='excel_data', headers=None, sheet_name = "Sheet1", default_style=None, |
|
|
|
force_csv=False, encoding='utf8'): |
|
|
|
force_csv=False, encoding='utf8'): |
|
|
|
valid_data = False |
|
|
|
valid_data = False |
|
|
|
if isinstance(data, ValuesQuerySet): |
|
|
|
qs = data.prefetch_related('contactsettings', 'contactsettings__theme', 'contactsettings__area') |
|
|
|
data = list(data) |
|
|
|
# if isinstance(data, ValuesQuerySet): |
|
|
|
elif isinstance(data, QuerySet): |
|
|
|
# data = list(data) |
|
|
|
data = list(data.values()) |
|
|
|
# elif isinstance(data, QuerySet): |
|
|
|
if hasattr(data, '__getitem__'): |
|
|
|
# data = list(data.values()) |
|
|
|
if isinstance(data[0], dict): |
|
|
|
|
|
|
|
if headers is None: |
|
|
|
# print(data) |
|
|
|
headers = data[0].keys() |
|
|
|
# if 'settings' in headers: |
|
|
|
data = [[row[col] for col in headers] for row in data] |
|
|
|
data = [] |
|
|
|
data.insert(0, headers) |
|
|
|
themes = dict(Theme.objects.language('ru').all().values_list('pk', 'name')) |
|
|
|
if hasattr(data[0], '__getitem__'): |
|
|
|
for item in qs[:100]: |
|
|
|
valid_data = True |
|
|
|
data.append([ |
|
|
|
assert valid_data is True, "ExcelResponse requires a sequence of sequences" |
|
|
|
item.email, |
|
|
|
|
|
|
|
item.first_name, |
|
|
|
|
|
|
|
item.contactsettings.exponent_practicum, |
|
|
|
|
|
|
|
item.contactsettings.organiser_practicum, |
|
|
|
|
|
|
|
item.creation_date.strftime('%d.%m.%Y'), |
|
|
|
|
|
|
|
item.modification_date.strftime('%d.%m.%Y'), |
|
|
|
|
|
|
|
', '.join([getattr(fill_trans_fields_r(obj=x, lang='ru'), 'name', '') for x in item.contactsettings.area.all()]), |
|
|
|
|
|
|
|
', '.join([themes.get(x.pk) for x in item.contactsettings.theme.all()]), |
|
|
|
|
|
|
|
]) |
|
|
|
|
|
|
|
headers = ('email', 'first_name', 'приактикум экспонента', 'практикум организатор', 'дата подписки', 'дата изменения', 'гео', 'темы') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# if hasattr(data, '__getitem__'): |
|
|
|
|
|
|
|
# if isinstance(data[0], dict): |
|
|
|
|
|
|
|
# if headers is None: |
|
|
|
|
|
|
|
# headers = data[0].keys() |
|
|
|
|
|
|
|
# data = [[row[col] for col in headers] for row in data] |
|
|
|
|
|
|
|
data.insert(0, headers) |
|
|
|
|
|
|
|
# if hasattr(data[0], '__getitem__'): |
|
|
|
|
|
|
|
# valid_data = True |
|
|
|
|
|
|
|
# assert valid_data is True, "ExcelResponse requires a sequence of sequences" |
|
|
|
|
|
|
|
|
|
|
|
import StringIO |
|
|
|
import StringIO |
|
|
|
output = StringIO.StringIO() |
|
|
|
output = StringIO.StringIO() |
|
|
|
|