@ -2,55 +2,53 @@
""" ExcelResponse for emencia.django.newsletter """
# Based on http://www.djangosnippets.org/snippets/1151/
import datetime
from django . http import HttpResponse
from django . db . models . query import QuerySet
from django . db . models . query import ValuesQuerySet
# from ..models import ContactSettings
from collections import OrderedDict
from functions . translate import fill_trans_fields_r
from django . db . models . query import QuerySet , ValuesQuerySet
from django . http import HttpResponse , HttpResponseRedirect
from theme . models import Theme
from city . models import City
from country . models import Country , Area
from functions . translate import fill_trans_fields_r
from . . models import ContactSettings
class ExcelResponse ( HttpResponse ) :
""" ExcelResponse feeded by queryset """
def __init__ ( self , data , output_name = ' excel_data ' , headers = None , sheet_name = " Sheet1 " , default_style = None ,
def __init__ ( self , request , data , output_name = ' excel_data ' , headers = None , sheet_name = " Sheet1 " , default_style = None ,
force_csv = False , encoding = ' utf8 ' ) :
self . request = request
valid_data = False
qs = data . prefetch_related ( ' contactsettings ' , ' contactsettings__theme ' , ' contactsettings__area ' )
# if isinstance(data, ValuesQuerySet):
# data = list(data)
# elif isinstance(data, QuerySet):
# data = list(data.values())
# print(data)
# if 'settings' in headers:
contact_ids = list ( data . values_list ( ' pk ' , flat = True ) )
qs = ContactSettings . objects . filter ( contact_id__in = contact_ids )
if not qs . count ( ) :
return HttpResponseRedirect ( self . request . META [ ' HTTP_REFERER ' ] )
qs = qs . prefetch_related (
' contact ' , ' theme ' , ' area ' , ' city ' , ' country ' ,
)
data = [ ]
areas = dict ( Area . objects . language ( ' ru ' ) . all ( ) . values_list ( ' pk ' , ' name ' ) )
countries = dict ( Country . objects . language ( ' ru ' ) . all ( ) . values_list ( ' pk ' , ' name ' ) )
cities = dict ( City . objects . language ( ' ru ' ) . all ( ) . values_list ( ' pk ' , ' name ' ) )
themes = dict ( Theme . objects . language ( ' ru ' ) . all ( ) . values_list ( ' pk ' , ' name ' ) )
for item in qs :
data . append ( [
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 ( ) ] ) ,
item . contact . email ,
item . contact . first_name ,
item . exponent_practicum ,
item . organiser_practicum ,
' , ' . join ( [ areas . get ( x ) for x in set ( item . area . values_list ( ' pk ' , flat = True ) ) ] ) ,
' , ' . join ( [ countries . get ( x ) for x in set ( item . country . values_list ( ' pk ' , flat = True ) ) ] ) ,
' , ' . join ( [ cities . get ( x ) for x in set ( item . city . values_list ( ' pk ' , flat = True ) ) ] ) ,
' , ' . join ( [ themes . get ( x ) for x in set ( item . theme . values_list ( ' pk ' , flat = True ) ) ] ) ,
item . contact . creation_date . strftime ( ' %d . % m. % Y ' ) ,
item . contact . modification_date . strftime ( ' %d . % m. % Y ' ) ,
] )
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]
headers = ( ' email ' , ' first_name ' , ' приактикум экспонента ' , ' практикум организатор ' , ' гео ' , ' страна ' , ' город ' , ' темы ' , ' дата подписки ' , ' дата изменения ' )
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
output = StringIO . StringIO ( )