Added activity list on task view
This commit is contained in:
@@ -1,12 +1,14 @@
|
|||||||
"""Task management."""
|
"""Task management."""
|
||||||
|
|
||||||
import attr
|
import attr
|
||||||
|
import flask
|
||||||
import flask_login
|
import flask_login
|
||||||
|
|
||||||
import pillarsdk
|
import pillarsdk
|
||||||
from pillar import attrs_extra
|
from pillar import attrs_extra
|
||||||
from pillar.web.system_util import pillar_api
|
from pillar.web.system_util import pillar_api
|
||||||
|
|
||||||
|
from attract import subquery
|
||||||
from attract.node_types.task import node_type_task
|
from attract.node_types.task import node_type_task
|
||||||
|
|
||||||
|
|
||||||
@@ -127,6 +129,29 @@ class TaskManager(object):
|
|||||||
}}, api=api)
|
}}, api=api)
|
||||||
return tasks
|
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):
|
def setup_app(app):
|
||||||
from . import eve_hooks
|
from . import eve_hooks
|
||||||
|
@@ -112,3 +112,16 @@ def create_task(project):
|
|||||||
resp.status_code = 201
|
resp.status_code = 201
|
||||||
|
|
||||||
return flask.make_response(flask.jsonify({'task_id': task['_id']}), 201)
|
return flask.make_response(flask.jsonify({'task_id': task['_id']}), 201)
|
||||||
|
|
||||||
|
|
||||||
|
@perproject_blueprint.route('/<task_id>/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)
|
||||||
|
15
src/templates/attract/tasks/view_activities_embed.jade
Normal file
15
src/templates/attract/tasks/view_activities_embed.jade
Normal file
@@ -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 %}
|
@@ -102,12 +102,13 @@
|
|||||||
| {% endif %}
|
| {% endif %}
|
||||||
|
|
||||||
#item-view-feed
|
#item-view-feed
|
||||||
| Task updated {{ task._updated | pretty_date }}
|
#activities
|
||||||
| {% if config.DEBUG %}
|
| {% if config.DEBUG %}
|
||||||
pre.
|
pre.
|
||||||
{{ task.to_dict() | pprint }}
|
{{ task.to_dict() | pprint }}
|
||||||
| {% endif %}
|
| {% endif %}
|
||||||
|
|
||||||
|
|
||||||
script.
|
script.
|
||||||
$("#assignees").select2();
|
$("#assignees").select2();
|
||||||
|
|
||||||
@@ -116,3 +117,24 @@ script.
|
|||||||
}
|
}
|
||||||
|
|
||||||
new Clipboard('.copy-to-clipboard');
|
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('<p class="text-danger">Opening activity log failed. There possibly was ' +
|
||||||
|
'an error connecting to the server. Please check your network connection and ' +
|
||||||
|
'try again.</p>');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Reference in New Issue
Block a user