From cf334e2b48d7dc5054ace50a1662d8cd4dbebb3c Mon Sep 17 00:00:00 2001 From: FlaviaBastos Date: Sat, 3 Dec 2016 12:41:34 -0700 Subject: [PATCH] Fix #307 -- Log sent emails --- src/.gitignore | 1 - src/pretix/base/models/log.py | 5 ++ .../templates/pretixcontrol/event/base.html | 18 ++++++- src/pretix/plugins/sendmail/signals.py | 30 ++++++++++- .../pretixplugins/sendmail/history.html | 51 +++++++++++++++++++ src/pretix/plugins/sendmail/urls.py | 3 +- src/pretix/plugins/sendmail/views.py | 35 ++++++++++--- 7 files changed, 133 insertions(+), 10 deletions(-) create mode 100644 src/pretix/plugins/sendmail/templates/pretixplugins/sendmail/history.html diff --git a/src/.gitignore b/src/.gitignore index 2cd7bd80d..cb5e9fb6b 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -8,4 +8,3 @@ dist/ *.egg-info/ *.bak static/jsi18n/ - diff --git a/src/pretix/base/models/log.py b/src/pretix/base/models/log.py index 78ebf8016..de259e459 100644 --- a/src/pretix/base/models/log.py +++ b/src/pretix/base/models/log.py @@ -1,3 +1,4 @@ +import json from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType from django.db import models @@ -124,3 +125,7 @@ class LogEntry(models.Model): return a_text else: return '' + + @cached_property + def parsed_data(self): + return json.loads(self.data) diff --git a/src/pretix/control/templates/pretixcontrol/event/base.html b/src/pretix/control/templates/pretixcontrol/event/base.html index 8aa40241a..36e228930 100644 --- a/src/pretix/control/templates/pretixcontrol/event/base.html +++ b/src/pretix/control/templates/pretixcontrol/event/base.html @@ -98,12 +98,28 @@ {% endif %} {% for nav in nav_event %}
  • - + {% if nav.icon %} {% endif %} {{ nav.label }} + {% if nav.children %} + + + + + {% endif %}
  • {% endfor %} {% endblock %} diff --git a/src/pretix/plugins/sendmail/signals.py b/src/pretix/plugins/sendmail/signals.py index 3f7194341..e878bc45f 100644 --- a/src/pretix/plugins/sendmail/signals.py +++ b/src/pretix/plugins/sendmail/signals.py @@ -2,6 +2,7 @@ from django.core.urlresolvers import resolve, reverse from django.dispatch import receiver from django.utils.translation import ugettext_lazy as _ +from pretix.base.signals import logentry_display from pretix.control.signals import nav_event @@ -19,5 +20,32 @@ def control_nav_import(sender, request=None, **kwargs): }), 'active': (url.namespace == 'plugins:sendmail' and url.url_name == 'send'), 'icon': 'envelope', - } + 'children': [ + { + 'label': _('Send email'), + 'url': reverse('plugins:sendmail:send', kwargs={ + 'event': request.event.slug, + 'organizer': request.event.organizer.slug, + }), + 'active': (url.namespace == 'plugins:sendmail' and url.url_name == 'send'), + }, + { + 'label': _('Email history'), + 'url': reverse('plugins:sendmail:history', kwargs={ + 'event': request.event.slug, + 'organizer': request.event.organizer.slug, + }), + 'active': (url.namespace == 'plugins:sendmail' and url.url_name == 'history'), + }, + ] + }, ] + + +@receiver(signal=logentry_display) +def pretixcontrol_logentry_display(sender, logentry, **kwargs): + plains = { + 'pretix.plugins.sendmail.sent': _('Email was sent'), + } + if logentry.action_type in plains: + return plains[logentry.action_type] diff --git a/src/pretix/plugins/sendmail/templates/pretixplugins/sendmail/history.html b/src/pretix/plugins/sendmail/templates/pretixplugins/sendmail/history.html new file mode 100644 index 000000000..26028c6ea --- /dev/null +++ b/src/pretix/plugins/sendmail/templates/pretixplugins/sendmail/history.html @@ -0,0 +1,51 @@ +{% extends "pretixcontrol/event/base.html" %} +{% load i18n %} +{% load bootstrap3 %} +{% block title %}{% trans "Send out emails" %}{% endblock %} +{% block content %} +

    {% trans "Email history" %}

    +
    + +
    + {% include "pretixcontrol/pagination.html" %} +{% endblock %} diff --git a/src/pretix/plugins/sendmail/urls.py b/src/pretix/plugins/sendmail/urls.py index 710bb56ae..9917909fc 100644 --- a/src/pretix/plugins/sendmail/urls.py +++ b/src/pretix/plugins/sendmail/urls.py @@ -3,6 +3,7 @@ from django.conf.urls import url from . import views urlpatterns = [ - url(r'^control/event/(?P[^/]+)/(?P[^/]+)/sendmail/', views.SenderView.as_view(), + url(r'^control/event/(?P[^/]+)/(?P[^/]+)/sendmail/$', views.SenderView.as_view(), name='send'), + url(r'^control/event/(?P[^/]+)/(?P[^/]+)/sendmail/history/', views.EmailHistoryView.as_view(), name='history') ] diff --git a/src/pretix/plugins/sendmail/views.py b/src/pretix/plugins/sendmail/views.py index eeb0ce8a7..37a3d505a 100644 --- a/src/pretix/plugins/sendmail/views.py +++ b/src/pretix/plugins/sendmail/views.py @@ -8,10 +8,10 @@ from django.shortcuts import redirect from django.utils.formats import date_format from django.utils.timezone import now from django.utils.translation import ugettext_lazy as _ -from django.views.generic import FormView +from django.views.generic import FormView, ListView from pretix.base.i18n import language -from pretix.base.models import Order +from pretix.base.models import LogEntry, Order from pretix.base.services.mail import SendMailException, mail from pretix.control.permissions import EventPermissionRequiredMixin from pretix.multidomain.urlreverse import build_absolute_uri @@ -38,9 +38,6 @@ class SenderView(EventPermissionRequiredMixin, FormView): statusq |= Q(status=Order.STATUS_PENDING, expires__lt=now()) orders = qs.filter(statusq) - self.request.event.log_action('pretix.plugins.sendmail.sent', user=self.request.user, data=dict( - form.cleaned_data)) - tz = pytz.timezone(self.request.event.settings.timezone) failures = [] @@ -77,9 +74,20 @@ class SenderView(EventPermissionRequiredMixin, FormView): 'secret': o.secret })}, self.request.event, locale=o.locale, order=o) + o.log_action( + 'pretix.plugins.sendmail.order.email.sent', + user=self.request.user, + data={ + 'subject': form.cleaned_data['subject'], + 'content': form.cleaned_data['message'], + 'recipients': o.email + } + ) except SendMailException: failures.append(o.email) - + self.request.event.log_action('pretix.plugins.sendmail.sent', + user=self.request.user, + data=dict(form.cleaned_data)) if failures: messages.error(self.request, _('Failed to send mails to the following users: {}'.format(' '.join(failures)))) else: @@ -95,3 +103,18 @@ class SenderView(EventPermissionRequiredMixin, FormView): ctx = super().get_context_data(*args, **kwargs) ctx['output'] = getattr(self, 'output', None) return ctx + + +class EmailHistoryView(EventPermissionRequiredMixin, ListView): + template_name = 'pretixplugins/sendmail/history.html' + permission = 'can_change_orders' + model = LogEntry + context_object_name = 'logs' + paginate_by = 15 + + def get_queryset(self): + qs = LogEntry.objects.filter( + event=self.request.event, + action_type='pretix.plugins.sendmail.sent' + ) + return qs