From d95004e62e0e35809165a5c421b0ae5ecab3e57e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Wed, 6 Jul 2016 15:19:28 +0200 Subject: [PATCH] Node 'user' property now defaults to the current user ID. --- pillar/application/modules/nodes.py | 5 ++- pillar/settings.py | 1 - tests/test_nodes.py | 49 +++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 2 deletions(-) diff --git a/pillar/application/modules/nodes.py b/pillar/application/modules/nodes.py index 4849140b..8741256f 100644 --- a/pillar/application/modules/nodes.py +++ b/pillar/application/modules/nodes.py @@ -1,7 +1,7 @@ import logging from bson import ObjectId -from flask import current_app +from flask import current_app, g from werkzeug.exceptions import UnprocessableEntity from application.modules import file_storage @@ -116,6 +116,9 @@ def before_inserting_nodes(items): if project: item['project'] = project['_id'] + # Default the 'user' property to the current user. + item.setdefault('user', g.current_user['user_id']) + def after_inserting_nodes(items): for item in items: diff --git a/pillar/settings.py b/pillar/settings.py index 5bcad025..44c9bd2a 100644 --- a/pillar/settings.py +++ b/pillar/settings.py @@ -304,7 +304,6 @@ nodes_schema = { }, 'user': { 'type': 'objectid', - 'required': True, 'data_relation': { 'resource': 'users', 'field': '_id', diff --git a/tests/test_nodes.py b/tests/test_nodes.py index 2fb48503..00ebde5c 100644 --- a/tests/test_nodes.py +++ b/tests/test_nodes.py @@ -183,3 +183,52 @@ class NodeContentTypeTest(AbstractPillarTest): }, 'name': 'Texture node'}, file_id_image_bump) + + +class NodeOwnerTest(AbstractPillarTest): + def setUp(self, **kwargs): + AbstractPillarTest.setUp(self, **kwargs) + + self.user_id = self.create_user() + self.create_valid_auth_token(self.user_id, 'token') + self.project_id, _ = self.ensure_project_exists( + project_overrides={'permissions': { + 'users': [ + {'user': self.user_id, + 'methods': ['GET', 'PUT', 'POST', 'DELETE']} + ] + }} + ) + + def test_create_with_explicit_owner(self): + test_node = { + 'project': self.project_id, + 'node_type': 'asset', + 'name': 'test with user', + 'user': self.user_id, + 'properties': {}, + } + self._test_user(test_node) + + def test_create_with_implicit_owner(self): + test_node = { + 'project': self.project_id, + 'node_type': 'asset', + 'name': 'test with user', + 'properties': {}, + } + self._test_user(test_node) + + def _test_user(self, test_node): + from application.utils import dumps + + resp = self.client.post('/nodes', data=dumps(test_node), + headers={'Authorization': self.make_header('token'), + 'Content-Type': 'application/json'}) + self.assertEqual(201, resp.status_code, resp.data) + created = json.loads(resp.data) + resp = self.client.get('/nodes/%s' % created['_id'], + headers={'Authorization': self.make_header('token')}) + self.assertEqual(200, resp.status_code, resp.data) + json_node = json.loads(resp.data) + self.assertEqual(str(self.user_id), json_node['user'])