From 9ab3c66cf18b85e69908131e945b9c2e1eeec268 Mon Sep 17 00:00:00 2001 From: Boris Bobrov Date: Mon, 11 Aug 2014 13:39:19 +0400 Subject: [PATCH 01/12] processing panel new looks --- .../user_pages/processing_panel.html | 121 ++++++++++-------- mediagoblin/user_pages/views.py | 6 +- 2 files changed, 71 insertions(+), 56 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/user_pages/processing_panel.html b/mediagoblin/templates/mediagoblin/user_pages/processing_panel.html index 2a449d45..545d7afc 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/processing_panel.html +++ b/mediagoblin/templates/mediagoblin/user_pages/processing_panel.html @@ -30,8 +30,47 @@

{% trans %}Media in-processing{% endtrans %}

+ + +{% if entries.count() %} @@ -39,9 +78,31 @@ - {% for media_entry in processing_entries %} + {% for media_entry in entries %} - + {% if media_entry.state == 'processed' %} + {% set entry_url = media_entry.url_for_self(request.urlgen) %} + + + + + {% else %} + {% if media_entry.transcoding_progress %} @@ -49,61 +110,11 @@ {% else %} {% endif %} + {% endif %} {% endfor %}
IDWhen submitted Transcoding progress
{{ media_entry.id }} +
+ + {{ media_entry.title }} + +
+
{{ media_entry.title }}{{ media_entry.created.strftime("%F %R") }}Ready +
+ {{ media_entry.title }} + {% if media_entry.state == 'processing' %} +
Processing...
+ {% elif media_entry.state == 'failed' %} +
Failed!
+ {% endif %} +
+
{{ media_entry.title }} {{ media_entry.created.strftime("%F %R") }}Unknown
{% else %} -

{% trans %}No media in-processing{% endtrans %}

+

{% trans %}You have not uploaded anything yet!{% endtrans %}

{% endif %} - -

{% trans %}These uploads failed to process:{% endtrans %}

-{% if failed_entries.count() %} - - - - - - - - - - {% for media_entry in failed_entries %} - - - - - {% if media_entry.get_fail_exception() %} - - - {% else %} - - - {% endif %} - - {% endfor %} -
IDTitleWhen submittedReason for failureFailure metadata
{{ media_entry.id }}{{ media_entry.title }}{{ media_entry.created.strftime("%F %R") }}{{ media_entry.get_fail_exception().general_message }}{{ media_entry.fail_metadata }}  
-{% else %} -

{% trans %}No failed entries!{% endtrans %}

-{% endif %} - -

{% trans %}Your last 10 successful uploads{% endtrans %}

-{% if processed_entries.count() %} - - - - - - - - {% for entry in processed_entries %} - - - - - - {% endfor %} -
IDTitleSubmitted
{{ entry.id }}{{ entry.title }}{{ entry.created.strftime("%F %R") }}
-{% else %} -

{% trans %}No processed entries, yet!{% endtrans %}

