コード例 #1
0
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)
コード例 #2
0
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
コード例 #3
0
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)
コード例 #4
0
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)
コード例 #5
0
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)
コード例 #6
0
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
コード例 #7
0
class Locale(XmlObject):
    ROOT_NAME = 'locale'
    id = StringField('@id')
    child_id = NodeField('id', Id)
    arguments = NodeListField('argument', LocaleArgument)
コード例 #8
0
class RemoteRequestPost(XmlObject):
    ROOT_NAME = 'post'

    url = StringField('@url')
    relevant = StringField('@relevant')
    data = NodeListField('data', QueryData)
コード例 #9
0
class Assertion(XmlObject):
    ROOT_NAME = 'assert'

    test = XPathField('@test')
    text = NodeListField('text', Text)
コード例 #10
0
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
コード例 #11
0
ファイル: xml.py プロジェクト: tstalka/commcare-hq
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)
コード例 #12
0
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)
コード例 #13
0
class TextMessagePacket(Packet):
    """
    Пакет сообщений.
    """
    ROOT_NAME = 'messages'
    items = NodeListField('message', TextMessage)
コード例 #14
0
class SecurityPitPacket(Packet):
    """
    Пакет питов.
    """
    ROOT_NAME = 'pits'
    items = NodeListField('pit', SecurityPit)
コード例 #15
0
class BoardPacket(Packet):
    """
    Справочник режимов торгов.
    """
    ROOT_NAME = 'boards'
    items = NodeListField('board', Board)
コード例 #16
0
class ClientTradePacket(Packet):
    """
    Пакет клиентских сделок, совершенных за сессию.
    """
    ROOT_NAME = 'trades'
    items = NodeListField('trade', ClientTrade)
コード例 #17
0
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)
コード例 #18
0
        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)
コード例 #19
0
class CalculatedPropertyXpath(XmlObject):
    ROOT_NAME = 'xpath'
    function = XPathField('@function')
    variables = NodeListField('variable', CalculatedPropertyXpathVariable)
コード例 #20
0
class MarketPacket(Packet):
    """
    Пакет с доступными рынками.
    """
    ROOT_NAME = 'markets'
    items = NodeListField('market', Market)
コード例 #21
0
class LocalizedMediaDisplay(XmlObject):
    ROOT_NAME = 'display'

    media_text = NodeListField('text', MediaText)
コード例 #22
0
class CandleKindPacket(Packet):
    """
    Пакет с доступными периодами.
    """
    ROOT_NAME = 'candlekinds'
    items = NodeListField('kind', CandleKind)
コード例 #23
0
class Xpath(XmlObject):
    ROOT_NAME = 'xpath'
    function = XPathField('@function')
    variables = NodeListField('variable', XpathVariable)
コード例 #24
0
class SecurityPacket(Packet):
    """
    Пакет со списком ценных бумаг.
    """
    ROOT_NAME = 'securities'
    items = NodeListField('security', Security)
コード例 #25
0
class RemoteRequestSession(OrderedXmlObject, XmlObject):
    ROOT_NAME = 'session'
    ORDER = ('queries', 'data')

    queries = NodeListField('query', RemoteRequestQuery)
    data = NodeListField('datum', SessionDatum)
コード例 #26
0
class QuotationPacket(Packet):
    """
    Пакет котировок.
    """
    ROOT_NAME = 'quotations'
    items = NodeListField('quotation', Quotation)
コード例 #27
0
class DetailVariableList(XmlObject):
    ROOT_NAME = 'variables'

    variables = NodeListField('_', DetailVariable)
コード例 #28
0
class TradePacket(Packet):
    """
    Пакет сделок с рынка.
    """
    ROOT_NAME = 'alltrades'
    items = NodeListField('trade', Trade)
コード例 #29
0
class ConfigurationGroup(XmlObject):
    ROOT_NAME = 'configuration'
    configs = NodeListField('text', ConfigurationItem)
コード例 #30
0
class QuotePacket(Packet):
    """
    Пакет обновлений стакана.
    """
    ROOT_NAME = 'quotes'
    items = NodeListField('quote', Quote)