From 021871ec169df420e140d3d78c4b7c95f62b82da Mon Sep 17 00:00:00 2001 From: dandds Date: Mon, 17 Sep 2018 11:40:58 -0400 Subject: [PATCH] route, form, and domain methods for updating workspace name --- atst/domain/workspaces/workspaces.py | 18 +++++++++++++++++- atst/forms/workspace.py | 8 ++++++++ atst/routes/workspaces.py | 21 ++++++++++++++++++--- tests/domain/test_workspaces.py | 8 ++++---- tests/routes/test_workspaces.py | 16 ++++++++++++++++ 5 files changed, 63 insertions(+), 8 deletions(-) create mode 100644 atst/forms/workspace.py diff --git a/atst/domain/workspaces/workspaces.py b/atst/domain/workspaces/workspaces.py index 636e55ee..c4a130ae 100644 --- a/atst/domain/workspaces/workspaces.py +++ b/atst/domain/workspaces/workspaces.py @@ -27,7 +27,7 @@ class Workspaces(object): return ScopedWorkspace(user, workspace) @classmethod - def get_for_update(cls, user, workspace_id): + def get_for_update_projects(cls, user, workspace_id): workspace = WorkspacesQuery.get(workspace_id) Authorization.check_workspace_permission( user, workspace, Permissions.ADD_APPLICATION_IN_WORKSPACE, "add project" @@ -35,6 +35,15 @@ class Workspaces(object): return workspace + @classmethod + def get_for_update_information(cls, user, workspace_id): + workspace = WorkspacesQuery.get(workspace_id) + # Authorization.check_workspace_permission( + # user, workspace, TBD, "update workspace information" + # ) + + return workspace + @classmethod def get_by_request(cls, request): return WorkspacesQuery.get_by_request(request) @@ -98,3 +107,10 @@ class Workspaces(object): workspace_role = WorkspacesQuery.create_workspace_role(user, role, workspace) WorkspacesQuery.add_and_commit(workspace_role) return workspace_role + + @classmethod + def update(cls, workspace, new_data): + if "name" in new_data: + workspace.name = new_data["name"] + + WorkspacesQuery.add_and_commit(workspace) diff --git a/atst/forms/workspace.py b/atst/forms/workspace.py new file mode 100644 index 00000000..bab487d6 --- /dev/null +++ b/atst/forms/workspace.py @@ -0,0 +1,8 @@ +from wtforms.fields import StringField +from wtforms.validators import Length + +from .forms import ValidatedForm + + +class WorkspaceForm(ValidatedForm): + name = StringField("Workspace Name", validators=[Length(min=4, max=50)]) diff --git a/atst/routes/workspaces.py b/atst/routes/workspaces.py index d4465f32..6dd93085 100644 --- a/atst/routes/workspaces.py +++ b/atst/routes/workspaces.py @@ -17,6 +17,7 @@ from atst.domain.workspace_users import WorkspaceUsers from atst.forms.new_project import NewProjectForm from atst.forms.new_member import NewMemberForm from atst.forms.edit_member import EditMemberForm +from atst.forms.workspace import WorkspaceForm from atst.domain.authz import Authorization from atst.models.permissions import Permissions @@ -50,6 +51,20 @@ def workspaces(): return render_template("workspaces/index.html", page=5, workspaces=workspaces) +@bp.route("/workspaces//edit", methods=["POST"]) +def edit_workspace(workspace_id): + workspace = Workspaces.get_for_update_information(g.current_user, workspace_id) + form = WorkspaceForm(http_request.form) + if form.validate(): + Workspaces.update(workspace, form.data) + return redirect( + url_for("workspaces.workspace_projects", workspace_id=workspace.id) + ) + else: + # return render_template("workspaces/edit.html", form=form, workspace=workspace) + pass + + @bp.route("/workspaces//projects") def workspace_projects(workspace_id): workspace = Workspaces.get(g.current_user, workspace_id) @@ -98,7 +113,7 @@ def workspace_reports(workspace_id): @bp.route("/workspaces//projects/new") def new_project(workspace_id): - workspace = Workspaces.get_for_update(g.current_user, workspace_id) + workspace = Workspaces.get_for_update_projects(g.current_user, workspace_id) form = NewProjectForm() return render_template( "workspaces/projects/new.html", workspace=workspace, form=form @@ -107,7 +122,7 @@ def new_project(workspace_id): @bp.route("/workspaces//projects/new", methods=["POST"]) def create_project(workspace_id): - workspace = Workspaces.get_for_update(g.current_user, workspace_id) + workspace = Workspaces.get_for_update_projects(g.current_user, workspace_id) form = NewProjectForm(http_request.form) if form.validate(): @@ -130,7 +145,7 @@ def create_project(workspace_id): @bp.route("/workspaces//projects//edit") def edit_project(workspace_id, project_id): - workspace = Workspaces.get_for_update(g.current_user, workspace_id) + workspace = Workspaces.get_for_update_projects(g.current_user, workspace_id) project = Projects.get(g.current_user, workspace, project_id) form = NewProjectForm( name=project.name, diff --git a/tests/domain/test_workspaces.py b/tests/domain/test_workspaces.py index c64c34d5..e59bf337 100644 --- a/tests/domain/test_workspaces.py +++ b/tests/domain/test_workspaces.py @@ -63,16 +63,16 @@ def test_workspaces_get_ensures_user_is_in_workspace(workspace, workspace_owner) Workspaces.get(outside_user, workspace.id) -def test_get_for_update_allows_owner(workspace, workspace_owner): - Workspaces.get_for_update(workspace_owner, workspace.id) +def test_get_for_update_projects_allows_owner(workspace, workspace_owner): + Workspaces.get_for_update_projects(workspace_owner, workspace.id) -def test_get_for_update_blocks_developer(workspace): +def test_get_for_update_projects_blocks_developer(workspace): developer = UserFactory.create() WorkspaceUsers.add(developer, workspace.id, "developer") with pytest.raises(UnauthorizedError): - Workspaces.get_for_update(developer, workspace.id) + Workspaces.get_for_update_projects(developer, workspace.id) def test_can_create_workspace_user(workspace, workspace_owner): diff --git a/tests/routes/test_workspaces.py b/tests/routes/test_workspaces.py index 202a8127..fcab09d2 100644 --- a/tests/routes/test_workspaces.py +++ b/tests/routes/test_workspaces.py @@ -1,3 +1,5 @@ +from flask import url_for + from tests.factories import UserFactory, WorkspaceFactory from atst.domain.workspaces import Workspaces from atst.models.workspace_user import WorkspaceUser @@ -51,3 +53,17 @@ def test_user_without_permission_has_no_add_member_link(client, user_session): 'href="/workspaces/{}/members/new"'.format(workspace.id).encode() not in response.data ) + + +def test_update_workspace_name(client, user_session): + user = UserFactory.create() + workspace = WorkspaceFactory.create() + Workspaces._create_workspace_role(user, workspace, "admin") + user_session(user) + response = client.post( + url_for("workspaces.edit_workspace", workspace_id=workspace.id), + data={"name": "a cool new name"}, + follow_redirects=True, + ) + assert response.status_code == 200 + assert workspace.name == "a cool new name"