import json from py_jftech import component, parse_date, get_config, to_tuple from api import DatumType, Datum, PortfoliosRisk from basic.dao import robo_base_datum as rbd @component class DefaultDatum(Datum): def __init__(self): self._config = get_config(__name__) @property def excludes(self): return self._config['excludes'] if 'excludes' in self._config else [] def format_datum(self, datum): if DatumType(datum['type']) is DatumType.FUND: return { **datum, 'inceptDate': parse_date(datum['inceptDate']) } return datum def get_datums(self, type: DatumType = None, crncy=None, risk=None, datum_ids=None, ticker=None): datum_ids = to_tuple(datum_ids) if ticker: datums = rbd.get_base_datums(type=type, ticker=ticker) datum_ids = tuple(set(datum_ids or []) | {x['id'] for x in datums}) result = rbd.get_base_datums(type=type, crncy=crncy, risk=risk, datum_ids=datum_ids) result = [{**json.loads(x['datas']), 'id': x['id']} for x in result] return [self.format_datum(x) for x in result if DatumType(x['type']) is not DatumType.FUND or x['bloombergTicker'] not in self.excludes] def get_high_risk_datums(self, risk: PortfoliosRisk): risk3 = self.get_datums(type=DatumType.FUND, risk=3) if risk is PortfoliosRisk.FT3: return risk3 risk3 = [x for x in risk3 if x['assetType'] in ['STOCK', 'BALANCED', 'COMMODITY']] if risk is PortfoliosRisk.FT6: return risk3 + self.get_datums(type=DatumType.FUND, risk=4) if risk is PortfoliosRisk.FT9: return risk3 + self.get_datums(type=DatumType.FUND, risk=(4, 5)) return None