from enum import IntEnum, Enum
from abc import ABC
from typing import List, Optional
from derivitec.core.dict_builder_abstract import DictBuilderAbstract
[docs]
class ReportsType(DictBuilderAbstract):
_dotnet_namespace = ""
[docs]
class ReportStatus(IntEnum):
Failed = 2
Running = 3
Null = 0
Succeeded = 1
Warning = 4
[docs]
class ReportData(ReportsType):
[docs]
def __init__(self,
market_data_error_summary=None,
portfolio_name=None,
position_import_errors=None,
real_time_market_data=None,
report_id=None,
report_name=None,
reporting_currency=None,
status=None,
status_message=None,
time_stamp=None):
"""
:param market_data_error_summary: The market data error summary
:param portfolio_name: The portfolio name
:param real_time_market_data: The real time market data
:param report_id: The report id
:param report_name: The report name
:param reporting_currency: The reporting currency
:param status: The status
:param status_message: The status message
:param time_stamp: The time stamp
:param position_import_errors: The position_import_errors
"""
self.market_data_error_summary = market_data_error_summary
self.portfolio_name = portfolio_name
self.real_time_market_data = real_time_market_data
self.report_id = report_id
self.report_name = report_name
self.reporting_currency = reporting_currency
self.status = status
self.status_message = status_message
self.time_stamp = time_stamp
self.position_import_errors = position_import_errors
def json_params(self):
params = [
'market_data_error_summary',
'portfolio_name',
'position_import_errors',
'real_time_market_data',
'report_id',
'report_name',
'reporting_currency',
'status',
'status_message',
'time_stamp',
]
return params
[docs]
class RiskReportData(ReportData):
[docs]
def __init__(self,
data_tables=None,
market_data_date=None,
market_data_error_summary=None,
portfolio_date_time=None,
portfolio_name=None,
position_import_errors=None,
pricing_date=None,
real_time_market_data=None,
report_id=None,
report_name=None,
reporting_currency=None,
status=None,
status_message=None,
time_stamp=None):
"""
:param data_tables: The data tables
:param market_data_date: The market data date
:param market_data_error_summary: The market data error summary
:param portfolio_date_time: The portfolio date time
:param portfolio_name: The portfolio name
:param position_import_errors: The position_import_errors
:param pricing_date: The pricing date
:param real_time_market_data: The real time market data
:param report_id: The report id
:param report_name: The report name
:param reporting_currency: The reporting currency
:param status: The status
:param status_message: The status message
:param time_stamp: The time stamp
"""
self.market_data_date = market_data_date
self.pricing_date = pricing_date
self.portfolio_date_time = portfolio_date_time
self.data_tables = data_tables
super(RiskReportData, self).__init__(
market_data_error_summary=market_data_error_summary,
portfolio_name=portfolio_name,
position_import_errors=position_import_errors,
real_time_market_data=real_time_market_data,
report_id=report_id,
report_name=report_name,
reporting_currency=reporting_currency,
status=status,
status_message=status_message,
time_stamp=time_stamp)
def json_params(self):
params = [
'market_data_date',
'pricing_date',
'portfolio_date_time',
'data_tables',
]
params += super(RiskReportData, self).json_params()
return params
[docs]
class VarReportData(ReportData):
[docs]
def __init__(self,
market_data_date=None,
market_data_error_summary=None,
portfolio_date_time=None,
portfolio_id=None,
portfolio_name=None,
position_import_errors=None,
pricing_date=None,
real_time_market_data=None,
portfolio_var_statistics=None,
report_id=None,
reporting_currency=None,
report_name=None,
scenario_portfolio_var_statistics=None,
scenarios=None,
status=None,
status_message=None,
time_stamp=None,
tradable_var_statistics=None,
position_infos=None,
user_time_zone_id=None,
historical_observation_dates=None,
excluded_price_histories_by_tradable_id=None,
excluded_scenario_price_histories_by_tradable_id=None,
price_histories_by_tradable_id=None,
scenario_price_histories_by_tradable_id=None):
"""
:param portfolio_var_statistics: The portfolio var statistics
:param market_data_error_summary: market data error summary
:param portfolio_date_time: portfolio date time
:param portfolio_id: portfolio id
:param portfolio_name: portfolio name
:param portfolio_var_statistics: portfolio var statistics
:param position_import_errors: position_import_errors
:param report_id: report id
:param reporting_currency: reporting currency
:param report_name: report name
:param scenario_portfolio_var_statistics: scenario portfolio var statistics
:param scenarios: scenarios
:param status: status
:param status_message: status message
:param time_stamp: time tamp
:param tradable_var_statistics: tradable var statistics
:param position_infos: position infos
:param user_time_zone_id: user time zone id
:param historical_observation_dates: historical_observation_dates
:param excluded_price_histories_by_tradable_id: excluded_price_histories_by_tradable_id
:param excluded_scenario_price_histories_by_tradable_id: excluded_scenario_price_histories_by_tradable_id
:param price_histories_by_tradable_id: price_histories_by_tradable_id
:param scenario_price_histories_by_tradable_id: scenario_price_histories_by_tradable_id
"""
self.market_data_date = market_data_date
self.pricing_date = pricing_date
self.portfolio_date_time = portfolio_date_time
self.portfolio_id = portfolio_id
self.portfolio_var_statistics = portfolio_var_statistics
self.scenario_portfolio_var_statistics = scenario_portfolio_var_statistics
self.scenarios = scenarios
self.tradable_var_statistics = tradable_var_statistics
self.position_infos = position_infos
self.user_time_zone_id = user_time_zone_id
self.historical_observation_dates = historical_observation_dates
self.excluded_price_histories_by_tradable_id = excluded_price_histories_by_tradable_id
self.excluded_scenario_price_histories_by_tradable_id = excluded_scenario_price_histories_by_tradable_id
self.price_histories_by_tradable_id = price_histories_by_tradable_id
self.scenario_price_histories_by_tradable_id = scenario_price_histories_by_tradable_id
super(VarReportData, self).__init__(
market_data_error_summary=market_data_error_summary,
portfolio_name=portfolio_name,
position_import_errors=position_import_errors,
real_time_market_data=real_time_market_data,
report_id=report_id,
report_name=report_name,
reporting_currency=reporting_currency,
status=status,
status_message=status_message,
time_stamp=time_stamp)
def json_params(self):
params = [
'portfolio_id',
'portfolio_var_statistics',
'scenario_portfolio_var_statistics',
'scenarios',
'tradable_var_statistics',
'position_infos',
'user_time_zone_id',
'historical_observation_dates',
'excluded_price_histories_by_tradable_id',
'excluded_scenario_price_histories_by_tradable_id',
'price_histories_by_tradable_id',
'scenario_price_histories_by_tradable_id',
'market_data_date',
'pricing_date',
'portfolio_date_time'
]
params += super(VarReportData, self).json_params()
return params
[docs]
class SignalrRiskReportResponse(ReportsType):
[docs]
def __init__(self,
delivery_tag=None,
is_complete=None,
message_type=None,
progress=None,
reply_to_session_id=None,
report_id=None,
report_status=None,
report_status_message=None,
request_id=None,
routing_key=None,
session_id=None,
time_stamp=None,
user_id=None):
"""
:param delivery_tag: The delivery tag
:param is_complete: The is complete
:param message_type: The message type
:param progress: The progress
:param reply_to_session_id: The reply to session id
:param report_id: The report id
:param report_status: The report status
:param report_status_message: The report status message
:param request_id: The request id
:param routing_key: The routing key
:param session_id: The session id
:param time_stamp: The time stamp
:param user_id: The user id
"""
self.delivery_tag = delivery_tag
self.is_complete = is_complete
self.message_type = message_type
self.progress = progress
self.reply_to_session_id = reply_to_session_id
self.report_id = report_id
self.report_status = report_status
self.report_status_message = report_status_message
self.request_id = request_id
self.routing_key = routing_key
self.session_id = session_id
self.time_stamp = time_stamp
self.user_id = user_id
def json_params(self):
params = [
'delivery_tag',
'is_complete',
'message_type',
'progress',
'reply_to_session_id',
'report_id',
'report_status',
'report_status_message',
'request_id',
'routing_key',
'session_id',
'time_stamp',
'user_id',
]
return params
[docs]
class Equal(ReportsType):
[docs]
def __init__(self,
column_name=None,
value=None):
"""
:param column_name: The column name
:param value: The value
"""
self.column_name = column_name
self.value = value
def json_params(self):
params = [
'column_name',
'value',
]
return params
[docs]
class RiskReportInfo(ReportsType):
[docs]
def __init__(self,
description=None,
id=None,
mkt_data_date=None,
portfolio_name=None,
pricing_date=None,
real_time_mkt_data=None,
report_name=None,
reporting_currency=None,
status=None,
status_message=None,
time_stamp=None,
market_data_environment_names=None,
run_by_user=None):
"""
:param description: The description
:param id: The id
:param mkt_data_date: The mkt data date
:param portfolio_name: The portfolio name
:param pricing_date: The pricing date
:param real_time_mkt_data: The real time mkt data
:param report_name: The report name
:param reporting_currency: The reporting currency
:param status: The status
:param status_message: The status message
:param time_stamp: The time stamp
:param market_data_environment_names: The list of market data environments the report was run against
:param run_by_user: The email address of the user that ran the report.
"""
self.description = description
self.id = id
self.mkt_data_date = mkt_data_date
self.portfolio_name = portfolio_name
self.pricing_date = pricing_date
self.real_time_mkt_data = real_time_mkt_data
self.report_name = report_name
self.reporting_currency = reporting_currency
self.status = status
self.status_message = status_message
self.time_stamp = time_stamp
self.market_data_environment_names = market_data_environment_names
self.run_by_user = run_by_user
def json_params(self):
params = [
'description',
'id',
'mkt_data_date',
'portfolio_name',
'pricing_date',
'real_time_mkt_data',
'report_name',
'reporting_currency',
'status',
'status_message',
'time_stamp',
'market_data_environment_names',
'run_by_user'
]
return params
[docs]
class VarReportInfo(ReportsType):
[docs]
def __init__(self,
confidence_level=None,
first_observation_date=None,
historical_start_date_rule=None,
id=None,
mkt_data_date=None,
portfolio_id=None,
portfolio_name=None,
pricing_date=None,
real_time_mkt_data=None,
reporting_currency=None,
report_name=None,
status=None,
status_message=None,
time_stamp=None,
var_horizon=None):
"""
:param confidence_level: The confidence_level
:param first_observation_date: The first_observation_date
:param historical_start_date_rule: The historical_start_date_rule
:param id: The id
:param mkt_data_date: The mkt_data_date
:param portfolio_id: The portfolio_id
:param portfolio_name: The portfolio_name
:param pricing_date: The pricing_date
:param real_time_mkt_data: The real_time_mkt_data
:param reporting_currency: The reporting_currency
:param report_name: The report name
:param status: The status
:param status_message: The status_message
:param time_stamp: The time_stamp
:param var_horizon: The var_horizon
"""
self.confidence_level = confidence_level
self.first_observation_date = first_observation_date
self.historical_start_date_rule = historical_start_date_rule
self.id = id
self.mkt_data_date = mkt_data_date
self.portfolio_id = portfolio_id
self.portfolio_name = portfolio_name
self.pricing_date = pricing_date
self.real_time_mkt_data = real_time_mkt_data
self.reporting_currency = reporting_currency
self.report_name = report_name
self.status = status
self.status_message = status_message
self.time_stamp = time_stamp
self.var_horizon = var_horizon
def json_params(self):
params = [
'confidence_level',
'first_observation_date',
'historical_start_date_rule',
'id',
'mkt_data_date',
'portfolio_id',
'portfolio_name',
'pricing_date',
'real_time_mkt_data',
'reporting_currency',
'report_name',
'status',
'status_message',
'time_stamp',
'var_horizon'
]
return params
[docs]
class VarPositionInfo(ReportsType):
[docs]
def __init__(self,
asset_id=None,
asset_name=None,
bond_issuer_type=None,
book_id=None,
book_name=None,
business_unit=None,
client=None,
client_name=None,
client_tradable_id=None,
client_transaction_id=None,
commodity_id=None,
counterparty=None,
counterparty_account=None,
counterparty_name=None,
date_label1=None,
date_label2=None,
dealer_name=None,
dealer_status=None,
dealing_bank=None,
dealing_bank_name=None,
decimal_label1=None,
decimal_label2=None,
entity=None,
equity_asset_code=None,
exchange=None,
futures_contract_size=None,
fx_cross=None,
fx_cross_id=None,
holding=None,
instrument_code=None,
issuer_name=None,
leg=None,
level1_portfolio_id=None,
level1_portfolio_name=None,
level2_portfolio_id=None,
level2_portfolio_name=None,
level3_portfolio_id=None,
level3_portfolio_name=None,
level4_portfolio_id=None,
level4_portfolio_name=None,
level5_portfolio_id=None,
level5_portfolio_name=None,
notes=None,
quantity=None,
sector=None,
country_of_risk=None,
contract_currency=None,
security_type=None,
strategy=None,
structure=None,
sub_business_unit=None,
team=None,
tradable=None,
tradable_id=None,
product_type=None,
string_label1=None,
string_label2=None,
string_label3=None,
string_label4=None,
string_label5=None,
string_label6=None,
string_label7=None,
string_label8=None,
string_label9=None,
string_label10=None,
string_label11=None,
string_label12=None,
string_label13=None,
string_label14=None,
string_label15=None,
ctpty_string_label1=None,
ctpty_string_label2=None,
ctpty_string_label3=None,
calculated_string_label1=None,
calculated_string_label2=None,
calculated_string_label3=None,
calculated_string_label4=None,
**kwargs):
"""
: param asset_id: asset_id
: param asset_name: asset_name
: param bond_issuer_type: bond_issuer_type
: param book_id: book_id
: param book_name: book_name
: param business_unit: business_unit
: param client: client
: param client_name: client_name
: param client_tradable_id: client_tradable_id
: param client_transaction_id: client_transaction_id
: param commodity_id: commodity_id
: param counterparty: counterparty
: param counterparty_account: counterparty_account
: param counterparty_name: counterparty_name
: param date_label1: date_label1
: param date_label2: date_label2
: param dealer_name: dealer_name
: param dealer_status: dealer_status
: param dealing_bank: dealing_bank
: param dealing_bank_name: dealing_bank_name
: param decimal_label1: decimal_label1
: param decimal_label2: decimal_label2
: param entity: entity
: param equity_asset_code: equity asset code
: param exchange: exchange
: param futures_contract_size: futures_contract_size
: param fx_cross: fx_cross
: param fx_cross_id: fx_cross_id
: param holding: holding
: param instrument_code: instrument_code
: param issuer_name: issuer name
: param leg: leg
: param level1_portfolio_id: level1_portfolio_id
: param level1_portfolio_name: level1_portfolio_name
: param level2_portfolio_id: level2_portfolio_id
: param level2_portfolio_name: level2_portfolio_name
: param level3_portfolio_id: level3_portfolio_id
: param level3_portfolio_name: level3_portfolio_name
: param level4_portfolio_id: level4_portfolio_id
: param level4_portfolio_name: level4_portfolio_name
: param level5_portfolio_id: level5_portfolio_id
: param level5_portfolio_name: level5_portfolio_name
: param notes: notes
: param quantity: quantity
: param sector: sector
: param country_of_risk: country_of_risk
: param contract_currency: contract_currency
: param security_type: security_type
: param strategy: strategy
: param structure: structure
: param sub_business_unit: sub_business_unit
: param team: team
: param tradable: tradable
: param tradableid: tradableid
: param producttype: producttype
: param string_label1: string_label1
: param string_label2: string_label2
: param string_label3: string_label3
: param string_label4: string_label4
: param string_label5: string_label5
: param ctpty_string_label1: ctpty_string_label1
: param ctpty_string_label2: ctpty_string_label2
: param ctpty_string_label3: ctpty_string_label3
: param calculated_string_label1: calculated_string_label1
: param calculated_string_label2: calculated_string_label2
: param calculated_string_label3: calculated_string_label3
: param calculated_stringlabel4: calculated_stringlabel4
"""
self.asset_id = asset_id
self.asset_name = asset_name
self.bond_issuer_type = bond_issuer_type
self.book_id = book_id
self.book_name = book_name
self.business_unit = business_unit
self.client = client
self.client_name = client_name
self.client_tradable_id = client_tradable_id
self.client_transaction_id = client_transaction_id
self.commodity_id = commodity_id
self.counterparty = counterparty
self.counterparty_account = counterparty_account
self.counterparty_name = counterparty_name
self.date_label1 = date_label1
self.date_label2 = date_label2
self.dealer_name = dealer_name
self.dealer_status = dealer_status
self.dealing_bank = dealing_bank
self.dealing_bank_name = dealing_bank_name
self.decimal_label1 = decimal_label1
self.decimal_label2 = decimal_label2
self.entity = entity
self.equity_asset_code = equity_asset_code
self.exchange = exchange
self.futures_contract_size = futures_contract_size
self.fx_cross = fx_cross
self.fx_cross_id = fx_cross_id
self.holding = holding
self.instrument_code = instrument_code
self.issuer_name = issuer_name
self.leg = leg
self.level1_portfolio_id = level1_portfolio_id
self.level1_portfolio_name = level1_portfolio_name
self.level2_portfolio_id = level2_portfolio_id
self.level2_portfolio_name = level2_portfolio_name
self.level3_portfolio_id = level3_portfolio_id
self.level3_portfolio_name = level3_portfolio_name
self.level4_portfolio_id = level4_portfolio_id
self.level4_portfolio_name = level4_portfolio_name
self.level5_portfolio_id = level5_portfolio_id
self.level5_portfolio_name = level5_portfolio_name
self.notes = notes
self.quantity = quantity
self.sector = sector
self.country_of_risk = country_of_risk
self.contract_currency = contract_currency
self.security_type = security_type
self.strategy = strategy
self.structure = structure
self.sub_business_unit = sub_business_unit
self.team = team
self.tradable = tradable
self.tradable_id = tradable_id
self.product_type = product_type
self.string_label1 = string_label1
self.string_label2 = string_label2
self.string_label3 = string_label3
self.string_label4 = string_label4
self.string_label5 = string_label5
self.string_label6 = string_label6
self.string_label7 = string_label7
self.string_label8 = string_label8
self.string_label9 = string_label9
self.string_label10 = string_label10
self.string_label11 = string_label11
self.string_label12 = string_label12
self.string_label13 = string_label13
self.string_label14 = string_label14
self.string_label15 = string_label15
self.ctpty_string_label1 = ctpty_string_label1
self.ctpty_string_label2 = ctpty_string_label2
self.ctpty_string_label3 = ctpty_string_label3
self.calculated_string_label1 = calculated_string_label1
self.calculated_string_label2 = calculated_string_label2
self.calculated_string_label3 = calculated_string_label3
self.calculated_string_label4 = calculated_string_label4
def json_params(self):
params = [
'asset_id',
'asset_name',
'bond_issuer_type',
'book_id',
'book_name',
'business_unit',
'client',
'client_name',
'client_tradable_id',
'client_transaction_id',
'commodity_id',
'counterparty',
'counterparty_account',
'counterparty_name',
'date_label1',
'date_label2',
'dealer_name',
'dealer_status',
'dealing_bank',
'dealing_bank_name',
'decimal_label1',
'decimal_label2',
'entity',
'equity_asset_code',
'exchange',
'futures_contract_size',
'fx_cross',
'fx_cross_id',
'holding',
'instrument_code',
'issuer_name',
'leg',
'level1_portfolio_id',
'level1_portfolio_name',
'level2_portfolio_id',
'level2_portfolio_name',
'level3_portfolio_id',
'level3_portfolio_name',
'level4_portfolio_id',
'level4_portfolio_name',
'level5_portfolio_id',
'level5_portfolio_name',
'notes',
'quantity',
'sector',
'country_of_risk',
'contract_currency',
'security_type',
'strategy',
'structure',
'sub_business_unit',
'team',
'tradable',
'tradable_id',
'product_type',
'string_label1',
'string_label2',
'string_label3',
'string_label4',
'string_label5',
'string_label6',
'string_label7',
'string_label8',
'string_label9',
'string_label10',
'string_label11',
'string_label12',
'string_label13',
'string_label14',
'string_label15',
'ctpty_string_label1',
'ctpty_string_label2',
'ctpty_string_label3',
'calculated_string_label1',
'calculated_string_label2',
'calculated_string_label3',
'calculated_string_label4'
]
return params
[docs]
class PnlReportData(ReportData):
[docs]
def __init__(self,
market_data_error_summary=None,
portfolio_name=None,
position_import_errors=None,
real_time_market_data=None,
report_id=None,
reporting_currency=None,
report_name=None,
status=None,
status_message=None,
time_stamp=None,
initial_date_time=None,
final_date_time=None,
data_tables=None):
"""
:param market_data_error_summary: market data error summary
:param portfolio_name: portfolio name
:param position_import_errors: position_import_errors
:param report_id: report id
:param reporting_currency: reporting currency
:param report_name: report name
:param status: status
:param status_message: status message
:param time_stamp: time tamp
:param initial_date_time: pnl initial date
:param final_date_time: pnl final date
:param data_tables: report data tables
"""
self.initial_date_time = initial_date_time
self.final_date_time = final_date_time
self.data_tables = data_tables
super(PnlReportData, self).__init__(
market_data_error_summary=market_data_error_summary,
portfolio_name=portfolio_name,
position_import_errors=position_import_errors,
real_time_market_data=real_time_market_data,
report_id=report_id,
report_name=report_name,
reporting_currency=reporting_currency,
status=status,
status_message=status_message,
time_stamp=time_stamp)
def json_params(self):
params = [
'initial_date_time',
'final_date_time',
'data_tables'
]
params += super(PnlReportData, self).json_params()
return params
[docs]
class PnlReportInfo(ReportsType):
[docs]
def __init__(self,
description=None,
id=None,
portfolio_name=None,
real_time_mkt_data=None,
reporting_currency=None,
report_name=None,
status=None,
status_message=None,
time_stamp=None,
initial_date_time=None,
final_date_time=None):
"""
:param description: description
:param id: id
:param portfolio_name: portfolio name
:param real_time_mkt_data: real time mkt data flag
:param reporting_currency: reporting currency
:param report_name: report name
:param status: status
:param status_message: status message
:param time_stamp: time tamp
:param initial_date_time: pnl initial date
:param final_date_time: pnl final date
"""
self.description = description
self.id = id
self.portfolio_name = portfolio_name
self.real_time_mkt_data = real_time_mkt_data
self.report_name = report_name
self.reporting_currency = reporting_currency
self.status = status
self.status_message = status_message
self.time_stamp = time_stamp
self.initial_date_time = initial_date_time
self.final_date_time = final_date_time
def json_params(self):
params = [
'description',
'id',
'portfolio_name',
'real_time_mkt_data',
'report_name',
'reporting_currency',
'status',
'status_message',
'time_stamp',
'initial_date_time',
'final_date_time'
]
params += super(PnlReportInfo, self).json_params()
return params
[docs]
class FilterBase(ABC):
[docs]
def __init__(self, field: Optional[str] = None):
self.field = field
def to_dict(self):
return {"field": self.field}
[docs]
class FilterType(Enum):
EQUAL = "equal"
CONTAIN = "contain"
STARTSWITH = "startswith"
ENDSWITH = "endswith"
BLANK = "blank"
NOT_EQUAL = "notEqual"
NOT_CONTAIN = "notContain"
NOT_STARTSWITH = "notStartswith"
NOT_ENDSWITH = "notEndswith"
NOT_BLANK = "notBlank"
[docs]
class Filter(FilterBase, ABC):
[docs]
def __init__(self,
field: Optional[str] = None,
filter_type: Optional[FilterType] = None):
super().__init__(field=field)
self.filter_type = filter_type
def to_dict(self):
base = super().to_dict()
base.update({"type": self.filter_type.value if self.filter_type else None})
return base
[docs]
class StringFilter(Filter):
[docs]
def __init__(self,
filter_value: Optional[str] = None,
field: Optional[str] = None,
filter_type: Optional[FilterType] = None):
super().__init__(field=field, filter_type=filter_type)
self.filter = filter_value
def to_dict(self):
base = super().to_dict()
base.update({"$type": "StringFilter"})
base.update({"filter": self.filter})
return base
[docs]
class MultiFilterOperator(Enum):
NOT_SET = 0
AND = 1
OR = 2
[docs]
class MultiFilter(FilterBase):
[docs]
def __init__(self,
operator: MultiFilterOperator = MultiFilterOperator.NOT_SET,
conditions: Optional[List[FilterBase]] = None):
super().__init__(field=None)
self.operator = operator
self.conditions = conditions if conditions is not None else []
def to_dict(self):
return {
"$type": "MultiFilter",
"operator": self.operator.value,
"conditions": [c.to_dict() for c in self.conditions]
}
[docs]
class DataTableQuery:
[docs]
def __init__(self,
filter: Optional[FilterBase] = None,
columns: Optional[List[str]] = None):
self.filter = filter
self.columns = columns if columns is not None else []
def to_dict(self):
return {
"filter": self.filter.to_dict() if self.filter else None,
"columns": self.columns,
}