diff --git a/emencia/django/newsletter/admin_urls.py b/emencia/django/newsletter/admin_urls.py index 4007fc9b..3575cc3c 100644 --- a/emencia/django/newsletter/admin_urls.py +++ b/emencia/django/newsletter/admin_urls.py @@ -2,12 +2,13 @@ from django.conf.urls import url from django.conf.urls import patterns from emencia.django.newsletter.views.admin_views import ContactList, UpdateContact, MailingListView, UpdateMailingList,\ CreateMailingList, NewsletterListView, NewsletterCreate, ExportContacts, DeleteContact, NewsletterUpdate, \ - DeleteMailingList, ImportContacts, NewsletterHistory, NewsletterStatistics + DeleteMailingList, ImportContacts, NewsletterHistory, NewsletterStatistics, NewsletterCloneView,ContactQueryDelete urlpatterns = patterns('', url(r'^newsletters/all/$', NewsletterListView.as_view(), name='newsletters_newsletters_list'), url(r'^newsletters/(?P\d+)/edit/$', NewsletterUpdate.as_view(), name='newsletters_newsletters_update'), + url(r'^newsletters/(?P\d+)/clone/$', NewsletterCloneView.as_view(), name='newsletters_newsletters_clone'), url(r'^newsletters/(?P\d+)/history/', NewsletterHistory.as_view(), name='newsletters_newsletters_history'), url(r'^newsletters/(?P\d+)/statistics/', NewsletterStatistics.as_view(), name='newsletters_newsletters_stat'), url(r'^newsletters/(?P\d+)/test/$', @@ -24,6 +25,7 @@ urlpatterns = patterns('', url(r'^contact/(?P\d+)/edit/', UpdateContact.as_view(), name='newsletters_contact_update'), url(r'^contact/(?P\d+)/delete/', DeleteContact.as_view(), name='newsletters_contact_delete'), 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/import/$', ImportContacts.as_view(), name='import_newsletters_contacts'), ) \ No newline at end of file diff --git a/emencia/django/newsletter/forms.py b/emencia/django/newsletter/forms.py index 2c532615..62da29f3 100644 --- a/emencia/django/newsletter/forms.py +++ b/emencia/django/newsletter/forms.py @@ -90,6 +90,8 @@ class ContactSettingsForm(forms.ModelForm): return Theme.objects.none() +from datetime import datetime + class ContactFilterForm(forms.Form): email = forms.EmailField( label="Email", @@ -122,6 +124,8 @@ class ContactFilterForm(forms.Form): label="Список рассылки", 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) valid = forms.BooleanField(label="Валидный Email", required=False) @@ -151,7 +155,10 @@ class ContactFilterForm(forms.Form): if self.cleaned_data.get('valid'): title = 'valid e-mail ' + title 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 diff --git a/emencia/django/newsletter/models.py b/emencia/django/newsletter/models.py index af20bf11..bb5df592 100644 --- a/emencia/django/newsletter/models.py +++ b/emencia/django/newsletter/models.py @@ -4,6 +4,7 @@ from smtplib import SMTP from datetime import datetime from datetime import timedelta from email.MIMEImage import MIMEImage +import copy from django.core.mail import EmailMessage from django.template import Context @@ -387,6 +388,24 @@ class Newsletter(models.Model): return unicode(item[1]) 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): return self.title diff --git a/emencia/django/newsletter/views/admin_views.py b/emencia/django/newsletter/views/admin_views.py index 779fd892..0f425041 100644 --- a/emencia/django/newsletter/views/admin_views.py +++ b/emencia/django/newsletter/views/admin_views.py @@ -1,5 +1,5 @@ # -*- 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.utils import translation from django.utils.translation import ugettext_lazy as _ @@ -55,6 +55,23 @@ class ContactList(FormView): 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): model = Contact success_url = reverse_lazy('newsletters_contact_list') @@ -289,3 +306,14 @@ class ImportContacts(FormView): form.save() 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) \ No newline at end of file diff --git a/templates/admin/expobanner/main_stat.html b/templates/admin/expobanner/main_stat.html index d186b92f..ce5d6b62 100644 --- a/templates/admin/expobanner/main_stat.html +++ b/templates/admin/expobanner/main_stat.html @@ -2,13 +2,7 @@ {% load static %} {% load i18n %} {% block scripts %} - {# datetimepicker #} - - - + {% endblock %} diff --git a/templates/admin/newsletters/contact_list.html b/templates/admin/newsletters/contact_list.html index 83effd34..bcc4b901 100644 --- a/templates/admin/newsletters/contact_list.html +++ b/templates/admin/newsletters/contact_list.html @@ -1,5 +1,15 @@ {% extends 'admin/base.html' %} {% 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 %}
@@ -10,7 +20,7 @@
- Filter subscribers + Фильтровать контакты - {{ object_list.paginator.count }} результатов
@@ -61,6 +71,24 @@
+ + +
+ +
+ {{ form.created_from }} +
+
+ + + +
+ +
+ {{ form.created_to }} +
+
+
@@ -82,9 +110,9 @@
@@ -104,7 +132,7 @@ Дата создания Дата редактирования   -   + Удалить все @@ -162,7 +190,28 @@ $('#mailinglist').on('click', function(event){ event.preventDefault(); 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; + } }) + }) {% endblock %} \ No newline at end of file diff --git a/templates/admin/newsletters/newsletter_list.html b/templates/admin/newsletters/newsletter_list.html index 7cb4bef7..624a286c 100644 --- a/templates/admin/newsletters/newsletter_list.html +++ b/templates/admin/newsletters/newsletter_list.html @@ -20,6 +20,7 @@       +   @@ -29,7 +30,8 @@ {{ item.mailing_list }} {{ item.get_status_text }} {{ item.sending_date|date:"Y-m-d H:i" }} - тест + Тест + Clone Изменить История {% if item.status == item.SENT or item.status == item.CANCELED %}Статистика{% endif %}