Merge branch 'stage6' of bitbucket.org:Bonus_05/expomap into stage6

remotes/origin/stage6
ya_dim4ik 9 years ago
commit b00f6de4d2
  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. 47
      emencia/django/newsletter/migrations/0011_update_contact.py
  5. 33
      emencia/django/newsletter/models.py
  6. 13
      emencia/django/newsletter/templates/newsletter/AutomaticEmail.html
  7. 10
      emencia/django/newsletter/templates/newsletter/AutomaticEmail_test.html
  8. 60
      emencia/django/newsletter/views/admin_views.py
  9. 10
      fabfile.py
  10. 1
      templates/c_admin/includes/admin_nav.html
  11. 56
      templates/c_admin/newsletters/newsletter_list_daily.html

@ -29,18 +29,21 @@ from emencia.django.newsletter.views.admin_views import (
) )
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+)/delete/$', NewsletterDelete.as_view(), name='newsletters_newsletters_delete'), 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+)/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+)/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+)/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/$',
'emencia.django.newsletter.views.admin_views.send_test_newsletter', 'emencia.django.newsletter.views.admin_views.send_test_newsletter',
name='newsletters_newsletters_send_test'), name='newsletters_newsletters_send_test'),
url(r'^newsletters/get-themes/', theme_for_filter_ajax, name='admin-newsletters-get-themes'), 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/$', NewsletterCreate.as_view(), name='newsletters_newsletters_create'),
# dailymail
url(r'^dailymail/all/$', NewsletterListView.as_view(), {'dailymail': True}, name='newsletters_dailymail_list'),
# recommends # recommends
url(r'^recommends/$', RecommendsList.as_view(), name='newsletters_recommends_list'), 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 Newsletter
from emencia.django.newsletter.models import ContactMailingStatus 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.tokens import tokenize
from emencia.django.newsletter.utils.newsletter import track_links from emencia.django.newsletter.utils.newsletter import track_links
from emencia.django.newsletter.utils.newsletter import body_insertion 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.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): def build_message(self, contact, announce_context=None):
""" """
@ -284,7 +285,8 @@ class NewsLetterSender(object):
}) })
if self.announce: if self.announce:
# render template by default announce template # 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) context.update(announce_context)
content = template.render(context) content = template.render(context)
elif self.newsletter.ab_testing == True: elif self.newsletter.ab_testing == True:
@ -476,7 +478,7 @@ class Mailer(NewsLetterSender):
# #
self.build_preheader_ctx(contact) self.build_preheader_ctx(contact)
# check if events for this newsletter exists # 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: if self.announce and not announce_context:
send = False send = False
try: try:
@ -529,6 +531,9 @@ class Mailer(NewsLetterSender):
if self.credits <= 0: if self.credits <= 0:
return [] return []
if self.newsletter.dailymail == True and not self.test:
return self.newsletter.get_dailymail_subscribers()
qs = super(Mailer, self).expedition_list qs = super(Mailer, self).expedition_list
qs = qs[:self.credits] qs = qs[:self.credits]

@ -15,11 +15,16 @@ class Command(NoArgsCommand):
def handle(self, *args, **options): def handle(self, *args, **options):
day = date.today() day = date.today()
while day <= date.today() + timedelta(days=7): while day <= date.today() + timedelta(days=7):
title = u'Ежедневная рассылка {}'.format(day) # Создаем только для пн-пт. По выходным не отправляем.
defaults = { if day.isoweekday() < 6:
'title': title, title = u'Ежедневная рассылка {}'.format(day)
'slug': translit_with_separator(title) defaults = {
} 'title': title,
n, created = Newsletter.objects.get_or_create( 'slug': translit_with_separator(title),
dailymail=True, sending_date=day, defaults=defaults) 'status': Newsletter.WAITING,
}
n, created = Newsletter.objects.get_or_create(
dailymail=True,
sending_date=day,
defaults=defaults)
day += timedelta(days=1) day += timedelta(days=1)

