Page Menu
Home
Search
Configure Global Search
Log In
Files
F14207933
setup.py
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Size
3 KB
Subscribers
None
setup.py
View Options
"""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
%i
x)'
%
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
File Metadata
Details
Attached
Mime Type
text/x-python
Expires
Tue, Jan 31, 5:00 AM (2 d)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
72/38/0583481aa8aa8eaed85e9b2b1b07
Attached To
rA Attract
Event Timeline
Log In to Comment