diff --git a/emencia/django/newsletter/forms.py b/emencia/django/newsletter/forms.py index b992a5af..1271f416 100644 --- a/emencia/django/newsletter/forms.py +++ b/emencia/django/newsletter/forms.py @@ -136,33 +136,33 @@ class ContactFilterForm(forms.Form): not_subscriber = forms.BooleanField(label=_(u"Отписался"), required=False) def filter(self): - title = 'contact list ' - qs = Contact.objects.all() + title = u'contact list ' + qs = Contact.objects.all().select_related('contactsettings') if self.cleaned_data.get('mailinglist'): qs = qs.filter(mailinglist_subscriber__id=self.cleaned_data['mailinglist']) - title += " mailinglist: %s" % MailingList.objects.get(id=self.cleaned_data['mailinglist']).name + title += u" mailinglist: %s" % MailingList.objects.get(id=self.cleaned_data['mailinglist']).name if self.cleaned_data.get('country'): qs = qs.filter(contactsettings__country__id__in=self.cleaned_data['country']) - title += " countries: %s" % ','.join([obj.url for obj in Country.objects.language().filter(id__in=self.cleaned_data['country'])]) + title += u" countries: %s" % ','.join([obj.url for obj in Country.objects.language().filter(id__in=self.cleaned_data['country'])]) if self.cleaned_data.get('email'): qs = qs.filter(email__icontains=self.cleaned_data['email']) if self.cleaned_data.get('theme'): qs = qs.filter(contactsettings__theme__id__in=self.cleaned_data['theme']) - title += " themes: %s" % ','.join([obj.url for obj in Theme.objects.language().filter(id__in=self.cleaned_data['theme'])]) + title += u" themes: %s" % ','.join([obj.url for obj in Theme.objects.language().filter(id__in=self.cleaned_data['theme'])]) if self.cleaned_data.get('city'): qs = qs.filter(contactsettings__city__id__in=self.cleaned_data['city']) - title += " cities: %s" % ','.join([obj.url for obj in Country.objects.language().filter(id__in=self.cleaned_data['country'])]) + title += u" cities: %s" % ','.join([obj.url for obj in Country.objects.language().filter(id__in=self.cleaned_data['country'])]) if self.cleaned_data.get('area'): qs = qs.filter(contactsettings__area__id__in=self.cleaned_data['area']) - title += " geo area: %s" % ','.join([tr(obj.name) for obj in Area.objects.language('en').filter(id__in=self.cleaned_data['area'])]) + title += u" geo area: %s" % ','.join([tr(obj.name) for obj in Area.objects.language('en').filter(id__in=self.cleaned_data['area'])]) if self.cleaned_data.get('not_active'): - title = ' not active ' + title + title = u' not active ' + title qs = qs.filter(activated=False) else: qs = qs.filter(activated=True) if self.cleaned_data.get('not_valid'): - title = 'not valid e-mail ' + title + title = u'not valid e-mail ' + title qs = qs.filter(valid=False) else: qs = qs.filter(valid=True) @@ -176,7 +176,7 @@ class ContactFilterForm(forms.Form): else: qs = qs.filter(subscriber=True) qs = qs.distinct() - return qs, title + return qs, title.replace('"', '\"').replace('\n', '') import xlrd diff --git a/emencia/django/newsletter/utils/excel.py b/emencia/django/newsletter/utils/excel.py index ea59a7e0..68fafedc 100644 --- a/emencia/django/newsletter/utils/excel.py +++ b/emencia/django/newsletter/utils/excel.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """ExcelResponse for emencia.django.newsletter""" # Based on http://www.djangosnippets.org/snippets/1151/ import datetime @@ -5,6 +6,10 @@ 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 theme.models import Theme 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, force_csv=False, encoding='utf8'): valid_data = False - if isinstance(data, ValuesQuerySet): - data = list(data) - elif isinstance(data, QuerySet): - data = list(data.values()) - 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" + 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: + data = [] + themes = dict(Theme.objects.language('ru').all().values_list('pk', 'name')) + for item in qs[:100]: + 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()]), + ]) + 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 output = StringIO.StringIO() diff --git a/functions/translate.py b/functions/translate.py index a2d1a16f..03f5dddb 100644 --- a/functions/translate.py +++ b/functions/translate.py @@ -30,6 +30,11 @@ def fill_trans_fields(obj=None, data={}, lang=''): if n != None: setattr(obj,str(field.name), n) +def fill_trans_fields_r(obj=None, data={}, lang=''): + # filling and returnig an object + fill_trans_fields(obj=obj, data=data, lang=lang) + return obj + def fill_trans_fields_all(Model, new_obj, data={}, id=None, zero_fields={}): """ Fills obj passing trough all languages