@ -3,10 +3,11 @@ from south.utils import datetime_utils as datetime
from south.db import db from south.db import db
from south.v2 import DataMigration from south.v2 import DataMigration
from django.db import models, transaction from django.db import models, transaction
from django.conf import settings
from city.models import City from city.models import City
from country.models import Country from country.models import Country
# from emencia.django.newsletter.models import Contact from emencia.django.newsletter.models import Contact
# from theme.models import Theme # from theme.models import Theme
@ -17,30 +18,34 @@ class Migration(DataMigration):
# Note: Don't use "from appname.models import ModelName". # Note: Don't use "from appname.models import ModelName".
# Use orm.ModelName to refer to models in this application, # Use orm.ModelName to refer to models in this application,
# and orm['appname.ModelName'] for models in other applications. # and orm['appname.ModelName'] for models in other applications.
Contact = orm['newsletter.Contact'] # Contact = orm['newsletter.Contact']
moscow = City.objects.language('ru').get(name=u'Москва').pk moscow = settings.MOSCOW_PK
russia = Country.objects.language('ru').get(name=u'Россия').pk russia = settings.RUSSIA_PK
r_cities = set(City.objects.filter(country_id=russia).values_list('pk', flat=True)) r_cities = set(City.objects.filter(country_id=russia).values_list('pk', flat=True))
# with transaction.commit_manually(): # with transaction.commit_manually():
for contact in Contact.objects.prefetch_related('contactsettings').all(): for contact in Contact.objects.prefetch_related('contactsettings').all():
cities = set(contact.contactsettings.city.values_list('pk', flat=True)) try:
countries = set(contact.contactsettings.country.values_list('pk', flat=True)) cities = set(contact.contactsettings.city.values_list('pk', flat=True))
themes = set(contact.contactsettings.theme.values_list('pk', flat=True)) countries = set(contact.contactsettings.country.values_list('pk', flat=True))
themes = set(contact.contactsettings.theme.values_list('pk', flat=True))
# moscow # moscow
contact.moscow = True if moscow in cities else False contact.moscow = True if moscow in cities else False
cities.discard(moscow) cities.discard(moscow)
# cities russia # cities russia
_r_cities = cities.intersection(r_cities) _r_cities = cities.intersection(r_cities)
contact.r_cities = _r_cities contact.r_cities = _r_cities
# russia # russia
contact.russia = True if russia in countries else False contact.russia = True if russia in countries else False
countries.discard(russia) countries.discard(russia)
# countries # countries
contact.f_countries = countries contact.f_countries = countries
# themes # themes
contact.themes = themes contact.themes = themes
contact.save() contact.save()
except Exception as e:
print('Exception')
print(e)
# transaction.commit() # transaction.commit()
def backwards(self, orm): def backwards(self, orm):