-{% endif %} {% endblock %} diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py index 88e077d4..50e5c3a4 100644 --- a/mediagoblin/user_pages/views.py +++ b/mediagoblin/user_pages/views.py @@ -671,6 +671,9 @@ def processing_panel(request): state = u'processed').\ order_by(MediaEntry.created.desc()).\ limit(10) + + entries = (MediaEntry.query.filter_by(uploader=user.id) + .order_by(MediaEntry.created.desc())) # Render to response return render_to_response( @@ -679,7 +682,8 @@ def processing_panel(request): {'user': user, 'processing_entries': processing_entries, 'failed_entries': failed_entries, - 'processed_entries': processed_entries}) + 'processed_entries': processed_entries, + 'entries': entries}) @allow_reporting @get_user_media_entry From d59c2298e418a885ad09e6a6a8ae76cdb5c7856e Mon Sep 17 00:00:00 2001 From: Boris Bobrov Date: Mon, 11 Aug 2014 13:51:07 +0400 Subject: [PATCH 02/12] removed querying of unused metrics in media panel --- mediagoblin/user_pages/views.py | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py index 50e5c3a4..0de63440 100644 --- a/mediagoblin/user_pages/views.py +++ b/mediagoblin/user_pages/views.py @@ -655,23 +655,6 @@ def processing_panel(request): user=user.username) # Get media entries which are in-processing - processing_entries = MediaEntry.query.\ - filter_by(actor = user.id, - state = u'processing').\ - order_by(MediaEntry.created.desc()) - - # Get media entries which have failed to process - failed_entries = MediaEntry.query.\ - filter_by(actor = user.id, - state = u'failed').\ - order_by(MediaEntry.created.desc()) - - processed_entries = MediaEntry.query.\ - filter_by(actor = user.id, - state = u'processed').\ - order_by(MediaEntry.created.desc()).\ - limit(10) - entries = (MediaEntry.query.filter_by(uploader=user.id) .order_by(MediaEntry.created.desc())) @@ -680,9 +663,6 @@ def processing_panel(request): request, 'mediagoblin/user_pages/processing_panel.html', {'user': user, - 'processing_entries': processing_entries, - 'failed_entries': failed_entries, - 'processed_entries': processed_entries, 'entries': entries}) @allow_reporting From a186505a8acc433626f4222550de1c344f4f5559 Mon Sep 17 00:00:00 2001 From: Boris Bobrov Date: Mon, 11 Aug 2014 14:03:18 +0400 Subject: [PATCH 03/12] removed h2 from media panel --- .../templates/mediagoblin/user_pages/processing_panel.html | 1 - 1 file changed, 1 deletion(-) diff --git a/mediagoblin/templates/mediagoblin/user_pages/processing_panel.html b/mediagoblin/templates/mediagoblin/user_pages/processing_panel.html index 545d7afc..9fc741f5 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/processing_panel.html +++ b/mediagoblin/templates/mediagoblin/user_pages/processing_panel.html @@ -29,7 +29,6 @@ {% trans %}You can track the state of media being processed for your gallery here.{% endtrans %}

-

{% trans %}Media in-processing{% endtrans %}

