From c56043563989187479a42399215b2ee1d1a162bf Mon Sep 17 00:00:00 2001 From: Ivan Kovalkovskyi Date: Fri, 9 Oct 2015 15:16:41 +0300 Subject: [PATCH] exel export and filtering contacts --- article/forms.py | 1 + emencia/django/newsletter/admin_urls.py | 3 +- emencia/django/newsletter/forms.py | 33 +++- emencia/django/newsletter/utils/excel.py | 6 +- .../django/newsletter/views/admin_views.py | 30 ++-- templates/admin/newsletters/contact_list.html | 157 +++++++++++------- 6 files changed, 149 insertions(+), 81 deletions(-) diff --git a/article/forms.py b/article/forms.py index e287fd45..013ed960 100644 --- a/article/forms.py +++ b/article/forms.py @@ -131,6 +131,7 @@ class NewsForm(BlogForm): except Conference.DoesNotExist: return None + class ArticleForm(forms.Form): """ Create Article form for creating conference diff --git a/emencia/django/newsletter/admin_urls.py b/emencia/django/newsletter/admin_urls.py index 2aa5b071..69b9374d 100644 --- a/emencia/django/newsletter/admin_urls.py +++ b/emencia/django/newsletter/admin_urls.py @@ -3,7 +3,7 @@ from django.conf.urls import include from django.conf.urls import patterns from django.http import HttpResponse from emencia.django.newsletter.views.admin_views import ContactList, UpdateContact, MailingListView, UpdateMailingList,\ - CreateMailingList, NewsletterCreate + CreateMailingList, NewsletterCreate, ExportContacts urlpatterns = patterns('', @@ -17,4 +17,5 @@ urlpatterns = patterns('', url(r'^contact/(?P\d+)/edit/', UpdateContact.as_view(), name='newsletters_contact_update'), url(r'^contact/all/$', ContactList.as_view(), name='newsletters_contact_list'), + url(r'^contact/export/$', ExportContacts.as_view(), name='export_contacts'), ) \ No newline at end of file diff --git a/emencia/django/newsletter/forms.py b/emencia/django/newsletter/forms.py index 250a388b..c858ede5 100644 --- a/emencia/django/newsletter/forms.py +++ b/emencia/django/newsletter/forms.py @@ -80,8 +80,33 @@ class ContactSettingsForm(forms.ModelForm): else: return Theme.objects.none() + class ContactFilterForm(forms.Form): - email = forms.EmailField(label=_("Email"), max_length=255) - theme = forms.ChoiceField(label=_("Тематика"), choices = [(t.id, t.name) for t in Theme.objects.language()]) - country = forms.ChoiceField(label=_("Страна"), choices = [(c.id, c.name) for c in Country.objects.language().distinct()]) - area = forms.ChoiceField(label=_("Страна"), choices = [(c.id, c.name) for c in Country.objects.language().distinct()]) + email = forms.EmailField(label="Email", max_length=255, required=False, + widget=forms.TextInput(attrs={'class':'input-xlarge search-query','placeholder':'Email'})) + theme = forms.MultipleChoiceField(label="Тематика", choices = [(t.id, t.name) for t in Theme.objects.language()], + required=False) + country = forms.MultipleChoiceField(label="Страна", + choices = [(c.id, c.name) for c in list(set(Country.objects.language('ru').all()))], + required=False) + area = forms.MultipleChoiceField(label="Area", choices = [(c.id, c.name) for c in list(set(Area.objects.language()))], + required=False) + active = forms.BooleanField(label="Подтверждена подписка", required=False) + valid = forms.BooleanField(label="Валидный Email", required=False) + + def filter(self): + qs = Contact.objects.all() + 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']) + if self.cleaned_data.get('country'): + qs = qs.filter(contactsettings__country__id__in=self.cleaned_data['country']) + if self.cleaned_data.get('area'): + qs = qs.filter(contactsettings__area__id__in=self.cleaned_data['area']) + if self.cleaned_data.get('active'): + qs = qs.filter(activated=True) + if self.cleaned_data.get('valid'): + qs = qs.filter(valid=True) + + return qs diff --git a/emencia/django/newsletter/utils/excel.py b/emencia/django/newsletter/utils/excel.py index c8bf89e4..ea59a7e0 100644 --- a/emencia/django/newsletter/utils/excel.py +++ b/emencia/django/newsletter/utils/excel.py @@ -10,7 +10,7 @@ from django.db.models.query import ValuesQuerySet class ExcelResponse(HttpResponse): """ExcelResponse feeded by queryset""" - def __init__(self, data, output_name='excel_data', headers=None, + 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): @@ -40,11 +40,11 @@ class ExcelResponse(HttpResponse): use_xls = True if use_xls: book = xlwt.Workbook(encoding=encoding) - sheet = book.add_sheet('Sheet 1') + sheet = book.add_sheet(sheet_name) styles = {'datetime': xlwt.easyxf(num_format_str='yyyy-mm-dd hh:mm:ss'), 'date': xlwt.easyxf(num_format_str='yyyy-mm-dd'), 'time': xlwt.easyxf(num_format_str='hh:mm:ss'), - 'default': xlwt.Style.default_style} + 'default': default_style or xlwt.Style.default_style} for rowx, row in enumerate(data): for colx, value in enumerate(row): if isinstance(value, datetime.datetime): diff --git a/emencia/django/newsletter/views/admin_views.py b/emencia/django/newsletter/views/admin_views.py index 95237699..a6466436 100644 --- a/emencia/django/newsletter/views/admin_views.py +++ b/emencia/django/newsletter/views/admin_views.py @@ -1,8 +1,7 @@ # -*- coding: utf-8 -*- from django.views.generic import TemplateView, CreateView, ListView, UpdateView, DetailView, FormView -from django.views.generic.list import MultipleObjectMixin from django.conf import settings -from django.http import HttpResponseRedirect +from django.http import HttpResponseRedirect, HttpResponse from django.shortcuts import get_object_or_404 from django.core.urlresolvers import reverse from emencia.django.newsletter.models import Contact, ContactSettings, MailingList, Newsletter @@ -38,11 +37,6 @@ class ContactList(FormView): return super(ContactList, self).get(request, *args, **kwargs) def form_valid(self, form): - """ - - filtering queryset and return paginated results - - """ qs = form.filter() result = paginate_results(qs, page=self.request.GET.get('page')) context = self.get_context_data(form=form) @@ -57,11 +51,6 @@ class ContactList(FormView): return context - - - - - class UpdateContact(UpdateView): model = ContactSettings form_class = ContactSettingsForm @@ -100,4 +89,19 @@ class NewsletterCreate(CreateView): model = Newsletter form_class = NewsletterForm template_name = 'admin/newsletters/newsletter_object.html' - success_url = '/admin/newsletters/newsletters/all/' \ No newline at end of file + success_url = '/admin/newsletters/newsletters/all/' + + +from ..utils.excel import ExcelResponse + + +class ExportContacts(FormView): + form_class = ContactFilterForm + + def get(self, request=None, *args, **kwargs): + form = self.form_class(request.GET) + if form.is_valid(): + qs = form.filter() + columns = ('first_name', 'email') + return ExcelResponse(qs, 'contact_import', columns,'contacts') + return HttpResponseRedirect(self.request.META['HTTP_REFERER']) diff --git a/templates/admin/newsletters/contact_list.html b/templates/admin/newsletters/contact_list.html index ce58dc06..f645fdcf 100644 --- a/templates/admin/newsletters/contact_list.html +++ b/templates/admin/newsletters/contact_list.html @@ -1,5 +1,5 @@ {% extends 'admin/base.html' %} - +{% load staticfiles %} {% block body %}
@@ -9,65 +9,75 @@
- - Filter subscribers - - -
- - -
-{# #} - {{ form.email }} - + Filter subscribers +
+ + +
+ +
+ {{ form.email }} +
-
- - -
- -
- {{ form.theme }} + +
+ +
+ {{ form.theme }} +
-
- -
- + +
+ +
+ {{ form.country }} +
+
-
- {{ form.country }} + +
+ +
+ {{ form.area }} +
-
- -
- + +
+ +
+ {{ form.active }} +
+
-
- {{ form.area }} + +
+ +
+ {{ form.valid }} +
-
- -
- + +
+ -
- +
+ + Export to xls +
-
- + @@ -78,27 +88,54 @@ - - - {% for item in object_list %} - - - - - - - - - - - - {% endfor %} - -
Email ИмяДата редактирования  
{{ item.email }}{{ item.first_name }}{% if item.tester %}да{% else %}нет{% endif %}{% if item.subscriber %}да{% else %}нет{% endif %}{% if item.activated %}да{% else %}нет{% endif %}{{ item.creation_date|date:"Y-m-d H:i" }}{{ item.modification_date|date:"Y-m-d H:i" }}Изменить
+ + + {% for item in object_list %} + + {{ item.email }} + {{ item.first_name }} + {% if item.tester %}да{% else %} + нет{% endif %} + {% if item.subscriber %}да{% else %} + нет{% endif %} + {% if item.activated %}да{% else %} + нет{% endif %} + {{ item.creation_date|date:"Y-m-d H:i" }} + {{ item.modification_date|date:"Y-m-d H:i" }} + + Изменить + + {% endfor %} + + +
+ {# pagination #} + {% include 'admin/includes/admin_pagination.html' with page_obj=object_list %}
- {# pagination #} - {% include 'admin/includes/admin_pagination.html' with page_obj=object_list %} - +{% endblock %} + + +{% block scripts %} + + + + {% endblock %} \ No newline at end of file