diff --git a/geomagio/api/db/MetadataDatabaseFactory.py b/geomagio/api/db/MetadataDatabaseFactory.py index 748bbabc8d3f01cf78ff435b457560280840ddc0..e97afd77261ec76e7209cfe482cb57a224aefad9 100644 --- a/geomagio/api/db/MetadataDatabaseFactory.py +++ b/geomagio/api/db/MetadataDatabaseFactory.py @@ -1,5 +1,5 @@ from datetime import datetime -from typing import List +from typing import List, Optional from databases import Database from obspy import UTCDateTime @@ -16,6 +16,7 @@ class MetadataDatabaseFactory(object): async def create_metadata(self, meta: Metadata) -> Metadata: query = metadata.insert() + meta.status = meta.status or "new" values = meta.datetime_dict(exclude={"id", "metadata_id"}, exclude_none=True) query = query.values(**values) meta.id = await self.database.execute(query) @@ -36,7 +37,7 @@ class MetadataDatabaseFactory(object): created_before: datetime = None, data_valid: bool = None, metadata_valid: bool = None, - status: str = None, + status: List[str] = None, ): query = metadata.select() if id: @@ -74,7 +75,7 @@ class MetadataDatabaseFactory(object): if metadata_valid is not None: query = query.where(metadata.c.metadata_valid == metadata_valid) if status is not None: - query = query.where(metadata.c.status == status) + query = query.where(metadata.c.status.in_(status)) rows = await self.database.fetch_all(query) return [Metadata(**row) for row in rows] @@ -98,6 +99,14 @@ class MetadataDatabaseFactory(object): metadata.reverse() return metadata + async def get_metadata_history_by_id(self, id: int) -> Optional[Metadata]: + query = metadata_history.select() + query = query.where(metadata_history.c.id == id) + meta = await self.database.fetch_one(query) + if meta is None: + return meta + return Metadata(**meta) + async def update_metadata(self, meta: Metadata, updated_by: str) -> Metadata: async with self.database.transaction() as transaction: # write current record to metadata history table diff --git a/geomagio/api/secure/metadata.py b/geomagio/api/secure/metadata.py index d397faca167ba4caf279b2e90e4a4a36cc791108..8a5251bdcb8d2cc85f737ab6013806d3b0607ce1 100644 --- a/geomagio/api/secure/metadata.py +++ b/geomagio/api/secure/metadata.py @@ -16,7 +16,7 @@ Configuration: import os from typing import List -from fastapi import APIRouter, Body, Depends, Request, Response +from fastapi import APIRouter, Body, Depends, Request, Response, Query from obspy import UTCDateTime from ...metadata import Metadata, MetadataCategory, MetadataQuery @@ -54,7 +54,7 @@ async def get_metadata( location: str = None, data_valid: bool = None, metadata_valid: bool = True, - status: str = None, + status: List[str] = Query(None), ): query = MetadataQuery( category=category, @@ -90,6 +90,16 @@ async def get_metadata_history( ) +@router.get("/metadata/history/{id}", response_model=Metadata) +async def get_metadata_history_by_id(id: int): + metadata = await MetadataDatabaseFactory( + database=database + ).get_metadata_history_by_id(id=id) + if metadata is None: + return Response(status_code=400) + return metadata + + @router.put("/metadata/{id}", response_model=Metadata) async def update_metadata( id: int, diff --git a/geomagio/api/ws/metadata.py b/geomagio/api/ws/metadata.py index 1dc77ee2c7fbcbee927707629dbf60703207c3f1..300dc3340428fcef198621378b226d9ee316d0b2 100644 --- a/geomagio/api/ws/metadata.py +++ b/geomagio/api/ws/metadata.py @@ -1,6 +1,6 @@ from typing import List -from fastapi import APIRouter +from fastapi import APIRouter, Query from obspy import UTCDateTime from ...metadata import Metadata, MetadataCategory, MetadataQuery @@ -21,7 +21,7 @@ async def get_metadata( location: str = None, data_valid: bool = None, metadata_valid: bool = True, - status: str = None, + status: List[str] = Query(None), ): query = MetadataQuery( category=category, diff --git a/geomagio/metadata/Metadata.py b/geomagio/metadata/Metadata.py index dff97fbeb4d448951f0503950a77ea052ac2f851..84f52c5e59477604f9a982a92d0c2cb00494b166 100644 --- a/geomagio/metadata/Metadata.py +++ b/geomagio/metadata/Metadata.py @@ -78,7 +78,7 @@ class Metadata(BaseModel): comment: str = None # review specific comment review_comment: str = None - # deletion status indicator + # metadata status indicator status: str = None def datetime_dict(self, **kwargs): diff --git a/geomagio/metadata/MetadataQuery.py b/geomagio/metadata/MetadataQuery.py index 5b5214849e1d3bb74821c4389052631f20c868c6..f776f34cb2bd075345980273f66dedb5dbb41c6e 100644 --- a/geomagio/metadata/MetadataQuery.py +++ b/geomagio/metadata/MetadataQuery.py @@ -2,7 +2,7 @@ from datetime import timezone from obspy import UTCDateTime from pydantic import BaseModel -from typing import Optional +from typing import List, Optional from .. import pydantic_utcdatetime from .MetadataCategory import MetadataCategory @@ -21,7 +21,7 @@ class MetadataQuery(BaseModel): location: str = None data_valid: Optional[bool] = None metadata_valid: Optional[bool] = None - status: Optional[str] = None + status: Optional[List[str]] = None def datetime_dict(self, **kwargs): values = self.dict(**kwargs) diff --git a/geomagio/metadata/main.py b/geomagio/metadata/main.py index 69e8eeecc3f6e718610547f74df5266cddd86591..c5546573e17d4e8d020a866ab038be14c326e75a 100644 --- a/geomagio/metadata/main.py +++ b/geomagio/metadata/main.py @@ -1,7 +1,7 @@ import sys import json import os -from typing import Dict, Optional +from typing import Dict, List, Optional from obspy import UTCDateTime import typer @@ -84,6 +84,7 @@ def create( network: str = None, starttime: str = None, station: str = None, + status: str = None, url: str = GEOMAG_API_URL, wrap: bool = True, ): @@ -105,6 +106,7 @@ def create( network=network, starttime=UTCDateTime(starttime) if starttime else None, station=station, + status=status or "new", ) metadata = MetadataFactory(url=url).create_metadata(metadata=metadata) print(metadata.json()) @@ -129,7 +131,7 @@ def get( location: Optional[str] = None, metadata_valid: Optional[bool] = None, network: Optional[str] = None, - status: Optional[str] = None, + status: Optional[List[str]] = typer.Argument(None), starttime: Optional[str] = None, station: Optional[str] = None, url: str = GEOMAG_API_URL,