Skip to content

Commit e7bc0ef

Browse files
committed
Merge branch 'master' of github.com:scalableminds/webknossos into drawings
* 'master' of github.com:scalableminds/webknossos: updates docs for docker installation (#6963) Fix misc stuff when viewing tasks/annotations of another user (#6957) Remove segment from list and add undo/redo for segments (#6944) Log all details on deleting annotation layer (#6950) fix typo Rename demo instance to wkorg instance (#6941) Add LOD mesh support for frontend (#6909) Fix layout of view mode switcher and move it (#6949) VaultPath no longer extends nio.Path (#6942) Release 23.04.0 (#6945) Use new zip.js version to allow zip64 uploads (#6939) Implement viewing sharded neuroglancer precomputed datasets (#6920) Reject dataset uploads if organization storage quota is exceeded (#6893) Refactor deprecated antd Dropdown menus (#6898)
2 parents f31c12a + b588324 commit e7bc0ef

File tree

122 files changed

+3623
-2998
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

122 files changed

+3623
-2998
lines changed

CHANGELOG.released.md

+26
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,32 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
77
and this project adheres to [Calendar Versioning](http://calver.org/) `0Y.0M.MICRO`.
88
For upgrade instructions, please check the [migration guide](MIGRATIONS.released.md).
99

10+
## [23.04.0](https://github.com/scalableminds/webknossos/releases/tag/23.04.0) - 2023-03-27
11+
[Commits](https://github.com/scalableminds/webknossos/compare/23.03.1...23.04.0)
12+
13+
### Highlights
14+
- Added email notifications for WK worker jobs. [#6918](https://github.com/scalableminds/webknossos/pull/6918)
15+
- Added support for viewing sharded neuroglancer precomputed datasets. [#6920](https://github.com/scalableminds/webknossos/pull/6920)
16+
17+
### Added
18+
- Added support for datasets where layers are transformed individually (with an affine matrix). Transformations can be specified via datasource-properties.json or via JS API (will be ephemeral, then). [#6748](https://github.com/scalableminds/webknossos/pull/6748)
19+
- Added list of all respective team members to the administration page for teams. [#6915](https://github.com/scalableminds/webknossos/pull/6915)
20+
- Added support for uploading zip64 files. [#6939](https://github.com/scalableminds/webknossos/pull/6939)
21+
22+
### Changed
23+
- Interpolation during rendering is now more performance intensive, since the rendering approach was changed. Therefore, interpolation is disabled by default. On the flip side, the rendered quality is often higher than it used to be. [#6748](https://github.com/scalableminds/webknossos/pull/6748)
24+
- Updated the styling of the "welcome" screen for new users to be in line with the new branding. [#6904](https://github.com/scalableminds/webknossos/pull/6904)
25+
- Improved Terms-of-Service modal (e.g., allow to switch organization even when modal was blocking the remaining usage of WEBKNOSSOS). [#6930](https://github.com/scalableminds/webknossos/pull/6930)
26+
- Uploads are now blocked when the organization’s storage quota is exceeded. [#6893](https://github.com/scalableminds/webknossos/pull/6893)
27+
28+
### Fixed
29+
- Fixed an issue with text hints not being visible on the logout page for dark mode users. [#6916](https://github.com/scalableminds/webknossos/pull/6916)
30+
- Fixed creating task types with a selected preferred mode. [#6928](https://github.com/scalableminds/webknossos/pull/6928)
31+
- Fixed support for rendering of negative floats. [#6895](https://github.com/scalableminds/webknossos/pull/6895)
32+
- Fixed caching issues with webworkers. [#6932](https://github.com/scalableminds/webknossos/pull/6932)
33+
- Fixed download button for annotations which was disabled in some cases. [#6931](https://github.com/scalableminds/webknossos/pull/6931)
34+
- Fixed antd deprecation warning for Dropdown menus. [#6898](https://github.com/scalableminds/webknossos/pull/6898)
35+
1036
## [23.03.1](https://github.com/scalableminds/webknossos/releases/tag/23.03.1) - 2023-03-14
1137
[Commits](https://github.com/scalableminds/webknossos/compare/23.03.0...23.03.1)
1238

CHANGELOG.unreleased.md

+7-12
Original file line numberDiff line numberDiff line change
@@ -8,25 +8,20 @@ and this project adheres to [Calendar Versioning](http://calver.org/) `0Y.0M.MIC
88
For upgrade instructions, please check the [migration guide](MIGRATIONS.released.md).
99

1010
## Unreleased
11-
[Commits](https://github.com/scalableminds/webknossos/compare/23.03.1...HEAD)
11+
[Commits](https://github.com/scalableminds/webknossos/compare/23.04.0...HEAD)
1212

1313
### Added
14-
- Added support for datasets where layers are transformed individually (with an affine matrix). Transformations can be specified via datasource-properties.json or via JS API (will be ephemeral, then). [#6748](https://github.com/scalableminds/webknossos/pull/6748)
15-
- Added list of all respective team members to the administration page for teams. [#6915](https://github.com/scalableminds/webknossos/pull/6915)
16-
- Added email notifications for WK worker jobs. [#6918](https://github.com/scalableminds/webknossos/pull/6918)
14+
- Added rendering precomputed meshes with level of detail depending on the zoom of the 3D viewport. This feature only works with version 3 mesh files. [#6909](https://github.com/scalableminds/webknossos/pull/6909)
15+
- Segments can now be removed from the segment list via the context menu. [#6944](https://github.com/scalableminds/webknossos/pull/6944)
16+
- Editing the meta data of segments (e.g., the name) is now undoable. [#6944](https://github.com/scalableminds/webknossos/pull/6944)
1717
- Added more icons and small redesigns for various pages in line with the new branding. [#6938](https://github.com/scalableminds/webknossos/pull/6938)
1818

19+
1920
### Changed
20-
- Interpolation during rendering is now more performance intensive, since the rendering approach was changed. Therefore, interpolation is disabled by default. On the flip side, the rendered quality is often higher than it used to be. [#6748](https://github.com/scalableminds/webknossos/pull/6748)
21-
- Updated the styling of the "welcome" screen for new users to be in line with the new branding. [#6904](https://github.com/scalableminds/webknossos/pull/6904)
22-
- Improved Terms-of-Service modal (e.g., allow to switch organization even when modal was blocking the remaining usage of WEBKNOSSOS). [#6930](https://github.com/scalableminds/webknossos/pull/6930)
21+
- Moved the view mode selection in the toolbar next to the position field. [#6949](https://github.com/scalableminds/webknossos/pull/6949)
2322

2423
### Fixed
25-
- Fixed an issue with text hints not being visible on the logout page for dark mode users. [#6916](https://github.com/scalableminds/webknossos/pull/6916)
26-
- Fixed creating task types with a selected preferred mode. [#6928](https://github.com/scalableminds/webknossos/pull/6928)
27-
- Fixed support for rendering of negative floats. [#6895](https://github.com/scalableminds/webknossos/pull/6895)
28-
- Fixed caching issues with webworkers. [#6932](https://github.com/scalableminds/webknossos/pull/6932)
29-
- Fixed download button for annotations which was disabled in some cases. [#6931](https://github.com/scalableminds/webknossos/pull/6931)
24+
- Fixed incorrect initial tab when clicking "Show Annotations" for a user in the user list. Also, the datasets tab was removed from that page as it was the same as the datasets table from the main dashboard. [#6957](https://github.com/scalableminds/webknossos/pull/6957)
3025

3126
### Removed
3227

MIGRATIONS.released.md

+8-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
11
# Migration Guide (Released)
2-
All migrations of WEBKNOSOSS are documented in this file.
2+
3+
All migrations of WEBKNOSSOS are documented in this file.
34
See `MIGRATIONS.unreleased.md` for the changes which are not yet part of an official release.
45

56
This project adheres to [Calendar Versioning](http://calver.org/) `0Y.0M.MICRO`.
67
User-facing changes are documented in the [changelog](CHANGELOG.released.md).
78

9+
## [23.04.0](https://github.com/scalableminds/webknossos/releases/tag/23.04.0) - 2023-03-27
10+
[Commits](https://github.com/scalableminds/webknossos/compare/23.03.1...23.04.0)
11+
12+
### Postgres Evolutions:
13+
None.
14+
815
## [23.03.1](https://github.com/scalableminds/webknossos/releases/tag/23.03.1) - 2023-03-14
916
[Commits](https://github.com/scalableminds/webknossos/compare/23.03.0...23.03.1)
1017
- WEBKNOSSOS now requires at least Java 11 (up from Java 8). [#6869](https://github.com/scalableminds/webknossos/pull/6869)

MIGRATIONS.unreleased.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ This project adheres to [Calendar Versioning](http://calver.org/) `0Y.0M.MICRO`.
66
User-facing changes are documented in the [changelog](CHANGELOG.released.md).
77

88
## Unreleased
9-
[Commits](https://github.com/scalableminds/webknossos/compare/23.03.1...HEAD)
9+
[Commits](https://github.com/scalableminds/webknossos/compare/23.04.0...HEAD)
10+
11+
- The config key features.isDemoInstance was renamed to features.isWkorgInstance (only needs to be adapted for the main wkorg instance). [#6941](https://github.com/scalableminds/webknossos/pull/6941/files)
1012

1113
### Postgres Evolutions:

app/RequestHandler.scala

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import com.typesafe.scalalogging.LazyLogging
2-
import controllers.{Assets, DemoProxyController, SitemapController}
2+
import controllers.{Assets, WkorgProxyController, SitemapController}
33
import javax.inject.Inject
44
import play.api.OptionalDevContext
55
import play.api.http.{DefaultHttpRequestHandler, HttpConfiguration, HttpErrorHandler, HttpFilters}
@@ -13,7 +13,7 @@ class RequestHandler @Inject()(webCommands: WebCommands,
1313
router: Router,
1414
errorHandler: HttpErrorHandler,
1515
httpConfiguration: HttpConfiguration,
16-
demoProxyController: DemoProxyController,
16+
wkorgProxyController: WkorgProxyController,
1717
filters: HttpFilters,
1818
conf: WkConf,
1919
assets: Assets,
@@ -35,11 +35,11 @@ class RequestHandler @Inject()(webCommands: WebCommands,
3535
} else if (request.uri.matches("^(/assets/).*$")) {
3636
val path = request.path.replaceFirst("^(/assets/)", "")
3737
Some(assets.at(path = "/public", file = path))
38-
} else if (request.uri.matches("""^/sitemap.xml$""") && conf.Features.isDemoInstance) {
38+
} else if (request.uri.matches("""^/sitemap.xml$""") && conf.Features.isWkorgInstance) {
3939
Some(sitemapController.getSitemap(conf.Http.uri))
40-
} else if (request.uri.matches("^/sw\\.(.*)\\.js$") && conf.Features.isDemoInstance) {
40+
} else if (request.uri.matches("^/sw\\.(.*)\\.js$") && conf.Features.isWkorgInstance) {
4141
Some(Action { Ok("").as("text/javascript") })
4242
} else if (request.uri == "/favicon.ico") {
4343
Some(Action { NotFound })
44-
} else Some(demoProxyController.proxyPageOrMainView)
44+
} else Some(wkorgProxyController.proxyPageOrMainView)
4545
}

app/controllers/AnnotationController.scala

+3-2
Original file line numberDiff line numberDiff line change
@@ -237,11 +237,12 @@ class AnnotationController @Inject()(
237237
_ <- bool2Fox(AnnotationType.Explorational.toString == typ) ?~> "annotation.deleteLayer.explorationalsOnly"
238238
annotation <- provider.provideAnnotation(typ, id, request.identity)
239239
_ <- bool2Fox(annotation._user == request.identity._id) ?~> "notAllowed" ~> FORBIDDEN
240-
_ <- annotation.annotationLayers.find(annotationLayer => annotationLayer.name == layerName) ?~> Messages(
240+
layer <- annotation.annotationLayers.find(annotationLayer => annotationLayer.name == layerName) ?~> Messages(
241241
"annotation.layer.notFound",
242242
layerName)
243243
_ <- bool2Fox(annotation.annotationLayers.length != 1) ?~> "annotation.deleteLayer.onlyLayer"
244-
_ = logger.info(s"Deleting annotation layer $layerName for annotation $id")
244+
_ = logger.info(
245+
s"Deleting annotation layer $layerName (tracing id ${layer.tracingId}, typ ${layer.typ}) for annotation $id")
245246
_ <- annotationService.deleteAnnotationLayer(annotation, layerName)
246247
} yield Ok
247248
}

app/controllers/AuthenticationController.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ class AuthenticationController @Inject()(
144144
_ <- Fox.runIf(inviteBox.isDefined)(Fox.runOptional(inviteBox.toOption)(i =>
145145
inviteService.deactivateUsedInvite(i)(GlobalAccessContext)))
146146
brainDBResult <- Fox.runIf(registerBrainDB)(brainTracing.registerIfNeeded(user, password.getOrElse("")))
147-
_ = if (conf.Features.isDemoInstance) {
147+
_ = if (conf.Features.isWkorgInstance) {
148148
mailchimpClient.registerUser(user, multiUser, tag = MailchimpTag.RegisteredAsUser)
149149
} else {
150150
Mailer ! Send(defaultMails.newUserMail(user.name, email, brainDBResult.flatten, autoActivate))
@@ -597,7 +597,7 @@ class AuthenticationController @Inject()(
597597
defaultMails.newOrganizationMail(organization.displayName,
598598
email.toLowerCase,
599599
request.headers.get("Host").getOrElse("")))
600-
if (conf.Features.isDemoInstance) {
600+
if (conf.Features.isWkorgInstance) {
601601
mailchimpClient.registerUser(user, multiUser, MailchimpTag.RegisteredAsAdmin)
602602
}
603603
Ok

app/controllers/MeshController.scala

+3
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ import javax.inject.Inject
1111

1212
import scala.concurrent.ExecutionContext
1313

14+
// Note that this wk-side controller deals with user-uploaded meshes stored in postgres
15+
// Not to be confused with the DSMeshController that deals with on-disk meshfiles
16+
1417
class MeshController @Inject()(meshDAO: MeshDAO,
1518
annotationDAO: AnnotationDAO,
1619
sil: Silhouette[WkEnv],

app/controllers/WKRemoteDataStoreController.scala

+3
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ class WKRemoteDataStoreController @Inject()(
6060
organization <- organizationDAO.findOneByName(uploadInfo.organization)(GlobalAccessContext) ?~> Messages(
6161
"organization.notFound",
6262
uploadInfo.organization) ~> NOT_FOUND
63+
usedStorageBytes <- organizationDAO.getUsedStorage(organization._id)
64+
_ <- Fox.runOptional(organization.includedStorageBytes)(includedStorage =>
65+
bool2Fox(usedStorageBytes <= includedStorage)) ?~> "dataSet.upload.storageExceeded" ~> FORBIDDEN
6366
_ <- bool2Fox(organization._id == user._organization) ?~> "notAllowed" ~> FORBIDDEN
6467
_ <- dataSetService.assertValidDataSetName(uploadInfo.name)
6568
_ <- dataSetService.assertNewDataSetName(uploadInfo.name, organization._id) ?~> "dataSet.name.alreadyTaken"

app/controllers/DemoProxyController.scala renamed to app/controllers/WkorgProxyController.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import utils.WkConf
1414
import scala.concurrent.ExecutionContext
1515
import scala.util.matching.Regex
1616

17-
class DemoProxyController @Inject()(ws: WSClient, conf: WkConf, sil: Silhouette[WkEnv], multiUserDAO: MultiUserDAO)(
17+
class WkorgProxyController @Inject()(ws: WSClient, conf: WkConf, sil: Silhouette[WkEnv], multiUserDAO: MultiUserDAO)(
1818
implicit ec: ExecutionContext)
1919
extends Controller {
2020

@@ -30,7 +30,7 @@ class DemoProxyController @Inject()(ws: WSClient, conf: WkConf, sil: Silhouette[
3030
}
3131

3232
private def matchesProxyPage(request: UserAwareRequest[WkEnv, AnyContent]): Boolean =
33-
conf.Features.isDemoInstance && conf.Proxy.routes
33+
conf.Features.isWkorgInstance && conf.Proxy.routes
3434
.exists(route => matchesPageWithWildcard(route, request.path)) && (request.identity.isEmpty || request.uri != "/")
3535

3636
private def matchesPageWithWildcard(routeWithWildcard: String, actualRequest: String): Boolean = {

app/models/binary/credential/CredentialDAO.scala

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package models.binary.credential
22

33
import com.scalableminds.util.tools.Fox
44
import com.scalableminds.webknossos.datastore.storage.{
5-
FileSystemCredential,
5+
DataVaultCredential,
66
GoogleServiceAccountCredential,
77
HttpBasicAuthCredential,
88
S3AccessKeyCredential
@@ -79,14 +79,14 @@ class CredentialDAO @Inject()(sqlClient: SqlClient)(implicit ec: ExecutionContex
7979
values(${_id}, ${CredentialType.GoogleServiceAccount}, ${credential.name}, ${credential.secretJson.toString}, ${credential.user}, ${credential.organization})""".asUpdate)
8080
} yield ()
8181

82-
def findOne(id: ObjectId): Fox[FileSystemCredential] =
82+
def findOne(id: ObjectId): Fox[DataVaultCredential] =
8383
for {
8484
r <- run(q"select $columns from webknossos.credentials_ where _id = $id".as[CredentialsRow])
8585
firstRow <- r.headOption.toFox
8686
parsed <- parseAnyCredential(firstRow)
8787
} yield parsed
8888

89-
private def parseAnyCredential(r: CredentialsRow): Fox[FileSystemCredential] =
89+
private def parseAnyCredential(r: CredentialsRow): Fox[DataVaultCredential] =
9090
for {
9191
typeParsed <- CredentialType.fromString(r.`type`).toFox
9292
parsed <- typeParsed match {

app/models/binary/credential/CredentialService.scala

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package models.binary.credential
22

33
import com.scalableminds.util.tools.Fox
44
import com.scalableminds.webknossos.datastore.storage.{
5-
FileSystemCredential,
5+
DataVaultCredential,
66
DataVaultsHolder,
77
GoogleServiceAccountCredential,
88
HttpBasicAuthCredential,
@@ -22,7 +22,7 @@ class CredentialService @Inject()(credentialDAO: CredentialDAO) {
2222
credentialIdentifier: Option[String],
2323
credentialSecret: Option[String],
2424
userId: ObjectId,
25-
organizationId: ObjectId): Option[FileSystemCredential] =
25+
organizationId: ObjectId): Option[DataVaultCredential] =
2626
uri.getScheme match {
2727
case DataVaultsHolder.schemeHttps | DataVaultsHolder.schemeHttp =>
2828
credentialIdentifier.map(
@@ -45,7 +45,7 @@ class CredentialService @Inject()(credentialDAO: CredentialDAO) {
4545
} yield GoogleServiceAccountCredential(uri.toString, secretJson, userId.toString, organizationId.toString)
4646
}
4747

48-
def insertOne(credential: FileSystemCredential)(implicit ec: ExecutionContext): Fox[ObjectId] = {
48+
def insertOne(credential: DataVaultCredential)(implicit ec: ExecutionContext): Fox[ObjectId] = {
4949
val _id = ObjectId.generate
5050
for {
5151
_ <- credential match {

app/models/binary/explore/ExploreRemoteLayerService.scala

+4-4
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import com.scalableminds.webknossos.datastore.dataformats.precomputed.{
1010
import com.scalableminds.webknossos.datastore.dataformats.zarr._
1111
import com.scalableminds.webknossos.datastore.datareaders.n5.N5Header
1212
import com.scalableminds.webknossos.datastore.datareaders.zarr._
13+
import com.scalableminds.webknossos.datastore.datavault.VaultPath
1314
import com.scalableminds.webknossos.datastore.models.datasource._
1415
import com.scalableminds.webknossos.datastore.storage.{DataVaultsHolder, RemoteSourceDescriptor}
1516
import com.typesafe.scalalogging.LazyLogging
@@ -21,7 +22,6 @@ import oxalis.security.WkEnv
2122
import play.api.libs.json.{Json, OFormat}
2223

2324
import java.net.URI
24-
import java.nio.file.Path
2525
import javax.inject.Inject
2626
import scala.collection.mutable.ListBuffer
2727
import scala.concurrent.ExecutionContext
@@ -162,8 +162,8 @@ class ExploreRemoteLayerService @Inject()(credentialService: CredentialService)
162162
requestingUser._id,
163163
requestingUser._organization)
164164
remoteSource = RemoteSourceDescriptor(uri, credentialOpt)
165-
credentialId <- Fox.runOptional(credentialOpt)(c => credentialService.insertOne(c)) ?~> "remoteFileSystem.credential.insert.failed"
166-
remotePath <- DataVaultsHolder.getVaultPath(remoteSource) ?~> "remoteFileSystem.setup.failed"
165+
credentialId <- Fox.runOptional(credentialOpt)(c => credentialService.insertOne(c)) ?~> "dataVault.credential.insert.failed"
166+
remotePath <- DataVaultsHolder.getVaultPath(remoteSource) ?~> "dataVault.setup.failed"
167167
layersWithVoxelSizes <- exploreRemoteLayersForRemotePath(
168168
remotePath,
169169
credentialId.map(_.toString),
@@ -186,7 +186,7 @@ class ExploreRemoteLayerService @Inject()(credentialService: CredentialService)
186186
else uri
187187

188188
private def exploreRemoteLayersForRemotePath(
189-
remotePath: Path,
189+
remotePath: VaultPath,
190190
credentialId: Option[String],
191191
reportMutable: ListBuffer[String],
192192
explorers: List[RemoteLayerExplorer])(implicit ec: ExecutionContext): Fox[List[(DataLayer, Vec3Double)]] =

app/models/binary/explore/N5ArrayExplorer.scala

+4-4
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,19 @@ import com.scalableminds.webknossos.datastore.dataformats.MagLocator
55
import com.scalableminds.webknossos.datastore.dataformats.n5.{N5DataLayer, N5Layer, N5SegmentationLayer}
66
import com.scalableminds.webknossos.datastore.datareaders.AxisOrder
77
import com.scalableminds.webknossos.datastore.datareaders.n5.N5Header
8+
import com.scalableminds.webknossos.datastore.datavault.VaultPath
89
import com.scalableminds.webknossos.datastore.models.datasource.Category
910

10-
import java.nio.file.Path
1111
import scala.concurrent.ExecutionContext.Implicits.global
1212

1313
class N5ArrayExplorer extends RemoteLayerExplorer {
1414

1515
override def name: String = "N5 Array"
1616

17-
override def explore(remotePath: Path, credentialId: Option[String]): Fox[List[(N5Layer, Vec3Double)]] =
17+
override def explore(remotePath: VaultPath, credentialId: Option[String]): Fox[List[(N5Layer, Vec3Double)]] =
1818
for {
19-
headerPath <- Fox.successful(remotePath.resolve(N5Header.FILENAME_ATTRIBUTES_JSON))
20-
name <- guessNameFromPath(remotePath)
19+
headerPath <- Fox.successful(remotePath / N5Header.FILENAME_ATTRIBUTES_JSON)
20+
name = guessNameFromPath(remotePath)
2121
n5Header <- parseJsonFromPath[N5Header](headerPath) ?~> s"failed to read n5 header at $headerPath"
2222
elementClass <- n5Header.elementClass ?~> "failed to read element class from n5 header"
2323
guessedAxisOrder = AxisOrder.asZyxFromRank(n5Header.rank)

0 commit comments

Comments
 (0)