gsheet feeder + db WIP

This commit is contained in:
msramalho
2023-01-04 16:37:36 +00:00
parent 96845305a3
commit bb512b36c9
15 changed files with 195 additions and 65 deletions

View File

@@ -0,0 +1,2 @@
from .database import Database
from .gsheet_db import GsheetsDb

View File

@@ -1,9 +1,11 @@
from __future__ import annotations
from dataclasses import dataclass
from abc import abstractmethod, ABC
from typing import Union
from metadata import Metadata
from steps.step import Step
@dataclass
class Database(Step, ABC):
name = "database"
@@ -11,11 +13,30 @@ class Database(Step, ABC):
def __init__(self, config: dict) -> None:
# without this STEP.__init__ is not called
super().__init__(config)
# only for typing...
def init(name: str, config: dict) -> Database:
# only for typing...
return Step.init(name, config, Database)
@abstractmethod
def enrich(self, item: Metadata) -> Metadata: pass
def started(self, item: Metadata) -> None:
"""signals the DB that the given item archival has started"""
pass
def failed(self, item: Metadata) -> None:
"""update DB accordingly for failure"""
pass
def aborted(self, item: Metadata) -> None:
"""abort notification if user cancelled after start"""
pass
# @abstractmethod
def fetch(self, item: Metadata) -> Union[Metadata, bool]:
"""check if the given item has been archived already"""
return False
@abstractmethod
def done(self, item: Metadata) -> None:
"""archival result ready - should be saved to DB"""
pass

View File

@@ -0,0 +1,64 @@
from typing import Union, Tuple
import gspread
# from metadata import Metadata
from loguru import logger
# from . import Enricher
from databases import Database
from metadata import Metadata
from steps.gsheet import Gsheets
from utils import GWorksheet
class GsheetsDb(Database):
"""
NB: only works if GsheetFeeder is used.
could be updated in the future to support non-GsheetFeeder metadata
"""
name = "gsheet_db"
def __init__(self, config: dict) -> None:
# without this STEP.__init__ is not called
super().__init__(config)
@staticmethod
def configs() -> dict:
return {}
def started(self, item: Metadata) -> None:
logger.warning(f"STARTED {item}")
gw, row = self._retrieve_gsheet(item)
gw.set_cell(row, 'status', 'Archive in progress')
def failed(self, item: Metadata) -> None:
logger.error(f"FAILED {item}")
self._safe_status_update(item, 'Archive failed')
def aborted(self, item: Metadata) -> None:
logger.warning(f"ABORTED {item}")
self._safe_status_update(item, '')
def fetch(self, item: Metadata) -> Union[Metadata, bool]:
"""check if the given item has been archived already"""
# TODO: this should not be done at the feeder stage then!
return False
def done(self, item: Metadata) -> None:
"""archival result ready - should be saved to DB"""
logger.success(f"DONE {item}")
gw, row = self._retrieve_gsheet(item)
self._safe_status_update(item, 'done')
pass
def _safe_status_update(self, item: Metadata, new_status: str) -> None:
try:
gw, row = self._retrieve_gsheet(item)
gw.set_cell(row, 'status', new_status)
except Exception as e:
logger.debug(f"Unable to update sheet: {e}")
def _retrieve_gsheet(self, item: Metadata) -> Tuple[GWorksheet, int]:
gw: GWorksheet = item.get("gsheet").get("worksheet")
row: int = item.get("gsheet").get("row")
return gw, row