Show activities on shot page.

This commit is contained in:
2016-10-18 14:50:35 +02:00
parent 612571b4b2
commit 963430e6d9
9 changed files with 85 additions and 50 deletions

View File

@@ -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."""

View File

@@ -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('/<shot_id>/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)

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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('<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>');
}
});
}
$(function() {
$("a.shot-link[data-shot-id]").click(function(e) {
e.preventDefault();

View 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 }}:&nbsp;
| {{ 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 %}

View File

@@ -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

View File

@@ -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('<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>');
}
});
load_activities(url); // from 10_tasks.js