remotes/origin/stage6
Alexander Burdeinyi 9 years ago
parent 2043a7983e
commit 2a3cd3ec43
  1. 33
      emencia/django/newsletter/mailer.py
  2. 28
      emencia/django/newsletter/management/commands/send_newsletter.py
  3. 35
      emencia/django/newsletter/models.py
  4. 4
      emencia/django/newsletter/settings.py
  5. 6
      emencia/django/newsletter/templates/newsletter/AutomaticEmail.html

@ -19,7 +19,6 @@ from logging import getLogger
log = getLogger('mail') log = getLogger('mail')
from itertools import chain from itertools import chain
try: try:
from email.mime.multipart import MIMEMultipart from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText from email.mime.text import MIMEText
@ -84,6 +83,7 @@ else:
LINK_RE = re.compile(r"https?://([^ \n]+\n)+[^ \n]+", re.MULTILINE) LINK_RE = re.compile(r"https?://([^ \n]+\n)+[^ \n]+", re.MULTILINE)
cid_rx = re.compile(r'^<(?P<id>.*)>$')
def html2text(html): def html2text(html):
@ -153,6 +153,7 @@ class NewsLetterSender(object):
# #
self.announce = self.newsletter.dailymail self.announce = self.newsletter.dailymail
self.local_dev = getattr(settings, 'LOCAL_DEV', False)
def build_message(self, contact, announce_context=None): def build_message(self, contact, announce_context=None):
""" """
@ -190,6 +191,8 @@ class NewsLetterSender(object):
message.attach(message_alt) message.attach(message_alt)
for attachment in self.attachments: for attachment in self.attachments:
if self.newsletter.dailymail and hasattr(attachment, 'cid') and not attachment.cid in content_html:
continue
message.attach(attachment) message.attach(attachment)
if self.announce and announce_context: if self.announce and announce_context:
@ -267,7 +270,9 @@ class NewsLetterSender(object):
def build_daily_attachments(self): def build_daily_attachments(self):
attachments = [] attachments = []
for cid, path in dailymail_attahcments.iteritems(): for cid, path in dailymail_attahcments.iteritems():
attachments.append(self.gen_attachment_by_path(path, cid)) atchm = self.gen_attachment_by_path(path, cid)
atchm.cid = 'cid:' + cid
attachments.append(atchm)
return attachments return attachments
def build_announce_attachments(self, context): def build_announce_attachments(self, context):
@ -439,15 +444,13 @@ class NewsLetterSender(object):
if self.newsletter.status == Newsletter.WAITING: if self.newsletter.status == Newsletter.WAITING:
self.newsletter.status = Newsletter.SENDING self.newsletter.status = Newsletter.SENDING
if self.newsletter.status == Newsletter.SENDING and \ if self.newsletter.status == Newsletter.SENDING and not self.expedition_list:
self.newsletter.mails_sent() >= \
self.newsletter.mailing_list.expedition_set().count():
self.newsletter.status = Newsletter.SENT self.newsletter.status = Newsletter.SENT
if self.newsletter.ab_testing: if self.newsletter.ab_testing:
self.newsletter.ab_final_stage = True self.newsletter.ab_final_stage = True
if self.announce and not self.expedition_list: # if self.announce and not self.expedition_list:
self.newsletter.status = Newsletter.SENT # self.newsletter.status = Newsletter.SENT
self.newsletter.save() self.newsletter.save()
@ -521,6 +524,9 @@ class NewsLetterSender(object):
print >>sys.stderr, 'smtp connection raises %s' % exception print >>sys.stderr, 'smtp connection raises %s' % exception
status = ContactMailingStatus.ERROR status = ContactMailingStatus.ERROR
if self.newsletter.dailymail and status in [ContactMailingStatus.SENT_TEST, ContactMailingStatus.SENT]:
contact.last_mailing_date = datetime.now().date()
contact.save()
params = { params = {
'newsletter': self.newsletter, 'newsletter': self.newsletter,
'contact': contact, 'contact': contact,
@ -551,7 +557,7 @@ class Mailer(NewsLetterSender):
if not self.can_send: if not self.can_send:
return return
if not self.smtp: if not self.smtp and not self.local_dev:
self.smtp_connect() self.smtp_connect()
if self.newsletter.dailymail: if self.newsletter.dailymail:
@ -583,9 +589,11 @@ class Mailer(NewsLetterSender):
# pass # pass
if send: if send:
message = self.build_message(contact, announce_context) message = self.build_message(contact, announce_context)
self.smtp.sendmail(self.newsletter.header_sender, if not self.local_dev:
self.smtp.sendmail(self.newsletter.header_sender,
contact.email, contact.email,
message.as_string()) message.as_string())
# print(message)
except (Exception, ) as e: except (Exception, ) as e:
exception = e exception = e
print(exception) print(exception)
@ -615,7 +623,8 @@ class Mailer(NewsLetterSender):
# маркируем оставшиеся контакты на второй этап # маркируем оставшиеся контакты на второй этап
self.mark_contacts_for_second_stage() self.mark_contacts_for_second_stage()
self.smtp.quit() if not self.local_dev:
self.smtp.quit()
self.update_newsletter_status() self.update_newsletter_status()
def smtp_connect(self): def smtp_connect(self):
@ -625,6 +634,8 @@ class Mailer(NewsLetterSender):
@property @property
def expedition_list(self): def expedition_list(self):
"""Build the expedition list""" """Build the expedition list"""
self.second_stage_expedition_list_ids = []
self.credits = self.newsletter.server.credits() self.credits = self.newsletter.server.credits()
if self.credits <= 0: if self.credits <= 0:
return [] return []
@ -636,8 +647,6 @@ class Mailer(NewsLetterSender):
qs = qs[:self.credits] qs = qs[:self.credits]
self.second_stage_expedition_list_ids = []
if self.test: if self.test:
return qs return qs

@ -1,9 +1,14 @@
"""Command for sending the newsletter""" """Command for sending the newsletter"""
from datetime import datetime, timedelta
from time import sleep
from django.conf import settings from django.conf import settings
from django.utils.translation import activate from django.utils.translation import activate
from django.core.management.base import NoArgsCommand from django.core.management.base import NoArgsCommand
from emencia.django.newsletter.settings import SEND_HOUR_LOOP
from emencia.django.newsletter.mailer import Mailer
from emencia.django.newsletter.models import Newsletter
class Command(NoArgsCommand): class Command(NoArgsCommand):
@ -11,21 +16,24 @@ class Command(NoArgsCommand):
help = 'Send the newsletter in queue' help = 'Send the newsletter in queue'
def handle_noargs(self, **options): def handle_noargs(self, **options):
from emencia.django.newsletter.mailer import Mailer self.end_time = datetime.now() + timedelta(minutes=30)
from emencia.django.newsletter.models import Newsletter self.verbose = int(options['verbosity'])
verbose = int(options['verbosity'])
activate(settings.LANGUAGE_CODE) activate(settings.LANGUAGE_CODE)
if SEND_HOUR_LOOP:
while self.end_time > datetime.now():
self.send()
sleep(30)
else:
self.send()
if self.verbose:
print 'End session sending'
def send(self):
for newsletter in Newsletter.objects.exclude( for newsletter in Newsletter.objects.exclude(
status__in=[Newsletter.DRAFT, status__in=[Newsletter.DRAFT,
Newsletter.SENT, Newsletter.SENT,
Newsletter.CANCELED,]): Newsletter.CANCELED,]):
mailer = Mailer(newsletter, verbose=verbose) mailer = Mailer(newsletter, verbose=self.verbose)
if mailer.can_send: if mailer.can_send:
mailer.run() mailer.run()
if verbose:
print 'End session sending'

@ -663,6 +663,31 @@ class Newsletter(models.Model):
if self.status == item[0]: if self.status == item[0]:
return unicode(item[1]) return unicode(item[1])
return 'bug' return 'bug'
#
# def get_expedition_count(self):
# add_sent = False
# if self.dailymail:
# qs = self.get_dailymail_subscribers()
# add_sent = True
# else:
# qs = self.mailing_list.expedition_set()
# if self.theme_for_filter:
# # qs = qs
# status_params = {'status': ContactMailingStatus.SENT}
# if self.ab_testing and not self.ab_final_stage:
# status_params = {'status__in': [ContactMailingStatus.SENT, ContactMailingStatus.AB_WAITING]}
# another_mailing_sent = ContactMailingStatus.objects.filter(
# newsletter__mailing_list=self.mailing_list,
# creation_date__gte=datetime.now() - timedelta(days=5),
# **status_params,
# ).exclude(newsletter_id=self.pk).values_list('contact__id', flat=True)
# qs = qs\
# .filter(contactsettings__theme=self.theme_for_filter)\
# .exclude(id__in=another_mailing_sent)
# count = qs.count()
# if add_sent:
# count += self.mails_sent()
# return count
def clone(self): def clone(self):
clone = copy.copy(self) clone = copy.copy(self)
@ -698,19 +723,19 @@ class Newsletter(models.Model):
periodic_filter = [] periodic_filter = []
periodic_filter.append(Q( periodic_filter.append(Q(
periodic=Contact.PERIODIC_CHOICES.WEEK, periodic=Contact.PERIODIC_CHOICES.WEEK,
last_mailing_date=self.sending_date - timedelta(days=7), last_mailing_date__lte=self.sending_date - timedelta(days=7),
)) ))
periodic_filter.append(Q( periodic_filter.append(Q(
periodic=Contact.PERIODIC_CHOICES.WEEK_2, periodic=Contact.PERIODIC_CHOICES.WEEK_2,
last_mailing_date=self.sending_date - timedelta(days=14), last_mailing_date__lte=self.sending_date - timedelta(days=14),
)) ))
month = relativedelta.relativedelta(month=1) month = relativedelta.relativedelta(month=1)
periodic_filter.append(Q( periodic_filter.append(Q(
periodic=Contact.PERIODIC_CHOICES.MONTH, periodic=Contact.PERIODIC_CHOICES.MONTH,
last_mailing_date=self.sending_date - month, last_mailing_date__lte=self.sending_date - month,
)) ))
periodic_filter.append(Q(last_mailing_date__isnull=True)) periodic_filter.append(Q(last_mailing_date__isnull=True))
qs = Contact.objects.subscribers().filter( qs = Contact.objects.valid_subscribers().filter(
reduce(operator.or_, periodic_filter), reduce(operator.or_, periodic_filter),
periodic_day=self.sending_date.isoweekday(), periodic_day=self.sending_date.isoweekday(),
dailymailing=True, dailymailing=True,
@ -737,7 +762,7 @@ class NewsletterRecommend(models.Model):
permissions = (('can_change_status', 'Can change status'),) permissions = (('can_change_status', 'Can change status'),)
def event(self): def event(self):
return self.exposition or conference return self.exposition or self.conference
class Link(models.Model): class Link(models.Model):

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
"""Settings for emencia.django.newsletter""" """Settings for emencia.django.newsletter"""
import string import string
from django.conf import settings from django.conf import settings
@ -45,3 +46,6 @@ ACTIVATION_TEMPLATE = 'client/newsletters/activation_template.html'
DEFAULT_SMPTSERVER_ID = 1 DEFAULT_SMPTSERVER_ID = 1
REMOVE_INACTIVATED_CONTACTS_DAYS = 3 REMOVE_INACTIVATED_CONTACTS_DAYS = 3
# если отмечено будет крутить отправку в течении 30 минут
SEND_HOUR_LOOP = True

@ -421,7 +421,7 @@
</td> </td>
</tr> </tr>
<tr> <tr>
<td style="font-family: Arial, sans-serif; color: #999999; font-size: 13px; padding-bottom: 20px; line-height: 1.5;">{{ news.preview|safe|truncatechars_html:60 }}</td> <td style="font-family: Arial, sans-serif; color: #999999; font-size: 13px; padding-bottom: 20px; line-height: 1.5;">{{ news.preview|safe|truncatewords_html:25 }}</td>
</tr> </tr>
<tr> <tr>
<td> <td>
@ -574,8 +574,8 @@
<td style="padding-top: 15px; padding-bottom: 15px;" align="center"> <td style="padding-top: 15px; padding-bottom: 15px;" align="center">
<a href="http://{{ domain }}/service/participation/" style="font-size: 15px;color: #ff6600;">{% trans "Участие в выставках" %}</a></td> <a href="http://{{ domain }}/service/participation/" style="font-size: 15px;color: #ff6600;">{% trans "Участие в выставках" %}</a></td>
<td style="padding-top: 15px; padding-bottom: 15px;" align="center"> <td style="padding-top: 15px; padding-bottom: 15px;" align="center">
<a href="http://{{ domain }}/blogs/" style="font-size: 15px;color: #666666;">{% trans "Новости" %}</a></td> <a href="http://{{ domain }}/news/" style="font-size: 15px;color: #666666;">{% trans "Новости" %}</a></td>
<td style="padding-top: 15px; padding-bottom: 15px; padding-right: 15px;" align="center"><a href="#" style="font-size: 15px;color: #666666;">{% trans "Статьи" %}</a></td> <td style="padding-top: 15px; padding-bottom: 15px; padding-right: 15px;" align="center"><a href="http://{{ domain }}/blogs/" style="font-size: 15px;color: #666666;">{% trans "Статьи" %}</a></td>
</tr> </tr>
</table> </table>

Loading…
Cancel
Save