Files
attract/attract/shots_and_assets/routes_assets.py

99 lines
3.7 KiB
Python

import logging
import flask_login
from flask import Blueprint, render_template, request
import flask
import werkzeug.exceptions as wz_exceptions
import pillarsdk
import pillar.api.utils
from pillar.web.system_util import pillar_api
from attract.routes import attract_project_view
from attract.node_types.asset import node_type_asset, task_types
from attract import current_attract, ROLES_REQUIRED_TO_VIEW_ITEMS
from pillar.web.utils import get_file
from . import routes_common
perproject_blueprint = Blueprint('attract.assets.perproject', __name__,
url_prefix='/<project_url>/assets')
log = logging.getLogger(__name__)
@perproject_blueprint.route('/', endpoint='index')
@perproject_blueprint.route('/with-task/<task_id>', endpoint='with_task')
@attract_project_view(extension_props=True)
def for_project(project, attract_props, task_id=None, asset_id=None):
assets, tasks_for_assets, task_types_for_template = routes_common.for_project(
node_type_asset['name'],
task_types,
project, attract_props, task_id, asset_id)
return render_template('attract/assets/for_project.html',
assets=assets,
tasks_for_assets=tasks_for_assets,
task_types=task_types_for_template,
open_task_id=task_id,
open_asset_id=asset_id,
project=project,
attract_props=attract_props)
@perproject_blueprint.route('/<asset_id>')
@attract_project_view(extension_props=True)
def view_asset(project, attract_props, asset_id):
if not request.is_xhr:
return for_project(project, attract_props, asset_id=asset_id)
asset, node_type = routes_common.view_node(project, asset_id, node_type_asset['name'])
return render_template('attract/assets/view_asset_embed.html',
asset=asset,
project=project,
asset_node_type=node_type,
attract_props=attract_props,
can_edit='PUT' in asset.allowed_methods)
@perproject_blueprint.route('/<asset_id>', methods=['POST'])
@attract_project_view()
def save(project, asset_id):
log.info('Saving asset %s', asset_id)
log.debug('Form data: %s', request.form)
asset_dict = request.form.to_dict()
current_attract.shot_manager.edit_asset(asset_id, **asset_dict)
# Return the patched node in all its glory.
api = pillar_api()
asset = pillarsdk.Node.find(asset_id, api=api)
return pillar.api.utils.jsonify(asset.to_dict())
@perproject_blueprint.route('/create', methods=['POST'])
@attract_project_view()
def create_asset(project):
asset = current_attract.shot_manager.create_asset(project)
resp = flask.make_response()
resp.headers['Location'] = flask.url_for('.view_asset',
project_url=project['url'],
asset_id=asset['_id'])
resp.status_code = 201
return flask.make_response(flask.jsonify({'asset_id': asset['_id']}), 201)
@perproject_blueprint.route('/<asset_id>/activities')
@attract_project_view()
def activities(project, asset_id):
if not request.is_xhr:
return flask.redirect(flask.url_for('.view_asset',
project_url=project.url,
asset_id=asset_id))
acts = current_attract.activities_for_node(asset_id)
# NOTE: this uses the 'shots' template, because it has everything we ever wanted.
return flask.render_template('attract/shots/view_activities_embed.html',
activities=acts)