aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/report_ops/__main__.py4
-rw-r--r--python/report_ops/admin.py80
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")