- {% if entries.count() %} - + From e3663c7be1d8c5a11b5e47050d921739a068b64f Mon Sep 17 00:00:00 2001 From: Boris Bobrov Date: Mon, 11 Aug 2014 20:59:35 +0400 Subject: [PATCH 05/12] changed the way we save information about exceptions --- mediagoblin/processing/__init__.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/mediagoblin/processing/__init__.py b/mediagoblin/processing/__init__.py index aa8f1447..112b9d35 100644 --- a/mediagoblin/processing/__init__.py +++ b/mediagoblin/processing/__init__.py @@ -325,14 +325,12 @@ def mark_entry_failed(entry_id, exc): u'fail_metadata': exc.metadata}) else: _log.warn("No idea what happened here, but it failed: %r", exc) - # Looks like no, so just mark it as failed and don't record a - # failure_error (we'll assume it wasn't handled) and don't record - # metadata (in fact overwrite it if somehow it had previous info - # here) + # Looks like no, let's record it so that admin could ask us about the + # reason atomic_update(mgg.database.MediaEntry, {'id': entry_id}, {u'state': u'failed', - u'fail_error': None, + u'fail_error': u'Unhandled exception: {0}'.format(unicode(exc)), u'fail_metadata': {}}) From 728ee1df3c7f6913e2462bbbb8388d12a580ee23 Mon Sep 17 00:00:00 2001 From: Boris Bobrov Date: Mon, 1 Feb 2016 00:28:32 +0100 Subject: [PATCH 06/12] added a plugin to display information about entries in processing Conflicts: mediagoblin/templates/mediagoblin/base.html -- resolved by using the original file and manually adding pieces from my commit --- .../plugins/processing_info/README.rst | 5 ++ .../plugins/processing_info/__init__.py | 50 +++++++++++++++++++ .../processing_info/header_left.html | 32 ++++++++++++ mediagoblin/static/css/base.css | 20 ++++++++ mediagoblin/templates/mediagoblin/base.html | 1 + 5 files changed, 108 insertions(+) create mode 100644 mediagoblin/plugins/processing_info/README.rst create mode 100644 mediagoblin/plugins/processing_info/__init__.py create mode 100644 mediagoblin/plugins/processing_info/templates/mediagoblin/processing_info/header_left.html diff --git a/mediagoblin/plugins/processing_info/README.rst b/mediagoblin/plugins/processing_info/README.rst new file mode 100644 index 00000000..3bacbf50 --- /dev/null +++ b/mediagoblin/plugins/processing_info/README.rst @@ -0,0 +1,5 @@ +============== + sampleplugin +============== + +A plugin to insert some useful information about processing to templates diff --git a/mediagoblin/plugins/processing_info/__init__.py b/mediagoblin/plugins/processing_info/__init__.py new file mode 100644 index 00000000..f89378fe --- /dev/null +++ b/mediagoblin/plugins/processing_info/__init__.py @@ -0,0 +1,50 @@ +# GNU MediaGoblin -- federated, autonomous media hosting +# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + + +import logging +import os + +from mediagoblin.tools.pluginapi import get_config +from mediagoblin.db.models import MediaEntry +from mediagoblin.tools import pluginapi + +_log = logging.getLogger(__name__) + +PLUGIN_DIR = os.path.dirname(__file__) + +def setup_plugin(): + pluginapi.register_template_path(os.path.join(PLUGIN_DIR, 'templates')) + pluginapi.register_template_hooks( + {'header_left': 'mediagoblin/processing_info/header_left.html'}) + return + +def make_stats(context): + request = context['request'] + user = request.user + num_queued = MediaEntry.query.filter_by( + uploader=user.id, state=u'processing').count() + context['num_queued'] = num_queued + num_failed = MediaEntry.query.filter_by( + uploader=user.id, state=u'failed').count() + context['num_failed'] = num_failed + return context + + +hooks = { + 'setup': setup_plugin, + 'template_context_prerender': make_stats + } diff --git a/mediagoblin/plugins/processing_info/templates/mediagoblin/processing_info/header_left.html b/mediagoblin/plugins/processing_info/templates/mediagoblin/processing_info/header_left.html new file mode 100644 index 00000000..d635afce --- /dev/null +++ b/mediagoblin/plugins/processing_info/templates/mediagoblin/processing_info/header_left.html @@ -0,0 +1,32 @@ +{# +# GNU MediaGoblin -- federated, autonomous media hosting +# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +#} +{#This injects some information about entries in processing #} +{% if request.user and request.user.has_privilege('active') %} +{% if num_queued is defined and num_queued != 0 %} +{% set panel_url = request.urlgen('mediagoblin.user_pages.processing_panel', + user=request.user.username) %} + + ⏳ {{ num_queued }} + +{% endif %} +{% if num_failed is defined and num_failed != 0 %} + + ☹ {{ num_failed }} + +{% endif %} +{% endif %} diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index e84f51f3..52c1f2dc 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -171,6 +171,26 @@ header { a.logo { color: #fff; font-weight: bold; + text-decoration: none; +} + +.status_icon { + border-radius: 2px; + padding: 4px; + margin: 0px 4px; +} + +.num_queued { + background: #56446F; +} + +.num_failed { + background: #87453B; +} + +.status_icon a { + display: inline-block; + color: #C3C3C3; } .logo img { diff --git a/mediagoblin/templates/mediagoblin/base.html b/mediagoblin/templates/mediagoblin/base.html index 778cc3f9..9b0b7168 100644 --- a/mediagoblin/templates/mediagoblin/base.html +++ b/mediagoblin/templates/mediagoblin/base.html @@ -72,6 +72,7 @@
{%- include "mediagoblin/bits/logo.html" -%} + {% template_hook("header_left") %} {% block mediagoblin_header_title %}{% endblock %}
From be9262b4d4317f244ae4602dad0aaed5fe4ee62f Mon Sep 17 00:00:00 2001 From: Boris Bobrov Date: Sat, 16 Aug 2014 16:38:35 +0300 Subject: [PATCH 07/12] included plugin from previous commit to mediagoblin.ini --- mediagoblin.example.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/mediagoblin.example.ini b/mediagoblin.example.ini index 52331d82..7b528359 100644 --- a/mediagoblin.example.ini +++ b/mediagoblin.example.ini @@ -57,4 +57,5 @@ base_url = /mgoblin_media/ [plugins] [[mediagoblin.plugins.geolocation]] [[mediagoblin.plugins.basic_auth]] +[[mediagoblin.plugins.processing_info]] [[mediagoblin.media_types.image]] From 906a00b6679fc7940262dde48467b102894fa9fe Mon Sep 17 00:00:00 2001 From: Boris Bobrov Date: Sat, 16 Aug 2014 17:41:37 +0300 Subject: [PATCH 08/12] added filtering by entry state in processing panel --- .../mediagoblin/processing_info/header_left.html | 8 ++++---- .../mediagoblin/user_pages/processing_panel.html | 12 ++++++++++++ mediagoblin/user_pages/routing.py | 5 +++++ mediagoblin/user_pages/views.py | 9 ++++++++- 4 files changed, 29 insertions(+), 5 deletions(-) diff --git a/mediagoblin/plugins/processing_info/templates/mediagoblin/processing_info/header_left.html b/mediagoblin/plugins/processing_info/templates/mediagoblin/processing_info/header_left.html index d635afce..1d5e724d 100644 --- a/mediagoblin/plugins/processing_info/templates/mediagoblin/processing_info/header_left.html +++ b/mediagoblin/plugins/processing_info/templates/mediagoblin/processing_info/header_left.html @@ -18,15 +18,15 @@ {#This injects some information about entries in processing #} {% if request.user and request.user.has_privilege('active') %} {% if num_queued is defined and num_queued != 0 %} -{% set panel_url = request.urlgen('mediagoblin.user_pages.processing_panel', - user=request.user.username) %} - ⏳ {{ num_queued }} + ⏳ {{ num_queued }} {% endif %} {% if num_failed is defined and num_failed != 0 %} - ☹ {{ num_failed }} + ☹ {{ num_failed }} {% endif %} {% endif %} diff --git a/mediagoblin/templates/mediagoblin/user_pages/processing_panel.html b/mediagoblin/templates/mediagoblin/user_pages/processing_panel.html index d803e51c..88eef827 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/processing_panel.html +++ b/mediagoblin/templates/mediagoblin/user_pages/processing_panel.html @@ -28,6 +28,18 @@

{% trans %}You can track the state of media being processed for your gallery here.{% endtrans %}

+ +

+Show: +All, +In processing, +Failed, +Succesful +

{% if entries.count() %}
IDThumbnail Title When submitted Transcoding progress
diff --git a/mediagoblin/user_pages/routing.py b/mediagoblin/user_pages/routing.py index 1a1d4139..68cb0a3b 100644 --- a/mediagoblin/user_pages/routing.py +++ b/mediagoblin/user_pages/routing.py @@ -97,6 +97,11 @@ add_route('mediagoblin.user_pages.processing_panel', '/u//panel/', 'mediagoblin.user_pages.views:processing_panel') +add_route('mediagoblin.user_pages.processing_panel', + '/u//panel//', + 'mediagoblin.user_pages.views:processing_panel') + + # Stray edit routes add_route('mediagoblin.edit.edit_media', '/u//m//edit/', diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py index 0de63440..97f0bac1 100644 --- a/mediagoblin/user_pages/views.py +++ b/mediagoblin/user_pages/views.py @@ -653,11 +653,18 @@ def processing_panel(request): return redirect( request, 'mediagoblin.user_pages.user_home', user=user.username) - # Get media entries which are in-processing entries = (MediaEntry.query.filter_by(uploader=user.id) .order_by(MediaEntry.created.desc())) + try: + state = request.matchdict['state'] + # no exception was thrown, filter entries by state + entries = entries.filter_by(state=state) + except KeyError: + # show all entries + pass + # Render to response return render_to_response( request, From 75972f0afac1bec998302e1563929d69569f166f Mon Sep 17 00:00:00 2001 From: Boris Bobrov Date: Sun, 17 Aug 2014 00:43:21 +0300 Subject: [PATCH 09/12] some fixes to the panel looks --- .../mediagoblin/user_pages/processing_panel.html | 10 +++++++--- mediagoblin/user_pages/views.py | 11 +++++++++-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/user_pages/processing_panel.html b/mediagoblin/templates/mediagoblin/user_pages/processing_panel.html index 88eef827..96786937 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/processing_panel.html +++ b/mediagoblin/templates/mediagoblin/user_pages/processing_panel.html @@ -17,6 +17,8 @@ #} {% extends "mediagoblin/base.html" %} +{% from "mediagoblin/utils/pagination.html" import render_pagination %} + {% block title -%} {% trans %}Media processing panel{% endtrans %} — {{ super() }} {%- endblock %} @@ -42,12 +44,13 @@ Show:

{% if entries.count() %} + {{ render_pagination(request, pagination) }}
- + - - + + {% for media_entry in entries %} @@ -85,6 +88,7 @@ Show: {% endfor %}
ThumbnailThumbnail TitleWhen submittedTranscoding progressWhen submittedTranscoding progress
+ {{ render_pagination(request, pagination) }} {% else %}

{% trans %}You have not uploaded anything yet!{% endtrans %}

{% endif %} diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py index 97f0bac1..c4f86b29 100644 --- a/mediagoblin/user_pages/views.py +++ b/mediagoblin/user_pages/views.py @@ -637,8 +637,10 @@ def collection_atom_feed(request): return feed.get_response() +@active_user_from_url +@uses_pagination @require_active_login -def processing_panel(request): +def processing_panel(request, page, url_user): """ Show to the user what media is still in conversion/processing... and what failed, and why! @@ -665,12 +667,17 @@ def processing_panel(request): # show all entries pass + pagination = Pagination(page, entries) + pagination.per_page = 30 + entries_on_a_page = pagination() + # Render to response return render_to_response( request, 'mediagoblin/user_pages/processing_panel.html', {'user': user, - 'entries': entries}) + 'entries': entries_on_a_page, + 'pagination': pagination}) @allow_reporting @get_user_media_entry From a2608d6b59adc0377ad6eb6b30d596d0c9fa470c Mon Sep 17 00:00:00 2001 From: Boris Bobrov Date: Mon, 18 Aug 2014 03:07:02 +0300 Subject: [PATCH 10/12] changes to BaseProcessingFail arguments usage --- mediagoblin/processing/__init__.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mediagoblin/processing/__init__.py b/mediagoblin/processing/__init__.py index 112b9d35..663d1bb5 100644 --- a/mediagoblin/processing/__init__.py +++ b/mediagoblin/processing/__init__.py @@ -408,8 +408,11 @@ class BaseProcessingFail(Exception): return u"%s:%s" % ( self.__class__.__module__, self.__class__.__name__) - def __init__(self, **metadata): - self.metadata = metadata or {} + def __init__(self, message=None, **metadata): + if message is not None: + super(BaseProcessingFail, self).__init__(message) + metadata['message'] = message + self.metadata = metadata class BadMediaFail(BaseProcessingFail): """ From db6cc0c0613f324b062e2c396fec6f26c504e362 Mon Sep 17 00:00:00 2001 From: Boris Bobrov Date: Mon, 1 Feb 2016 00:35:42 +0100 Subject: [PATCH 11/12] Change `uploader` to `actor` Class User doesn't have field `uploader` any more, instead there `actor`. Fix several uses of `uploader` to `actor`. --- mediagoblin/plugins/processing_info/__init__.py | 6 +++--- mediagoblin/user_pages/views.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mediagoblin/plugins/processing_info/__init__.py b/mediagoblin/plugins/processing_info/__init__.py index f89378fe..e5ce0a1c 100644 --- a/mediagoblin/plugins/processing_info/__init__.py +++ b/mediagoblin/plugins/processing_info/__init__.py @@ -36,13 +36,13 @@ def make_stats(context): request = context['request'] user = request.user num_queued = MediaEntry.query.filter_by( - uploader=user.id, state=u'processing').count() + actor=user.id, state=u'processing').count() context['num_queued'] = num_queued num_failed = MediaEntry.query.filter_by( - uploader=user.id, state=u'failed').count() + actor=user.id, state=u'failed').count() context['num_failed'] = num_failed return context - + hooks = { 'setup': setup_plugin, diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py index c4f86b29..547048d6 100644 --- a/mediagoblin/user_pages/views.py +++ b/mediagoblin/user_pages/views.py @@ -656,7 +656,7 @@ def processing_panel(request, page, url_user): request, 'mediagoblin.user_pages.user_home', user=user.username) # Get media entries which are in-processing - entries = (MediaEntry.query.filter_by(uploader=user.id) + entries = (MediaEntry.query.filter_by(actor=user.id) .order_by(MediaEntry.created.desc())) try: From 41076dc96bbf273c5a04978e2046ea8738b1eee0 Mon Sep 17 00:00:00 2001 From: Boris Bobrov Date: Mon, 1 Feb 2016 01:43:36 +0100 Subject: [PATCH 12/12] Fix occurence of unicode() Fix unicode() -> six.text_type() --- mediagoblin/processing/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mediagoblin/processing/__init__.py b/mediagoblin/processing/__init__.py index 663d1bb5..29345227 100644 --- a/mediagoblin/processing/__init__.py +++ b/mediagoblin/processing/__init__.py @@ -330,7 +330,8 @@ def mark_entry_failed(entry_id, exc): atomic_update(mgg.database.MediaEntry, {'id': entry_id}, {u'state': u'failed', - u'fail_error': u'Unhandled exception: {0}'.format(unicode(exc)), + u'fail_error': u'Unhandled exception: {0}'.format( + six.text_type(exc)), u'fail_metadata': {}})