mex.editor package

Subpackages

Submodules

mex.editor.components module

mex.editor.components.render_badge(text: str | None) Component

Render a generic badge with the given text.

Render an editor value as a clickable external link that opens in a new tab.

mex.editor.components.render_identifier(value: EditorValue) Component

Render an editor value as a clickable internal link that loads the edit page.

Render an editor value as an internal or external link.

mex.editor.components.render_span(text: str | None) Component

Render a generic span with the given text.

mex.editor.components.render_text(value: EditorValue) Component

Render an editor value as a text span.

mex.editor.components.render_value(value: EditorValue) Component

Render a single editor value.

mex.editor.exceptions module

mex.editor.exceptions.escalate_error(namespace: str, summary: str, payload: object) Generator[EventSpec, None, None]

Escalate an error by spreading it to the python and browser logs and the UI.

mex.editor.fields module

mex.editor.layout module

Return the app logo with icon and label.

mex.editor.layout.nav_bar() Component

Return a navigation bar component.

Return a link component for the given navigation item.

mex.editor.layout.page(*children: Component) Component

Return a page fragment with navigation bar and given children.

mex.editor.layout.user_button() Component

Return a user button with an icon that indicates their access rights.

mex.editor.layout.user_menu() Component

Return a user menu with a trigger, the user’s name and a logout button.

mex.editor.logging module

mex.editor.main module

mex.editor.main.editor_api() None

Start the editor api.

mex.editor.main.editor_frontend() None

Start the editor frontend.

mex.editor.main.main() None

Start the editor api together with frontend.

mex.editor.models module

class mex.editor.models.EditorValue(*, text: str | None = None, identifier: str | None = None, badge: str | None = None, href: str | None = None, external: bool = False, enabled: bool = True, being_edited: bool = False, **extra_data: Any)

Bases: Base

Model for describing atomic values in the editor.

badge: str | None
being_edited: bool
enabled: bool
external: bool
href: str | None
identifier: str | None
text: str | None
class mex.editor.models.ModelConfig(*, title: str, preview: list[str] = [], icon: str)

Bases: BaseModel

Configuration for how to display an entity type in the frontend.

icon: str
model_computed_fields: ClassVar[Dict[str, ComputedFieldInfo]] = {}

A dictionary of computed field names and their corresponding ComputedFieldInfo objects.