@ -17,6 +17,7 @@ from django.utils.encoding import smart_str
from django.utils.encoding import force_unicode from django.utils.encoding import force_unicode
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.utils.translation import activate from django.utils.translation import activate
from django.utils.safestring import mark_safe
from django.conf import settings from django.conf import settings
from django.core.mail import EmailMessage from django.core.mail import EmailMessage
from django.core.validators import MaxValueValidator, MinValueValidator 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('theme', th_tg_structure.keys())
moscow_filter_url.setlist('tag', list(chain(th_tg_structure.values()))) moscow_filter_url.setlist('tag', list(chain(th_tg_structure.values())))
moscow_filter_url['city'] = settings.MOSCOW_PK moscow_filter_url['city'] = settings.MOSCOW_PK
moscow_filter_url['date_from'] = date.strftime('%d.%m.%Y') # moscow_filter_url['date_from'] = date.strftime('%d.%m.%Y')
ctx['moscow_filter_url'] = moscow_filter_url.urlencode() ctx['moscow_filter_url'] = mark_safe(moscow_filter_url.urlencode())
# russia # russia
if self.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('theme', th_tg_structure.keys())
russia_filter_url.setlist('tag', list(chain(th_tg_structure.values()))) russia_filter_url.setlist('tag', list(chain(th_tg_structure.values())))
russia_filter_url['country'] = settings.RUSSIA_PK russia_filter_url['country'] = settings.RUSSIA_PK
russia_filter_url['date_from'] = r_date.strftime('%d.%m.%Y') # russia_filter_url['date_from'] = r_date.strftime('%d.%m.%Y')
ctx['russia_filter_url'] = russia_filter_url.urlencode() ctx['russia_filter_url'] = mark_safe(russia_filter_url.urlencode())
# foreign # foreign
if self.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('theme', th_tg_structure.keys())
foreign_filter_url.setlist('tag', list(chain(th_tg_structure.values()))) foreign_filter_url.setlist('tag', list(chain(th_tg_structure.values())))
foreign_filter_url.setlist('country', f_countries) foreign_filter_url.setlist('country', f_countries)
foreign_filter_url['date_from'] = date.strftime('%d.%m.%Y') # foreign_filter_url['date_from'] = date.strftime('%d.%m.%Y')
ctx['foreign_filter_url'] = foreign_filter_url.urlencode() ctx['foreign_filter_url'] = mark_safe(foreign_filter_url.urlencode())
# news # news
if self.content_news: if self.content_news:
@ -657,6 +658,26 @@ class Newsletter(models.Model):
verbose_name_plural = _('newsletters') verbose_name_plural = _('newsletters')
permissions = (('can_change_status', 'Can change status'),) 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): class NewsletterRecommend(models.Model):
theme = models.ManyToManyField('theme.Theme', null=True) theme = models.ManyToManyField('theme.Theme', null=True)

