ScanList gets scans from GalleryThing, no ongoing scans shown.
This commit is contained in:
parent
4583151345
commit
a16d47ed61
5 changed files with 52 additions and 63 deletions
|
|
@ -5,7 +5,7 @@ the Things that capture the Data. This thing just provides a unified way for the
|
|||
front end to access the data.
|
||||
"""
|
||||
|
||||
from typing import Mapping, Optional, Protocol, Self, runtime_checkable
|
||||
from typing import Any, Mapping, Optional, Protocol, Self, cast, runtime_checkable
|
||||
|
||||
from pydantic import BaseModel
|
||||
|
||||
|
|
@ -42,10 +42,10 @@ class GalleryThing(lt.Thing):
|
|||
|
||||
all_ofm_things: Mapping[str, OFMThing] = lt.thing_slot()
|
||||
|
||||
_gallery_providing_things: Optional[Mapping[str, OFMThing]] = None
|
||||
_gallery_providing_things: Optional[Mapping[str, GalleryCompatibleThing]] = None
|
||||
|
||||
@property
|
||||
def gallery_providing_things(self) -> Mapping[str, OFMThing]:
|
||||
def gallery_providing_things(self) -> Mapping[str, GalleryCompatibleThing]:
|
||||
"""All Things that provide data to the gallery."""
|
||||
if self._gallery_providing_things is None:
|
||||
raise RuntimeError(
|
||||
|
|
@ -56,6 +56,7 @@ class GalleryThing(lt.Thing):
|
|||
def __enter__(self) -> Self:
|
||||
"""Check for all gallery providing things on server startup."""
|
||||
self._set_gallery_providers()
|
||||
return self
|
||||
|
||||
def _set_gallery_providers(self) -> None:
|
||||
"""Set the mapping of gallery providing things.
|
||||
|
|
@ -77,4 +78,22 @@ class GalleryThing(lt.Thing):
|
|||
)
|
||||
gallery_providers.pop(key)
|
||||
|
||||
self._gallery_providing_things = gallery_providers
|
||||
# Cast the type of each thing to "GalleryCompatibleThing" as other Things have
|
||||
# been popped.
|
||||
self._gallery_providing_things = cast(
|
||||
Mapping[str, GalleryCompatibleThing], gallery_providers
|
||||
)
|
||||
|
||||
@lt.property
|
||||
def list_data(self) -> list[dict[str, Any]]:
|
||||
"""List the data from all registered things.
|
||||
|
||||
Currently only works with `smart_scan` as the UI cards are not customisable.
|
||||
|
||||
This will change to an action (or another type of endpoint) at a
|
||||
later date to enable filtering, and returning only a specific page.
|
||||
"""
|
||||
data_list = []
|
||||
for thing in self.gallery_providing_things.values():
|
||||
data_list += [model.model_dump() for model in thing.get_gallery_data()]
|
||||
return data_list
|
||||
|
|
|
|||
|
|
@ -71,16 +71,6 @@ class ActiveScanData(scan_directories.BaseScanData):
|
|||
self.scan_result = result
|
||||
|
||||
|
||||
class ScanListInfo(BaseModel):
|
||||
"""The information to be sent to the Scan List tab."""
|
||||
|
||||
scans: list[scan_directories.ScanInfo]
|
||||
"""The list of scans as ScanInfo objects"""
|
||||
|
||||
ongoing: Optional[str]
|
||||
"""The name of the ongoing scan or None"""
|
||||
|
||||
|
||||
class JPEGBlob(lt.blob.Blob):
|
||||
"""A class representing a JPEG image as a LabThings FastAPI Blob."""
|
||||
|
||||
|
|
@ -197,7 +187,9 @@ class SmartScanThing(OFMThing):
|
|||
in any ongoing scans being read.
|
||||
"""
|
||||
ongoing_name = None if self._ongoing_scan is None else self.ongoing_scan.name
|
||||
return self._scan_dir_manager.all_scans_info(ongoing=ongoing_name)
|
||||
return self._scan_dir_manager.all_scans_info(
|
||||
ongoing=ongoing_name, include_ongoing=False
|
||||
)
|
||||
|
||||
# Note that the default detector name is set at init. This is over written if
|
||||
# setting is loaded from disk.
|
||||
|
|
@ -567,21 +559,6 @@ class SmartScanThing(OFMThing):
|
|||
stitch_automatically: bool = lt.setting(default=True)
|
||||
"""Whether to run a final stitch at the end of a successful scan."""
|
||||
|
||||
@lt.property
|
||||
def scans(self) -> ScanListInfo:
|
||||
"""All the available scans.
|
||||
|
||||
Each scan has a name (which can be used to access it), along with
|
||||
its modified and created times (according to the filesystem) and
|
||||
the number of items in the ``images`` folder. Note that image count
|
||||
uses a regular expression, and changes to the naming scheme will
|
||||
break it.
|
||||
"""
|
||||
return ScanListInfo(
|
||||
scans=self.get_gallery_data(),
|
||||
ongoing=None if self._ongoing_scan is None else self.ongoing_scan.name,
|
||||
)
|
||||
|
||||
@lt.endpoint(
|
||||
"get",
|
||||
"get_stitch/{scan_name}",
|
||||
|
|
@ -646,7 +623,7 @@ class SmartScanThing(OFMThing):
|
|||
def purge_empty_scans(self) -> None:
|
||||
"""Delete all scan folders containing no images at the top level."""
|
||||
# JSON is ignored as it's created before any images are captured
|
||||
for scan_info in self._get_all_scan_info():
|
||||
for scan_info in self.get_gallery_data():
|
||||
if scan_info.number_of_images == 0:
|
||||
self._delete_scan(scan_info.name)
|
||||
|
||||
|
|
@ -761,6 +738,6 @@ class SmartScanThing(OFMThing):
|
|||
"""
|
||||
if self._scan_lock.locked():
|
||||
raise RuntimeError("Can't stitch previous scans while a scan is ongoing")
|
||||
for scan in self._get_all_scan_info():
|
||||
for scan in self.get_gallery_data():
|
||||
if scan.dzi is None:
|
||||
self.stitch_scan(scan_name=scan.name)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue