diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/report_ops/base.py | 43 | ||||
| -rw-r--r-- | python/report_ops/cash.py | 7 | ||||
| -rw-r--r-- | python/report_ops/wires.py | 42 |
3 files changed, 49 insertions, 43 deletions
diff --git a/python/report_ops/base.py b/python/report_ops/base.py new file mode 100644 index 00000000..367faf50 --- /dev/null +++ b/python/report_ops/base.py @@ -0,0 +1,43 @@ +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") + + 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 = [] + + @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 + + @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() diff --git a/python/report_ops/cash.py b/python/report_ops/cash.py index f851d8d1..552058a8 100644 --- a/python/report_ops/cash.py +++ b/python/report_ops/cash.py @@ -12,7 +12,7 @@ from serenitas.ops.trade_dataclasses import Ccy from serenitas.ops.dataclass_mapping import Fund from .misc import Custodian, get_dir -from .wires import Report +from .base import Report @dataclass @@ -24,6 +24,7 @@ class CashReport(Report, table_name="cash_balances"): currency_code: Ccy balance: float custodian: ClassVar[Custodian] = field(metadata={"insert": False}) + _registry: ClassVar = field(default={}, metadata={"insert": False}) def __init_subclass__(cls, custodian): cls.custodian = custodian @@ -144,8 +145,8 @@ class ScotiaCashReport(CashReport, custodian="SCOTIA"): return cls( date=prev_business_day(d["knowledge_date"]), fund=d["fund"], - account_name=d["Account"], - account_number=d["Account Name"], + account_name=d["Account Name"], + account_number=d["Account"], currency_code="USD", balance=d["Opening Bal."], ) diff --git a/python/report_ops/wires.py b/python/report_ops/wires.py index baaae19d..6da3ac29 100644 --- a/python/report_ops/wires.py +++ b/python/report_ops/wires.py @@ -13,46 +13,7 @@ from serenitas.utils.env import DAILY_DIR from serenitas.utils.db2 import dbconn from .misc import get_dir, dt_from_fname, Custodian - - -class Report: - _sql_insert: ClassVar[str] - _insert_queue: ClassVar[list] - _insert_fields: ClassVar[list] - _conn: ClassVar = dbconn("dawndb") - _registry = {} - - 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 = [] - - @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 - - @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() +from .base import Report @dataclass @@ -68,6 +29,7 @@ class WireReport(Report, table_name="custodian_wires"): wire_details: str unique_ref: str dtkey: ClassVar = field(metadata={"insert": False}) + _registry: ClassVar = field(default={}, metadata={"insert": False}) def __init_subclass__(cls, custodian, dtkey): cls.custodian = custodian |
