Show activities on shot page.
This commit is contained in:
@@ -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."""
|
||||
|
@@ -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)
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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)
|
||||
|
@@ -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();
|
||||
|
15
src/templates/attract/shots/view_activities_embed.jade
Normal file
15
src/templates/attract/shots/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 %}
|
@@ -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
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user