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

+ +
    +
  • + + + + + + + + + + {% for job in results %} + + + + + + {% endfor %} + +
    Started atJob FunctionTraceback
    {{ job|lookup:started_at }}{{ job|lookup:func_name }}{{ job|lookup:traceback }}
    +
  • +
  • + + {{ 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'):