From d0bb5aa5988bbbf2679cd00139d0763f340ee680 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Wed, 12 Oct 2016 16:58:42 +0200 Subject: [PATCH] Added activity list on task view --- attract/tasks/__init__.py | 25 +++++++++++++++++++ attract/tasks/routes.py | 13 ++++++++++ .../attract/tasks/view_activities_embed.jade | 15 +++++++++++ .../attract/tasks/view_task_embed.jade | 24 +++++++++++++++++- 4 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 src/templates/attract/tasks/view_activities_embed.jade diff --git a/attract/tasks/__init__.py b/attract/tasks/__init__.py index 805b8f3..acc08f3 100644 --- a/attract/tasks/__init__.py +++ b/attract/tasks/__init__.py @@ -1,12 +1,14 @@ """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 @@ -127,6 +129,29 @@ 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/routes.py b/attract/tasks/routes.py index e1a214d..919847b 100644 --- a/attract/tasks/routes.py +++ b/attract/tasks/routes.py @@ -112,3 +112,16 @@ def create_task(project): resp.status_code = 201 return flask.make_response(flask.jsonify({'task_id': task['_id']}), 201) + + +@perproject_blueprint.route('//activities') +@attract_project_view() +def activities(project, task_id): + if not request.is_xhr: + return flask.redirect(flask.url_for('.view_task', + project_url=project.url, + task_id=task_id)) + + acts = current_attract.task_manager.activities_for_task(task_id) + return flask.render_template('attract/tasks/view_activities_embed.html', + activities=acts) diff --git a/src/templates/attract/tasks/view_activities_embed.jade b/src/templates/attract/tasks/view_activities_embed.jade new file mode 100644 index 0000000..6a9c547 --- /dev/null +++ b/src/templates/attract/tasks/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/tasks/view_task_embed.jade b/src/templates/attract/tasks/view_task_embed.jade index bb410b9..b774cff 100644 --- a/src/templates/attract/tasks/view_task_embed.jade +++ b/src/templates/attract/tasks/view_task_embed.jade @@ -102,12 +102,13 @@ | {% endif %} #item-view-feed - | Task updated {{ task._updated | pretty_date }} + #activities | {% if config.DEBUG %} pre. {{ task.to_dict() | pprint }} | {% endif %} + script. $("#assignees").select2(); @@ -116,3 +117,24 @@ 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.

'); + } + });