From 745c23d6798fba4f3c1a4fdf15ff5684665086cb Mon Sep 17 00:00:00 2001 From: Alexander Burdeiny Date: Wed, 5 Oct 2016 13:33:49 +0300 Subject: [PATCH] =?UTF-8?q?1577=20&=201581:=20=D0=BF=D0=BE=D0=B4=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20=D1=87=D1=83=D1=82=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- emencia/django/newsletter/admin_urls.py | 27 +++++---- emencia/django/newsletter/mailer.py | 11 +++- .../commands/newsletter_create_dailymail.py | 19 +++--- emencia/django/newsletter/models.py | 33 ++++++++-- .../templates/newsletter/AutomaticEmail.html | 13 ++-- .../newsletter/AutomaticEmail_test.html | 10 ++++ .../django/newsletter/views/admin_views.py | 60 +++++++++++++++---- templates/c_admin/includes/admin_nav.html | 1 + .../newsletters/newsletter_list_daily.html | 56 +++++++++++++++++ 9 files changed, 187 insertions(+), 43 deletions(-) create mode 100644 emencia/django/newsletter/templates/newsletter/AutomaticEmail_test.html create mode 100644 templates/c_admin/newsletters/newsletter_list_daily.html diff --git a/emencia/django/newsletter/admin_urls.py b/emencia/django/newsletter/admin_urls.py index 9b5854c7..7931107e 100644 --- a/emencia/django/newsletter/admin_urls.py +++ b/emencia/django/newsletter/admin_urls.py @@ -29,18 +29,21 @@ from emencia.django.newsletter.views.admin_views import ( ) 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+)/delete/$', NewsletterDelete.as_view(), name='newsletters_newsletters_delete'), - url(r'^newsletters/(?P\d+)/clone/$', NewsletterCloneView.as_view(), name='newsletters_newsletters_clone'), - url(r'^newsletters/(?P\d+)/cancel/$', NewsletterCancelView.as_view(), name='newsletters_newsletters_cancel'), - 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/$', - 'emencia.django.newsletter.views.admin_views.send_test_newsletter', - name='newsletters_newsletters_send_test'), - url(r'^newsletters/get-themes/', theme_for_filter_ajax, name='admin-newsletters-get-themes'), - url(r'^newsletters/$', NewsletterCreate.as_view(), name='newsletters_newsletters_create'), + 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+)/delete/$', NewsletterDelete.as_view(), name='newsletters_newsletters_delete'), + url(r'^newsletters/(?P\d+)/clone/$', NewsletterCloneView.as_view(), name='newsletters_newsletters_clone'), + url(r'^newsletters/(?P\d+)/cancel/$', NewsletterCancelView.as_view(), name='newsletters_newsletters_cancel'), + 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/$', + 'emencia.django.newsletter.views.admin_views.send_test_newsletter', + name='newsletters_newsletters_send_test'), + url(r'^newsletters/get-themes/', theme_for_filter_ajax, name='admin-newsletters-get-themes'), + url(r'^newsletters/$', NewsletterCreate.as_view(), name='newsletters_newsletters_create'), + + # dailymail + url(r'^dailymail/all/$', NewsletterListView.as_view(), {'dailymail': True}, name='newsletters_dailymail_list'), # recommends url(r'^recommends/$', RecommendsList.as_view(), name='newsletters_recommends_list'), diff --git a/emencia/django/newsletter/mailer.py b/emencia/django/newsletter/mailer.py index 273252cd..8f2c35db 100644 --- a/emencia/django/newsletter/mailer.py +++ b/emencia/django/newsletter/mailer.py @@ -47,6 +47,7 @@ from django.db.models import Q from emencia.django.newsletter.models import Newsletter from emencia.django.newsletter.models import ContactMailingStatus +from emencia.django.newsletter.models import Contact from emencia.django.newsletter.utils.tokens import tokenize from emencia.django.newsletter.utils.newsletter import track_links from emencia.django.newsletter.utils.newsletter import body_insertion @@ -113,7 +114,7 @@ class NewsLetterSender(object): self.ab_state = self.newsletter.ab_final_choice # - self.announce = self.newsletter.mailing_list.announce + self.announce = self.newsletter.dailymail def build_message(self, contact, announce_context=None): """ @@ -284,7 +285,8 @@ class NewsLetterSender(object): }) if self.announce: # render template by default announce template - template = get_template('newsletter/announce_template.html') + # template = get_template('newsletter/announce_template.html') + template = get_template('newsletter/AutomaticEmail.html') context.update(announce_context) content = template.render(context) elif self.newsletter.ab_testing == True: @@ -476,7 +478,7 @@ class Mailer(NewsLetterSender): # self.build_preheader_ctx(contact) # check if events for this newsletter exists - announce_context = contact.get_announce_context() if self.announce else None + announce_context = contact.get_announce_context_v2() if self.announce else None if self.announce and not announce_context: send = False try: @@ -529,6 +531,9 @@ class Mailer(NewsLetterSender): if self.credits <= 0: return [] + if self.newsletter.dailymail == True and not self.test: + return self.newsletter.get_dailymail_subscribers() + qs = super(Mailer, self).expedition_list qs = qs[:self.credits] diff --git a/emencia/django/newsletter/management/commands/newsletter_create_dailymail.py b/emencia/django/newsletter/management/commands/newsletter_create_dailymail.py index 590f0ccd..c3f0c85b 100644 --- a/emencia/django/newsletter/management/commands/newsletter_create_dailymail.py +++ b/emencia/django/newsletter/management/commands/newsletter_create_dailymail.py @@ -15,11 +15,16 @@ class Command(NoArgsCommand): def handle(self, *args, **options): day = date.today() while day <= date.today() + timedelta(days=7): - title = u'Ежедневная рассылка {}'.format(day) - defaults = { - 'title': title, - 'slug': translit_with_separator(title) - } - n, created = Newsletter.objects.get_or_create( - dailymail=True, sending_date=day, defaults=defaults) + # Создаем только для пн-пт. По выходным не отправляем. + if day.isoweekday() < 6: + title = u'Ежедневная рассылка {}'.format(day) + defaults = { + 'title': title, + 'slug': translit_with_separator(title), + 'status': Newsletter.WAITING, + } + n, created = Newsletter.objects.get_or_create( + dailymail=True, + sending_date=day, + defaults=defaults) day += timedelta(days=1) diff --git a/emencia/django/newsletter/models.py b/emencia/django/newsletter/models.py index 9913ac30..946e2a15 100644 --- a/emencia/django/newsletter/models.py +++ b/emencia/django/newsletter/models.py @@ -17,6 +17,7 @@ from django.utils.encoding import smart_str from django.utils.encoding import force_unicode from django.utils.translation import ugettext_lazy as _ from django.utils.translation import activate +from django.utils.safestring import mark_safe from django.conf import settings from django.core.mail import EmailMessage from django.core.validators import MaxValueValidator, MinValueValidator @@ -257,8 +258,8 @@ class Contact(models.Model): moscow_filter_url.setlist('theme', th_tg_structure.keys()) moscow_filter_url.setlist('tag', list(chain(th_tg_structure.values()))) moscow_filter_url['city'] = settings.MOSCOW_PK - moscow_filter_url['date_from'] = date.strftime('%d.%m.%Y') - ctx['moscow_filter_url'] = moscow_filter_url.urlencode() + # moscow_filter_url['date_from'] = date.strftime('%d.%m.%Y') + ctx['moscow_filter_url'] = mark_safe(moscow_filter_url.urlencode()) # russia if self.russia: @@ -276,8 +277,8 @@ class Contact(models.Model): russia_filter_url.setlist('theme', th_tg_structure.keys()) russia_filter_url.setlist('tag', list(chain(th_tg_structure.values()))) russia_filter_url['country'] = settings.RUSSIA_PK - russia_filter_url['date_from'] = r_date.strftime('%d.%m.%Y') - ctx['russia_filter_url'] = russia_filter_url.urlencode() + # russia_filter_url['date_from'] = r_date.strftime('%d.%m.%Y') + ctx['russia_filter_url'] = mark_safe(russia_filter_url.urlencode()) # foreign if self.foreign: @@ -291,8 +292,8 @@ class Contact(models.Model): foreign_filter_url.setlist('theme', th_tg_structure.keys()) foreign_filter_url.setlist('tag', list(chain(th_tg_structure.values()))) foreign_filter_url.setlist('country', f_countries) - foreign_filter_url['date_from'] = date.strftime('%d.%m.%Y') - ctx['foreign_filter_url'] = foreign_filter_url.urlencode() + # foreign_filter_url['date_from'] = date.strftime('%d.%m.%Y') + ctx['foreign_filter_url'] = mark_safe(foreign_filter_url.urlencode()) # news if self.content_news: @@ -657,6 +658,26 @@ class Newsletter(models.Model): verbose_name_plural = _('newsletters') permissions = (('can_change_status', 'Can change status'),) + def get_dailymail_subscribers(self): + periodic_filter = [] + periodic_filter.append(Q( + periodic=Contact.PERIODIC_CHOICES.WEEK, + last_mailing_date=self.sending_date - timedelta(days=7), + )) + periodic_filter.append(Q( + periodic=Contact.PERIODIC_CHOICES.WEEK_2, + last_mailing_date=self.sending_date - timedelta(days=14), + )) + month = relativedelta.relativedelta(month=1) + periodic_filter.append(Q( + periodic=Contact.PERIODIC_CHOICES.MONTH, + last_mailing_date=self.sending_date - month, + )) + qs = Contact.objects.subscribers().filter( + reduce(operator.or_, periodic_filter), + periodic_day=self.sending_date.isoweekday()) + return qs + class NewsletterRecommend(models.Model): theme = models.ManyToManyField('theme.Theme', null=True) diff --git a/emencia/django/newsletter/templates/newsletter/AutomaticEmail.html b/emencia/django/newsletter/templates/newsletter/AutomaticEmail.html index 7649a6fa..c52d231c 100644 --- a/emencia/django/newsletter/templates/newsletter/AutomaticEmail.html +++ b/emencia/django/newsletter/templates/newsletter/AutomaticEmail.html @@ -11,12 +11,15 @@

