Add an email test function

When you make changes to the infrastructure it can be useful to test
that email sending is working, since for that to work that involves the
code, Celery, RabbitMQ and SMTP being functional. However, up until now
to run a test you needed to submit a fake layer which is a bit annoying.
Add an explicit "Test email" option to the Tools drop-down for staff
users to allow them to send an email to themselves.

Note: the page will come back when the Celery job has been created, it
does not check and report on the job status - you need to look on the
server side to see that.

Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
This commit is contained in:
Paul Eggleton 2018-10-01 16:58:45 +13:00
parent 3cc90cde35
commit d3bd81dc3b
4 changed files with 52 additions and 8 deletions

View File

@ -8,7 +8,7 @@ from django.conf.urls import *
from django.views.generic import TemplateView, DetailView, ListView, RedirectView from django.views.generic import TemplateView, DetailView, ListView, RedirectView
from django.views.defaults import page_not_found from django.views.defaults import page_not_found
from django.core.urlresolvers import reverse_lazy from django.core.urlresolvers import reverse_lazy
from layerindex.views import LayerListView, LayerReviewListView, LayerReviewDetailView, RecipeSearchView, MachineSearchView, LayerDetailView, edit_layer_view, delete_layer_view, edit_layernote_view, delete_layernote_view, HistoryListView, EditProfileFormView, AdvancedRecipeSearchView, BulkChangeView, BulkChangeSearchView, bulk_change_edit_view, bulk_change_patch_view, BulkChangeDeleteView, RecipeDetailView, RedirectParamsView, ClassicRecipeSearchView, ClassicRecipeDetailView, ClassicRecipeStatsView, LayerUpdateDetailView, UpdateListView, UpdateDetailView, StatsView, publish_view, LayerCheckListView, BBClassCheckListView, TaskStatusView, ComparisonRecipeSelectView, ComparisonRecipeSelectDetailView, task_log_view, task_stop_view from layerindex.views import LayerListView, LayerReviewListView, LayerReviewDetailView, RecipeSearchView, MachineSearchView, LayerDetailView, edit_layer_view, delete_layer_view, edit_layernote_view, delete_layernote_view, HistoryListView, EditProfileFormView, AdvancedRecipeSearchView, BulkChangeView, BulkChangeSearchView, bulk_change_edit_view, bulk_change_patch_view, BulkChangeDeleteView, RecipeDetailView, RedirectParamsView, ClassicRecipeSearchView, ClassicRecipeDetailView, ClassicRecipeStatsView, LayerUpdateDetailView, UpdateListView, UpdateDetailView, StatsView, publish_view, LayerCheckListView, BBClassCheckListView, TaskStatusView, ComparisonRecipeSelectView, ComparisonRecipeSelectDetailView, task_log_view, task_stop_view, email_test_view
from layerindex.models import LayerItem, Recipe, RecipeChangeset from layerindex.models import LayerItem, Recipe, RecipeChangeset
from rest_framework import routers from rest_framework import routers
from . import restviews from . import restviews
@ -164,6 +164,9 @@ urlpatterns = [
ComparisonRecipeSelectDetailView.as_view( ComparisonRecipeSelectDetailView.as_view(
template_name='layerindex/comparisonrecipeselectdetail.html'), template_name='layerindex/comparisonrecipeselectdetail.html'),
name='comparison_select_detail'), name='comparison_select_detail'),
url(r'^email_test/$',
email_test_view,
name='email_test'),
url(r'^task/(?P<task_id>[-\w]+)/$', url(r'^task/(?P<task_id>[-\w]+)/$',
TaskStatusView.as_view( TaskStatusView.as_view(
template_name='layerindex/task.html'), template_name='layerindex/task.html'),

View File

@ -31,6 +31,7 @@ from django.contrib.auth.decorators import login_required
from django.contrib import messages from django.contrib import messages
from django import forms from django import forms
from django.utils.html import escape from django.utils.html import escape
from django.contrib.sites.models import Site
from reversion.models import Revision from reversion.models import Revision
from . import utils from . import utils
@ -266,6 +267,15 @@ def _check_url_branch(kwargs):
raise Http404 raise Http404
branch = get_object_or_404(Branch, name=branchname) branch = get_object_or_404(Branch, name=branchname)
def _get_help_contact():
# find appropriate help contact
help_contact = None
for user in User.objects.all():
if user.username != 'root' and (user.is_staff or user.is_superuser) and user.is_active:
help_contact = user
break
return help_contact
def publish_view(request, name): def publish_view(request, name):
if not (request.user.is_authenticated() and request.user.has_perm('layerindex.publish_layer')): if not (request.user.is_authenticated() and request.user.has_perm('layerindex.publish_layer')):
raise PermissionDenied raise PermissionDenied
@ -279,12 +289,6 @@ def publish_view(request, name):
subjecttext = get_template('layerindex/publishemailsubject.txt') subjecttext = get_template('layerindex/publishemailsubject.txt')
bodytext = get_template('layerindex/publishemail.txt') bodytext = get_template('layerindex/publishemail.txt')
maintainer_names = [m.name for m in maintainers] maintainer_names = [m.name for m in maintainers]
# find appropriate help contact
help_contact = None
for user in User.objects.all():
if user.username != 'root' and (user.is_staff or user.is_superuser) and user.is_active:
help_contact = user
break
# create subject from subject template # create subject from subject template
d = { d = {
@ -298,7 +302,7 @@ def publish_view(request, name):
'maintainers': maintainer_names, 'maintainers': maintainer_names,
'layer_name': layeritem.name, 'layer_name': layeritem.name,
'layer_url': layer_url, 'layer_url': layer_url,
'help_contact': help_contact, 'help_contact': _get_help_contact(),
} }
body = bodytext.render(d) body = bodytext.render(d)
@ -1423,6 +1427,34 @@ def task_stop_view(request, task_id):
return HttpResponse('terminated') return HttpResponse('terminated')
def email_test_view(request):
if not request.user.is_authenticated() and request.user.is_staff():
raise PermissionDenied
plaintext = get_template('layerindex/testemail.txt')
if request.user.first_name:
user_name = request.user.first_name
else:
user_name = request.user.username
site = Site.objects.get_current()
if site:
site_name = site.name
else:
site_name = 'OE Layer Index'
d = {
'user_name': user_name,
'site_name': site_name,
'site_host': request.META['HTTP_HOST'],
'help_contact': _get_help_contact(),
}
subject = '%s: test email' % site_name
from_email = settings.SUBMIT_EMAIL_FROM
to_email = request.user.email
text_content = plaintext.render(d)
tasks.send_email.apply_async((subject, text_content, from_email, [to_email]))
return HttpResponse('Test email sent to %s' % to_email)
class ComparisonRecipeSelectView(ClassicRecipeSearchView): class ComparisonRecipeSelectView(ClassicRecipeSearchView):
def _can_edit(self): def _can_edit(self):
if self.request.user.is_authenticated(): if self.request.user.is_authenticated():

View File

@ -85,7 +85,9 @@
<li><a href="{% url 'rrs_frontpage' %}">Recipe Maintenance</a></li> <li><a href="{% url 'rrs_frontpage' %}">Recipe Maintenance</a></li>
{% endif %} {% endif %}
{% if user.is_staff %} {% if user.is_staff %}
<li class="divider"></li>
<li><a href="{% url 'admin:index' %}">Admin</a></li> <li><a href="{% url 'admin:index' %}">Admin</a></li>
<li><a href="{% url 'email_test' %}">Test email</a></li>
{% endif %} {% endif %}
</ul> </ul>
</li> </li>

View File

@ -0,0 +1,7 @@
Hi {{ user_name }},
This is a test email from {{ site_name }} at {{ site_host }} to ensure that the email setup is working.
The help contact for this site is {% if help_contact.first_name and help_contact.last_name %}{{ help_contact.first_name }} {{ help_contact.last_name}}{% else %}{{ help_contact.username }}{% endif %} <{{ help_contact.email }}> (usually defined as the first active staff user who isn't "root").
Have a nice day!