From 963430e6d916c18d17d98960ea0f877cd0691f78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Tue, 18 Oct 2016 14:50:35 +0200 Subject: [PATCH] Show activities on shot page. --- attract/__init__.py | 30 +++++++++++++++++-- attract/shots/routes.py | 13 ++++++++ attract/tasks/__init__.py | 25 ---------------- attract/tasks/eve_hooks.py | 2 -- attract/tasks/routes.py | 2 +- src/scripts/tutti/10_tasks.js | 23 ++++++++++++++ .../attract/shots/view_activities_embed.jade | 15 ++++++++++ .../attract/shots/view_shot_embed.jade | 5 +++- .../attract/tasks/view_task_embed.jade | 20 +------------ 9 files changed, 85 insertions(+), 50 deletions(-) create mode 100644 src/templates/attract/shots/view_activities_embed.jade diff --git a/attract/__init__.py b/attract/__init__.py index 2bab4fe..ddb029b 100644 --- a/attract/__init__.py +++ b/attract/__init__.py @@ -1,10 +1,11 @@ import logging -import attract.shots import flask -import flask_login from werkzeug.local import LocalProxy from pillar.extension import PillarExtension +from pillar.web.system_util import pillar_api + +import pillarsdk import attract.tasks import attract.shots @@ -158,6 +159,31 @@ class AttractExtension(PillarExtension): # return flask.render_template('attract/sidebar.html', # project=project) + def activities_for_node(self, node_id, max_results=20, page=1): + """Returns a page of activities for the given task or shot. + + :returns: {'_items': [task, task, ...], '_meta': {Eve metadata}} + """ + + from . import subquery + + api = pillar_api() + activities = pillarsdk.Activity.all({ + 'where': { + 'object_type': 'node', + 'object': node_id, + }, + 'sort': [('_created', -1)], + 'max_results': max_results, + 'page': page, + }, api=api) + + # Fetch more info for each activity. + for act in activities['_items']: + act.actor_user = subquery.get_user_info(act.actor_user) + + return activities + def _get_current_attract(): """Returns the Attract extension of the current application.""" diff --git a/attract/shots/routes.py b/attract/shots/routes.py index b30de85..cfa4260 100644 --- a/attract/shots/routes.py +++ b/attract/shots/routes.py @@ -102,3 +102,16 @@ def create_shot(project): shot_id=shot['_id']) resp.status_code = 201 return flask.make_response(flask.jsonify({'shot_id': shot['_id']}), 201) + + +@perproject_blueprint.route('//activities') +@attract_project_view() +def activities(project, shot_id): + if not request.is_xhr: + return flask.redirect(flask.url_for('.view_shot', + project_url=project.url, + shot_id=shot_id)) + + acts = current_attract.activities_for_node(shot_id) + return flask.render_template('attract/shots/view_activities_embed.html', + activities=acts) diff --git a/attract/tasks/__init__.py b/attract/tasks/__init__.py index 767e915..f298fd2 100644 --- a/attract/tasks/__init__.py +++ b/attract/tasks/__init__.py @@ -1,14 +1,12 @@ """Task management.""" import attr -import flask import flask_login import pillarsdk from pillar import attrs_extra from pillar.web.system_util import pillar_api -from attract import subquery from attract.node_types.task import node_type_task @@ -128,29 +126,6 @@ class TaskManager(object): }}, api=api) return tasks - def activities_for_task(self, task_id, max_results=20, page=1): - """Returns a page of activities for the given task. - - :returns: {'_items': [task, task, ...], '_meta': {Eve metadata}} - """ - - api = pillar_api() - activities = pillarsdk.Activity.all({ - 'where': { - 'object_type': 'node', - 'object': task_id, - }, - 'sort': [('_created', -1)], - 'max_results': max_results, - 'page': page, - }, api=api) - - # Fetch more info for each activity. - for act in activities['_items']: - act.actor_user = subquery.get_user_info(act.actor_user) - - return activities - def setup_app(app): from . import eve_hooks diff --git a/attract/tasks/eve_hooks.py b/attract/tasks/eve_hooks.py index 30d2a81..8f90f22 100644 --- a/attract/tasks/eve_hooks.py +++ b/attract/tasks/eve_hooks.py @@ -93,8 +93,6 @@ def _parent_name(task): def register_task_activity(task, descr): user_id = pillar.api.utils.authentication.current_user_id() if not user_id: - import flask - log.error('Unable to register task activity %r for task %s: user_id=%s', descr, task['_id'], user_id) return diff --git a/attract/tasks/routes.py b/attract/tasks/routes.py index 919847b..3893aff 100644 --- a/attract/tasks/routes.py +++ b/attract/tasks/routes.py @@ -122,6 +122,6 @@ def activities(project, task_id): project_url=project.url, task_id=task_id)) - acts = current_attract.task_manager.activities_for_task(task_id) + acts = current_attract.activities_for_node(task_id) return flask.render_template('attract/tasks/view_activities_embed.html', activities=acts) diff --git a/src/scripts/tutti/10_tasks.js b/src/scripts/tutti/10_tasks.js index b098256..99890ae 100644 --- a/src/scripts/tutti/10_tasks.js +++ b/src/scripts/tutti/10_tasks.js @@ -352,6 +352,29 @@ function task_delete(task_id, task_etag, task_delete_url) { }); } +function load_activities(url) +{ + $.get(url) + .done(function(data) { + if(console) console.log('Activities loaded OK'); + $('#activities').html(data); + }) + .fail(function(xhr) { + if (console) { + console.log('Error fetching activities'); + console.log('XHR:', xhr); + } + $('#status-bar').text('Opening activity log failed.'); + if (xhr.status) { + $('#activities').html(xhr.responseText); + } else { + $('#activities').html('