{% trans "Emencia Django Newsletter" %}

-
- {% csrf_token %} - {{ form.as_p }} - -
+ {% block test_form %} + {% endblock test_form %} + {% block content %} + {% trans "ПОСМОТРЕТЬ ВСЕ" %} > + {% trans "ПОСМОТРЕТЬ ВСЕ" %} > + {% trans "ПОСМОТРЕТЬ ВСЕ" %} > + {% trans "НАСТРОИТЬ" %} > + {% endblock %} diff --git a/emencia/django/newsletter/templates/newsletter/AutomaticEmail_test.html b/emencia/django/newsletter/templates/newsletter/AutomaticEmail_test.html new file mode 100644 index 00000000..44f96963 --- /dev/null +++ b/emencia/django/newsletter/templates/newsletter/AutomaticEmail_test.html @@ -0,0 +1,10 @@ +{% extends "newsletter/AutomaticEmail.html" %} +{% load i18n %} + +{% block test_form %} +
+ {% csrf_token %} + {{ form.as_p }} + +
+{% endblock test_form %} diff --git a/emencia/django/newsletter/views/admin_views.py b/emencia/django/newsletter/views/admin_views.py index 98679ee3..bd1b9765 100644 --- a/emencia/django/newsletter/views/admin_views.py +++ b/emencia/django/newsletter/views/admin_views.py @@ -2,7 +2,8 @@ import datetime from django.conf import settings -from django.core.urlresolvers import reverse_lazy +from django.core.urlresolvers import reverse_lazy, reverse +from django.contrib.sites.models import Site from django.forms.formsets import formset_factory from django.forms.models import modelformset_factory from django.http import Http404, HttpResponse, HttpResponseRedirect @@ -43,6 +44,7 @@ from emencia.django.newsletter.models import ( NewsletterRecommend, ) + from functions.admin_views import paginate_results from functions.custom_views import ContextMixin, CreateUpdateView from functions.http import JsonResponse @@ -52,15 +54,25 @@ from theme.models import Theme from ..forms import ContactFilterForm, ContactImportForm, AutomaticEmailTestForm from ..models import PopupCount from ..utils.excel import ExcelResponse +from ..utils.tokens import tokenize class AutomaticEmailTest(ContextMixin, FormView): form_class = AutomaticEmailTestForm - template_name = 'newsletter/AutomaticEmail.html' + template_name = 'newsletter/AutomaticEmail_test.html' # success_url = reverse_lazy('automaticemailtest') def form_valid(self, form): contact = Contact.objects.get(email=form.cleaned_data.get('email')) + uidb36, token = tokenize(contact) + self.extra_ctx.update({ + 'contact': contact, + 'domain': Site.objects.get_current().domain, + # 'newsletter': self.newsletter, + # 'tracking_image_format': TRACKING_IMAGE_FORMAT, + 'uidb36': uidb36, 'token': token, + 'name': contact.first_name or contact.last_name or _(u'Подписчик'), + }) self.extra_ctx.update(contact.get_announce_context_v2(date=form.cleaned_data.get('date'))) return self.form_invalid(form) @@ -229,7 +241,14 @@ class UpdateMailingList(MailingListMixin, UpdateView): pass -class NewsletterCreate(CreateView): +class DailyMailSuccesUrlMixin(object): + def get_success_url(self): + if self.object.dailymail == True: + return reverse('newsletters_dailymail_list') + return super(DailyMailSuccesUrlMixin, self).get_success_url() + + +class NewsletterCreate(DailyMailSuccesUrlMixin, CreateView): model = Newsletter form_class = NewsletterForm template_name = 'c_admin/newsletters/newsletter_object.html' @@ -262,7 +281,7 @@ class NewsletterCreate(CreateView): return HttpResponseRedirect(self.success_url) -class NewsletterUpdate(UpdateView): +class NewsletterUpdate(DailyMailSuccesUrlMixin, UpdateView): model = Newsletter form_class = NewsletterForm template_name = 'c_admin/newsletters/newsletter_object.html' @@ -304,8 +323,18 @@ class NewsletterListView(ListView): paginate_by = settings.ADMIN_PAGINATION model = Newsletter template_name = 'c_admin/newsletters/newsletter_list.html' + template_name_daily = 'c_admin/newsletters/newsletter_list_daily.html' success_url = '/admin/newsletters/newsletters/all/' + def get_template_names(self): + if self.kwargs.get('dailymail', False): + return [self.template_name_daily] + return super(NewsletterListView, self).get_template_names() + + def get_queryset(self): + qs = super(NewsletterListView, self).get_queryset() + return qs.filter(dailymail=self.kwargs.get('dailymail', False)) + def send_test_newsletter(request, pk): newsletter = get_object_or_404(Newsletter, pk=pk) @@ -318,7 +347,11 @@ def send_test_newsletter(request, pk): else: return HttpResponse(_(u'Нет тестовых контактов')) - redirect = request.META.get('HTTP_REFERER', '/admin/newsletter/newsletter/all/') + if newsletter.dailymail == False: + redirect = request.META.get('HTTP_REFERER', '/admin/newsletter/newsletter/all/') + else: + redirect = request.META.get('HTTP_REFERER', reverse('newsletters_dailymail_list')) + return HttpResponseRedirect(redirect) @@ -366,19 +399,26 @@ class NewsletterStatistics(DetailView): return stat -class NewsletterCloneView(RedirectView): +class DailyMailSuccesUrlMixinUrl(object): + def get_url(self, newsletter): + if newsletter.dailymail == True: + return reverse('newsletters_dailymail_list') + return self.url + + +class NewsletterCloneView(RedirectView, DailyMailSuccesUrlMixinUrl): 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) + return HttpResponseRedirect(self.get_url(newsletter)) def post(self, request, *args, **kwargs): return self.get(request, *args, **kwargs) -class NewsletterCancelView(NewsletterCloneView): +class NewsletterCancelView(NewsletterCloneView, DailyMailSuccesUrlMixinUrl): url = reverse_lazy("newsletters_newsletters_list") def get(self, request, *args, **kwargs): @@ -386,7 +426,7 @@ class NewsletterCancelView(NewsletterCloneView): if newsletter.can_cancel: newsletter.status = Newsletter.CANCELED newsletter.save() - return HttpResponseRedirect(self.url) + return HttpResponseRedirect(self.get_url(newsletter)) class NewsletterHistory(ListView): @@ -416,7 +456,7 @@ class NewsletterHistory(ListView): return context -class NewsletterDelete(DeleteView): +class NewsletterDelete(DailyMailSuccesUrlMixin, DeleteView): model = Newsletter template_name = 'c_admin/newsletters/confirm_delete.html' success_url = reverse_lazy('newsletters_newsletters_list') diff --git a/templates/c_admin/includes/admin_nav.html b/templates/c_admin/includes/admin_nav.html index 15969bad..8bb4192d 100644 --- a/templates/c_admin/includes/admin_nav.html +++ b/templates/c_admin/includes/admin_nav.html @@ -127,6 +127,7 @@
  • Подписчики
  • Списки рассылок
  • Рассылки
  • +
  • Ежедневные рассылки
  • Настройки рекомендаций
  • Статистика
  • diff --git a/templates/c_admin/newsletters/newsletter_list_daily.html b/templates/c_admin/newsletters/newsletter_list_daily.html new file mode 100644 index 00000000..a0f4c239 --- /dev/null +++ b/templates/c_admin/newsletters/newsletter_list_daily.html @@ -0,0 +1,56 @@ +{% extends 'c_admin/base.html' %} +{% load i18n %} + +{% block body %} + +
    +
    +

    {% trans "Рассылки" %}

    +
    +
    + + + + + + + + + + + + + + + + + + + {% for item in object_list %} + + + + + + + + + {% endif %} + + + + + + {% endfor %} + +
    {% trans "Название" %}{% trans "Кол-во получателей" %}{% trans "Статус" %}{% trans "Дата отправки" %}      
    {{ item.title }}{{ item.get_dailymail_subscribers.count }}{{ item.get_status_text }}{{ item.sending_date|date:"Y-m-d H:i" }}{% trans "Тест" %}{% trans "Clone" %} + {% trans "Изменить" %} + {% if item.can_cancel %} +
    {% trans "Отменить" %}
    {% trans "История" %}{% trans "Статистика" %}
    + {% trans "Добавить новый список" %} +
    + {# pagination #} + {% include 'c_admin/includes/admin_pagination.html' with page_obj=page_obj %} +
    + +{% endblock %}