Page MenuHome

setup.py
No OneTemporary

File Metadata

Created
Wed, Nov 13, 3:59 AM

setup.py

"""Setting up projects for Attract.
This is intended to be used by the CLI and unittests only, not tested
for live/production situations.
"""
from __future__ import print_function, division
import logging
from bson import ObjectId
from eve.methods.put import put_internal
from flask import current_app
from . import EXTENSION_NAME
log = logging.getLogger(__name__)
def _get_project(project_url):
"""Find a project in the database, or SystemExit()s.
:param project_url: UUID of the project
:type: str
:return: the project
:rtype: dict
"""
projects_collection = current_app.data.driver.db['projects']
# Find the project in the database.
project = projects_collection.find_one({'url': project_url})
if not project:
raise RuntimeError('Project %s does not exist.' % project_url)
return project
def _update_project(project):
"""Updates a project in the database, or SystemExit()s.
:param project: the project data, should be the entire project document
:type: dict
:return: the project
:rtype: dict
"""
from pillar.api.utils import remove_private_keys
project_id = ObjectId(project['_id'])
project = remove_private_keys(project)
result, _, _, status_code = put_internal('projects', project, _id=project_id)
if status_code != 200:
raise RuntimeError("Can't update project %s, issues: %s", project_id, result)
def setup_for_attract(project_url, replace=False, svn_url=None):
"""Adds Attract node types to the project.
Use --replace to replace pre-existing Attract node types
(by default already existing Attract node types are skipped).
Returns the updated project.
"""
from .node_types import NODE_TYPES, shot
# Copy permissions from the project, then give everyone with PUT
# access also DELETE access.
project = _get_project(project_url)
permissions = {}
proj_perms = project['permissions']
for key in ('users', 'groups'):
perms = proj_perms[key]
singular = key.rstrip('s')
for perm in perms:
assert isinstance(perm, dict), 'perm should be dict, but is %r' % perm
id = perm[singular] # group or user ID.
if 'PUT' not in set(perm['methods']):
continue
permissions.setdefault(key, []).append(
{singular: id,
'methods': ['DELETE']}
)
# Make a copy of the node types when setting the permissions, as
# we don't want to mutate the global node type objects.
node_types = (dict(permissions=permissions, **nt) for nt in NODE_TYPES)
# Add the missing node types.
for node_type in node_types:
found = [nt for nt in project['node_types']
if nt['name'] == node_type['name']]
if found:
assert len(found) == 1, 'node type name should be unique (found %ix)' % len(found)
# TODO: validate that the node type contains all the properties Attract needs.
if replace:
log.info('Replacing existing node type %s', node_type['name'])
project['node_types'].remove(found[0])
else:
continue
project['node_types'].append(node_type)
# Set default extension properties. Be careful not to overwrite any properties that
# are already there.
eprops = project.setdefault('extension_props', {})
attract_props = eprops.setdefault(EXTENSION_NAME, {})
if svn_url:
log.info('Setting SVN URL to %s', svn_url)
attract_props['svn_url'] = svn_url
# Set up task types
task_types = attract_props.setdefault('task_types', {})
task_types.setdefault(shot.node_type_shot['name'], shot.task_types)
_update_project(project)
log.info('Project %s was updated for Attract.', project_url)
return project

Event Timeline