model_config: ClassVar[ConfigDict] = {'extra': 'ignore', 'populate_by_name': True, 'str_max_length': 100000, 'str_min_length': 1, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_assignment': True, 'validate_default': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

model_fields: ClassVar[Dict[str, FieldInfo]] = {'icon': FieldInfo(annotation=str, required=True), 'preview': FieldInfo(annotation=list[str], required=False, default=[]), 'title': FieldInfo(annotation=str, required=True)}

Metadata about the fields defined on the model, mapping of field names to [FieldInfo][pydantic.fields.FieldInfo] objects.

This replaces Model.__fields__ from Pydantic V1.

preview: list[str]
title: str
class mex.editor.models.NavItem(*, title: str = '', path: str = '/', raw_path: str = '/', underline: Literal['always', 'none'] = 'none', **extra_data: Any)

Bases: Base

Model for one navigation bar item.

path: str
raw_path: str
title: str
underline: Literal['always', 'none']
class mex.editor.models.User(*, name: str, authorization: str, write_access: bool, **extra_data: Any)

Bases: Base

Info on the currently logged-in user.

authorization: str
name: str
write_access: bool

mex.editor.security module

mex.editor.security.has_read_access_mex(username: str, password: str) bool

Verify if provided credentials have read access.

mex.editor.security.has_write_access_ldap(username: str, password: str) bool

Verify if provided credentials have ldap write access.

mex.editor.security.has_write_access_mex(username: str, password: str) bool

Verify if provided credentials have write access.

mex.editor.settings module

class mex.editor.settings.EditorSettings(_env_file: Path | str | Sequence[Path | str] | None = PosixPath('.'), _env_file_encoding: str | None = None, _env_nested_delimiter: str | None = None, _secrets_dir: str | Path | None = None, *, pdb: bool = False, MEX_SINK: list[Sink] = [Sink.NDJSON], MEX_ASSETS_DIR: Path = PosixPath('/home/runner/work/mex-editor/mex-editor/assets'), MEX_WORK_DIR: Path = PosixPath('/home/runner/work/mex-editor/mex-editor'), MEX_IDENTITY_PROVIDER: IdentityProvider = IdentityProvider.MEMORY, MEX_BACKEND_API_URL: Url = Url('http://localhost:8080/'), MEX_BACKEND_API_KEY: SecretStr = SecretStr('**********'), MEX_BACKEND_API_PARALLELIZATION: int = 1, MEX_BACKEND_API_CHUNK_SIZE: int = 25, MEX_VERIFY_SESSION: bool | AssetsPath = True, MEX_ORGANIGRAM_PATH: AssetsPath = AssetsPath('raw-data/organigram/organizational_units.json'), MEX_PRIMARY_SOURCES_PATH: AssetsPath = AssetsPath('raw-data/primary-sources/primary-sources.json'), MEX_LDAP_URL: SecretStr = SecretStr('**********'), MEX_LDAP_SEARCH_BASE: str = 'DC=rki,DC=local', MEX_WIKI_API_URL: Url = Url('http://wikidata/'), MEX_WEB_USER_AGENT: str = 'rki/mex', MEX_ORCID_API_URL: Url = Url('https://orcid/'), MEX_EDITOR_API_HOST: Annotated[str, MinLen(min_length=1), MaxLen(max_length=250)] = 'localhost', MEX_EDITOR_API_PORT: Annotated[int, Gt(gt=0), Lt(lt=65536)] = 8031, MEX_EDITOR_FRONTEND_PORT: Annotated[int, Gt(gt=0), Lt(lt=65536)] = 8030, MEX_EDITOR_API_ROOT_PATH: str = '', MEX_BACKEND_API_USER_DATABASE: EditorUserDatabase = EditorUserDatabase(read={}, write={}))

Bases: BaseSettings

Settings definition for the editor service.

editor_api_host: str
editor_api_port: int
editor_api_root_path: str
editor_frontend_port: int
editor_user_database: EditorUserDatabase
model_computed_fields: ClassVar[Dict[str, ComputedFieldInfo]] = {}

A dictionary of computed field names and their corresponding ComputedFieldInfo objects.

model_config: ClassVar[SettingsConfigDict] = {'arbitrary_types_allowed': True, 'case_sensitive': False, 'cli_avoid_json': False, 'cli_enforce_required': False, 'cli_exit_on_error': True, 'cli_flag_prefix_char': '-', 'cli_hide_none_type': False, 'cli_ignore_unknown_args': False, 'cli_implicit_flags': False, 'cli_kebab_case': False, 'cli_parse_args': None, 'cli_parse_none_str': None, 'cli_prefix': '', 'cli_prog_name': None, 'cli_use_class_docs_for_groups': False, 'enable_decoding': True, 'env_file': '.env', 'env_file_encoding': 'utf-8', 'env_ignore_empty': False, 'env_nested_delimiter': '__', 'env_parse_enums': None, 'env_parse_none_str': None, 'env_prefix': 'mex_', 'extra': 'ignore', 'json_file': None, 'json_file_encoding': None, 'nested_model_default_partial_update': False, 'populate_by_name': True, 'protected_namespaces': ('model_validate', 'model_dump', 'settings_customise_sources'), 'secrets_dir': None, 'toml_file': None, 'validate_assignment': True, 'validate_default': True, 'yaml_file': None, 'yaml_file_encoding': None}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

model_fields: ClassVar[Dict[str, FieldInfo]] = {'assets_dir': FieldInfo(annotation=Path, required=False, default=PosixPath('/home/runner/work/mex-editor/mex-editor/assets'), alias_priority=2, validation_alias='MEX_ASSETS_DIR', description='Path to directory that contains input files treated as read-only, looks for a folder named `assets` in the current directory by default.'), 'backend_api_chunk_size': FieldInfo(annotation=int, required=False, default=25, alias_priority=2, validation_alias='MEX_BACKEND_API_CHUNK_SIZE', description='How many items to load into the backend in one chunk.'), 'backend_api_key': FieldInfo(annotation=SecretStr, required=False, default=SecretStr('**********'), alias_priority=2, validation_alias='MEX_BACKEND_API_KEY', description='Backend API key with write access to call POST/PUT endpoints'), 'backend_api_parallelization': FieldInfo(annotation=int, required=False, default=1, alias_priority=2, validation_alias='MEX_BACKEND_API_PARALLELIZATION', description='How many simultaneous threads may spin up to load data into the backend.'), 'backend_api_url': FieldInfo(annotation=Url, required=False, default=Url('http://localhost:8080/'), alias_priority=2, validation_alias='MEX_BACKEND_API_URL', description='MEx backend API url.'), 'debug': FieldInfo(annotation=bool, required=False, default=False, alias='pdb', alias_priority=2, validation_alias='MEX_DEBUG', description='Jump into post-mortem debugging after any uncaught exception.'), 'editor_api_host': FieldInfo(annotation=str, required=False, default='localhost', alias_priority=2, validation_alias='MEX_EDITOR_API_HOST', description='Host that the editor api will run on.', metadata=[MinLen(min_length=1), MaxLen(max_length=250)]), 'editor_api_port': FieldInfo(annotation=int, required=False, default=8031, alias_priority=2, validation_alias='MEX_EDITOR_API_PORT', description='Port that the editor api should listen on.', metadata=[Gt(gt=0), Lt(lt=65536)]), 'editor_api_root_path': FieldInfo(annotation=str, required=False, default='', alias_priority=2, validation_alias='MEX_EDITOR_API_ROOT_PATH', description='Root path that the editor server should run under.'), 'editor_frontend_port': FieldInfo(annotation=int, required=False, default=8030, alias_priority=2, validation_alias='MEX_EDITOR_FRONTEND_PORT', description='Port that the editor frontend should serve on.', metadata=[Gt(gt=0), Lt(lt=65536)]), 'editor_user_database': FieldInfo(annotation=EditorUserDatabase, required=False, default=EditorUserDatabase(read={}, write={}), alias_priority=2, validation_alias='MEX_BACKEND_API_USER_DATABASE', description='Database of users.'), 'identity_provider': FieldInfo(annotation=IdentityProvider, required=False, default=<IdentityProvider.MEMORY: 'memory'>, alias_priority=2, validation_alias='MEX_IDENTITY_PROVIDER', description='Provider to assign identifiers to new model instances.'), 'ldap_search_base': FieldInfo(annotation=str, required=False, default='DC=rki,DC=local', alias_priority=2, validation_alias='MEX_LDAP_SEARCH_BASE', description='Search base for the ldap connector.'), 'ldap_url': FieldInfo(annotation=SecretStr, required=False, default=SecretStr('**********'), alias_priority=2, validation_alias='MEX_LDAP_URL', description='LDAP server for person queries with authentication credentials. Must follow format `ldap://user:pw@host:port`, where `user` is the username, and `pw` is the password for authenticating against ldap, `host` is the url of the ldap server, and `port` is the port of the ldap server.'), 'mex_web_user_agent': FieldInfo(annotation=str, required=False, default='rki/mex', alias_priority=2, validation_alias='MEX_WEB_USER_AGENT', description='User agent is sent in request headers to external services.'), 'orcid_api_url': FieldInfo(annotation=Url, required=False, default=Url('https://orcid/'), alias_priority=2, validation_alias='MEX_ORCID_API_URL', description='URL of orcid api.'), 'organigram_path': FieldInfo(annotation=AssetsPath, required=False, default=AssetsPath("raw-data/organigram/organizational_units.json"), alias_priority=2, validation_alias='MEX_ORGANIGRAM_PATH', description='Path to the JSON file describing the organizational units, absolute path or relative to `assets_dir`.'), 'primary_sources_path': FieldInfo(annotation=AssetsPath, required=False, default=AssetsPath("raw-data/primary-sources/primary-sources.json"), alias_priority=2, validation_alias='MEX_PRIMARY_SOURCES_PATH', description='Path to the JSON file describing the primary sources, absolute path or relative to `assets_dir`.'), 'sink': FieldInfo(annotation=list[Sink], required=False, default=[<Sink.NDJSON: 'ndjson'>], alias_priority=2, validation_alias='MEX_SINK', description='Where to send data that is extracted or ingested. Defaults to writing ndjson files, but can be configured to push to the backend or the graph.'), 'verify_session': FieldInfo(annotation=Union[bool, AssetsPath], required=False, default=True, alias_priority=2, validation_alias='MEX_VERIFY_SESSION', description="Either a boolean that controls whether we verify the server's TLS certificate, or a path to a CA bundle to use. If a path is given, it can be either absolute or relative to the `assets_dir`. Defaults to True."), 'wiki_api_url': FieldInfo(annotation=Url, required=False, default=Url('http://wikidata/'), alias_priority=2, validation_alias='MEX_WIKI_API_URL', description='URL of the Wikidata API used to resolve an ID to an organization.'), 'work_dir': FieldInfo(annotation=Path, required=False, default=PosixPath('/home/runner/work/mex-editor/mex-editor'), alias_priority=2, validation_alias='MEX_WORK_DIR', description='Path to directory that stores generated and temporary files. Defaults to the current working directory.')}

Metadata about the fields defined on the model, mapping of field names to [FieldInfo][pydantic.fields.FieldInfo] objects.

This replaces Model.__fields__ from Pydantic V1.

mex.editor.state module

class mex.editor.state.State(parent_state: BaseState | None = None, init_substates: bool = True, _reflex_internal_init: bool = False, *, substates: Dict[str, BaseState] = {}, dirty_vars: Set[str] = {}, dirty_substates: Set[str] = {}, router_data: Dict[str, Any] = {}, router: RouterData = RouterData(session=SessionData(client_token='', client_ip='', session_id=''), headers=HeaderData(host='', origin='', upgrade='', connection='', cookie='', pragma='', cache_control='', user_agent='', sec_websocket_version='', sec_websocket_key='', sec_websocket_extensions='', accept_encoding='', accept_language=''), page=PageData(host='', path='', raw_path='', full_path='', full_raw_path='', params={})), is_hydrated: bool = False, user_mex: User | None = None, user_ldap: User | None = None, target_path_after_login: str | None = None, nav_items: list[NavItem] = [NavItem(title='Search', path='/', raw_path='/?page=1', underline='none'), NavItem(title='Create', path='/create', raw_path='/create/', underline='none'), NavItem(title='Edit', path='/item/[identifier]', raw_path='/item/00000000000000/', underline='none'), NavItem(title='Merge', path='/merge', raw_path='/merge/', underline='none'), NavItem(title='Ingest', path='/ingest', raw_path='/ingest/', underline='none')], **kwargs)

Bases: State

The base state for the app.

static _update_raw_path(nav_item: NavItem, **params: int | str | list[str]) None

Update the raw path of a nav item with the given parameters.

backend_vars: ClassVar[Dict[str, Any]] = {}
backend_version

Base class of converting a var to another var type.

base_vars: ClassVar[Dict[str, Var]] = {'nav_items': Var.__init_subclass__.<locals>.ToVarOperation(_js_expr='reflex___state____state__mex___editor___state____state.nav_items', _var_type=list[mex.editor.models.NavItem], _var_data=None, _original=Var(_js_expr='reflex___state____state__mex___editor___state____state.nav_items', _var_type=list[mex.editor.models.NavItem], _var_data=VarData(state='reflex___state____state.mex___editor___state____state', field_name='nav_items', imports=(('$/utils/context', (ImportVar(tag='StateContexts', is_default=False, alias=None, install=True, render=True, transpile=False),)), ('react', (ImportVar(tag='useContext', is_default=False, alias=None, install=True, render=True, transpile=False),))), hooks=('const reflex___state____state__mex___editor___state____state = useContext(StateContexts.reflex___state____state__mex___editor___state____state)',), deps=(), position=None))), 'target_path_after_login': Var.__init_subclass__.<locals>.ToVarOperation(_js_expr='reflex___state____state__mex___editor___state____state.target_path_after_login', _var_type=typing.Optional[str], _var_data=None, _original=Var(_js_expr='reflex___state____state__mex___editor___state____state.target_path_after_login', _var_type=<class 'str'>, _var_data=VarData(state='reflex___state____state.mex___editor___state____state', field_name='target_path_after_login', imports=(('$/utils/context', (ImportVar(tag='StateContexts', is_default=False, alias=None, install=True, render=True, transpile=False),)), ('react', (ImportVar(tag='useContext', is_default=False, alias=None, install=True, render=True, transpile=False),))), hooks=('const reflex___state____state__mex___editor___state____state = useContext(StateContexts.reflex___state____state__mex___editor___state____state)',), deps=(), position=None))), 'user_ldap': Var.__init_subclass__.<locals>.ToVarOperation(_js_expr='reflex___state____state__mex___editor___state____state.user_ldap', _var_type=typing.Optional[mex.editor.models.User], _var_data=None, _original=Var(_js_expr='reflex___state____state__mex___editor___state____state.user_ldap', _var_type=<class 'mex.editor.models.User'>, _var_data=VarData(state='reflex___state____state.mex___editor___state____state', field_name='user_ldap', imports=(('$/utils/context', (ImportVar(tag='StateContexts', is_default=False, alias=None, install=True, render=True, transpile=False),)), ('react', (ImportVar(tag='useContext', is_default=False, alias=None, install=True, render=True, transpile=False),))), hooks=('const reflex___state____state__mex___editor___state____state = useContext(StateContexts.reflex___state____state__mex___editor___state____state)',), deps=(), position=None))), 'user_mex': Var.__init_subclass__.<locals>.ToVarOperation(_js_expr='reflex___state____state__mex___editor___state____state.user_mex', _var_type=typing.Optional[mex.editor.models.User], _var_data=None, _original=Var(_js_expr='reflex___state____state__mex___editor___state____state.user_mex', _var_type=<class 'mex.editor.models.User'>, _var_data=VarData(state='reflex___state____state.mex___editor___state____state', field_name='user_mex', imports=(('$/utils/context', (ImportVar(tag='StateContexts', is_default=False, alias=None, install=True, render=True, transpile=False),)), ('react', (ImportVar(tag='useContext', is_default=False, alias=None, install=True, render=True, transpile=False),))), hooks=('const reflex___state____state__mex___editor___state____state = useContext(StateContexts.reflex___state____state__mex___editor___state____state)',), deps=(), position=None)))}
check_ldap_login = EventHandler(event_actions={}, fn=<function State.check_ldap_login>, state_full_name='reflex___state____state.mex___editor___state____state')
check_mex_login = EventHandler(event_actions={}, fn=<function State.check_mex_login>, state_full_name='reflex___state____state.mex___editor___state____state')
class_subclasses: ClassVar[Set[Type[BaseState]]] = {<class 'mex.editor.consent.state.ConsentState'>, <class 'mex.editor.ingest.state.IngestState'>, <class 'mex.editor.login.state.LoginLdapState'>, <class 'mex.editor.login.state.LoginMExState'>, <class 'mex.editor.merge.state.MergeState'>, <class 'mex.editor.rules.state.RuleState'>, <class 'mex.editor.search.state.SearchState'>}
computed_vars: ClassVar[Dict[str, ComputedVar]] = {'backend_version': FakeComputedVarBaseClass(_js_expr='backend_version', _var_type=<class 'str'>, _var_data=VarData(state='reflex___state____state.mex___editor___state____state', field_name='', imports=(('$/utils/context', (ImportVar(tag='StateContexts', is_default=False, alias=None, install=True, render=True, transpile=False),)), ('react', (ImportVar(tag='useContext', is_default=False, alias=None, install=True, render=True, transpile=False),))), hooks=('const reflex___state____state__mex___editor___state____state = useContext(StateContexts.reflex___state____state__mex___editor___state____state)',), deps=(), position=None), _cache=True, _backend=False, _initial_value=Unset, _static_deps=set(), _auto_deps=True, _update_interval=None, _fget=<function State.backend_version>), 'editor_version': FakeComputedVarBaseClass(_js_expr='editor_version', _var_type=<class 'str'>, _var_data=VarData(state='reflex___state____state.mex___editor___state____state', field_name='', imports=(('$/utils/context', (ImportVar(tag='StateContexts', is_default=False, alias=None, install=True, render=True, transpile=False),)), ('react', (ImportVar(tag='useContext', is_default=False, alias=None, install=True, render=True, transpile=False),))), hooks=('const reflex___state____state__mex___editor___state____state = useContext(StateContexts.reflex___state____state__mex___editor___state____state)',), deps=(), position=None), _cache=True, _backend=False, _initial_value=Unset, _static_deps=set(), _auto_deps=True, _update_interval=None, _fget=<function State.editor_version>)}
editor_version

Base class of converting a var to another var type.

event_handlers: ClassVar[Dict[str, EventHandler]] = {'check_ldap_login': EventHandler(event_actions={}, fn=<function State.check_ldap_login>, state_full_name='reflex___state____state.mex___editor___state____state'), 'check_mex_login': EventHandler(event_actions={}, fn=<function State.check_mex_login>, state_full_name='reflex___state____state.mex___editor___state____state'), 'load_nav': EventHandler(event_actions={}, fn=<function State.load_nav>, state_full_name='reflex___state____state.mex___editor___state____state'), 'logout': EventHandler(event_actions={}, fn=<function State.logout>, state_full_name='reflex___state____state.mex___editor___state____state'), 'push_url_params': EventHandler(event_actions={}, fn=<function State.push_url_params>, state_full_name='reflex___state____state.mex___editor___state____state'), 'set_nav_items': EventHandler(event_actions={}, fn=<function reflex___state____state.mex___editor___state____state.set_nav_items>, state_full_name='reflex___state____state.mex___editor___state____state'), 'set_target_path_after_login': EventHandler(event_actions={}, fn=<function reflex___state____state.mex___editor___state____state.set_target_path_after_login>, state_full_name='reflex___state____state.mex___editor___state____state'), 'set_user_ldap': EventHandler(event_actions={}, fn=<function reflex___state____state.mex___editor___state____state.set_user_ldap>, state_full_name='reflex___state____state.mex___editor___state____state'), 'set_user_mex': EventHandler(event_actions={}, fn=<function reflex___state____state.mex___editor___state____state.set_user_mex>, state_full_name='reflex___state____state.mex___editor___state____state'), 'setvar': EventHandlerSetVar(event_actions={}, fn=<function EventHandlerSetVar.setvar>, state_full_name='reflex___state____state.mex___editor___state____state', state_cls=<class 'mex.editor.state.State'>)}
inherited_backend_vars: ClassVar[Dict[str, Any]] = {}
inherited_vars: ClassVar[Dict[str, Var]] = {'identifier': FakeComputedVarBaseClass(_js_expr='identifier', _var_type=<class 'str'>, _var_data=VarData(state='reflex___state____state', field_name='', imports=(('$/utils/context', (ImportVar(tag='StateContexts', is_default=False, alias=None, install=True, render=True, transpile=False),)), ('react', (ImportVar(tag='useContext', is_default=False, alias=None, install=True, render=True, transpile=False),))), hooks=('const reflex___state____state = useContext(StateContexts.reflex___state____state)',), deps=(), position=None), _cache=True, _backend=False, _initial_value=Unset, _static_deps={'router'}, _auto_deps=False, _update_interval=None, _fget=<function BaseState.setup_dynamic_args.<locals>.argsingle_factory.<locals>.inner_func>), 'is_hydrated': Var.__init_subclass__.<locals>.ToVarOperation(_js_expr='reflex___state____state.is_hydrated', _var_type=<class 'bool'>, _var_data=None, _original=Var(_js_expr='reflex___state____state.is_hydrated', _var_type=<class 'bool'>, _var_data=VarData(state='reflex___state____state', field_name='is_hydrated', imports=(('$/utils/context', (ImportVar(tag='StateContexts', is_default=False, alias=None, install=True, render=True, transpile=False),)), ('react', (ImportVar(tag='useContext', is_default=False, alias=None, install=True, render=True, transpile=False),))), hooks=('const reflex___state____state = useContext(StateContexts.reflex___state____state)',), deps=(), position=None))), 'router': Var.__init_subclass__.<locals>.ToVarOperation(_js_expr='reflex___state____state.router', _var_type=<class 'reflex.istate.data.RouterData'>, _var_data=None, _original=Var(_js_expr='reflex___state____state.router', _var_type=<class 'reflex.istate.data.RouterData'>, _var_data=VarData(state='reflex___state____state', field_name='router', imports=(('$/utils/context', (ImportVar(tag='StateContexts', is_default=False, alias=None, install=True, render=True, transpile=False),)), ('react', (ImportVar(tag='useContext', is_default=False, alias=None, install=True, render=True, transpile=False),))), hooks=('const reflex___state____state = useContext(StateContexts.reflex___state____state)',), deps=(), position=None)))}
load_nav = EventHandler(event_actions={}, fn=<function State.load_nav>, state_full_name='reflex___state____state.mex___editor___state____state')
logout = EventHandler(event_actions={}, fn=<function State.logout>, state_full_name='reflex___state____state.mex___editor___state____state')
nav_items: list[NavItem]

Base class of converting a var to another var type.

push_url_params = EventHandler(event_actions={}, fn=<function State.push_url_params>, state_full_name='reflex___state____state.mex___editor___state____state')
set_nav_items = EventHandler(event_actions={}, fn=<function reflex___state____state.mex___editor___state____state.set_nav_items>, state_full_name='reflex___state____state.mex___editor___state____state')
set_target_path_after_login = EventHandler(event_actions={}, fn=<function reflex___state____state.mex___editor___state____state.set_target_path_after_login>, state_full_name='reflex___state____state.mex___editor___state____state')
set_user_ldap = EventHandler(event_actions={}, fn=<function reflex___state____state.mex___editor___state____state.set_user_ldap>, state_full_name='reflex___state____state.mex___editor___state____state')
set_user_mex = EventHandler(event_actions={}, fn=<function reflex___state____state.mex___editor___state____state.set_user_mex>, state_full_name='reflex___state____state.mex___editor___state____state')
setvar: ClassVar[EventHandler] = EventHandlerSetVar(event_actions={}, fn=<function EventHandlerSetVar.setvar>, state_full_name='reflex___state____state.mex___editor___state____state', state_cls=<class 'mex.editor.state.State'>)
target_path_after_login: str | None

Base class of converting a var to another var type.

user_ldap: User | None

Base class of converting a var to another var type.

user_mex: User | None

Base class of converting a var to another var type.

vars: ClassVar[Dict[str, Var]] = {'backend_version': FakeComputedVarBaseClass(_js_expr='backend_version', _var_type=<class 'str'>, _var_data=VarData(state='reflex___state____state.mex___editor___state____state', field_name='', imports=(('$/utils/context', (ImportVar(tag='StateContexts', is_default=False, alias=None, install=True, render=True, transpile=False),)), ('react', (ImportVar(tag='useContext', is_default=False, alias=None, install=True, render=True, transpile=False),))), hooks=('const reflex___state____state__mex___editor___state____state = useContext(StateContexts.reflex___state____state__mex___editor___state____state)',), deps=(), position=None), _cache=True, _backend=False, _initial_value=Unset, _static_deps=set(), _auto_deps=True, _update_interval=None, _fget=<function State.backend_version>), 'editor_version': FakeComputedVarBaseClass(_js_expr='editor_version', _var_type=<class 'str'>, _var_data=VarData(state='reflex___state____state.mex___editor___state____state', field_name='', imports=(('$/utils/context', (ImportVar(tag='StateContexts', is_default=False, alias=None, install=True, render=True, transpile=False),)), ('react', (ImportVar(tag='useContext', is_default=False, alias=None, install=True, render=True, transpile=False),))), hooks=('const reflex___state____state__mex___editor___state____state = useContext(StateContexts.reflex___state____state__mex___editor___state____state)',), deps=(), position=None), _cache=True, _backend=False, _initial_value=Unset, _static_deps=set(), _auto_deps=True, _update_interval=None, _fget=<function State.editor_version>), 'identifier': FakeComputedVarBaseClass(_js_expr='identifier', _var_type=<class 'str'>, _var_data=VarData(state='reflex___state____state', field_name='', imports=(('$/utils/context', (ImportVar(tag='StateContexts', is_default=False, alias=None, install=True, render=True, transpile=False),)), ('react', (ImportVar(tag='useContext', is_default=False, alias=None, install=True, render=True, transpile=False),))), hooks=('const reflex___state____state = useContext(StateContexts.reflex___state____state)',), deps=(), position=None), _cache=True, _backend=False, _initial_value=Unset, _static_deps={'router'}, _auto_deps=False, _update_interval=None, _fget=<function BaseState.setup_dynamic_args.<locals>.argsingle_factory.<locals>.inner_func>), 'is_hydrated': Var.__init_subclass__.<locals>.ToVarOperation(_js_expr='reflex___state____state.is_hydrated', _var_type=<class 'bool'>, _var_data=None, _original=Var(_js_expr='reflex___state____state.is_hydrated', _var_type=<class 'bool'>, _var_data=VarData(state='reflex___state____state', field_name='is_hydrated', imports=(('$/utils/context', (ImportVar(tag='StateContexts', is_default=False, alias=None, install=True, render=True, transpile=False),)), ('react', (ImportVar(tag='useContext', is_default=False, alias=None, install=True, render=True, transpile=False),))), hooks=('const reflex___state____state = useContext(StateContexts.reflex___state____state)',), deps=(), position=None))), 'nav_items': Var.__init_subclass__.<locals>.ToVarOperation(_js_expr='reflex___state____state__mex___editor___state____state.nav_items', _var_type=list[mex.editor.models.NavItem], _var_data=None, _original=Var(_js_expr='reflex___state____state__mex___editor___state____state.nav_items', _var_type=list[mex.editor.models.NavItem], _var_data=VarData(state='reflex___state____state.mex___editor___state____state', field_name='nav_items', imports=(('$/utils/context', (ImportVar(tag='StateContexts', is_default=False, alias=None, install=True, render=True, transpile=False),)), ('react', (ImportVar(tag='useContext', is_default=False, alias=None, install=True, render=True, transpile=False),))), hooks=('const reflex___state____state__mex___editor___state____state = useContext(StateContexts.reflex___state____state__mex___editor___state____state)',), deps=(), position=None))), 'router': Var.__init_subclass__.<locals>.ToVarOperation(_js_expr='reflex___state____state.router', _var_type=<class 'reflex.istate.data.RouterData'>, _var_data=None, _original=Var(_js_expr='reflex___state____state.router', _var_type=<class 'reflex.istate.data.RouterData'>, _var_data=VarData(state='reflex___state____state', field_name='router', imports=(('$/utils/context', (ImportVar(tag='StateContexts', is_default=False, alias=None, install=True, render=True, transpile=False),)), ('react', (ImportVar(tag='useContext', is_default=False, alias=None, install=True, render=True, transpile=False),))), hooks=('const reflex___state____state = useContext(StateContexts.reflex___state____state)',), deps=(), position=None))), 'target_path_after_login': Var.__init_subclass__.<locals>.ToVarOperation(_js_expr='reflex___state____state__mex___editor___state____state.target_path_after_login', _var_type=typing.Optional[str], _var_data=None, _original=Var(_js_expr='reflex___state____state__mex___editor___state____state.target_path_after_login', _var_type=<class 'str'>, _var_data=VarData(state='reflex___state____state.mex___editor___state____state', field_name='target_path_after_login', imports=(('$/utils/context', (ImportVar(tag='StateContexts', is_default=False, alias=None, install=True, render=True, transpile=False),)), ('react', (ImportVar(tag='useContext', is_default=False, alias=None, install=True, render=True, transpile=False),))), hooks=('const reflex___state____state__mex___editor___state____state = useContext(StateContexts.reflex___state____state__mex___editor___state____state)',), deps=(), position=None))), 'user_ldap': Var.__init_subclass__.<locals>.ToVarOperation(_js_expr='reflex___state____state__mex___editor___state____state.user_ldap', _var_type=typing.Optional[mex.editor.models.User], _var_data=None, _original=Var(_js_expr='reflex___state____state__mex___editor___state____state.user_ldap', _var_type=<class 'mex.editor.models.User'>, _var_data=VarData(state='reflex___state____state.mex___editor___state____state', field_name='user_ldap', imports=(('$/utils/context', (ImportVar(tag='StateContexts', is_default=False, alias=None, install=True, render=True, transpile=False),)), ('react', (ImportVar(tag='useContext', is_default=False, alias=None, install=True, render=True, transpile=False),))), hooks=('const reflex___state____state__mex___editor___state____state = useContext(StateContexts.reflex___state____state__mex___editor___state____state)',), deps=(), position=None))), 'user_mex': Var.__init_subclass__.<locals>.ToVarOperation(_js_expr='reflex___state____state__mex___editor___state____state.user_mex', _var_type=typing.Optional[mex.editor.models.User], _var_data=None, _original=Var(_js_expr='reflex___state____state__mex___editor___state____state.user_mex', _var_type=<class 'mex.editor.models.User'>, _var_data=VarData(state='reflex___state____state.mex___editor___state____state', field_name='user_mex', imports=(('$/utils/context', (ImportVar(tag='StateContexts', is_default=False, alias=None, install=True, render=True, transpile=False),)), ('react', (ImportVar(tag='useContext', is_default=False, alias=None, install=True, render=True, transpile=False),))), hooks=('const reflex___state____state__mex___editor___state____state = useContext(StateContexts.reflex___state____state__mex___editor___state____state)',), deps=(), position=None)))}

mex.editor.transform module

mex.editor.transform.ensure_list(values: object) list[object]

Wrap single objects in lists, replace None with [] and return lists untouched.

mex.editor.transform.transform_models_to_preview(models: Sequence[AdditiveAccessPlatform | AdditiveActivity | AdditiveBibliographicResource | AdditiveConsent | AdditiveContactPoint | AdditiveDistribution | AdditiveOrganization | AdditiveOrganizationalUnit | AdditivePerson | AdditivePrimarySource | AdditiveResource | AdditiveVariable | AdditiveVariableGroup | SubtractiveAccessPlatform | SubtractiveActivity | SubtractiveBibliographicResource | SubtractiveConsent | SubtractiveContactPoint | SubtractiveDistribution | SubtractiveOrganization | SubtractiveOrganizationalUnit | SubtractivePerson | SubtractivePrimarySource | SubtractiveResource | SubtractiveVariable | SubtractiveVariableGroup | PreventiveAccessPlatform | PreventiveActivity | PreventiveBibliographicResource | PreventiveConsent | PreventiveContactPoint | PreventiveDistribution | PreventiveOrganization | PreventiveOrganizationalUnit | PreventivePerson | PreventivePrimarySource | PreventiveResource | PreventiveVariable | PreventiveVariableGroup | ExtractedAccessPlatform | ExtractedActivity | ExtractedBibliographicResource | ExtractedConsent | ExtractedContactPoint | ExtractedDistribution | ExtractedOrganization | ExtractedOrganizationalUnit | ExtractedPerson | ExtractedPrimarySource | ExtractedResource | ExtractedVariable | ExtractedVariableGroup | PreviewAccessPlatform | PreviewActivity | PreviewBibliographicResource | PreviewConsent | PreviewContactPoint | PreviewDistribution | PreviewOrganization | PreviewOrganizationalUnit | PreviewPerson | PreviewPrimarySource | PreviewResource | PreviewVariable | PreviewVariableGroup | MergedAccessPlatform | MergedActivity | MergedBibliographicResource | MergedConsent | MergedContactPoint | MergedDistribution | MergedOrganization | MergedOrganizationalUnit | MergedPerson | MergedPrimarySource | MergedResource | MergedVariable | MergedVariableGroup]) list[EditorValue]

Converts a list of models into editor values based on the preview config.

mex.editor.transform.transform_models_to_stem_type(models: Sequence[AdditiveAccessPlatform | AdditiveActivity | AdditiveBibliographicResource | AdditiveConsent | AdditiveContactPoint | AdditiveDistribution | AdditiveOrganization | AdditiveOrganizationalUnit | AdditivePerson | AdditivePrimarySource | AdditiveResource | AdditiveVariable | AdditiveVariableGroup | SubtractiveAccessPlatform | SubtractiveActivity | SubtractiveBibliographicResource | SubtractiveConsent | SubtractiveContactPoint | SubtractiveDistribution | SubtractiveOrganization | SubtractiveOrganizationalUnit | SubtractivePerson | SubtractivePrimarySource | SubtractiveResource | SubtractiveVariable | SubtractiveVariableGroup | PreventiveAccessPlatform | PreventiveActivity | PreventiveBibliographicResource | PreventiveConsent | PreventiveContactPoint | PreventiveDistribution | PreventiveOrganization | PreventiveOrganizationalUnit | PreventivePerson | PreventivePrimarySource | PreventiveResource | PreventiveVariable | PreventiveVariableGroup | ExtractedAccessPlatform | ExtractedActivity | ExtractedBibliographicResource | ExtractedConsent | ExtractedContactPoint | ExtractedDistribution | ExtractedOrganization | ExtractedOrganizationalUnit | ExtractedPerson | ExtractedPrimarySource | ExtractedResource | ExtractedVariable | ExtractedVariableGroup | PreviewAccessPlatform | PreviewActivity | PreviewBibliographicResource | PreviewConsent | PreviewContactPoint | PreviewDistribution | PreviewOrganization | PreviewOrganizationalUnit | PreviewPerson | PreviewPrimarySource | PreviewResource | PreviewVariable | PreviewVariableGroup | MergedAccessPlatform | MergedActivity | MergedBibliographicResource | MergedConsent | MergedContactPoint | MergedDistribution | MergedOrganization | MergedOrganizationalUnit | MergedPerson | MergedPrimarySource | MergedResource | MergedVariable | MergedVariableGroup]) str | None

Get the stem type from a list of models.

mex.editor.transform.transform_models_to_title(models: Sequence[AdditiveAccessPlatform | AdditiveActivity | AdditiveBibliographicResource | AdditiveConsent | AdditiveContactPoint | AdditiveDistribution | AdditiveOrganization | AdditiveOrganizationalUnit | AdditivePerson | AdditivePrimarySource | AdditiveResource | AdditiveVariable | AdditiveVariableGroup | SubtractiveAccessPlatform | SubtractiveActivity | SubtractiveBibliographicResource | SubtractiveConsent | SubtractiveContactPoint | SubtractiveDistribution | SubtractiveOrganization | SubtractiveOrganizationalUnit | SubtractivePerson | SubtractivePrimarySource | SubtractiveResource | SubtractiveVariable | SubtractiveVariableGroup | PreventiveAccessPlatform | PreventiveActivity | PreventiveBibliographicResource | PreventiveConsent | PreventiveContactPoint | PreventiveDistribution | PreventiveOrganization | PreventiveOrganizationalUnit | PreventivePerson | PreventivePrimarySource | PreventiveResource | PreventiveVariable | PreventiveVariableGroup | ExtractedAccessPlatform | ExtractedActivity | ExtractedBibliographicResource | ExtractedConsent | ExtractedContactPoint | ExtractedDistribution | ExtractedOrganization | ExtractedOrganizationalUnit | ExtractedPerson | ExtractedPrimarySource | ExtractedResource | ExtractedVariable | ExtractedVariableGroup | PreviewAccessPlatform | PreviewActivity | PreviewBibliographicResource | PreviewConsent | PreviewContactPoint | PreviewDistribution | PreviewOrganization | PreviewOrganizationalUnit | PreviewPerson | PreviewPrimarySource | PreviewResource | PreviewVariable | PreviewVariableGroup | MergedAccessPlatform | MergedActivity | MergedBibliographicResource | MergedConsent | MergedContactPoint | MergedDistribution | MergedOrganization | MergedOrganizationalUnit | MergedPerson | MergedPrimarySource | MergedResource | MergedVariable | MergedVariableGroup]) list[EditorValue]

Convert a list of models into editor values based on the title config.

mex.editor.transform.transform_value(value: object, allow_link: bool = True) EditorValue

Transform a single object into an editor value ready for rendering.

mex.editor.transform.transform_values(values: object, allow_link: bool = True) list[EditorValue]

Convert a single object or a list of objects into a list of editor values.

mex.editor.types module

class mex.editor.types.EditorUserDatabase(*, read: dict[str, EditorUserPassword] = {}, write: dict[str, EditorUserPassword] = {})

Bases: BaseModel

Database containing usernames and passwords for the editor users.

model_computed_fields: ClassVar[Dict[str, ComputedFieldInfo]] = {}

A dictionary of computed field names and their corresponding ComputedFieldInfo objects.

model_config: ClassVar[ConfigDict] = {'extra': 'ignore', 'populate_by_name': True, 'str_max_length': 100000, 'str_min_length': 1, 'str_strip_whitespace': True, 'use_enum_values': True, 'validate_assignment': True, 'validate_default': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

model_fields: ClassVar[Dict[str, FieldInfo]] = {'read': FieldInfo(annotation=dict[str, EditorUserPassword], required=False, default={}), 'write': FieldInfo(annotation=dict[str, EditorUserPassword], required=False, default={})}

Metadata about the fields defined on the model, mapping of field names to [FieldInfo][pydantic.fields.FieldInfo] objects.

This replaces Model.__fields__ from Pydantic V1.

read: dict[str, EditorUserPassword]
write: dict[str, EditorUserPassword]
class mex.editor.types.EditorUserPassword(secret_value: SecretType)

Bases: SecretStr

An editor password used for basic authentication along with a username.

mex.editor.utils module

async mex.editor.utils.resolve_editor_value(editor_value: EditorValue) None

Resolve editor text values to human readable display values.

mex.editor.utils.resolve_identifier(identifier: str) str

Resolve identifiers to human readable display values.

Module contents