create date filtering and newsletter cloning

remotes/origin/1203
Ivan 10 years ago
parent b8ff4735c2
commit fafb2da2c9
  1. 4
      emencia/django/newsletter/admin_urls.py
  2. 9
      emencia/django/newsletter/forms.py
  3. 19
      emencia/django/newsletter/models.py
  4. 30
      emencia/django/newsletter/views/admin_views.py
  5. 8
      templates/admin/expobanner/main_stat.html
  6. 59
      templates/admin/newsletters/contact_list.html
  7. 4
      templates/admin/newsletters/newsletter_list.html

@ -2,12 +2,13 @@ from django.conf.urls import url
from django.conf.urls import patterns from django.conf.urls import patterns
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, NewsletterListView, NewsletterCreate, ExportContacts, DeleteContact, NewsletterUpdate, \ CreateMailingList, NewsletterListView, NewsletterCreate, ExportContacts, DeleteContact, NewsletterUpdate, \
DeleteMailingList, ImportContacts, NewsletterHistory, NewsletterStatistics DeleteMailingList, ImportContacts, NewsletterHistory, NewsletterStatistics, NewsletterCloneView,ContactQueryDelete
urlpatterns = patterns('', urlpatterns = patterns('',
url(r'^newsletters/all/$', NewsletterListView.as_view(), name='newsletters_newsletters_list'), url(r'^newsletters/all/$', NewsletterListView.as_view(), name='newsletters_newsletters_list'),
url(r'^newsletters/(?P<pk>\d+)/edit/$', NewsletterUpdate.as_view(), name='newsletters_newsletters_update'), url(r'^newsletters/(?P<pk>\d+)/edit/$', NewsletterUpdate.as_view(), name='newsletters_newsletters_update'),
url(r'^newsletters/(?P<pk>\d+)/clone/$', NewsletterCloneView.as_view(), name='newsletters_newsletters_clone'),
url(r'^newsletters/(?P<pk>\d+)/history/', NewsletterHistory.as_view(), name='newsletters_newsletters_history'), url(r'^newsletters/(?P<pk>\d+)/history/', NewsletterHistory.as_view(), name='newsletters_newsletters_history'),
url(r'^newsletters/(?P<pk>\d+)/statistics/', NewsletterStatistics.as_view(), name='newsletters_newsletters_stat'), url(r'^newsletters/(?P<pk>\d+)/statistics/', NewsletterStatistics.as_view(), name='newsletters_newsletters_stat'),
url(r'^newsletters/(?P<pk>\d+)/test/$', url(r'^newsletters/(?P<pk>\d+)/test/$',
@ -24,6 +25,7 @@ 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/(?P<pk>\d+)/delete/', DeleteContact.as_view(), name='newsletters_contact_delete'), url(r'^contact/(?P<pk>\d+)/delete/', DeleteContact.as_view(), name='newsletters_contact_delete'),
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/delete-query/$', ContactQueryDelete.as_view(), name='newsletters_contact_query_delete'),
url(r'^contact/export/$', ExportContacts.as_view(), name='export_contacts'), url(r'^contact/export/$', ExportContacts.as_view(), name='export_contacts'),
url(r'^contact/import/$', ImportContacts.as_view(), name='import_newsletters_contacts'), url(r'^contact/import/$', ImportContacts.as_view(), name='import_newsletters_contacts'),
) )

@ -90,6 +90,8 @@ class ContactSettingsForm(forms.ModelForm):
return Theme.objects.none() return Theme.objects.none()
from datetime import datetime
class ContactFilterForm(forms.Form): class ContactFilterForm(forms.Form):
email = forms.EmailField( email = forms.EmailField(
label="Email", label="Email",
@ -122,6 +124,8 @@ class ContactFilterForm(forms.Form):
label="Список рассылки", label="Список рассылки",
required=False required=False
) )
created_from = forms.CharField(max_length=255, label="Создан с", required=False)
created_to = forms.CharField(max_length=255, label="Создан по", required=False)
active = forms.BooleanField(label="Подтверждена подписка", required=False) active = forms.BooleanField(label="Подтверждена подписка", required=False)
valid = forms.BooleanField(label="Валидный Email", required=False) valid = forms.BooleanField(label="Валидный Email", required=False)
@ -151,7 +155,10 @@ class ContactFilterForm(forms.Form):
if self.cleaned_data.get('valid'): if self.cleaned_data.get('valid'):
title = 'valid e-mail ' + title title = 'valid e-mail ' + title
qs = qs.filter(valid=True) qs = qs.filter(valid=True)
if self.cleaned_data.get("created_from"):
qs = qs.filter(creation_date__gte=datetime.strptime(self.cleaned_data['created_from'], "%d.%m.%Y"))
if self.cleaned_data.get("created_to"):
qs = qs.filter(creation_date__lte=datetime.strptime(self.cleaned_data['created_to'], "%d.%m.%Y"))
return qs, title return qs, title

@ -4,6 +4,7 @@ from smtplib import SMTP
from datetime import datetime from datetime import datetime
from datetime import timedelta from datetime import timedelta
from email.MIMEImage import MIMEImage from email.MIMEImage import MIMEImage
import copy
from django.core.mail import EmailMessage from django.core.mail import EmailMessage
from django.template import Context from django.template import Context
@ -387,6 +388,24 @@ class Newsletter(models.Model):
return unicode(item[1]) return unicode(item[1])
return 'bug' return 'bug'
def clone(self):
clone = copy.copy(self)
clone.id = None
clone.title+=u"_копия"
clone.slug += "c"
clone.status = Newsletter.DRAFT
clone.save()
cloned_attachments = [copy.copy(a) for a in list(self.attachment_set.all())]
for a in cloned_attachments:
a.id = None
a.save()
a.newsletter = clone
a.save()
clone.test_contacts = self.test_contacts.all()
clone.save()
return clone
def __unicode__(self): def __unicode__(self):
return self.title return self.title

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.views.generic import CreateView, ListView, UpdateView, DeleteView, FormView, DetailView from django.views.generic import CreateView, ListView, UpdateView, DeleteView, FormView, DetailView, RedirectView
from django.conf import settings from django.conf import settings
from django.utils import translation from django.utils import translation
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
@ -55,6 +55,23 @@ class ContactList(FormView):
return context return context
class ContactQueryDelete(RedirectView):
url = reverse_lazy('newsletters_contact_list')
filter_form = ContactFilterForm
def get(self, request, *args, **kwargs):
form = self.filter_form(request.GET)
if form.is_valid():
qs,_ = form.filter()
qs.delete()
return HttpResponseRedirect(self.url)
else:
return HttpResponse('400')
class DeleteContact(DeleteView): class DeleteContact(DeleteView):
model = Contact model = Contact
success_url = reverse_lazy('newsletters_contact_list') success_url = reverse_lazy('newsletters_contact_list')
@ -289,3 +306,14 @@ class ImportContacts(FormView):
form.save() form.save()
return HttpResponseRedirect(self.get_success_url()) return HttpResponseRedirect(self.get_success_url())
class NewsletterCloneView(RedirectView):
url = reverse_lazy("newsletters_newsletters_list")
def get(self, request, *args, **kwargs):
newsletter = get_object_or_404(Newsletter, id=kwargs['pk'])
newsletter.clone()
return HttpResponseRedirect(self.url)
def post(self, request, *args, **kwargs):
return self.get(request, *args, **kwargs)

@ -2,13 +2,7 @@
{% load static %} {% load static %}
{% load i18n %} {% load i18n %}
{% block scripts %} {% block scripts %}
{# datetimepicker #} <script src="{% static 'js/jquery.dataTables.min.js' %}"></script>
<script type="text/javascript">
console.log("2");
</script>
<script src="{% static 'js/jquery.dataTables.min.js' %}"></script>
{% endblock %} {% endblock %}

@ -1,5 +1,15 @@
{% extends 'admin/base.html' %} {% extends 'admin/base.html' %}
{% load staticfiles %} {% load staticfiles %}
{% block styles %}
#delete-all-button{
min-width:75px;
padding-left:2px;
padding-right:2px;
}
.yellow{
background-image: linear-gradient(#E7FF1D, #E7FF1D 5%, #E9F399);
}
{% endblock %}
{% block body %} {% block body %}
<div class="box span10"> <div class="box span10">
@ -10,7 +20,7 @@
<form class="form-horizontal" method="get"> <form class="form-horizontal" method="get">
<fieldset> <fieldset>
<!-- Form Name --> <!-- Form Name -->
<legend>Filter subscribers <i class="icon-circle-arrow-down"></i></legend> <legend>Фильтровать контакты <i class="icon-circle-arrow-down"></i> - {{ object_list.paginator.count }} результатов</legend>
<div class="toggled"> <div class="toggled">
<!-- Email --> <!-- Email -->
@ -61,6 +71,24 @@
</div> </div>
</div> </div>
<!-- Created from -->
<div class="control-group">
<label class="control-label" for="id_created_from">{{ form.created_from.label }}</label>
<div class="controls">
{{ form.created_from }}
</div>
</div>
<!-- Created to -->
<div class="control-group">
<label class="control-label" for="id_created_to">{{ form.created_to.label }}</label>
<div class="controls">
{{ form.created_to }}
</div>
</div>
<!-- Submit newsletter --> <!-- Submit newsletter -->
<div class="control-group"> <div class="control-group">
<label class="control-label" for="id_active">{{ form.active.label }}</label> <label class="control-label" for="id_active">{{ form.active.label }}</label>
@ -82,9 +110,9 @@
<label class="control-label" for="submit"></label> <label class="control-label" for="submit"></label>
<div class="controls"> <div class="controls">
<button id="submit" class="btn btn-primary">Фильтровать </button> <button id="submit" class="btn btn-primary">Фильтровать</button>
<a href="{% url 'export_contacts' %}" id="export" class="btn btn-warning">Экспорт в xls <i class="icon-circle-arrow-down"></i></a> <a href="{% url 'export_contacts' %}" id="export" class="btn yellow">Экспорт<i class="icon-circle-arrow-down"></i></a>
<a href="{% url 'newsletters_mailinglist_create' %}" id="mailinglist" class="btn btn-success">Создать сп. рассылки <i class="icon-list"></i></a> <a href="{% url 'newsletters_mailinglist_create' %}" id="mailinglist" class="btn btn-success" data-toggle="tooltip" data-placement="top" title="Создает новый список рассылки с отфильтрованими контактами">Сп.рассылки <i class="icon-list"></i></a>
</div> </div>
</div> </div>
</div> </div>
@ -104,7 +132,7 @@
<th>Дата создания</th> <th>Дата создания</th>
<th>Дата редактирования</th> <th>Дата редактирования</th>
<th>&nbsp;</th> <th>&nbsp;</th>
<th>&nbsp;</th> <th><a class="btn btn-danger" id="delete-all-button" href="{% url 'newsletters_contact_query_delete' %}" data-toggle="tooltip" data-placement="top" title="Удалит ВСЕ контакты из результата поиска!(не только на первой странице)">Удалить все</a></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -162,7 +190,28 @@
$('#mailinglist').on('click', function(event){ $('#mailinglist').on('click', function(event){
event.preventDefault(); event.preventDefault();
window.location = "{% url 'newsletters_mailinglist_create' %}" + get_param; window.location = "{% url 'newsletters_mailinglist_create' %}" + get_param;
});
$('#id_created_from').datetimepicker({
todayHighlight: true,
format : 'dd.mm.yyyy',
minView:2
});
$('#id_created_to').datetimepicker({
todayHighlight: true,
format : 'dd.mm.yyyy',
minView:2
});
$('[data-toggle="tooltip"]').tooltip();
$('#delete-all-button').on('click', function(event){
event.preventDefault();
if(confirm("Удалить записи?")) {
var get_param = window.location.search;
var href = $(this).attr('href');
window.location = href+get_param;
}
}) })
}) })
</script> </script>
{% endblock %} {% endblock %}

