diff --git a/accounts/views.py b/accounts/views.py index 7ca6dd32..760b8147 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -131,6 +131,7 @@ class MailingSettings(GetUserMixin, ContextMixin, AjaxableResponseMixin, CreateU 'checked_r_cities': list(instance.r_cities.values_list('pk', flat=True)), 'checked_tg': list(instance.tags.values_list('pk', flat=True)), 'checked_th': list(instance.themes.values_list('pk', flat=True)), + 'contact': instance, }) elif not self.request.user.is_authenticated(): raise HttpResponseForbidden() diff --git a/emencia/django/newsletter/forms.py b/emencia/django/newsletter/forms.py index 2b84c00d..cae37b70 100644 --- a/emencia/django/newsletter/forms.py +++ b/emencia/django/newsletter/forms.py @@ -584,3 +584,13 @@ class MailingStatusFilter(forms.Form): if ab: qs = qs.filter(ab=ab) return qs + + +class SendtoFriendForm(forms.Form): + email = forms.EmailField(label=_(u"E-mail Вашего друга"), required=False) + first_name = forms.CharField(label=_(u"Имя Вашего друга"), required=False) + + def clean_first_name(self): + if self.cleaned_data.get('email') and not self.cleaned_data.get('first_name'): + raise forms.ValidationError(_(u'Введите имя вашего друга')) + return self.cleaned_data.get('first_name') diff --git a/emencia/django/newsletter/mailer.py b/emencia/django/newsletter/mailer.py index 4d67727a..73c9c687 100644 --- a/emencia/django/newsletter/mailer.py +++ b/emencia/django/newsletter/mailer.py @@ -129,7 +129,7 @@ dailymail_attahcments = { 'twitter': 'newsletter/images/twitter.png', } context_attachments_size = { - 'recommended': '281x225', + 'recommended': '17', 'news': '272x195', 'blog': '272x195', 'moscow': '109x114', @@ -144,6 +144,7 @@ class NewsLetterSender(object): self.test = test self.verbose = verbose self.newsletter = newsletter + self.settings_links = True self.newsletter_template = Template(self.newsletter.content) self.themes = dict(Theme.objects.language('ru').all().values_list('pk', 'name')) @@ -159,14 +160,14 @@ class NewsLetterSender(object): 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, name=None): """ Build the email as a multipart message containing a multipart alternative for text (plain, HTML) plus all the attached files. """ - content_html = self.build_email_content(contact, announce_context) + content_html = self.build_email_content(contact, announce_context, name) h = HTMLParser.HTMLParser() content_html = h.unescape(content_html) @@ -384,7 +385,7 @@ class NewsLetterSender(object): title = self.newsletter.title2.format(**self.preheader_ctx) return title - def build_email_content(self, contact, announce_context=None): + def build_email_content(self, contact, announce_context=None, name=None): """Generate the mail for a contact""" uidb36, token = tokenize(contact) context = Context({'contact': contact, @@ -392,7 +393,8 @@ class NewsLetterSender(object): 'newsletter': self.newsletter, 'tracking_image_format': TRACKING_IMAGE_FORMAT, 'uidb36': uidb36, 'token': token, - 'name': contact.first_name or contact.last_name or _(u'Подписчик'), + 'name': name or contact.first_name or contact.last_name or _(u'Подписчик'), + 'settings_links': self.settings_links, }) if self.announce: # render template by default announce template @@ -441,7 +443,7 @@ class NewsLetterSender(object): return smart_unicode(content) - def build_preheader_ctx(self, contact): + def build_preheader_ctx(self, contact, name=None): t_add = u'' count = contact.themes.count() if count > 3: @@ -452,7 +454,7 @@ class NewsLetterSender(object): theme_word=theme_word.make_agree_with_number(count).word, ) self.preheader_ctx = { - 'name': contact.first_name or contact.last_name or _(u'Подписчик'), + 'name': name or contact.first_name or contact.last_name or _(u'Подписчик'), 'themes': u', '.join([self.themes.get(x) for x in contact.themes.all().values_list('pk', flat=True)[:3]]) + t_add, } @@ -571,6 +573,39 @@ class Mailer(NewsLetterSender): In test mode the mailer always send mails but do not log it""" smtp = None + def send_to_friends(self, contact, contacts): + if not self.can_send: + return + + if not self.smtp and not self.local_dev: + self.smtp_connect() + + self.attachments = self.build_daily_attachments() + + for _contact in contacts: + send = True + self.build_preheader_ctx(contact, name=_contact.get('name')) + announce_context = contact.get_announce_context_v2(self.newsletter.sending_date) + if not announce_context: + send = False + try: + log.info(u'Trying send to {email}'.format(email=contact.email)) + # pass + if send: + message = self.build_message(contact, announce_context, _contact.get('name')) + if not self.local_dev: + self.smtp.sendmail(self.newsletter.header_sender, + _contact.get('email'), + message.as_string()) + except (Exception,) as e: + exception = e + log.info(u'Exception was raised while sending to {email}: {exception}'.format( + email=contact.email, exception=exception)) + else: + exception = None + if not self.local_dev: + self.smtp.quit() + def run(self): """Send the mails""" if not self.can_send: diff --git a/emencia/django/newsletter/templates/newsletter/AutomaticEmail_v2.html b/emencia/django/newsletter/templates/newsletter/AutomaticEmail_v2.html index 1f01491e..b265e1d6 100644 --- a/emencia/django/newsletter/templates/newsletter/AutomaticEmail_v2.html +++ b/emencia/django/newsletter/templates/newsletter/AutomaticEmail_v2.html @@ -115,7 +115,6 @@ @@ -653,12 +652,18 @@
- {# TODO: Сменить размер картинки на 170x170 #} {# {% endthumbnail %}#}
- - - - - - + {% if settings_links %} + + + + + + + {% else %} + + + + {% endif %} diff --git a/emencia/django/newsletter/templates/newsletter/AutomaticEmail_web.html b/emencia/django/newsletter/templates/newsletter/AutomaticEmail_web.html index b6fc5bfd..5ebc2808 100644 --- a/emencia/django/newsletter/templates/newsletter/AutomaticEmail_web.html +++ b/emencia/django/newsletter/templates/newsletter/AutomaticEmail_web.html @@ -668,7 +668,7 @@ - + diff --git a/emencia/django/newsletter/urls/mailing_list.py b/emencia/django/newsletter/urls/mailing_list.py index be50064a..19a09294 100644 --- a/emencia/django/newsletter/urls/mailing_list.py +++ b/emencia/django/newsletter/urls/mailing_list.py @@ -4,6 +4,7 @@ from django.conf.urls import patterns from emencia.django.newsletter.views.mailing_list import UnsubscribeView from emencia.django.newsletter.views.mailing_list import UnsubscriptionSuccess from emencia.django.newsletter.views.mailing_list import AuthMailingSettings +from emencia.django.newsletter.views.mailing_list import SendtoFriendView from emencia.django.newsletter.forms import MailingListSubscriptionForm from emencia.django.newsletter.forms import AllMailingListSubscriptionForm @@ -39,4 +40,8 @@ urlpatterns = patterns('emencia.django.newsletter.views.mailing_list', AuthMailingSettings.as_view(), name='newsletter-authmailingsettings'), + url(r'^tofriend/(?P[-\w]+)/(?P[0-9A-Za-z]+)-(?P.+)/$', + SendtoFriendView.as_view(), + name='newsletter-sendtofriend'), + ) diff --git a/emencia/django/newsletter/views/mailing_list.py b/emencia/django/newsletter/views/mailing_list.py index 1e718993..95fd3701 100644 --- a/emencia/django/newsletter/views/mailing_list.py +++ b/emencia/django/newsletter/views/mailing_list.py @@ -1,17 +1,21 @@ # -*- coding: utf-8 -*- """Views for emencia.django.newsletter Mailing List""" +from datetime import datetime, timedelta from django.template import RequestContext from django.shortcuts import get_object_or_404 from django.shortcuts import render_to_response from django.contrib import messages from django.http import HttpResponseRedirect -from django.views.generic import DetailView, TemplateView, RedirectView +from django.views.generic import DetailView, TemplateView, RedirectView, FormView from django.core.urlresolvers import reverse_lazy +from django.contrib import messages from django.utils.translation import ugettext as _ +from django.forms.formsets import formset_factory +from emencia.django.newsletter.mailer import Mailer from emencia.django.newsletter.utils.tokens import untokenize from emencia.django.newsletter.models import Newsletter, MailingList, ContactMailingStatus, Contact, ContactSettings -from emencia.django.newsletter.forms import SubscribeSettingsForm +from emencia.django.newsletter.forms import SubscribeSettingsForm, SendtoFriendForm def view_mailinglist_unsubscribe(request, slug, uidb36, token): @@ -150,3 +154,54 @@ class AuthMailingSettings(RedirectView): self.contact = untokenize(self.kwargs.get('uidb36'), self.kwargs.get('token')) request.session['ml_contact_pk'] = self.contact.pk return super(AuthMailingSettings, self).get(request, *args, **kwargs) + + +class SendtoFriendView(TemplateView): + # form_class = SendtoFriendForm + formset_class = formset_factory(SendtoFriendForm, extra=5, max_num=5) + template_name = 'client/newsletters/sendmail_to_friend.html' + message_template_name = 'client/newsletters/sendmail_to_friend_message.html' + + def dispatch(self, request, *args, **kwargs): + self.message_template = False + self.formset = self.formset_class(request.POST or None) + self.newsletter = get_object_or_404(Newsletter, slug=kwargs.get('slug')) + self.contact = untokenize(self.kwargs.get('uidb36'), self.kwargs.get('token')) + last_send = request.session.get('last_friend_send') + if last_send and datetime.now() - last_send < timedelta(hours=1): + self.add_msg(_(u'В целях направленных на борьбу со спамом, пересылать письма можно не чаще чем раз в час.')) + return super(SendtoFriendView, self).dispatch(request, *args, **kwargs) + + def add_msg(self, msg): + self.message_template = True + messages.add_message(self.request, messages.INFO, msg) + + def post(self, request, *args, **kwargs): + if self.formset.is_valid(): + contacts = [] + for form in self.formset: + contacts.append({ + 'name': form.cleaned_data.get('first_name'), + 'email': form.cleaned_data.get('email') + }) + self.send_mail(contacts) + request.session['last_friend_send'] = datetime.now() + self.add_msg(_(u'Мы успешно переслали письмо вашим друзьям. Спасибо что Вы с нами!')) + return self.get(request, *args, **kwargs) + + def get_template_names(self): + if self.message_template: + return [self.message_template_name] + return super(SendtoFriendView, self).get_template_names() + + def send_mail(self, contacts): + mailer = Mailer(self.newsletter) + mailer.settings_links = False + mailer.send_to_friends(self.contact, contacts) + + def get_context_data(self, **kwargs): + ctx = super(SendtoFriendView, self).get_context_data(**kwargs) + ctx['formset'] = self.formset + ctx['newsletter'] = self.newsletter + ctx['contact'] = self.contact + return ctx \ No newline at end of file diff --git a/templates/client/accounts/mailing_settings.html b/templates/client/accounts/mailing_settings.html index 81ab20b9..ee87cf92 100644 --- a/templates/client/accounts/mailing_settings.html +++ b/templates/client/accounts/mailing_settings.html @@ -21,7 +21,7 @@ expomap.ru

