exel export and filtering contacts

remotes/origin/1203
Ivan Kovalkovskyi 10 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:
return None
class ArticleForm(forms.Form):
"""
Create Article form for creating conference

@ -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<pk>\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'),
)

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

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

@ -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/'
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' %}
{% load staticfiles %}
{% block body %}
<div class="box span10">
@ -9,65 +9,75 @@
<div class="box-content">
<form class="form-horizontal" method="get">
<fieldset>
<!-- Form Name -->
<legend>Filter subscribers</legend>
<!-- Search input-->
<div class="control-group">
<label class="control-label" for="id_email">{{ form.email.label }}</label>
<div class="controls">
{# <input id="Email" name="Email" type="text" placeholder="Email"#}
{# class="input-xlarge search-query">#}
{{ form.email }}
<legend>Filter subscribers <i class="icon-circle-arrow-down"></i></legend>
<div class="toggled">
<!-- Email -->
<div class="control-group">
<label class="control-label" for="id_email">{{ form.email.label }}</label>
<div class="controls">
{{ 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">
{{ form.theme }}
<!-- Theme -->
<div class="control-group">
<label class="control-label" for="id_theme">{{ form.theme.label }}</label>
<div class="controls">
{{ form.theme }}
</div>
</div>
</div>
<!-- Select Basic -->
<div class="control-group">
<label class="control-label" for="id_country">{{ form.id_country }}</label>
<!-- Country -->
<div class="control-group">
<label class="control-label" for="id_country">{{ form.country.label }}</label>
<div class="controls">
{{ form.country }}
</div>
</div>
<div class="controls">
{{ form.country }}
<!-- Area -->
<div class="control-group">
<label class="control-label" for="id_area">{{ form.area.label }}</label>
<div class="controls">
{{ form.area }}
</div>
</div>
</div>
<!-- Select Basic -->
<div class="control-group">
<label class="control-label" for="id_area">{{ form.area.label }}</label>
<!-- Submit newsletter -->
<div class="control-group">
<label class="control-label" for="id_active">{{ form.active.label }}</label>
<div class="controls">
{{ form.active }}
</div>
</div>
<div class="controls">
{{ form.area }}
<!-- Valid email -->
<div class="control-group">
<label class="control-label" for="id_area">{{ form.valid.label }}</label>
<div class="controls">
{{ form.valid }}
</div>
</div>
</div>
<!-- Button -->
<div class="control-group">
<label class="control-label" for="submit"></label>
<!-- Buttons -->
<div class="control-group">
<label class="control-label" for="submit"></label>
<div class="controls">
<button id="submit" name="submit" class="btn btn-info">Filter</button>
<div class="controls">
<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>
</fieldset>
</form>
<table class="table table-hover">
<thead>
<thead>
<tr>
<th>Email</th>
<th>Имя</th>
@ -78,27 +88,54 @@
<th>Дата редактирования</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
{% for item in object_list %}
<tr>
<td>{{ item.email }}</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.subscriber %}<span class="label label-success">да</span>{% else %}<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>{{ item.creation_date|date:"Y-m-d H:i" }}</td>
<td>{{ item.modification_date|date:"Y-m-d H:i" }}</td>
<td><a href="{% url 'newsletters_contact_update' item.contactsettings.id %}">Изменить</a> </td>
</tr>
{% endfor %}
</tbody>
</table>
</thead>
<tbody>
{% for item in object_list %}
<tr>
<td>{{ item.email }}</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.subscriber %}<span class="label label-success">да</span>{% else %}
<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>{{ item.creation_date|date:"Y-m-d H:i" }}</td>
<td>{{ item.modification_date|date:"Y-m-d H:i" }}</td>
<td><a href="{% url 'newsletters_contact_update' item.contactsettings.id %}">Изменить</a></td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{# pagination #}
{% include 'admin/includes/admin_pagination.html' with page_obj=object_list %}
</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 %}
Loading…
Cancel
Save