Components and environment

Для обеспечения модульности в NGW используются разделение на компоненты. Один python-пакет может содержать один или несколько компонентов. Каждый компонент является наследником класса Component, а для загрузки соответствующих модулей используются точки входа (entry points) setuptools.

def pkginfo():
    return dict(components=dict(
        somecomp='somepackage.somecomp'))

setup(
    name = 'somepackage',
    entry_points = {'nextgisweb.packages':
        'somepackage = somepackage:somemod:pkginfo'}
)

У каждого компонента есть идентификатор (somecomp в примере выше). Так же этот идентификатор указываетс в атрибуте класса identity. Этот идентификатор должен быть уникален в рамках всех пакетов NGW.

Для объединения компонентов в единое целое используется объект-окружение, экземпляр класса Env, который создается на этапе инициализации. Инициализация происходит следующим образом:

  1. Создаются экземпляры компонентов
  2. Для каждого компонента вызывается initialize()
  3. Для каждого компонента вызывается configure()

Component dependency

Вызовы методов initialize() и configure() осуществляются с учетом зависимостей, которые могут быть указаны при помощи декоратора require().

nextgisweb.component.require(*deps)[исходный код]

Decorator for dependencies between components methods. When applied dependencies are written to private attributes of decorated method. These private methods are used in chain().

Параметры:deps – One or many component identifiers which decorated method execution depends on.

Таким образом, если необходимо вызывать initialize() компонента B после A, то выглядеть это будет следующим образом:

from nextgisweb.component import Component, require

class A(Component):
    identity = 'A'

    def initialize(self):
        pass

class B(Component):
    identity = 'B'

    @require('A')
    def initialize(self):
        pass

Global environment object

class nextgisweb.env.env[исходный код]

Proxy-class for global environment access. Use it only where it is impossible to get access to current environment by other means. However in any case, simultaneous work with multiple environments is currently not supported an will hardly ever be needed. To get original object for which messages are proxied one can use constructor env().

Component class

class nextgisweb.component.Component(env, settings)[исходный код]
identity = None

Component identifier that should be redefined in a child class. Must be syntactically correct python id as it is used as attribute name in some cases.

initialize()[исходный код]

First initialization stage.

configure()[исходный код]

Second initialization stage.

env

Environment this component belongs too. Set on class exemplar creation and not changed afterwards. This attribute should be used instead of global environment env.

amd_base

Список вспомогательных AMD модулей, предоставляемых компонентом, которые будут использованы в базовом шаблоне страницы. Могут быть использованы для изменения её внешнего вида.

Env class

class nextgisweb.env.Env(cfg)[исходный код]
chain(meth)[исходный код]

Building a sequence of method calls with dependencies. core component dependency gets added automatically for all components, so that it is returned first.

Параметры:meth – Name of the method to build sequence for.
metadata()[исходный код]

Returns object sa.MetaData that combines metadata of all components from this environment