Skip to content

Commit 48d8102

Browse files
authored
Fix "Save as template" (#1493)
* exportGroup -> exportDAG * USERs can create templates * accessRights modified by the frontent are overridable
1 parent 618c5f3 commit 48d8102

File tree

7 files changed

+100
-20
lines changed

7 files changed

+100
-20
lines changed

services/web/client/source/class/osparc/component/export/ExportDAG.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ qx.Class.define("osparc.component.export.ExportDAG", {
105105
flex: 1
106106
});
107107

108-
// const shareWith = new osparc.component.export.ShareWith("exportGroup");
108+
// const shareWith = new osparc.component.export.ShareWith("exportDAG");
109109
// this._add(shareWith);
110110

111111
const exportBtn = this.__getExportBtn();

services/web/client/source/class/osparc/component/widget/NodesTree.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ qx.Class.define("osparc.component.widget.NodesTree", {
102102
enabled: false
103103
});
104104
exportButton.addListener("execute", () => {
105-
this.__exportGroup();
105+
this.__exportDAG();
106106
}, this);
107107
osparc.utils.Utils.setIdToWidget(exportButton, "exportServicesBtn");
108108
toolbar.add(exportButton);
@@ -239,7 +239,7 @@ qx.Class.define("osparc.component.widget.NodesTree", {
239239
this.fireEvent("addNode");
240240
},
241241

242-
__exportGroup: function() {
242+
__exportDAG: function() {
243243
const selectedItem = this.__getSelection();
244244
if (selectedItem) {
245245
if (selectedItem.getIsContainer()) {

services/web/client/source/class/osparc/data/Permissions.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,9 @@ qx.Class.define("osparc.data.Permissions", {
134134
"user": [
135135
"studies.user.read",
136136
"studies.user.create",
137+
"studies.template.create",
138+
"studies.template.update",
139+
"studies.template.delete",
137140
"storage.datcore.read",
138141
"preferences.user.update",
139142
"preferences.apikey.create",
@@ -155,9 +158,6 @@ qx.Class.define("osparc.data.Permissions", {
155158
"study.tag"
156159
],
157160
"tester": [
158-
"studies.template.create",
159-
"studies.template.update",
160-
"studies.template.delete",
161161
"services.all.read",
162162
"preferences.role.update",
163163
"study.nodestree.uuid.read",

services/web/client/source/class/osparc/desktop/StudyEditor.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ qx.Class.define("osparc.desktop.StudyEditor", {
195195
}
196196
const node = this.getStudy().getWorkbench().getNode(nodeId);
197197
if (node && node.isContainer()) {
198-
const exportGroupView = new osparc.component.export.ExportGroup(node);
198+
const exportDAGView = new osparc.component.export.ExportDAG(node);
199199
const window = new qx.ui.window.Window(this.tr("Export: ") + node.getLabel()).set({
200200
appearance: "service-window",
201201
layout: new qx.ui.layout.Grow(),
@@ -206,15 +206,15 @@ qx.Class.define("osparc.desktop.StudyEditor", {
206206
showMinimize: false,
207207
modal: true
208208
});
209-
window.add(exportGroupView);
209+
window.add(exportDAGView);
210210
window.center();
211211
window.open();
212212

213213
window.addListener("close", () => {
214-
exportGroupView.tearDown();
214+
exportDAGView.tearDown();
215215
}, this);
216216

217-
exportGroupView.addListener("finished", () => {
217+
exportDAGView.addListener("finished", () => {
218218
window.close();
219219
}, this);
220220
}

services/web/server/src/simcore_service_webserver/projects/projects_handlers.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from .projects_db import APP_PROJECT_DBAPI
1818
from .projects_exceptions import ProjectInvalidRightsError, ProjectNotFoundError
1919

20-
OVERRIDABLE_DOCUMENT_KEYS = ["name", "description", "thumbnail", "prjOwner"]
20+
OVERRIDABLE_DOCUMENT_KEYS = ["name", "description", "thumbnail", "prjOwner", "accessRights"]
2121
# TODO: validate these against api/specs/webserver/v0/components/schemas/project-v0.0.1.json
2222

2323
log = logging.getLogger(__name__)

services/web/server/src/simcore_service_webserver/security_roles.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
"project.create", # "studies.user.create",
4848
"project.close",
4949
"project.delete", # "study.node.create",
50+
"project.template.create",
5051
# "study.node.delete",
5152
# "study.node.rename",
5253
# "study.edge.create",
@@ -67,7 +68,9 @@
6768
],
6869
"inherits": [UserRole.GUEST, UserRole.ANONYMOUS],
6970
},
70-
UserRole.TESTER: {"can": ["project.template.create",], "inherits": [UserRole.USER]},
71+
UserRole.TESTER: {
72+
"can": [],
73+
"inherits": [UserRole.USER]},
7174
}
7275

7376
#

services/web/server/tests/unit/with_dbs/test_projects.py

+85-8
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ async def test_new_project(
283283
"creationDate": now_str(),
284284
"lastChangeDate": now_str(),
285285
"thumbnail": "",
286-
"accessRights": {},
286+
"accessRights": {"12": "some rights"},
287287
"workbench": {},
288288
"tags": [],
289289
}
@@ -297,7 +297,8 @@ async def test_new_project(
297297

298298
# updated fields
299299
assert default_project["uuid"] != new_project["uuid"]
300-
assert default_project["prjOwner"] != logged_user["name"]
300+
assert default_project["prjOwner"] != logged_user["email"]
301+
assert new_project["prjOwner"] == logged_user["email"]
301302
assert to_datetime(default_project["creationDate"]) < to_datetime(
302303
new_project["creationDate"]
303304
)
@@ -351,6 +352,7 @@ async def test_new_project_from_template(
351352
# different ownership
352353
assert project["prjOwner"] == logged_user["email"]
353354
assert project["prjOwner"] != template_project["prjOwner"]
355+
assert project["accessRights"] == template_project["accessRights"]
354356

355357
# different timestamps
356358
assert to_datetime(template_project["creationDate"]) < to_datetime(
@@ -403,6 +405,7 @@ async def test_new_project_from_template_with_body(
403405
"prjOwner": "",
404406
"creationDate": "2019-06-03T09:59:31.987Z",
405407
"lastChangeDate": "2019-06-03T09:59:31.987Z",
408+
"accessRights": {"123": "some new access rights"},
406409
"workbench": {},
407410
"tags": [],
408411
}
@@ -423,6 +426,9 @@ async def test_new_project_from_template_with_body(
423426
# different ownership
424427
assert project["prjOwner"] == logged_user["email"]
425428
assert project["prjOwner"] != template_project["prjOwner"]
429+
# different access rights
430+
assert project["accessRights"] != template_project["accessRights"]
431+
assert project["accessRights"] == predefined["accessRights"]
426432

427433
# different timestamps
428434
assert to_datetime(template_project["creationDate"]) < to_datetime(
@@ -448,7 +454,7 @@ async def test_new_project_from_template_with_body(
448454
[
449455
(UserRole.ANONYMOUS, web.HTTPUnauthorized),
450456
(UserRole.GUEST, web.HTTPForbidden),
451-
(UserRole.USER, web.HTTPForbidden),
457+
(UserRole.USER, web.HTTPCreated),
452458
(UserRole.TESTER, web.HTTPCreated),
453459
],
454460
)
@@ -480,12 +486,83 @@ async def test_new_template_from_project(
480486
assert len(templates) == 1
481487
assert templates[0] == template_project
482488

483-
# identical in all fields except UUIDs?
484-
# api/specs/webserver/v0/components/schemas/project-v0.0.1.json
485-
# assert_replaced(user_project, template_project)
489+
assert template_project["name"] == user_project["name"]
490+
assert template_project["description"] == user_project["description"]
491+
assert template_project["prjOwner"] == logged_user["email"]
492+
assert template_project["accessRights"] == user_project["accessRights"]
493+
494+
# different timestamps
495+
assert to_datetime(user_project["creationDate"]) < to_datetime(
496+
template_project["creationDate"]
497+
)
498+
assert to_datetime(user_project["lastChangeDate"]) < to_datetime(
499+
template_project["lastChangeDate"]
500+
)
501+
502+
# different uuids for project and nodes!?
503+
assert template_project["uuid"] != user_project["uuid"]
504+
505+
# check uuid replacement
506+
for node_name in template_project["workbench"]:
507+
try:
508+
uuidlib.UUID(node_name)
509+
except ValueError:
510+
pytest.fail("Invalid uuid in workbench node {}".format(node_name))
511+
512+
# do the same with a body
513+
predefined = {
514+
"uuid": "",
515+
"name": "My super duper new template",
516+
"description": "Some lines from user",
517+
"thumbnail": "",
518+
"prjOwner": "",
519+
"creationDate": "2019-06-03T09:59:31.987Z",
520+
"lastChangeDate": "2019-06-03T09:59:31.987Z",
521+
"workbench": {},
522+
"accessRights": {"12": "rwx"},
523+
"tags": [],
524+
}
525+
526+
resp = await client.post(url, json=predefined)
527+
data, error = await assert_status(resp, expected)
528+
529+
if not error:
530+
template_project = data
531+
# uses predefined
532+
assert template_project["name"] == predefined["name"]
533+
assert template_project["description"] == predefined["description"]
534+
assert template_project["prjOwner"] == logged_user["email"]
535+
assert template_project["accessRights"] == predefined["accessRights"]
536+
537+
modified = [
538+
"prjOwner",
539+
"creationDate",
540+
"lastChangeDate",
541+
"uuid",
542+
"accessRights",
543+
]
544+
545+
# different ownership
546+
assert template_project["prjOwner"] == logged_user["email"]
547+
assert template_project["prjOwner"] == user_project["prjOwner"]
486548

487-
# TODO: workbench nodes should not have progress??
488-
# TODO: check in detail all fields in a node
549+
# different timestamps
550+
assert to_datetime(user_project["creationDate"]) < to_datetime(
551+
template_project["creationDate"]
552+
)
553+
assert to_datetime(user_project["lastChangeDate"]) < to_datetime(
554+
template_project["lastChangeDate"]
555+
)
556+
557+
# different uuids for project and nodes!?
558+
assert template_project["uuid"] != user_project["uuid"]
559+
560+
# check uuid replacement
561+
for node_name in template_project["workbench"]:
562+
try:
563+
uuidlib.UUID(node_name)
564+
except ValueError:
565+
pytest.fail("Invalid uuid in workbench node {}".format(node_name))
489566

490567

491568
# PUT --------

0 commit comments

Comments
 (0)