1577 & 1581: подправил чутка

remotes/origin/stage6
Alexander Burdeiny 9 years ago
parent bb0f61cb31
commit 745c23d679
  1. 27
      emencia/django/newsletter/admin_urls.py
  2. 11
      emencia/django/newsletter/mailer.py
  3. 19
      emencia/django/newsletter/management/commands/newsletter_create_dailymail.py
  4. 33
      emencia/django/newsletter/models.py
  5. 13
      emencia/django/newsletter/templates/newsletter/AutomaticEmail.html
  6. 10
      emencia/django/newsletter/templates/newsletter/AutomaticEmail_test.html
  7. 60
      emencia/django/newsletter/views/admin_views.py
  8. 1
      templates/c_admin/includes/admin_nav.html
  9. 56
      templates/c_admin/newsletters/newsletter_list_daily.html

@ -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<pk>\d+)/edit/$', NewsletterUpdate.as_view(), name='newsletters_newsletters_update'),
url(r'^newsletters/(?P<pk>\d+)/delete/$', NewsletterDelete.as_view(), name='newsletters_newsletters_delete'),
url(r'^newsletters/(?P<pk>\d+)/clone/$', NewsletterCloneView.as_view(), name='newsletters_newsletters_clone'),
url(r'^newsletters/(?P<pk>\d+)/cancel/$', NewsletterCancelView.as_view(), name='newsletters_newsletters_cancel'),
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+)/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<pk>\d+)/edit/$', NewsletterUpdate.as_view(), name='newsletters_newsletters_update'),
url(r'^newsletters/(?P<pk>\d+)/delete/$', NewsletterDelete.as_view(), name='newsletters_newsletters_delete'),
url(r'^newsletters/(?P<pk>\d+)/clone/$', NewsletterCloneView.as_view(), name='newsletters_newsletters_clone'),
url(r'^newsletters/(?P<pk>\d+)/cancel/$', NewsletterCancelView.as_view(), name='newsletters_newsletters_cancel'),
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+)/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'),

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

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

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

@ -11,12 +11,15 @@
</head>
<body>
<h1>{% trans "Emencia Django Newsletter" %}</h1>
<form action="." method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Сгенерировать</button>
</form>
{% block test_form %}
{% endblock test_form %}
{% block content %}
<a href="http://{{ domain }}{% url 'events:main' %}?{{ moscow_filter_url }}">{% trans "ПОСМОТРЕТЬ ВСЕ" %} ></a>
<a href="http://{{ domain }}{% url 'events:main' %}?{{ russia_filter_url }}">{% trans "ПОСМОТРЕТЬ ВСЕ" %} ></a>
<a href="http://{{ domain }}{% url 'events:main' %}?{{ foreign_filter_url }}">{% trans "ПОСМОТРЕТЬ ВСЕ" %} ></a>
<a href="{% if uidb36 and token %}http://{{ domain }}{% url 'newsletter-authmailingsettings' uidb36=uidb36 token=token %}{% else %}#{% endif %}">{% trans "НАСТРОИТЬ" %} ></a>
{% endblock %}
</body>
</html>

@ -0,0 +1,10 @@
{% extends "newsletter/AutomaticEmail.html" %}
{% load i18n %}
{% block test_form %}
<form action="." method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Сгенерировать</button>
</form>
{% endblock test_form %}

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

@ -127,6 +127,7 @@
<li><a href="/admin/newsletters/contact/all/">Подписчики</a></li>
<li><a href="/admin/newsletters/mailinglist/all/">Списки рассылок</a></li>
<li><a href="/admin/newsletters/newsletters/all/">Рассылки</a></li>
<li><a href="{% url 'newsletters_dailymail_list' %}">Ежедневные рассылки</a></li>
<li><a href="{% url 'newsletters_recommends_list' %}">Настройки рекомендаций</a></li>
<li><a href="/admin/newsletters/get-popup-statistics/">Статистика</a></li>
</ul>

@ -0,0 +1,56 @@
{% extends 'c_admin/base.html' %}
{% load i18n %}
{% block body %}
<div class="box span10">
<div class="box-header well">
<h2><i class="icon-arrow-down"></i>{% trans "Рассылки" %}</h2>
</div>
<div class="box-content">
<table class="table table-hover">
<thead>
<tr>
<th>{% trans "Название" %}</th>
<th>{% trans "Кол-во получателей" %}</th>
<th>{% trans "Статус" %}</th>
<th>{% trans "Дата отправки" %}</th>
<th>&nbsp;</th>
<th>&nbsp;</th>
<th>&nbsp;</th>
<th>&nbsp;</th>
<th>&nbsp;</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
{% for item in object_list %}
<tr>
<td>{{ item.title }}</td>
<td>{{ item.get_dailymail_subscribers.count }}</td>
<td>{{ item.get_status_text }}</td>
<td>{{ item.sending_date|date:"Y-m-d H:i" }}</td>
<td><a href="{% url 'newsletters_newsletters_send_test' item.id %}">{% trans "Тест" %}</a></td>
<td><a href="{% url 'newsletters_newsletters_clone' item.id %}">{% trans "Clone" %}</a></td>
<td>
<a href="{% url 'newsletters_newsletters_update' item.id %}">{% trans "Изменить" %}</a>
{% if item.can_cancel %}
<br><a href="{% url 'newsletters_newsletters_cancel' item.id %}">{% trans "Отменить" %}</a></td>
{% endif %}
<td><a href="{% url 'newsletters_newsletters_history' item.id %}">{% trans "История" %}</a></td>
<td><a href="{% url 'newsletters_newsletters_stat' item.id %}">{% trans "Статистика" %}</a></td>
<td><a class="btn btn-close btn-round btn-danger" href="{% url 'newsletters_newsletters_delete' item.id %}"><i class="icon-remove"></i></a> </td>
</tr>
{% endfor %}
</tbody>
</table>
<a class="btn btn-success" href="{% url 'newsletters_newsletters_create' %}"><i class="icon-plus-sign icon-white"></i> {% trans "Добавить новый список" %}</a>
</div>
{# pagination #}
{% include 'c_admin/includes/admin_pagination.html' with page_obj=page_obj %}
</div>
{% endblock %}
Loading…
Cancel
Save