class RemoteRequest(OrderedXmlObject, XmlObject): """ Used to set the URL and query details for synchronous search. See "remote-request" in the `CommCare 2.0 Suite Definition`_ for details. .. _CommCare 2.0 Suite Definition: https://github.com/dimagi/commcare/wiki/Suite20#remote-request """ ROOT_NAME = 'remote-request' ORDER = ('post', 'command', 'instances', 'session', 'stack') post = NodeField('post', RemoteRequestPost) instances = NodeListField('instance', Instance) command = NodeField('command', Command) session = NodeField('session', RemoteRequestSession) stack = NodeField('stack', Stack)
class Entry(OrderedXmlObject, XmlObject): ROOT_NAME = 'entry' ORDER = ('form', 'command', 'instance', 'datums') form = StringField('form') command = NodeField('command', Command) instances = NodeListField('instance', Instance) datums = NodeListField('session/datum', SessionDatum) queries = NodeListField('session/query', RemoteRequestQuery) session_children = NodeListField('session/*', _wrap_session_datums) all_datums = NodeListField( 'session/*[self::datum or self::instance-datum]', _wrap_session_datums) stack = NodeField('stack', Stack) assertions = NodeListField('assertions/assert', Assertion) def require_instances(self, instances=(), instance_ids=()): used = {(instance.id, instance.src) for instance in self.instances} for instance in instances: if 'remote' in instance.src: continue if (instance.id, instance.src) not in used: self.instances.append( # it's important to make a copy, # since these can't be reused Instance(id=instance.id, src=instance.src)) # make sure the first instance gets inserted # right after the command # once you "suggest" a placement to eulxml, # it'll follow your lead and place the rest of them there too if len(self.instances) == 1: instance_node = self.node.find('instance') command_node = self.node.find('command') self.node.remove(instance_node) self.node.insert( self.node.index(command_node) + 1, instance_node) covered_ids = {instance_id for instance_id, _ in used} for instance_id in instance_ids: if instance_id not in covered_ids: raise UnknownInstanceError( "Instance reference not recognized: {} in XPath \"{}\"" # to get xpath context to show in this error message # make instance_id a unicode subclass with an xpath property .format(instance_id, getattr(instance_id, 'xpath', "(XPath Unknown)"))) sorted_instances = sorted(self.instances, key=lambda instance: instance.id) if sorted_instances != self.instances: self.instances = sorted_instances
class Feed(OrderedXmlObject): ROOT_NAME = 'feed' ROOT_NS = NS['atom'] ROOT_NAMESPACES = NS ORDER = ('title', 'ids', 'updated', 'author_name', 'author_email', 'entries') title = StringField('atom:title') ids = EntryIdListField('atom:id') updated = UTCDateTimeField('atom:updated') author_name = StringField('atom:author/atom:name') author_email = StringField('atom:author/atom:email') entries = NodeListField('atom:entry', Entry) def __init__(self, node=None, context=None, **kwargs): if node is None and 'title' not in kwargs: kwargs['title'] = 'Mail Filters' super(Feed, self).__init__(node, context, **kwargs)
class ClientLimitsTPlus(Entity): """ Максимальная покупка/продажа для Т+. """ ROOT_NAME = 'max_buy_sell_tplus' # Идентификатор клиента id = client = StringField('@client') class _Security(MyXmlObject): # Id бумаги secid = IntegerField('@secid') # Внутренний код рынка market = IntegerField('market') # Код инструмента seccode = StringField('seccode') # Максимум купить (лотов) max_buy = IntegerField('maxbuy') # Максимум продать (лотов) max_sell = IntegerField('maxsell') securities = NodeListField('security', _Security)
class Entry(OrderedXmlObject): ROOT_NAME = 'entry' ROOT_NAMESPACES = NS ROOT_NS = NS['atom'] ORDER = ('category_term', 'title', 'id', 'updated', 'content', 'properties') category_term = StringField('atom:category/@term') title = StringField('atom:title') id = EntryIdField('atom:id') updated = UTCDateTimeField('atom:updated') content = StringField('atom:content') properties = NodeListField('apps:property', EntryProperty) def __init__(self, node=None, context=None, **kwargs): if node is None: if 'category_term' not in kwargs: kwargs['category_term'] = 'filter' if 'title' not in kwargs: kwargs['title'] = 'Mail Filter' if 'content' not in kwargs: kwargs['content'] = '' super(Entry, self).__init__(node, context, **kwargs)
class Detail(OrderedXmlObject, IdNode): """ <detail id=""> <title><text/></title> <lookup action="" image="" name=""> <extra key="" value = "" /> <response key ="" /> </lookup> <variables> <__ function=""/> </variables> <field sort=""> <header form="" width=""><text/></header> <template form="" width=""><text/></template> </field> </detail> """ ROOT_NAME = 'detail' ORDER = ('title', 'lookup', 'details', 'fields') nodeset = StringField('@nodeset') print_template = StringField('@print-template') title = NodeField('title/text', Text) lookup = NodeField('lookup', Lookup) fields = NodeListField('field', Field) actions = NodeListField('action', Action) details = NodeListField('detail', "self") _variables = NodeField('variables', DetailVariableList) relevant = StringField('@relevant') def _init_variables(self): if self._variables is None: self._variables = DetailVariableList() def get_variables(self): self._init_variables() return self._variables.variables def set_variables(self, value): self._init_variables() self._variables.variables = value variables = property(get_variables, set_variables) def get_all_xpaths(self): result = set() if self.nodeset: result.add(self.nodeset) if self._variables: for variable in self.variables: result.add(variable.function) if self.actions: for action in self.actions: for frame in action.stack.frames: result.add(frame.if_clause) for datum in getattr(frame, 'datums', []): result.add(datum.value) def _get_graph_config_xpaths(configuration): result = set() for config in configuration.configs: result.add(config.xpath_function) return result for field in self.fields: if field.template.form == 'graph': s = etree.tostring(field.template.node) template = load_xmlobject_from_string(s, xmlclass=GraphTemplate) result.update(_get_graph_config_xpaths(template.graph.configuration)) for series in template.graph.series: result.add(series.nodeset) result.update(_get_graph_config_xpaths(series.configuration)) else: result.add(field.header.text.xpath_function) result.add(field.template.text.xpath_function) for detail in self.details: result.update(detail.get_all_xpaths()) result.discard(None) return result
class Locale(XmlObject): ROOT_NAME = 'locale' id = StringField('@id') child_id = NodeField('id', Id) arguments = NodeListField('argument', LocaleArgument)
class RemoteRequestPost(XmlObject): ROOT_NAME = 'post' url = StringField('@url') relevant = StringField('@relevant') data = NodeListField('data', QueryData)
class Assertion(XmlObject): ROOT_NAME = 'assert' test = XPathField('@test') text = NodeListField('text', Text)
class Detail(OrderedXmlObject, IdNode): """ <detail id=""> <title><text/></title> <lookup action="" image="" name=""> <extra key="" value = "" /> <response key ="" /> </lookup> <variables> <__ function=""/> </variables> <field sort=""> <header form="" width=""><text/></header> <template form="" width=""><text/></template> </field> </detail> """ ROOT_NAME = 'detail' ORDER = ('title', 'lookup', 'details', 'fields') nodeset = StringField('@nodeset') print_template = StringField('@print-template') title = NodeField('title/text', Text) lookup = NodeField('lookup', Lookup) fields = NodeListField('field', Field) actions = NodeListField('action', Action) details = NodeListField('detail', "self") _variables = NodeField('variables', DetailVariableList) relevant = StringField('@relevant') def _init_variables(self): if self._variables is None: self._variables = DetailVariableList() def _get_variables_node(self): self._init_variables() return self._variables.variables def _set_variables_node(self, value): self._init_variables() self._variables.variables = value variables = property(_get_variables_node, _set_variables_node) def has_variables(self): # can't check len(self.variables) directly since NodeList uses an # xpath to find its children which doesn't work here since # each node has a custom name return self._variables is not None and len( self.variables.node.getchildren()) > 0 def get_variables(self): """ :returns: List of DetailVariable objects """ return [ self.variables.mapper.to_python(node) for node in self.variables.node.getchildren() ] def get_all_xpaths(self): result = set() if self.nodeset: result.add(self.nodeset) if self.has_variables(): for variable in self.get_variables(): result.add(variable.function) if self.actions: for action in self.actions: for frame in action.stack.frames: result.add(frame.if_clause) for datum in getattr(frame, 'datums', []): result.add(datum.value) def _get_graph_config_xpaths(configuration): result = set() for config in configuration.configs: result.add(config.xpath_function) return result for field in self.fields: if field.template.form == 'graph': s = etree.tostring(field.template.node) template = load_xmlobject_from_string(s, xmlclass=GraphTemplate) result.update( _get_graph_config_xpaths(template.graph.configuration)) for series in template.graph.series: result.add(series.nodeset) result.update( _get_graph_config_xpaths(series.configuration)) else: result.add(field.header.text.xpath_function) result.add(field.template.text.xpath_function) if field.template.text.xpath: for variable in field.template.text.xpath.variables: if variable.xpath: result.add(str(variable.xpath.function)) for detail in self.details: result.update(detail.get_all_xpaths()) result.discard(None) return result
class AuthKeys(XmlObject): ROOT_NAME = 'auth_keys' domain = StringField('@domain', required=True) issued = CustomDateTimeField('@issued', required=True) key_records = NodeListField('key_record', KeyRecord, required=True)
class UnitedPortfolio(MyXmlObject): """ Клиентский единый портфель. """ ROOT_NAME = 'united_portfolio' # Идентификатор клиента id = client = StringField('@client') # Входящая оценка единого портфеля open_equity = FloatField('open_equity') # Текущая оценка единого портфеля equity = FloatField('equity') # Корреляционный вычет планового риска chrgoff_ir = FloatField('chrgoff_ir') # Плановый риск (размер начальных требований) init_req = FloatField('init_req') # Корреляционный вычет минимальных требований chrgoff_mr = FloatField('chrgoff_mr') # Размер минимальных требований maint_req = FloatField('maint_req') # Стоимость портфеля нормативная reg_equity = FloatField('reg_equity') # Плановая начальная маржа нормативная reg_ir = FloatField('reg_ir') # Минимальная маржа нормативная reg_mr = FloatField('reg_mr') # Вариационная маржа FORTS vm = FloatField('vm') # Финансовый результат последнего клиринга FORTS finres = FloatField('finres') # Размер требуемого ГО, посчитанный биржей FORTS go = FloatField('go') class _Money(MyXmlObject): # Наименование денежного раздела name = StringField('@name') # Входящая денежная позиция open_balance = FloatField('open_balance') # Затрачено на покупки bought = FloatField('bought') # Выручено от продаж sold = FloatField('sold') # Исполнено settled = FloatField('settled') # Текущая денежная позиция balance = FloatField('balance') # Уплачено комиссии tax = FloatField('tax') class _ValuePart(MyXmlObject): # Регистр учёта register = StringField('@register') # Входящая денежная позиция open_balance = FloatField('open_balance') # Потрачено на покупки bought = FloatField('bought') # Выручка от продаж sold = FloatField('sold') # Исполнено settled = FloatField('settled') # Текущая денежная позиция balance = FloatField('balance') value_parts = NodeListField('value_part', _ValuePart) moneys = NodeListField('money', _Money) class _Asset(MyXmlObject): # Код базового актива code = StringField('@code') # Наименование базового актива name = StringField('@name') # Ставка перекрытия setoff_rate = FloatField('setoff_rate') # Плановый риск init_req = FloatField('init_req') # Минимальная маржа maint_req = FloatField('maint_req') class _Security(MyXmlObject): # Id инструмента secid = IntegerField('@secid') # Id рынка market = IntegerField('market') # Обозначение инструмента seccode = StringField('seccode') # Текущая цена price = FloatField('price') # Входящая позиция, штук open_balance = IntegerField('open_balance') # Куплено, штук bought = IntegerField('bought') # Продано, штук sold = IntegerField('sold') # Текущая позиция, штук balance = IntegerField('balance') # Заявлено купить, штук buying = IntegerField('buying') # Заявлено продать, штук selling = IntegerField('selling') # Оценка (в составе обеспечения ЕП) equity = FloatField('equity') # Стоимость в обеспечении портфеля нормативная reg_equity = FloatField('reg_equity') # Cтавка риска для лонгов, % riskrate_long = FloatField('riskrate_long') # Cтавка риска для шортов, % riskrate_short = FloatField('riskrate_short') # Ставка резерва для лонгов, % reserate_long = FloatField('reserate_long') # Ставка резерва для шортов, % reserate_short = FloatField('reserate_short') # Прибыль/убыток общий pl = FloatField('pl') # Прибыль/убыток по входящим позициям pnl_income = FloatField('pnl_income') # Прибыль/убыток по сделкам pnl_intraday = FloatField('pnl_intraday') # Максимальная покупка, в лотах max_buy = IntegerField('maxbuy') # Макcимальная продажа, в лотах max_sell = IntegerField('maxsell') class _ValuePart(MyXmlObject): # Входящая позиция, штук register = StringField('@register') # Входящая позиция, штук open_balance = IntegerField('open_balance') # Куплено, штук bought = IntegerField('bought') # Продано, штук sold = IntegerField('sold') # Исполнено settled = IntegerField('settled') # Текущая позиция, штук balance = IntegerField('balance') # Заявлено купить, штук buying = IntegerField('buying') # Заявлено продать, штук selling = IntegerField('selling') value_parts = NodeListField('value_part', _ValuePart) securities = NodeListField('security', _Security) assets = NodeListField('asset', _Asset)
class TextMessagePacket(Packet): """ Пакет сообщений. """ ROOT_NAME = 'messages' items = NodeListField('message', TextMessage)
class SecurityPitPacket(Packet): """ Пакет питов. """ ROOT_NAME = 'pits' items = NodeListField('pit', SecurityPit)
class BoardPacket(Packet): """ Справочник режимов торгов. """ ROOT_NAME = 'boards' items = NodeListField('board', Board)
class ClientTradePacket(Packet): """ Пакет клиентских сделок, совершенных за сессию. """ ROOT_NAME = 'trades' items = NodeListField('trade', ClientTrade)
class ClientPortfolio(Entity): """ Клиентский портфель Т+, основная рабочая структура для фондовой секции. """ ROOT_NAME = 'portfolio_tplus' # Идентификатор клиента id = client = StringField('@client') # Фактическая обеспеченность coverage_fact = FloatField('coverage_fact') # Плановая обеспеченность coverage_plan = FloatField('coverage_plan') # Критическая обеспеченность coverage_crit = FloatField('coverage_crit') # Входящая оценка портфеля без дисконта open_equity = FloatField('open_equity') # Текущая оценка портфеля без дисконта equity = FloatField('equity') # Плановое обеспечение (оценка ликвидационной стоимости портфеля) cover = FloatField('cover') # Плановая начальная маржа (оценка портфельного риска) init_margin = FloatField('init_margin') # Прибыль/убыток по входящим позициям pnl_income = FloatField('pnl_income') # Прибыль/убыток по сделкам pnl_intraday = FloatField('pnl_intraday') # Фактическое плечо портфеля Т+ leverage = FloatField('leverage') # Фактический уровень маржи портфеля Т+ margin_level = FloatField('margin_level') class _Money(MyXmlObject): # Входящая денежная позиция open_balance = FloatField('open_balance') # Затрачено на покупки bought = FloatField('bought') # Выручено от продаж sold = FloatField('sold') # Исполнено settled = FloatField('settled') # Текущая денежная позиция balance = FloatField('balance') # Уплачено комиссии tax = FloatField('tax') class _ValuePart(MyXmlObject): # Регистр учёта register = StringField('@register') # Входящая денежная позиция open_balance = FloatField('open_balance') # Потрачено на покупки bought = FloatField('bought') # Выручка от продаж sold = FloatField('sold') # Исполнено settled = FloatField('settled') # Текущая денежная позиция balance = FloatField('balance') value_parts = NodeListField('value_part', _ValuePart) money = NodeField('money', _Money) class _Security(MyXmlObject): # Id инструмента secid = IntegerField('@secid') # Id рынка market = IntegerField('market') # Обозначение инструмента seccode = StringField('seccode') # Текущая цена price = FloatField('price') # Входящая позиция, штук open_balance = IntegerField('open_balance') # Куплено, штук bought = IntegerField('bought') # Продано, штук sold = IntegerField('sold') # Текущая позиция, штук balance = IntegerField('balance') # Заявлено купить, штук buying = IntegerField('buying') # Заявлено продать, штук selling = IntegerField('selling') # Вклад бумаги в плановое обеспечение cover = FloatField('cover') # Плановая начальная маржа (риск) init_margin = FloatField('init_margin') # Cтавка риска для лонгов riskrate_long = FloatField('riskrate_long') # Cтавка риска для шортов riskrate_short = FloatField('riskrate_short') # Прибыль/убыток по входящим позициям pnl_income = FloatField('pnl_income') # Прибыль/убыток по сделкам pnl_intraday = FloatField('pnl_intraday') # Максимальная покупка, в лотах max_buy = IntegerField('maxbuy') # Макcимальная продажа, в лотах max_sell = IntegerField('maxsell') class _ValuePart(MyXmlObject): # Входящая позиция, штук register = StringField('@register') # Входящая позиция, штук open_balance = IntegerField('open_balance') # Куплено, штук bought = IntegerField('bought') # Продано, штук sold = IntegerField('sold') # Исполнено settled = IntegerField('settled') # Текущая позиция, штук balance = IntegerField('balance') # Заявлено купить, штук buying = IntegerField('buying') # Заявлено продать, штук selling = IntegerField('selling') value_parts = NodeListField('value_part', _ValuePart) securities = NodeListField('security', _Security)
class _Security(MyXmlObject): # Id инструмента secid = IntegerField('@secid') # Id рынка market = IntegerField('market') # Обозначение инструмента seccode = StringField('seccode') # Текущая цена price = FloatField('price') # Входящая позиция, штук open_balance = IntegerField('open_balance') # Куплено, штук bought = IntegerField('bought') # Продано, штук sold = IntegerField('sold') # Текущая позиция, штук balance = IntegerField('balance') # Заявлено купить, штук buying = IntegerField('buying') # Заявлено продать, штук selling = IntegerField('selling') # Оценка (в составе обеспечения ЕП) equity = FloatField('equity') # Стоимость в обеспечении портфеля нормативная reg_equity = FloatField('reg_equity') # Cтавка риска для лонгов, % riskrate_long = FloatField('riskrate_long') # Cтавка риска для шортов, % riskrate_short = FloatField('riskrate_short') # Ставка резерва для лонгов, % reserate_long = FloatField('reserate_long') # Ставка резерва для шортов, % reserate_short = FloatField('reserate_short') # Прибыль/убыток общий pl = FloatField('pl') # Прибыль/убыток по входящим позициям pnl_income = FloatField('pnl_income') # Прибыль/убыток по сделкам pnl_intraday = FloatField('pnl_intraday') # Максимальная покупка, в лотах max_buy = IntegerField('maxbuy') # Макcимальная продажа, в лотах max_sell = IntegerField('maxsell') class _ValuePart(MyXmlObject): # Входящая позиция, штук register = StringField('@register') # Входящая позиция, штук open_balance = IntegerField('open_balance') # Куплено, штук bought = IntegerField('bought') # Продано, штук sold = IntegerField('sold') # Исполнено settled = IntegerField('settled') # Текущая позиция, штук balance = IntegerField('balance') # Заявлено купить, штук buying = IntegerField('buying') # Заявлено продать, штук selling = IntegerField('selling') value_parts = NodeListField('value_part', _ValuePart)
class CalculatedPropertyXpath(XmlObject): ROOT_NAME = 'xpath' function = XPathField('@function') variables = NodeListField('variable', CalculatedPropertyXpathVariable)
class MarketPacket(Packet): """ Пакет с доступными рынками. """ ROOT_NAME = 'markets' items = NodeListField('market', Market)
class LocalizedMediaDisplay(XmlObject): ROOT_NAME = 'display' media_text = NodeListField('text', MediaText)
class CandleKindPacket(Packet): """ Пакет с доступными периодами. """ ROOT_NAME = 'candlekinds' items = NodeListField('kind', CandleKind)
class Xpath(XmlObject): ROOT_NAME = 'xpath' function = XPathField('@function') variables = NodeListField('variable', XpathVariable)
class SecurityPacket(Packet): """ Пакет со списком ценных бумаг. """ ROOT_NAME = 'securities' items = NodeListField('security', Security)
class RemoteRequestSession(OrderedXmlObject, XmlObject): ROOT_NAME = 'session' ORDER = ('queries', 'data') queries = NodeListField('query', RemoteRequestQuery) data = NodeListField('datum', SessionDatum)
class QuotationPacket(Packet): """ Пакет котировок. """ ROOT_NAME = 'quotations' items = NodeListField('quotation', Quotation)
class DetailVariableList(XmlObject): ROOT_NAME = 'variables' variables = NodeListField('_', DetailVariable)
class TradePacket(Packet): """ Пакет сделок с рынка. """ ROOT_NAME = 'alltrades' items = NodeListField('trade', Trade)
class ConfigurationGroup(XmlObject): ROOT_NAME = 'configuration' configs = NodeListField('text', ConfigurationItem)
class QuotePacket(Packet): """ Пакет обновлений стакана. """ ROOT_NAME = 'quotes' items = NodeListField('quote', Quote)