From 83298e1609d8e609350070cad31c8779d61410dd Mon Sep 17 00:00:00 2001 From: pcain-usgs <pcain@usgs.gov> Date: Tue, 13 Apr 2021 15:04:58 -0600 Subject: [PATCH 1/3] query by list of statuses, default created metadata status to new --- geomagio/api/db/MetadataDatabaseFactory.py | 5 +++-- geomagio/api/secure/metadata.py | 4 ++-- geomagio/api/ws/metadata.py | 4 ++-- geomagio/metadata/Metadata.py | 2 +- geomagio/metadata/MetadataQuery.py | 4 ++-- geomagio/metadata/main.py | 6 ++++-- 6 files changed, 14 insertions(+), 11 deletions(-) diff --git a/geomagio/api/db/MetadataDatabaseFactory.py b/geomagio/api/db/MetadataDatabaseFactory.py index 748bbabc8..2453dad8b 100644 --- a/geomagio/api/db/MetadataDatabaseFactory.py +++ b/geomagio/api/db/MetadataDatabaseFactory.py @@ -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] diff --git a/geomagio/api/secure/metadata.py b/geomagio/api/secure/metadata.py index d397faca1..7dec81c09 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, diff --git a/geomagio/api/ws/metadata.py b/geomagio/api/ws/metadata.py index 1dc77ee2c..300dc3340 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 dff97fbeb..84f52c5e5 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 5b5214849..f776f34cb 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 69e8eeecc..c5546573e 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, -- GitLab From 4b5ac9390d845a05b48717d57a8ef0f2abbe8988 Mon Sep 17 00:00:00 2001 From: pcain-usgs <pcain@usgs.gov> Date: Fri, 16 Apr 2021 10:00:28 -0600 Subject: [PATCH 2/3] request history by ID --- geomagio/api/db/MetadataDatabaseFactory.py | 6 ++++++ geomagio/api/secure/metadata.py | 10 ++++++++++ 2 files changed, 16 insertions(+) diff --git a/geomagio/api/db/MetadataDatabaseFactory.py b/geomagio/api/db/MetadataDatabaseFactory.py index 2453dad8b..a75cdb0a0 100644 --- a/geomagio/api/db/MetadataDatabaseFactory.py +++ b/geomagio/api/db/MetadataDatabaseFactory.py @@ -99,6 +99,12 @@ class MetadataDatabaseFactory(object): metadata.reverse() return metadata + async def get_metadata_history_by_id(self, id: int) -> Metadata: + query = metadata_history.select() + query = query.where(metadata_history.c.id == id) + meta = await self.database.fetch_all(query) + return 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 7dec81c09..95919e03a 100644 --- a/geomagio/api/secure/metadata.py +++ b/geomagio/api/secure/metadata.py @@ -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 len(metadata) != 1: + return Response(status_code=400) + return metadata[0] + + @router.put("/metadata/{id}", response_model=Metadata) async def update_metadata( id: int, -- GitLab From 84e33f5987534e5ed40792e8419938e26525bb13 Mon Sep 17 00:00:00 2001 From: pcain-usgs <pcain@usgs.gov> Date: Wed, 21 Apr 2021 12:59:27 -0600 Subject: [PATCH 3/3] fetch_one for history by id, return status code 400 with no result --- geomagio/api/db/MetadataDatabaseFactory.py | 10 ++++++---- geomagio/api/secure/metadata.py | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/geomagio/api/db/MetadataDatabaseFactory.py b/geomagio/api/db/MetadataDatabaseFactory.py index a75cdb0a0..e97afd772 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 @@ -99,11 +99,13 @@ class MetadataDatabaseFactory(object): metadata.reverse() return metadata - async def get_metadata_history_by_id(self, id: int) -> 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_all(query) - return meta + 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: diff --git a/geomagio/api/secure/metadata.py b/geomagio/api/secure/metadata.py index 95919e03a..8a5251bdc 100644 --- a/geomagio/api/secure/metadata.py +++ b/geomagio/api/secure/metadata.py @@ -95,9 +95,9 @@ async def get_metadata_history_by_id(id: int): metadata = await MetadataDatabaseFactory( database=database ).get_metadata_history_by_id(id=id) - if len(metadata) != 1: + if metadata is None: return Response(status_code=400) - return metadata[0] + return metadata @router.put("/metadata/{id}", response_model=Metadata) -- GitLab