@ -20,6 +20,7 @@
<th>&nbsp;</th> <th>&nbsp;</th>
<th>&nbsp;</th> <th>&nbsp;</th>
<th>&nbsp;</th> <th>&nbsp;</th>
<th>&nbsp;</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -29,7 +30,8 @@
<td>{{ item.mailing_list }}</td> <td>{{ item.mailing_list }}</td>
<td>{{ item.get_status_text }}</td> <td>{{ item.get_status_text }}</td>
<td>{{ item.sending_date|date:"Y-m-d H:i" }}</td> <td>{{ item.sending_date|date:"Y-m-d H:i" }}</td>
<td><a href="{% url 'newsletters_newsletters_send_test' item.id %}">тест</a> </td> <td><a href="{% url 'newsletters_newsletters_send_test' item.id %}">Тест</a> </td>
<td><a href="{% url 'newsletters_newsletters_clone' item.id %}">Clone</a> </td>
<td><a href="{% url 'newsletters_newsletters_update' item.id %}">Изменить</a> </td> <td><a href="{% url 'newsletters_newsletters_update' item.id %}">Изменить</a> </td>
<td><a href="{% url 'newsletters_newsletters_history' item.id %}">История</a> </td> <td><a href="{% url 'newsletters_newsletters_history' item.id %}">История</a> </td>
<td>{% if item.status == item.SENT or item.status == item.CANCELED %}<a href="{% url 'newsletters_newsletters_stat' item.id %}">Статистика</a>{% endif %}</td> <td>{% if item.status == item.SENT or item.status == item.CANCELED %}<a href="{% url 'newsletters_newsletters_stat' item.id %}">Статистика</a>{% endif %}</td>

Loading…
Cancel
Save