1455: Этап №5: Админка баги - Подписчики -> ЭКСПОРТ

remotes/origin/stage5
Alexander Burdeiny 10 years ago
parent 3e33970055
commit 8db8bead96
  1. 20
      emencia/django/newsletter/forms.py
  2. 51
      emencia/django/newsletter/utils/excel.py
  3. 5
      functions/translate.py

@ -136,33 +136,33 @@ class ContactFilterForm(forms.Form):
not_subscriber = forms.BooleanField(label=_(u"Отписался"), required=False) not_subscriber = forms.BooleanField(label=_(u"Отписался"), required=False)
def filter(self): def filter(self):
title = 'contact list ' title = u'contact list '
qs = Contact.objects.all() qs = Contact.objects.all().select_related('contactsettings')
if self.cleaned_data.get('mailinglist'): if self.cleaned_data.get('mailinglist'):
qs = qs.filter(mailinglist_subscriber__id=self.cleaned_data['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'): if self.cleaned_data.get('country'):
qs = qs.filter(contactsettings__country__id__in=self.cleaned_data['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'): if self.cleaned_data.get('email'):
qs = qs.filter(email__icontains=self.cleaned_data['email']) qs = qs.filter(email__icontains=self.cleaned_data['email'])
if self.cleaned_data.get('theme'): if self.cleaned_data.get('theme'):
qs = qs.filter(contactsettings__theme__id__in=self.cleaned_data['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'): if self.cleaned_data.get('city'):
qs = qs.filter(contactsettings__city__id__in=self.cleaned_data['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'): if self.cleaned_data.get('area'):
qs = qs.filter(contactsettings__area__id__in=self.cleaned_data['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'): if self.cleaned_data.get('not_active'):
title = ' not active ' + title title = u' not active ' + title
qs = qs.filter(activated=False) qs = qs.filter(activated=False)
else: else:
qs = qs.filter(activated=True) qs = qs.filter(activated=True)
if self.cleaned_data.get('not_valid'): 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) qs = qs.filter(valid=False)
else: else:
qs = qs.filter(valid=True) qs = qs.filter(valid=True)
@ -176,7 +176,7 @@ class ContactFilterForm(forms.Form):
else: else:
qs = qs.filter(subscriber=True) qs = qs.filter(subscriber=True)
qs = qs.distinct() qs = qs.distinct()
return qs, title return qs, title.replace('"', '\"').replace('\n', '')
import xlrd import xlrd

@ -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()

@ -30,6 +30,11 @@ def fill_trans_fields(obj=None, data={}, lang=''):
if n != None: if n != None:
setattr(obj,str(field.name), n) 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={}): def fill_trans_fields_all(Model, new_obj, data={}, id=None, zero_fields={}):
""" """
Fills obj passing trough all languages Fills obj passing trough all languages

Loading…
Cancel
Save