{% trans 'Настройте рассылку от Expomap' %}

-

{% trans 'для' %} {{ request.user }}

+

{% trans 'для' %} {{ contact.email }}

diff --git a/templates/client/article/article.html b/templates/client/article/article.html index 8f0c01b1..653c690e 100644 --- a/templates/client/article/article.html +++ b/templates/client/article/article.html @@ -31,10 +31,8 @@ {# {% include 'client/includes/article/article_logo.html' with obj=object %} #}

{% trans 'Краткое содержание' %}{{ object.main_title }}

{# {{ object.publish_date|date:"d E Y" }} #} diff --git a/templates/client/newsletters/sendmail_to_friend.html b/templates/client/newsletters/sendmail_to_friend.html new file mode 100644 index 00000000..c068bd57 --- /dev/null +++ b/templates/client/newsletters/sendmail_to_friend.html @@ -0,0 +1,65 @@ +{% load i18n %} +{% load static %} +{% load widget_tweaks %} + + + + + + + {% trans 'Перешлите письмо другу' %} + + + + +{# #} +{# #} + + + + + + + + {% block content %} +
+ {% csrf_token %} + {{ formset.management_form }} + {% for form in formset %} +
+ {{ form.as_p }} +
+
+{# {% for field in form %}#} +{#
#} +{# #} +{#
#} +{# {{ field|add_class:"form-control" }}#} +{# {{ field.errors }}#} +{#
#} +{#
#} +{# {% endfor %}#} + {% endfor %} +
+
+ +
+
+ + {% endblock %} + + +
© Expomap {% now "Y" %}
+ + + + diff --git a/templates/client/newsletters/sendmail_to_friend_message.html b/templates/client/newsletters/sendmail_to_friend_message.html new file mode 100644 index 00000000..3fa19b1c --- /dev/null +++ b/templates/client/newsletters/sendmail_to_friend_message.html @@ -0,0 +1,19 @@ +{% extends 'client/newsletters/sendmail_to_friend.html' %} + +{% load i18n %} +{% load static %} +{% load widget_tweaks %} + +{% block content %} +
+ {% if messages %} +{#
    #} + {% for message in messages %} + {{ message }} + {% endfor %} +{#
#} + {% endif %} +
+{% endblock %} + +
{% trans "Вы получили это письмо, так как подписаны на рассылку" %} https://www.expomap.ru
{% trans "Переслать другу" %} {% trans "или" %} {% trans "Отписаться" %}
{% trans "Вы получили это письмо, так как подписаны на рассылку" %} https://www.expomap.ru
{% trans "Переслать другу" %} {% trans "или" %} {% trans "Отписаться" %}
{% trans "Вы получили это письмо, так как его переслал ваш друг" %} {{ contact.email }}. https://www.expomap.ru
© 2008 — 2016 Expomap.ru
{% trans "Вы получили это письмо, так как подписаны на рассылку" %} https://www.expomap.ru
{% trans "Переслать другу" %} {% trans "или" %} {% trans "Отписаться" %}{% trans "Переслать другу" %} {% trans "или" %} {% trans "Отписаться" %}
© 2008 — 2016 Expomap.ru