@ -11,12 +11,15 @@
</head> </head>
<body> <body>
<h1>{% trans "Emencia Django Newsletter" %}</h1> <h1>{% trans "Emencia Django Newsletter" %}</h1>
<form action="." method="post"> {% block test_form %}
{% csrf_token %} {% endblock test_form %}
{{ form.as_p }}
<button type="submit">Сгенерировать</button>
</form>
{% block content %} {% 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 %} {% endblock %}
</body> </body>
</html> </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 import datetime
from django.conf import settings 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.formsets import formset_factory
from django.forms.models import modelformset_factory from django.forms.models import modelformset_factory
from django.http import Http404, HttpResponse, HttpResponseRedirect from django.http import Http404, HttpResponse, HttpResponseRedirect
@ -43,6 +44,7 @@ from emencia.django.newsletter.models import (
NewsletterRecommend, NewsletterRecommend,
) )
from functions.admin_views import paginate_results from functions.admin_views import paginate_results
from functions.custom_views import ContextMixin, CreateUpdateView from functions.custom_views import ContextMixin, CreateUpdateView
from functions.http import JsonResponse from functions.http import JsonResponse
@ -52,15 +54,25 @@ from theme.models import Theme
from ..forms import ContactFilterForm, ContactImportForm, AutomaticEmailTestForm from ..forms import ContactFilterForm, ContactImportForm, AutomaticEmailTestForm
from ..models import PopupCount from ..models import PopupCount
from ..utils.excel import ExcelResponse from ..utils.excel import ExcelResponse
from ..utils.tokens import tokenize
class AutomaticEmailTest(ContextMixin, FormView): class AutomaticEmailTest(ContextMixin, FormView):
form_class = AutomaticEmailTestForm form_class = AutomaticEmailTestForm
template_name = 'newsletter/AutomaticEmail.html' template_name = 'newsletter/AutomaticEmail_test.html'
# success_url = reverse_lazy('automaticemailtest') # success_url = reverse_lazy('automaticemailtest')
def form_valid(self, form): def form_valid(self, form):
contact = Contact.objects.get(email=form.cleaned_data.get('email')) 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'))) self.extra_ctx.update(contact.get_announce_context_v2(date=form.cleaned_data.get('date')))
return self.form_invalid(form) return self.form_invalid(form)
@ -229,7 +241,14 @@ class UpdateMailingList(MailingListMixin, UpdateView):
pass 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 model = Newsletter
form_class = NewsletterForm form_class = NewsletterForm
template_name = 'c_admin/newsletters/newsletter_object.html' template_name = 'c_admin/newsletters/newsletter_object.html'
@ -262,7 +281,7 @@ class NewsletterCreate(CreateView):
return HttpResponseRedirect(self.success_url) return HttpResponseRedirect(self.success_url)
class NewsletterUpdate(UpdateView): class NewsletterUpdate(DailyMailSuccesUrlMixin, UpdateView):
model = Newsletter model = Newsletter
form_class = NewsletterForm form_class = NewsletterForm
template_name = 'c_admin/newsletters/newsletter_object.html' template_name = 'c_admin/newsletters/newsletter_object.html'
@ -304,8 +323,18 @@ class NewsletterListView(ListView):
paginate_by = settings.ADMIN_PAGINATION paginate_by = settings.ADMIN_PAGINATION
model = Newsletter model = Newsletter
template_name = 'c_admin/newsletters/newsletter_list.html' template_name = 'c_admin/newsletters/newsletter_list.html'
template_name_daily = 'c_admin/newsletters/newsletter_list_daily.html'
success_url = '/admin/newsletters/newsletters/all/' 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): def send_test_newsletter(request, pk):
newsletter = get_object_or_404(Newsletter, pk=pk) newsletter = get_object_or_404(Newsletter, pk=pk)
@ -318,7 +347,11 @@ def send_test_newsletter(request, pk):
else: else:
return HttpResponse(_(u'Нет тестовых контактов')) 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) return HttpResponseRedirect(redirect)
@ -366,19 +399,26 @@ class NewsletterStatistics(DetailView):
return stat 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") url = reverse_lazy("newsletters_newsletters_list")
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
newsletter = get_object_or_404(Newsletter, id=kwargs['pk']) newsletter = get_object_or_404(Newsletter, id=kwargs['pk'])
newsletter.clone() newsletter.clone()
return HttpResponseRedirect(self.url) return HttpResponseRedirect(self.get_url(newsletter))
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
return self.get(request, *args, **kwargs) return self.get(request, *args, **kwargs)
class NewsletterCancelView(NewsletterCloneView): class NewsletterCancelView(NewsletterCloneView, DailyMailSuccesUrlMixinUrl):
url = reverse_lazy("newsletters_newsletters_list") url = reverse_lazy("newsletters_newsletters_list")
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
@ -386,7 +426,7 @@ class NewsletterCancelView(NewsletterCloneView):
if newsletter.can_cancel: if newsletter.can_cancel:
newsletter.status = Newsletter.CANCELED newsletter.status = Newsletter.CANCELED
newsletter.save() newsletter.save()
return HttpResponseRedirect(self.url) return HttpResponseRedirect(self.get_url(newsletter))
class NewsletterHistory(ListView): class NewsletterHistory(ListView):
@ -416,7 +456,7 @@ class NewsletterHistory(ListView):
return context return context
class NewsletterDelete(DeleteView): class NewsletterDelete(DailyMailSuccesUrlMixin, DeleteView):
model = Newsletter model = Newsletter
template_name = 'c_admin/newsletters/confirm_delete.html' template_name = 'c_admin/newsletters/confirm_delete.html'
success_url = reverse_lazy('newsletters_newsletters_list') success_url = reverse_lazy('newsletters_newsletters_list')

10
fabfile.py vendored

@ -227,6 +227,16 @@ def t1580():
run('python manage.py migrate') run('python manage.py migrate')
run('python manage.py users_to_mailinglist') run('python manage.py users_to_mailinglist')
@ticket
def mailing():
with cd(REMOTE_HOME_DIR):
run('python manage.py migrate newsletter 0011 --fake')
run('python manage.py migrate newsletter')
run('python manage.py migrate newsletter 0010 --fake')
run('python manage.py migrate newsletter 0011 --fake')
run('python manage.py migrate newsletter --fake')
run('python manage.py migrate')
run('python manage.py newsletter_create_dailymail')
# def stage3_pre_final(): # def stage3_pre_final():
# with cd(REMOTE_HOME_DIR): # with cd(REMOTE_HOME_DIR):

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