diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/report_ops/__main__.py | 4 | ||||
| -rw-r--r-- | python/report_ops/admin.py | 80 |
2 files changed, 42 insertions, 42 deletions
diff --git a/python/report_ops/__main__.py b/python/report_ops/__main__.py index 606150b2..ff241e23 100644 --- a/python/report_ops/__main__.py +++ b/python/report_ops/__main__.py @@ -103,9 +103,9 @@ if args.cash_reports or args.wire_reports: if args.isosel_reports: for fund in ("ISOSEL",): for report in ("isosel_accrued", "citco_reports"): - report = CitcoReport[report] + report = CitcoReport[report](cob, fund) try: - report.to_db(cob, fund) + report.to_db() except MissingDataError as e: logger.warning(e) diff --git a/python/report_ops/admin.py b/python/report_ops/admin.py index 2cb927b4..951ebcb1 100644 --- a/python/report_ops/admin.py +++ b/python/report_ops/admin.py @@ -1,11 +1,12 @@ from typing import ClassVar import datetime -from dataclasses import dataclass +from dataclasses import dataclass, field import re import pandas as pd from serenitas.utils.remote import SftpClient -from serenitas.utils.db import dawn_engine, dbconn +from serenitas.utils.db import dawn_engine +from sqlalchemy.engine import Engine from serenitas.analytics.dates import next_business_day, prev_business_day from serenitas.analytics.exceptions import MissingDataError @@ -14,39 +15,40 @@ _suffix = {"ISOSEL": "IM", "CRSE": "IMCG"} @dataclass class CitcoReport: - report_name: ClassVar + _engine: ClassVar[Engine] = dawn_engine + _sftp: ClassVar[SftpClient] = SftpClient.from_creds("citco", folder="outgoing") table: ClassVar - knowledge_date: datetime.date = None - _conn: dbconn = dbconn("dawndb") - _sftp: ClassVar = SftpClient.from_creds("citco", folder="outgoing") + knowledge_date: datetime.date + fund: str + file_pattern: str = field(init=False) date_cols: ClassVar = [] - prefix: ClassVar - _registry = {} + pattern: ClassVar[str] + _registry: ClassVar = {} - def __init_subclass__(cls, table, date_cols, prefix): + def __init_subclass__(cls, table, date_cols, pattern): cls.table = table cls.date_cols = date_cols - cls.prefix = prefix + cls.pattern = pattern cls._registry[table] = cls + def __post_init__(self): + self.file_pattern = self.pattern.format( + fund=self.fund, suffix=_suffix[self.fund] + ) + def __class_getitem__(cls, table): return cls._registry[table] - @staticmethod - def get_report_date(cob): - return cob - - @classmethod - def get_report(cls, date, fund): + def get_report(self): reports = [ f - for f in cls._sftp.client.listdir() - if (cls.prefix.format(fund=fund, suffix=_suffix[fund]) in f) - and cls.get_ts(f).date() == date + for f in self._sftp.client.listdir() + if f.startswith(self.file_pattern) + and self.get_ts(f).date() == self.knowledge_date ] return max( reports, - key=cls.get_ts, + key=self.get_ts, default=None, ) @@ -66,26 +68,24 @@ class CitcoReport: ) return df - @classmethod - def to_db(cls, date, fund): - if report_name := cls.get_report(date, fund): - conn = cls._conn - df = cls.get_df(report_name) - df["fund"] = fund + def to_db(self): + if report_name := self.get_report(): + df = self.get_df(report_name) + df["fund"] = self.fund - with conn.cursor() as c: - c.execute( - f"DELETE FROM {cls.table} WHERE period_end_date=%s AND fund=%s", + with self._engine.connect() as conn: + conn.execute( + f"DELETE FROM {self.table} WHERE period_end_date=%s AND fund=%s", ( - date, - fund, + self.knowledge_date, + self.fund, ), ) - conn.commit() - - df.to_sql(cls.table, dawn_engine, if_exists="append", index=False) + df.to_sql(self.table, self._engine, if_exists="append", index=False) else: - raise MissingDataError(f"{fund}: {cls.table} report not ready for {date}") + raise MissingDataError( + f"{self.fund}: {self.table} report not ready for {self.date}" + ) class AccruedReport( @@ -101,21 +101,21 @@ class AccruedReport( "Start Date", "End Date", ], - prefix="100502500_INNOCAP_{fund}_", + pattern="100502500_INNOCAP_{fund}_", ): @staticmethod def get_ts(s): - m = re.search(r"\d{8}\d{4}", s) - return prev_business_day(datetime.datetime.strptime(m.group(), "%Y%m%d%H%M%S")) + m = re.search(r"\d{12}", s) + return prev_business_day(datetime.datetime.strptime(m[0], "%Y%m%d%H%M%S")) class AllReport( CitcoReport, table="citco_reports", date_cols=["Maturity Date"], - prefix="SPOS4X_INNOCAP_{fund}_D_{suffix}", + pattern="SPOS4X_INNOCAP_{fund}_D_{suffix}", ): @staticmethod def get_ts(s): m = re.search(r"\d{8}\.\d{6}", s) - return datetime.datetime.strptime(m.group(), "%Y%m%d.%H%M%S") + return datetime.datetime.strptime(m[0], "%Y%m%d.%H%M%S") |
