diff --git a/rowers/templates/failed_jobs.html b/rowers/templates/failed_jobs.html
new file mode 100644
index 00000000..b938757c
--- /dev/null
+++ b/rowers/templates/failed_jobs.html
@@ -0,0 +1,47 @@
+{% extends "newbase.html" %}
+{% load staticfiles %}
+{% load rowerfilters %}
+
+{% block title %}Failed Que{% endblock %}
+
+{% block main %}
+
+
+
+
Failed Que
+
+
+ -
+
+
+
+ | Started at |
+ Job Function |
+ Traceback |
+
+
+
+ {% for job in results %}
+
+ | {{ job|lookup:started_at }} |
+ {{ job|lookup:func_name }} |
+ {{ job|lookup:traceback }} |
+
+ {% endfor %}
+
+
+
+ -
+
+ {{ the_div|safe }}
+
+
+
+
+
+{% endblock %}
+
+
+{% block sidebar %}
+{% include 'menu_analytics.html' %}
+{% endblock %}
diff --git a/rowers/urls.py b/rowers/urls.py
index f15bf561..a8296507 100644
--- a/rowers/urls.py
+++ b/rowers/urls.py
@@ -138,6 +138,7 @@ urlpatterns = [
path('403/', TemplateView.as_view(template_name='403.html'),name='403'),
# re_path(r'^imports/$', views.imports_view),
re_path(r'^exportallworkouts/?/$',views.workouts_summaries_email_view,name='workouts_summaries_email_view'),
+ path('failedjobs/',views.failed_queue_view,name='failed_queue_view'),
re_path(r'^update_empower/$',views.rower_update_empower_view,name='rower_update_empower_view'),
re_path(r'^agegroupcp/(?P\d+)/$',views.agegroupcpview,name='agegroupcpview'),
re_path(r'^agegroupcp/(?P\d+)/(?P\d+)/$',views.agegroupcpview,name='agegroupcpview'),
diff --git a/rowers/views/otherviews.py b/rowers/views/otherviews.py
index 2d35ff28..dfc7ea6b 100644
--- a/rowers/views/otherviews.py
+++ b/rowers/views/otherviews.py
@@ -5,6 +5,36 @@ from __future__ import unicode_literals
from rowers.views.statements import *
+from rq import Queue
+from redis import Redis
+
+
+@login_required()
+def failed_queue_view(request):
+ if not request.user.is_staff:
+ raise PermissionDenied("Not Allowed")
+
+ q = Queue('failed', connection=Redis())
+
+ results = []
+
+ for job in q.jobs:
+ traceback = job.exc_info
+ info = {
+ 'started_at': job.started_at,
+ 'func_name': job.func_name,
+ 'traceback': traceback
+ }
+
+ results.append(info)
+
+ return render(request,
+ "failed_jobs.html",
+ {
+ 'results':results,
+ }
+ )
+
@login_required()
def errormessage_view(request,errormessage='aap'):
if (errormessage=='3dsecure'):