Opening activity log failed. There possibly was ' + + 'an error connecting to the server. Please check your network connection and ' + + 'try again.

'); + } + }); +} + $(function() { $("a.shot-link[data-shot-id]").click(function(e) { e.preventDefault(); diff --git a/src/templates/attract/shots/view_activities_embed.jade b/src/templates/attract/shots/view_activities_embed.jade new file mode 100644 index 0000000..6a9c547 --- /dev/null +++ b/src/templates/attract/shots/view_activities_embed.jade @@ -0,0 +1,15 @@ +.d-activity + | {% if activities['_meta']['total'] %} + h3 Activity + + ul + | {% for act in activities['_items'] %} + li + span.date {{ act._created | pretty_date_time }}:  + | {{ act['actor_user']['full_name'] }} {{ act.verb }} + | {% endfor %} + | {% else %} + p. + No activity detected, which is strange, as we also consider creation + to be an activity. + | {% endif %} diff --git a/src/templates/attract/shots/view_shot_embed.jade b/src/templates/attract/shots/view_shot_embed.jade index 00475e9..1b14035 100644 --- a/src/templates/attract/shots/view_shot_embed.jade +++ b/src/templates/attract/shots/view_shot_embed.jade @@ -55,7 +55,10 @@ | {{ shot.properties.trim_start_in_frames }} frames #item-view-feed - | Activity feed here. + #activities script. new Clipboard('.copy-to-clipboard'); + + var url = "{{ url_for('.activities', project_url=project.url, shot_id=shot['_id']) }}"; + load_activities(url); // from 10_tasks.js diff --git a/src/templates/attract/tasks/view_task_embed.jade b/src/templates/attract/tasks/view_task_embed.jade index 9897f57..5717eca 100644 --- a/src/templates/attract/tasks/view_task_embed.jade +++ b/src/templates/attract/tasks/view_task_embed.jade @@ -119,22 +119,4 @@ script. new Clipboard('.copy-to-clipboard'); var url = "{{ url_for('.activities', project_url=project.url, task_id=task['_id']) }}"; - $.get(url) - .done(function(data) { - if(console) console.log('Activities for task loaded OK'); - $('#activities').html(data); - }) - .fail(function(xhr) { - if (console) { - console.log('Error fetching activities'); - console.log('XHR:', xhr); - } - $('#status-bar').text('Opening task activity log failed.'); - if (xhr.status) { - $('#activities').html(xhr.responseText); - } else { - $('#activities').html('

Opening activity log failed. There possibly was ' + - 'an error connecting to the server. Please check your network connection and ' + - 'try again.

'); - } - }); + load_activities(url); // from 10_tasks.js