Removed full capture metadata from top-level resource list
This commit is contained in:
parent
982154ce22
commit
b69c90345f
2 changed files with 57 additions and 15 deletions
|
|
@ -17,9 +17,9 @@ class InstrumentSchema(Schema):
|
||||||
state = fields.Dict()
|
state = fields.Dict()
|
||||||
|
|
||||||
|
|
||||||
class CaptureMetadataImageSchema(Schema):
|
class ImageSchema(Schema):
|
||||||
id = fields.UUID()
|
id = fields.UUID()
|
||||||
acquisitionDate = fields.String(format="date")
|
time = fields.String(format="date")
|
||||||
format = fields.String()
|
format = fields.String()
|
||||||
name = fields.String()
|
name = fields.String()
|
||||||
tags = fields.List(fields.String())
|
tags = fields.List(fields.String())
|
||||||
|
|
@ -30,19 +30,20 @@ class CaptureMetadataSchema(Schema):
|
||||||
experimenter = fields.Dict() # TODO: Make schema
|
experimenter = fields.Dict() # TODO: Make schema
|
||||||
experimenterGroup = fields.Dict() # TODO: Make schema
|
experimenterGroup = fields.Dict() # TODO: Make schema
|
||||||
dataset = fields.Dict() # TODO: Make schema
|
dataset = fields.Dict() # TODO: Make schema
|
||||||
image = fields.Nested(CaptureMetadataImageSchema())
|
image = fields.Nested(ImageSchema())
|
||||||
instrument = fields.Nested(InstrumentSchema())
|
instrument = fields.Nested(InstrumentSchema())
|
||||||
|
|
||||||
|
|
||||||
class CaptureSchema(Schema):
|
class CaptureSchema(ImageSchema):
|
||||||
id = fields.String()
|
"""
|
||||||
|
Schema containing only basic attributes required
|
||||||
|
for interacting with a capture. Additional attributes
|
||||||
|
are returned by using FullCaptureSchema
|
||||||
|
"""
|
||||||
|
dataset = fields.Dict() # TODO: Make schema
|
||||||
file = fields.String(
|
file = fields.String(
|
||||||
data_key="path", description="Path of file on microscope device"
|
data_key="path", description="Path of file on microscope device"
|
||||||
)
|
)
|
||||||
exists = fields.Bool(data_key="available")
|
|
||||||
name = fields.String()
|
|
||||||
metadata = fields.Nested(CaptureMetadataSchema())
|
|
||||||
|
|
||||||
links = fields.Dict()
|
links = fields.Dict()
|
||||||
|
|
||||||
@pre_dump
|
@pre_dump
|
||||||
|
|
@ -91,6 +92,14 @@ class CaptureSchema(Schema):
|
||||||
|
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
class FullCaptureSchema(CaptureSchema):
|
||||||
|
"""
|
||||||
|
Capture schema including metadata. We exclude this by default
|
||||||
|
since it can become huge due to complex settings including
|
||||||
|
lens shading tables and CSM matrices.
|
||||||
|
"""
|
||||||
|
metadata = fields.Nested(CaptureMetadataSchema())
|
||||||
|
|
||||||
|
|
||||||
class CaptureList(PropertyView):
|
class CaptureList(PropertyView):
|
||||||
tags = ["captures"]
|
tags = ["captures"]
|
||||||
|
|
@ -108,7 +117,7 @@ class CaptureList(PropertyView):
|
||||||
class CaptureView(View):
|
class CaptureView(View):
|
||||||
tags = ["captures"]
|
tags = ["captures"]
|
||||||
|
|
||||||
@marshal_with(CaptureSchema())
|
@marshal_with(FullCaptureSchema())
|
||||||
def get(self, id_):
|
def get(self, id_):
|
||||||
"""
|
"""
|
||||||
Description of a single image capture
|
Description of a single image capture
|
||||||
|
|
|
||||||
|
|
@ -120,7 +120,8 @@ class CaptureObject(object):
|
||||||
# Store a nice ID
|
# Store a nice ID
|
||||||
self.id = uuid.uuid4() #: str: Unique capture ID
|
self.id = uuid.uuid4() #: str: Unique capture ID
|
||||||
logging.debug("Created CaptureObject {}".format(self.id))
|
logging.debug("Created CaptureObject {}".format(self.id))
|
||||||
self.datetime = datetime.datetime.now()
|
|
||||||
|
self.time = datetime.datetime.now()
|
||||||
|
|
||||||
# Create file name. Default to UUID
|
# Create file name. Default to UUID
|
||||||
self.format = None
|
self.format = None
|
||||||
|
|
@ -130,12 +131,15 @@ class CaptureObject(object):
|
||||||
if not os.path.exists(self.filefolder):
|
if not os.path.exists(self.filefolder):
|
||||||
os.makedirs(self.filefolder)
|
os.makedirs(self.filefolder)
|
||||||
|
|
||||||
# Dictionary for adding top-level metadata (cannmot be accessed through web API)
|
# Dictionary for adding top-level metadata
|
||||||
|
# This can ONLY be modified by the server application
|
||||||
|
# Top level metadata cannot be modified via the web API
|
||||||
self._metadata = {}
|
self._metadata = {}
|
||||||
|
|
||||||
# Dictionary for storing custom annotations
|
# Dictionary for storing custom annotations
|
||||||
|
# Can be modified via the web API
|
||||||
self.annotations = {}
|
self.annotations = {}
|
||||||
# List for storing tags
|
# List for storing tags
|
||||||
|
# Can be modified via the web API
|
||||||
self.tags = []
|
self.tags = []
|
||||||
|
|
||||||
def write(self, s):
|
def write(self, s):
|
||||||
|
|
@ -173,6 +177,22 @@ class CaptureObject(object):
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
@property
|
||||||
|
def dataset(self) -> str:
|
||||||
|
"""
|
||||||
|
If capture is part of a dataset, return basic dataset info.
|
||||||
|
Otherwise return None
|
||||||
|
"""
|
||||||
|
dataset = self.metadata.get("dataset")
|
||||||
|
if not dataset:
|
||||||
|
return None
|
||||||
|
return {
|
||||||
|
"id": dataset.get("id"),
|
||||||
|
"name": dataset.get("name"),
|
||||||
|
"type": dataset.get("type")
|
||||||
|
}
|
||||||
|
|
||||||
# HANDLE TAGS
|
# HANDLE TAGS
|
||||||
def put_tags(self, tags: list):
|
def put_tags(self, tags: list):
|
||||||
"""
|
"""
|
||||||
|
|
@ -199,7 +219,7 @@ class CaptureObject(object):
|
||||||
|
|
||||||
self.save_metadata()
|
self.save_metadata()
|
||||||
|
|
||||||
# HANDLE METADATA
|
# HANDLE ANNOTATIONS
|
||||||
|
|
||||||
def put_annotations(self, data: dict) -> None:
|
def put_annotations(self, data: dict) -> None:
|
||||||
"""
|
"""
|
||||||
|
|
@ -211,6 +231,13 @@ class CaptureObject(object):
|
||||||
self.annotations.update(data)
|
self.annotations.update(data)
|
||||||
self.save_metadata()
|
self.save_metadata()
|
||||||
|
|
||||||
|
def delete_annotation(self, key: str) -> None:
|
||||||
|
if key in self.annotations:
|
||||||
|
del self.annotations[key]
|
||||||
|
self.save_metadata()
|
||||||
|
|
||||||
|
# HANDLE METADATA
|
||||||
|
|
||||||
def put_metadata(self, data: dict) -> None:
|
def put_metadata(self, data: dict) -> None:
|
||||||
"""
|
"""
|
||||||
Merge root metadata from a passed dictionary into the capture metadata, and saves.
|
Merge root metadata from a passed dictionary into the capture metadata, and saves.
|
||||||
|
|
@ -230,6 +257,8 @@ class CaptureObject(object):
|
||||||
"""
|
"""
|
||||||
self._metadata = data
|
self._metadata = data
|
||||||
|
|
||||||
|
# BULK OPERATIONS
|
||||||
|
|
||||||
def put_and_save(
|
def put_and_save(
|
||||||
self, tags: list = None, annotations: dict = None, metadata: dict = None
|
self, tags: list = None, annotations: dict = None, metadata: dict = None
|
||||||
):
|
):
|
||||||
|
|
@ -273,6 +302,8 @@ class CaptureObject(object):
|
||||||
piexif.insert(exif_bytes, self.file)
|
piexif.insert(exif_bytes, self.file)
|
||||||
logging.info("Finished saving metadata to %s", self.file)
|
logging.info("Finished saving metadata to %s", self.file)
|
||||||
|
|
||||||
|
# PROPERTIES
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def metadata(self) -> dict:
|
def metadata(self) -> dict:
|
||||||
"""
|
"""
|
||||||
|
|
@ -283,7 +314,7 @@ class CaptureObject(object):
|
||||||
"image": {
|
"image": {
|
||||||
"id": self.id,
|
"id": self.id,
|
||||||
"name": self.name,
|
"name": self.name,
|
||||||
"acquisitionDate": self.datetime.isoformat(),
|
"time": self.time.isoformat(),
|
||||||
"format": self.format,
|
"format": self.format,
|
||||||
"tags": self.tags,
|
"tags": self.tags,
|
||||||
"annotations": self.annotations,
|
"annotations": self.annotations,
|
||||||
|
|
@ -354,6 +385,8 @@ class CaptureObject(object):
|
||||||
piexif.insert(exif_bytes, self.file)
|
piexif.insert(exif_bytes, self.file)
|
||||||
return io.BytesIO(thumbnail)
|
return io.BytesIO(thumbnail)
|
||||||
|
|
||||||
|
# FILE MANAGEMENT
|
||||||
|
|
||||||
def save(self) -> None:
|
def save(self) -> None:
|
||||||
"""Write stream to file, and save/update metadata file"""
|
"""Write stream to file, and save/update metadata file"""
|
||||||
# If a stream OR file exists, save the metadata file
|
# If a stream OR file exists, save the metadata file
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue