aboutsummaryrefslogtreecommitdiffstats
path: root/python/report_ops
diff options
context:
space:
mode:
Diffstat (limited to 'python/report_ops')
-rw-r--r--python/report_ops/status.py76
1 files changed, 76 insertions, 0 deletions
diff --git a/python/report_ops/status.py b/python/report_ops/status.py
new file mode 100644
index 00000000..befaeff3
--- /dev/null
+++ b/python/report_ops/status.py
@@ -0,0 +1,76 @@
+from typing import ClassVar
+from dataclasses import field, dataclass
+import datetime
+import re
+import xml.etree.ElementTree as ET
+from io import BytesIO
+from functools import lru_cache
+
+from serenitas.ops.trade_dataclasses import Deal
+from serenitas.utils.remote import Client
+
+
+class Remote:
+ _client: ClassVar
+
+ def __init_subclass__(self, client_name, folder=None):
+ self.client_name = client_name
+ self.folder = folder
+ self.init_client()
+
+ @classmethod
+ def check_cache(cls):
+ if cls.process.cache_info().currsize == cls.process.cache_info().maxsize:
+ if (cls.process.cache_info().misses / cls.process.cache_info().hits) > 0.5:
+ raise ValueError(
+ "Too many files in the SFTP compared to cache max size"
+ )
+
+ @classmethod
+ def init_client(cls):
+ cls._client = Client.from_creds(cls.client_name)
+ if cls.folder:
+ cls._client.client.cwd(cls.folder)
+
+
+@dataclass
+class QuantifiRemote(
+ Deal,
+ Remote,
+ deal_type=None,
+ table_name="quantifi_submission",
+ client_name="quantifi",
+ folder="/OUTGOING/status",
+):
+ uploadtime: datetime
+ filename: str
+ errors: int
+ warnings: int
+ successes: int
+ total: int
+ id: int = field(default=None, metadata={"insert": False})
+
+ @classmethod
+ @lru_cache(1280)
+ def process(cls, fname):
+ file_io = BytesIO()
+ cls._client.client.retrbinary(f"RETR /OUTGOING/status/{fname}", file_io.write)
+ file_io.seek(0)
+ parse = ET.parse(file_io)
+ data = {key: value for key, value in parse.getroot().items()}
+ data = data | {
+ "uploadtime": cls.extract_ts(fname),
+ "filename": fname.removesuffix(".xml"),
+ "total": data["items"],
+ }
+ return cls.from_dict(**data)
+
+ @staticmethod
+ def extract_ts(filename):
+ timestamp = re.search(
+ r"\d{4}-\d{2}-\d{2}T\d{2}_\d{2}_\d{2}\.\d+", filename
+ ).group()
+ timestamp = timestamp.replace("_", ":")
+ timestamp = timestamp[:-3]
+ timestamp = datetime.datetime.strptime(timestamp, "%Y-%m-%dT%H:%M:%S.%f")
+ return timestamp