From 1a7e9e55f2be5b5239244b1e79db2fce6e6a7f0b Mon Sep 17 00:00:00 2001 From: Youri K Date: Mon, 9 Jul 2018 15:24:34 +0200 Subject: [PATCH 1/8] add displayname to organization #2833 --- app/controllers/InitialDataController.scala | 2 +- app/controllers/OrganizationController.scala | 2 +- app/models/team/Organization.scala | 11 ++++++++--- conf/evolutions/015-add-organization-displayname.sql | 8 ++++++++ .../reversions/003-add-organization-displayname.sql | 5 +++++ tools/postgres/schema.sql | 1 + 6 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 conf/evolutions/015-add-organization-displayname.sql create mode 100644 conf/evolutions/reversions/003-add-organization-displayname.sql diff --git a/app/controllers/InitialDataController.scala b/app/controllers/InitialDataController.scala index 69bbc97e1ae..f5c47f4e897 100644 --- a/app/controllers/InitialDataController.scala +++ b/app/controllers/InitialDataController.scala @@ -42,7 +42,7 @@ Sampletown Samplecountry """ val organizationTeamId = BSONObjectID.generate - val defaultOrganization = Organization("/assets/images/mpi-logos.svg", additionalInformation, "Connectomics department", List(), organizationTeamId) + val defaultOrganization = Organization("MPI for Brain Research", "/assets/images/mpi-logos.svg", additionalInformation, "Connectomics department", List(), organizationTeamId) val organizationTeam = Team(defaultOrganization.name, defaultOrganization.name, organizationTeamId) val organizationTeamSQL = TeamSQL(ObjectId.fromBsonId(organizationTeamId), ObjectId.fromBsonId(defaultOrganization._id), defaultOrganization.name, isOrganizationTeam = true) diff --git a/app/controllers/OrganizationController.scala b/app/controllers/OrganizationController.scala index 7bb7baa1ca3..a2fc5648a2a 100755 --- a/app/controllers/OrganizationController.scala +++ b/app/controllers/OrganizationController.scala @@ -17,7 +17,7 @@ class OrganizationController @Inject()(val messagesApi: MessagesApi) extends Con for { allOrgs <- OrganizationDAO.findAll(GlobalAccessContext) } yield { - Ok(Json.toJson(allOrgs.map(org => Json.obj("id" -> org.id, "name" -> org.name, "additionalInformation" -> org.additionalInformation)))) + Ok(Json.toJson(allOrgs.map(org => Json.obj("id" -> org.id, "name" -> org.name, "additionalInformation" -> org.additionalInformation, "displayname" -> org.displayName)))) } } diff --git a/app/models/team/Organization.scala b/app/models/team/Organization.scala index 46c6b37d872..c2f7ae58341 100755 --- a/app/models/team/Organization.scala +++ b/app/models/team/Organization.scala @@ -23,6 +23,7 @@ case class OrganizationSQL( name: String, additionalInformation: String, logoUrl: String, + displayName: String, created: Long = System.currentTimeMillis(), isDeleted: Boolean = false ) @@ -35,7 +36,8 @@ object OrganizationSQL { ObjectId.fromBsonId(o._id), o.name, o.additionalInformation, - o.logoUrl + o.logoUrl, + o.displayName ) ) } @@ -56,6 +58,7 @@ object OrganizationSQLDAO extends SQLDAO[OrganizationSQL, OrganizationsRow, Orga r.name, r.additionalinformation, r.logourl, + r.displayname, r.created.getTime, r.isdeleted) ) @@ -77,8 +80,8 @@ object OrganizationSQLDAO extends SQLDAO[OrganizationSQL, OrganizationsRow, Orga for { r <- run( - sqlu"""insert into webknossos.organizations(_id, name, additionalInformation, logoUrl, created, isDeleted) - values(${o._id.id}, ${o.name}, ${o.additionalInformation}, ${o.logoUrl}, ${new java.sql.Timestamp(o.created)}, ${o.isDeleted}) + sqlu"""insert into webknossos.organizations(_id, name, additionalInformation, logoUrl, displayName, created, isDeleted) + values(${o._id.id}, ${o.name}, ${o.additionalInformation}, ${o.logoUrl}, ${o.displayName}, ${new java.sql.Timestamp(o.created)}, ${o.isDeleted}) """) } yield () @@ -92,6 +95,7 @@ object OrganizationSQLDAO extends SQLDAO[OrganizationSQL, OrganizationsRow, Orga case class Organization( + displayName: String, logoUrl: String, additionalInformation: String, name: String, @@ -116,6 +120,7 @@ object Organization extends FoxImplicits { teamBsonIds <- Fox.combined(teams.map(_._id.toBSONObjectId.toFox)) } yield { Organization( + o.displayName, o.logoUrl, o.additionalInformation, o.name, diff --git a/conf/evolutions/015-add-organization-displayname.sql b/conf/evolutions/015-add-organization-displayname.sql new file mode 100644 index 00000000000..b9238abdf8f --- /dev/null +++ b/conf/evolutions/015-add-organization-displayname.sql @@ -0,0 +1,8 @@ +-- https://github.com/scalableminds/webknossos/pull/ TODO pr number + +START TRANSACTION; +DROP VIEW webknossos.organizations_; +ALTER TABLE webknossos.organizations ADD COLUMN displayName VARCHAR(1024) NOT NULL DEFAULT ''; +CREATE VIEW webknossos.organizations_ AS SELECT * FROM webknossos.organizations WHERE NOT isDeleted; +UPDATE webknossos.organizations SET displayName = name; +COMMIT TRANSACTION; diff --git a/conf/evolutions/reversions/003-add-organization-displayname.sql b/conf/evolutions/reversions/003-add-organization-displayname.sql new file mode 100644 index 00000000000..1666b5fb6b2 --- /dev/null +++ b/conf/evolutions/reversions/003-add-organization-displayname.sql @@ -0,0 +1,5 @@ +START TRANSACTION; +DROP VIEW webknossos.organizations_; +ALTER TABLE webknossos.organizations DROP COLUMN displayName; +CREATE VIEW webknossos.organizations_ AS SELECT * FROM webknossos.organizations WHERE NOT isDeleted; +COMMIT TRANSACTION; diff --git a/tools/postgres/schema.sql b/tools/postgres/schema.sql index 3e77252f7c6..07f42ce1b5e 100644 --- a/tools/postgres/schema.sql +++ b/tools/postgres/schema.sql @@ -187,6 +187,7 @@ CREATE TABLE webknossos.organizations( name VARCHAR(256) NOT NULL, additionalInformation VARCHAR(2048) NOT NULL DEFAULT '', logoUrl VARCHAR(2048) NOT NULL DEFAULT '', + displayName VARCHAR(1024) NOT NULL DEFAULT '', created TIMESTAMPTZ NOT NULL DEFAULT NOW(), isDeleted BOOLEAN NOT NULL DEFAULT false ); From a2ef4e43d844544c02d5308eaaa8184c7bbca660 Mon Sep 17 00:00:00 2001 From: Youri K Date: Mon, 9 Jul 2018 15:35:15 +0200 Subject: [PATCH 2/8] use normalized name instead of displayName for folder creation #2859 --- app/controllers/Authentication.scala | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/app/controllers/Authentication.scala b/app/controllers/Authentication.scala index 8518f22b9cd..291678e8bd1 100755 --- a/app/controllers/Authentication.scala +++ b/app/controllers/Authentication.scala @@ -373,10 +373,12 @@ class Authentication @Inject()( val loginInfo = LoginInfo(CredentialsProvider.ID, email) var errors = List[String]() val firstName = normalizeName(signUpData.firstName).getOrElse { - errors ::= Messages("user.firstName.invalid"); "" + errors ::= Messages("user.firstName.invalid"); + "" } val lastName = normalizeName(signUpData.lastName).getOrElse { - errors ::= Messages("user.lastName.invalid"); "" + errors ::= Messages("user.lastName.invalid"); + "" } UserService.retrieve(loginInfo).toFox.futureBox.flatMap { case Full(_) => @@ -390,7 +392,7 @@ class Authentication @Inject()( organization <- createOrganization(signUpData.organization) ?~> Messages("organization.create.failed") user <- UserService.insert(organization.name, email, firstName, lastName, signUpData.password, isActive = true, teamRole = true, loginInfo, passwordHasher.hash(signUpData.password), isAdmin = true) - _ <- createOrganizationFolder(signUpData.organization, loginInfo) + _ <- createOrganizationFolder(organization.name, loginInfo) } yield Ok } case f: Failure => Fox.failure(f.msg) @@ -409,15 +411,16 @@ class Authentication @Inject()( Fox.sequenceOfFulls(List(noOrganizationPresent, configurationFlagSet, userIsSuperUser)).map(_.headOption).toFox } - private def createOrganization(organizationName: String) = { - val organization = OrganizationSQL(ObjectId.generate, organizationName, "", "") - val organizationTeam = TeamSQL(ObjectId.generate, organization._id, organization.name, isOrganizationTeam = true) + private def createOrganization(organizationDisplayName: String) = for { + organizationName <- normalizeName(organizationDisplayName).toFox ?~> "invalid organization name" + organization = OrganizationSQL(ObjectId.generate, organizationName.replaceAll(" ", "_"), "", "", organizationDisplayName) + organizationTeam = TeamSQL(ObjectId.generate, organization._id, organization.name, isOrganizationTeam = true) _ <- OrganizationSQLDAO.insertOne(organization)(GlobalAccessContext) _ <- TeamSQLDAO.insertOne(organizationTeam)(GlobalAccessContext) _ <- InitialDataService.insertLocalDataStoreIfEnabled } yield organization - } + private def createOrganizationFolder(organizationName: String, loginInfo: LoginInfo)(implicit request: RequestHeader) = { def sendRPCToDataStore(dataStore: DataStoreSQL, token: String) = { From 8e39fc25d8337f7af58055c8940cd69aea3cf083 Mon Sep 17 00:00:00 2001 From: Youri K Date: Mon, 9 Jul 2018 15:41:56 +0200 Subject: [PATCH 3/8] Update MIGRATIONS.md --- MIGRATIONS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/MIGRATIONS.md b/MIGRATIONS.md index 743fd25795f..baac39b9dad 100644 --- a/MIGRATIONS.md +++ b/MIGRATIONS.md @@ -8,6 +8,7 @@ User-facing changes are documented in the [changelog](CHANGELOG.md). ### Postgres Evolutions: - [013-add-logoUrl.sql](conf/evolutions/013-add-logoUrl.sql) - [014-equalize-schema-and-evolutions.sql](conf/evolutions/014-equalize-schema-and-evolutions.sql) +- [015-add-organization-displayname.sql](conf/evolutions/015-add-organization-displayname.sql) ## [18.07.0](https://github.com/scalableminds/webknossos/releases/tag/18.07.0) - 2018-07-05 First release From 63436295cf93b1b34a0fbf27fbb47bd6e5295d29 Mon Sep 17 00:00:00 2001 From: Youri K Date: Mon, 9 Jul 2018 15:43:07 +0200 Subject: [PATCH 4/8] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d5c9ae46863..01992216000 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ For upgrade instructions, please check the [migration guide](MIGRATIONS.md). - Added the shortcut to copy the currently hovered cell id (CTRL + I) to non-volume-tracings, too. [#2726](https://github.com/scalableminds/webknossos/pull/2726) - Added permission for team managers to refresh datasets. [#2688](https://github.com/scalableminds/webknossos/pull/2688) - Added backend-unit-test setup and a first test for NML validation. [#2829](https://github.com/scalableminds/webknossos/pull/2829) + - Added displayName for organizations [#2869](https://github.com/scalableminds/webknossos/pull/2869) ### Changed From be3b90d347eb9654dc71709a0ac59d47ce7dc038 Mon Sep 17 00:00:00 2001 From: Youri K Date: Mon, 9 Jul 2018 15:43:42 +0200 Subject: [PATCH 5/8] Update 015-add-organization-displayname.sql --- conf/evolutions/015-add-organization-displayname.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/evolutions/015-add-organization-displayname.sql b/conf/evolutions/015-add-organization-displayname.sql index b9238abdf8f..f64f9b66443 100644 --- a/conf/evolutions/015-add-organization-displayname.sql +++ b/conf/evolutions/015-add-organization-displayname.sql @@ -1,4 +1,4 @@ --- https://github.com/scalableminds/webknossos/pull/ TODO pr number +-- https://github.com/scalableminds/webknossos/pull/2869 START TRANSACTION; DROP VIEW webknossos.organizations_; From bedbb9a5d81ee69319345adcc55442636acb36bb Mon Sep 17 00:00:00 2001 From: Florian M Date: Mon, 9 Jul 2018 16:03:17 +0200 Subject: [PATCH 6/8] update test db + reverse evolution --- .../reversions/015-add-organization-displayname.sql | 5 +++++ test/db/organizations.csv | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 conf/evolutions/reversions/015-add-organization-displayname.sql diff --git a/conf/evolutions/reversions/015-add-organization-displayname.sql b/conf/evolutions/reversions/015-add-organization-displayname.sql new file mode 100644 index 00000000000..1666b5fb6b2 --- /dev/null +++ b/conf/evolutions/reversions/015-add-organization-displayname.sql @@ -0,0 +1,5 @@ +START TRANSACTION; +DROP VIEW webknossos.organizations_; +ALTER TABLE webknossos.organizations DROP COLUMN displayName; +CREATE VIEW webknossos.organizations_ AS SELECT * FROM webknossos.organizations WHERE NOT isDeleted; +COMMIT TRANSACTION; diff --git a/test/db/organizations.csv b/test/db/organizations.csv index e47d4b85d75..ec4ca315d43 100644 --- a/test/db/organizations.csv +++ b/test/db/organizations.csv @@ -1,3 +1,3 @@ -_id,name,additionalinformation,logoUrl,created,isdeleted -'5ab0c6a674d0af7b003b23ac','Organization_X','lorem ipsum','/assets/images/mpi-logos.svg','2018-03-20 09:30:31.91+01',f -'6bb0c6a674d0af7b003b23bd','Organization_Y','foo bar','/assets/images/mpi-logos.svg','2018-03-24 09:30:31.91+01',f +_id,name,additionalinformation,logoUrl,displayName,created,isdeleted +'5ab0c6a674d0af7b003b23ac','Organization_X','lorem ipsum','/assets/images/mpi-logos.svg','Organization_X',2018-03-20 09:30:31.91+01',f +'6bb0c6a674d0af7b003b23bd','Organization_Y','foo bar','/assets/images/mpi-logos.svg','Organization_Y','2018-03-24 09:30:31.91+01',f From 8ea9ee41c9aa65f9821ca641d58b54bba9be19c7 Mon Sep 17 00:00:00 2001 From: Florian M Date: Mon, 9 Jul 2018 16:17:50 +0200 Subject: [PATCH 7/8] fix typo --- test/db/organizations.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/db/organizations.csv b/test/db/organizations.csv index ec4ca315d43..6aa4537fe18 100644 --- a/test/db/organizations.csv +++ b/test/db/organizations.csv @@ -1,3 +1,3 @@ _id,name,additionalinformation,logoUrl,displayName,created,isdeleted -'5ab0c6a674d0af7b003b23ac','Organization_X','lorem ipsum','/assets/images/mpi-logos.svg','Organization_X',2018-03-20 09:30:31.91+01',f +'5ab0c6a674d0af7b003b23ac','Organization_X','lorem ipsum','/assets/images/mpi-logos.svg','Organization_X','2018-03-20 09:30:31.91+01',f '6bb0c6a674d0af7b003b23bd','Organization_Y','foo bar','/assets/images/mpi-logos.svg','Organization_Y','2018-03-24 09:30:31.91+01',f From 37cadbc09c3fd7304349d10991a41bcbc09ebc8b Mon Sep 17 00:00:00 2001 From: Florian M Date: Tue, 10 Jul 2018 10:17:04 +0200 Subject: [PATCH 8/8] remove duplicate evolution --- .../reversions/003-add-organization-displayname.sql | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 conf/evolutions/reversions/003-add-organization-displayname.sql diff --git a/conf/evolutions/reversions/003-add-organization-displayname.sql b/conf/evolutions/reversions/003-add-organization-displayname.sql deleted file mode 100644 index 1666b5fb6b2..00000000000 --- a/conf/evolutions/reversions/003-add-organization-displayname.sql +++ /dev/null @@ -1,5 +0,0 @@ -START TRANSACTION; -DROP VIEW webknossos.organizations_; -ALTER TABLE webknossos.organizations DROP COLUMN displayName; -CREATE VIEW webknossos.organizations_ AS SELECT * FROM webknossos.organizations WHERE NOT isDeleted; -COMMIT TRANSACTION;