forked from CGM_Public/pretix_original
Fix #307 -- Log sent emails
This commit is contained in:
committed by
Raphael Michel
parent
adbe966d85
commit
cf334e2b48
1
src/.gitignore
vendored
1
src/.gitignore
vendored
@@ -8,4 +8,3 @@ dist/
|
||||
*.egg-info/
|
||||
*.bak
|
||||
static/jsi18n/
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -98,12 +98,28 @@
|
||||
{% endif %}
|
||||
{% for nav in nav_event %}
|
||||
<li>
|
||||
<a href="{{ nav.url }}" {% if nav.active %}class="active"{% endif %}>
|
||||
<a href="{{ nav.url }}" {% if nav.active %}class="active"{% endif %}
|
||||
{% if nav.children %}class="has-children"{% endif %}>
|
||||
{% if nav.icon %}
|
||||
<i class="fa fa-{{ nav.icon }} fa-fw"></i>
|
||||
{% endif %}
|
||||
{{ nav.label }}
|
||||
</a>
|
||||
{% if nav.children %}
|
||||
<a href="#" class="arrow">
|
||||
<span class="fa arrow"></span>
|
||||
</a>
|
||||
<ul class="nav nav-second-level">
|
||||
{% for item in nav.children %}
|
||||
<li>
|
||||
<a href="{{ item.url }}"
|
||||
{% if item.active %}class="active"{% endif %}>
|
||||
{{ item.label }}
|
||||
</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
{% extends "pretixcontrol/event/base.html" %}
|
||||
{% load i18n %}
|
||||
{% load bootstrap3 %}
|
||||
{% block title %}{% trans "Send out emails" %}{% endblock %}
|
||||
{% block content %}
|
||||
<h1>{% trans "Email history" %}</h1>
|
||||
<div>
|
||||
<ul class="list-group">
|
||||
{% for log in logs %}
|
||||
<li class="list-group-item logentry">
|
||||
<p class="meta">
|
||||
<span class="fa fa-clock-o"></span> {{ log.datetime|date:"SHORT_DATETIME_FORMAT" }}
|
||||
{% if log.user %}
|
||||
<br/><span class="fa fa-user"></span> {{ log.user.get_full_name }}
|
||||
{% endif %}
|
||||
{% if log.display %}
|
||||
<br/><span class="fa fa-comment-o"></span> {{ log.display }}
|
||||
{% endif %}
|
||||
</p>
|
||||
<p>
|
||||
<strong>Email address:</strong> {{ log.parsed_data.recipients }}
|
||||
</p>
|
||||
<p>
|
||||
<strong>Subject:</strong>
|
||||
</p>
|
||||
<p>
|
||||
{% for key,value in log.parsed_data.subject.items %}
|
||||
<p>
|
||||
{{ key }}: {{ value }}
|
||||
</p>
|
||||
{% endfor %}
|
||||
</p>
|
||||
<p>
|
||||
<strong>Email content:</strong>
|
||||
</p>
|
||||
<p>
|
||||
{% for key,value in log.parsed_data.message.items %}
|
||||
<p>
|
||||
{{ key }}:
|
||||
</p>
|
||||
<p>
|
||||
{{ value|linebreaksbr }}
|
||||
</p>
|
||||
{% endfor %}
|
||||
</p>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
{% include "pretixcontrol/pagination.html" %}
|
||||
{% endblock %}
|
||||
@@ -3,6 +3,7 @@ from django.conf.urls import url
|
||||
from . import views
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^control/event/(?P<organizer>[^/]+)/(?P<event>[^/]+)/sendmail/', views.SenderView.as_view(),
|
||||
url(r'^control/event/(?P<organizer>[^/]+)/(?P<event>[^/]+)/sendmail/$', views.SenderView.as_view(),
|
||||
name='send'),
|
||||
url(r'^control/event/(?P<organizer>[^/]+)/(?P<event>[^/]+)/sendmail/history/', views.EmailHistoryView.as_view(), name='history')
|
||||
]
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user