exel export and filtering contacts

remotes/origin/1203
Ivan Kovalkovskyi 11 years ago
parent 84b71d90f8
commit c560435639
  1. 1
      article/forms.py
  2. 3
      emencia/django/newsletter/admin_urls.py
  3. 33
      emencia/django/newsletter/forms.py
  4. 6
      emencia/django/newsletter/utils/excel.py
  5. 30
      emencia/django/newsletter/views/admin_views.py
  6. 157
      templates/admin/newsletters/contact_list.html

@ -131,6 +131,7 @@ class NewsForm(BlogForm):
except Conference.DoesNotExist: except Conference.DoesNotExist:
return None return None
class ArticleForm(forms.Form): class ArticleForm(forms.Form):
""" """
Create Article form for creating conference Create Article form for creating conference

@ -3,7 +3,7 @@ from django.conf.urls import include
from django.conf.urls import patterns from django.conf.urls import patterns
from django.http import HttpResponse from django.http import HttpResponse
from emencia.django.newsletter.views.admin_views import ContactList, UpdateContact, MailingListView, UpdateMailingList,\ from emencia.django.newsletter.views.admin_views import ContactList, UpdateContact, MailingListView, UpdateMailingList,\
CreateMailingList, NewsletterCreate CreateMailingList, NewsletterCreate, ExportContacts
urlpatterns = patterns('', urlpatterns = patterns('',
@ -17,4 +17,5 @@ urlpatterns = patterns('',
url(r'^contact/(?P<pk>\d+)/edit/', UpdateContact.as_view(), name='newsletters_contact_update'), url(r'^contact/(?P<pk>\d+)/edit/', UpdateContact.as_view(), name='newsletters_contact_update'),
url(r'^contact/all/$', ContactList.as_view(), name='newsletters_contact_list'), url(r'^contact/all/$', ContactList.as_view(), name='newsletters_contact_list'),
url(r'^contact/export/$', ExportContacts.as_view(), name='export_contacts'),
) )

@ -80,8 +80,33 @@ class ContactSettingsForm(forms.ModelForm):
else: else:
return Theme.objects.none() return Theme.objects.none()
class ContactFilterForm(forms.Form): class ContactFilterForm(forms.Form):
email = forms.EmailField(label=_("Email"), max_length=255) email = forms.EmailField(label="Email", max_length=255, required=False,
theme = forms.ChoiceField(label=_("Тематика"), choices = [(t.id, t.name) for t in Theme.objects.language()]) widget=forms.TextInput(attrs={'class':'input-xlarge search-query','placeholder':'Email'}))
country = forms.ChoiceField(label=_("Страна"), choices = [(c.id, c.name) for c in Country.objects.language().distinct()]) theme = forms.MultipleChoiceField(label="Тематика", choices = [(t.id, t.name) for t in Theme.objects.language()],
area = forms.ChoiceField(label=_("Страна"), choices = [(c.id, c.name) for c in Country.objects.language().distinct()]) 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

@ -10,7 +10,7 @@ from django.db.models.query import ValuesQuerySet
class ExcelResponse(HttpResponse): class ExcelResponse(HttpResponse):
"""ExcelResponse feeded by queryset""" """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'): force_csv=False, encoding='utf8'):
valid_data = False valid_data = False
if isinstance(data, ValuesQuerySet): if isinstance(data, ValuesQuerySet):
@ -40,11 +40,11 @@ class ExcelResponse(HttpResponse):
use_xls = True use_xls = True
if use_xls: if use_xls:
book = xlwt.Workbook(encoding=encoding) 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'), styles = {'datetime': xlwt.easyxf(num_format_str='yyyy-mm-dd hh:mm:ss'),
'date': xlwt.easyxf(num_format_str='yyyy-mm-dd'), 'date': xlwt.easyxf(num_format_str='yyyy-mm-dd'),
'time': xlwt.easyxf(num_format_str='hh:mm:ss'), '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 rowx, row in enumerate(data):
for colx, value in enumerate(row): for colx, value in enumerate(row):
if isinstance(value, datetime.datetime): if isinstance(value, datetime.datetime):

@ -1,8 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.views.generic import TemplateView, CreateView, ListView, UpdateView, DetailView, FormView 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.conf import settings
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect, HttpResponse
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from emencia.django.newsletter.models import Contact, ContactSettings, MailingList, Newsletter 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) return super(ContactList, self).get(request, *args, **kwargs)
def form_valid(self, form): def form_valid(self, form):
"""
filtering queryset and return paginated results
"""
qs = form.filter() qs = form.filter()
result = paginate_results(qs, page=self.request.GET.get('page')) result = paginate_results(qs, page=self.request.GET.get('page'))
context = self.get_context_data(form=form) context = self.get_context_data(form=form)
@ -57,11 +51,6 @@ class ContactList(FormView):
return context return context
class UpdateContact(UpdateView): class UpdateContact(UpdateView):
model = ContactSettings model = ContactSettings
form_class = ContactSettingsForm form_class = ContactSettingsForm
@ -100,4 +89,19 @@ class NewsletterCreate(CreateView):
model = Newsletter model = Newsletter
form_class = NewsletterForm form_class = NewsletterForm
template_name = 'admin/newsletters/newsletter_object.html' template_name = 'admin/newsletters/newsletter_object.html'
success_url = '/admin/newsletters/newsletters/all/' 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'])

@ -1,5 +1,5 @@
{% extends 'admin/base.html' %} {% extends 'admin/base.html' %}
{% load staticfiles %}
{% block body %} {% block body %}
<div class="box span10"> <div class="box span10">
@ -9,65 +9,75 @@
<div class="box-content"> <div class="box-content">
<form class="form-horizontal" method="get"> <form class="form-horizontal" method="get">
<fieldset> <fieldset>
<!-- Form Name --> <!-- Form Name -->
<legend>Filter subscribers</legend> <legend>Filter subscribers <i class="icon-circle-arrow-down"></i></legend>
<div class="toggled">
<!-- Search input-->
<div class="control-group"> <!-- Email -->
<label class="control-label" for="id_email">{{ form.email.label }}</label> <div class="control-group">
<label class="control-label" for="id_email">{{ form.email.label }}</label>
<div class="controls"> <div class="controls">
{# <input id="Email" name="Email" type="text" placeholder="Email"#} {{ form.email }}
{# class="input-xlarge search-query">#} </div>
{{ form.email }}
</div> </div>
</div>
<!-- Select Basic -->
<div class="control-group">
<label class="control-label" for="id_theme">{{ form.theme.label }}</label>
<div class="controls"> <!-- Theme -->
{{ form.theme }} <div class="control-group">
<label class="control-label" for="id_theme">{{ form.theme.label }}</label>
<div class="controls">
{{ form.theme }}
</div>
</div> </div>
</div>
<!-- Select Basic --> <!-- Country -->
<div class="control-group"> <div class="control-group">
<label class="control-label" for="id_country">{{ form.id_country }}</label> <label class="control-label" for="id_country">{{ form.country.label }}</label>
<div class="controls">
{{ form.country }}
</div>
</div>
<div class="controls"> <!-- Area -->
{{ form.country }} <div class="control-group">
<label class="control-label" for="id_area">{{ form.area.label }}</label>
<div class="controls">
{{ form.area }}
</div>
</div> </div>
</div>
<!-- Select Basic --> <!-- Submit newsletter -->
<div class="control-group"> <div class="control-group">
<label class="control-label" for="id_area">{{ form.area.label }}</label> <label class="control-label" for="id_active">{{ form.active.label }}</label>
<div class="controls">
{{ form.active }}
</div>
</div>
<div class="controls"> <!-- Valid email -->
{{ form.area }} <div class="control-group">
<label class="control-label" for="id_area">{{ form.valid.label }}</label>
<div class="controls">
{{ form.valid }}
</div>
</div> </div>
</div>
<!-- Button --> <!-- Buttons -->
<div class="control-group"> <div class="control-group">
<label class="control-label" for="submit"></label> <label class="control-label" for="submit"></label>
<div class="controls"> <div class="controls">
<button id="submit" name="submit" class="btn btn-info">Filter</button> <button id="submit" class="btn btn-primary">Filter</button>
<a href="{% url 'export_contacts' %}" id="export" class="btn btn-warning">Export to xls <i class="icon-circle-arrow-down"></i></a>
</div>
</div> </div>
</div> </div>
</fieldset> </fieldset>
</form> </form>
<table class="table table-hover"> <table class="table table-hover">
<thead> <thead>
<tr> <tr>
<th>Email</th> <th>Email</th>
<th>Имя</th> <th>Имя</th>
@ -78,27 +88,54 @@
<th>Дата редактирования</th> <th>Дата редактирования</th>
<th>&nbsp;</th> <th>&nbsp;</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for item in object_list %} {% for item in object_list %}
<tr> <tr>
<td>{{ item.email }}</td> <td>{{ item.email }}</td>
<td>{{ item.first_name }}</td> <td>{{ item.first_name }}</td>
<td>{% if item.tester %}<span class="label label-success">да</span>{% else %}<span class="label label-important">нет</span>{% endif %}</td> <td>{% if item.tester %}<span class="label label-success">да</span>{% else %}
<td>{% if item.subscriber %}<span class="label label-success">да</span>{% else %}<span class="label label-important">нет</span>{% endif %}</td> <span class="label label-important">нет</span>{% endif %}</td>
<td>{% if item.activated %}<span class="label label-success">да</span>{% else %}<span class="label label-important">нет</span>{% endif %}</td> <td>{% if item.subscriber %}<span class="label label-success">да</span>{% else %}
<td>{{ item.creation_date|date:"Y-m-d H:i" }}</td> <span class="label label-important">нет</span>{% endif %}</td>
<td>{{ item.modification_date|date:"Y-m-d H:i" }}</td> <td>{% if item.activated %}<span class="label label-success">да</span>{% else %}
<span class="label label-important">нет</span>{% endif %}</td>
<td><a href="{% url 'newsletters_contact_update' item.contactsettings.id %}">Изменить</a> </td> <td>{{ item.creation_date|date:"Y-m-d H:i" }}</td>
</tr> <td>{{ item.modification_date|date:"Y-m-d H:i" }}</td>
{% endfor %}
</tbody> <td><a href="{% url 'newsletters_contact_update' item.contactsettings.id %}">Изменить</a></td>
</table> </tr>
{% endfor %}
</tbody>
</table>
</div>
{# pagination #}
{% include 'admin/includes/admin_pagination.html' with page_obj=object_list %}
</div> </div>
{# pagination #}
{% include 'admin/includes/admin_pagination.html' with page_obj=object_list %}
</div>
{% endblock %}
{% block scripts %}
<script src="{% static 'js/select2.min.js' %}"></script>
<link href="{% static 'js/select/select2.css' %}" rel='stylesheet'>
<script>
$(document).ready(function () {
$("#id_theme").select2({width: 283, placeholder: 'Тематики'});
$("#id_country").select2({width: 283, placeholder: 'Страны'});
$("#id_area").select2({width: 283, placeholder: 'Географическая зона'});
var get_param = window.location.search;
if (!get_param) {
$('.toggled').collapse('hide');
}
$('legend').on('click', function () {
$('.toggled').collapse('toggle');
});
$('#export').on('click', function(){
window.location = "{% url 'export_contacts' %}" + get_param;
})
})
</script>
{% endblock %} {% endblock %}
Loading…
Cancel
Save