Show activities on shot page.
This commit is contained in:
@@ -1,10 +1,11 @@
|
|||||||
import logging
|
import logging
|
||||||
|
|
||||||
import attract.shots
|
|
||||||
import flask
|
import flask
|
||||||
import flask_login
|
|
||||||
from werkzeug.local import LocalProxy
|
from werkzeug.local import LocalProxy
|
||||||
from pillar.extension import PillarExtension
|
from pillar.extension import PillarExtension
|
||||||
|
from pillar.web.system_util import pillar_api
|
||||||
|
|
||||||
|
import pillarsdk
|
||||||
|
|
||||||
import attract.tasks
|
import attract.tasks
|
||||||
import attract.shots
|
import attract.shots
|
||||||
@@ -158,6 +159,31 @@ class AttractExtension(PillarExtension):
|
|||||||
# return flask.render_template('attract/sidebar.html',
|
# return flask.render_template('attract/sidebar.html',
|
||||||
# project=project)
|
# 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():
|
def _get_current_attract():
|
||||||
"""Returns the Attract extension of the current application."""
|
"""Returns the Attract extension of the current application."""
|
||||||
|
@@ -102,3 +102,16 @@ def create_shot(project):
|
|||||||
shot_id=shot['_id'])
|
shot_id=shot['_id'])
|
||||||
resp.status_code = 201
|
resp.status_code = 201
|
||||||
return flask.make_response(flask.jsonify({'shot_id': shot['_id']}), 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."""
|
"""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
|
||||||
|
|
||||||
|
|
||||||
@@ -128,29 +126,6 @@ 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
|
||||||
|
@@ -93,8 +93,6 @@ def _parent_name(task):
|
|||||||
def register_task_activity(task, descr):
|
def register_task_activity(task, descr):
|
||||||
user_id = pillar.api.utils.authentication.current_user_id()
|
user_id = pillar.api.utils.authentication.current_user_id()
|
||||||
if not user_id:
|
if not user_id:
|
||||||
import flask
|
|
||||||
|
|
||||||
log.error('Unable to register task activity %r for task %s: user_id=%s',
|
log.error('Unable to register task activity %r for task %s: user_id=%s',
|
||||||
descr, task['_id'], user_id)
|
descr, task['_id'], user_id)
|
||||||
return
|
return
|
||||||
|
@@ -122,6 +122,6 @@ def activities(project, task_id):
|
|||||||
project_url=project.url,
|
project_url=project.url,
|
||||||
task_id=task_id))
|
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',
|
return flask.render_template('attract/tasks/view_activities_embed.html',
|
||||||
activities=acts)
|
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() {
|
$(function() {
|
||||||
$("a.shot-link[data-shot-id]").click(function(e) {
|
$("a.shot-link[data-shot-id]").click(function(e) {
|
||||||
e.preventDefault();
|
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
|
| {{ shot.properties.trim_start_in_frames }} frames
|
||||||
|
|
||||||
#item-view-feed
|
#item-view-feed
|
||||||
| Activity feed here.
|
#activities
|
||||||
|
|
||||||
script.
|
script.
|
||||||
new Clipboard('.copy-to-clipboard');
|
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');
|
new Clipboard('.copy-to-clipboard');
|
||||||
|
|
||||||
var url = "{{ url_for('.activities', project_url=project.url, task_id=task['_id']) }}";
|
var url = "{{ url_for('.activities', project_url=project.url, task_id=task['_id']) }}";
|
||||||
$.get(url)
|
load_activities(url); // from 10_tasks.js
|
||||||
.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