aboutsummaryrefslogtreecommitdiffstats
path: root/python/report_ops/base.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/report_ops/base.py')
-rw-r--r--python/report_ops/base.py43
1 files changed, 11 insertions, 32 deletions
diff --git a/python/report_ops/base.py b/python/report_ops/base.py
index 367faf50..7517591b 100644
--- a/python/report_ops/base.py
+++ b/python/report_ops/base.py
@@ -1,43 +1,22 @@
from typing import ClassVar
-from dataclasses import Field
from serenitas.utils.db2 import dbconn
class Report:
_sql_insert: ClassVar[str]
- _insert_queue: ClassVar[list]
- _insert_fields: ClassVar[list]
_conn: ClassVar = dbconn("dawndb")
+ _registry: ClassVar[dict] = {}
- def __init_subclass__(cls, table_name: str):
- cls._insert_fields = list(filter(cls.is_insert_field, cls.__annotations__))
- place_holders = ",".join(["%s"] * len(cls._insert_fields))
- cls._sql_insert = f"INSERT INTO {table_name}({','.join(cls._insert_fields)}) VALUES({place_holders}) ON CONFLICT DO NOTHING RETURNING *"
- cls._insert_queue = []
+ def __init_subclass__(cls, table_name: str, columns: tuple[str], **kwargs):
+ super().__init_subclass__(**kwargs)
+ place_holders = ",".join(["%s"] * len(columns))
+ cls._sql_insert = f"INSERT INTO {table_name}({','.join(columns)}) VALUES({place_holders}) ON CONFLICT DO NOTHING RETURNING *"
- @classmethod
- def is_insert_field(cls, attr):
- """fields are insertable by default unless specified otherwise"""
- match getattr(cls, attr, None):
- case Field(metadata={"insert": False}) | Field(init=False):
- return False
- case _:
- return True
+ def __class_getitem__(cls, key):
+ return cls._registry[key]
- @classmethod
- def clear(cls):
- cls._insert_queue.clear()
-
- def stage(self):
- self._insert_queue.append(
- tuple([getattr(self, col) for col in self._insert_fields])
- )
-
- @classmethod
- def commit(cls):
- conn = cls._conn
- with conn.cursor() as c:
- c.executemany(cls._sql_insert, cls._insert_queue)
- conn.commit()
- cls._insert_queue.clear()
+ def commit(self):
+ with self._conn.cursor() as c:
+ c.executemany(self._sql_insert, self)
+ self._conn.commit()