oarepo-fsm
OArepo FSM library for record state transitions built on top of the https://pypi.org/project/sqlalchemy-fsm/ library.
Quickstart
Run the following commands to bootstrap your environment
git clone https://github.com/oarepo/oarepo-fsm cd oarepo-fsm pip install -e .[devel]
Configuration
Check that correct record_class is being used on the RECORDS_REST_ENDPOINT’s item_route
item_route='/records/<pid(recid,record_class="yourapp.models:RecordModelFSM"):pid_value>',
To automatically add a link to the FSM endpoint to your record links, use the following links_factory_imp in your RECORDS_REST_ENDPOINTS config
links_factory_imp='oarepo_fsm.links:record_fsm_links_factory',
If you wish to activate FSM on a certain Record enpoints only, put in your config
OAREPO_FSM_ENABLED_REST_ENDPOINTS = ['recid']
Where recid is the prefix key into your RECORDS_REST_ENDPOINTS configuration. This library activates FSM on all endpoints using record_class inherited from FSMMixin otherwise.
Usage
In order to use this library, you need to define a Record model in your app, that inherits from a FSMMixin column
from invenio_records import Record from oarepo_fsm.mixins import FSMMixin class RecordModelFSM(FSMMixin, Record): ...
To define FSM transitions on this class, create methods decorated with @transition(..) e.g.
@transition(
src=['open', 'archived'],
dest='published',
required=['id'],
permissions=[editor_permission],
commit_record=True)
def publish(self, **kwargs):
print('record published')
Where decorator parameters mean:
src: record must be in one of the source states before transition could happen
dest: target state of the transition
required: a list of required **kwargs that must be passed to the @transition decorated function
permissions: currently logged user must have at least one of the permissions to execute the transition
commit_record: should the changes made in a record be commited after the function returns?
A transition-decorated function can optionally return a custom flask Response or a JSON-serializable dict to be provided to user in a JSON response.
REST API Usage
To get current record state and possible transitions (only transitions that you have permission to invoke will be returned)
GET <record_rest_item_endpoint>
>>>
{
metadata: {
state: <current state of the record>
... other record metadata
}
links: {
self: ...,
"transitions": {
<fsm_transition1_name>: <transition_url>,
<fsm_transition2_name>: <transition_url>,
},
...
}
}
To invoke a specific transition transition, do
POST <record_rest_endpoint>/<fsm_transition_name>
Further documentation is available on https://oarepo-fsm.readthedocs.io/
Permission factories
Sometimes access to records should be governed by the state of the record. For example, if the record is in state=editing, any editor can make changes. If it is state=approving, only the curator can modify the record.
On REST level, modification permissions are governed by permission factories
from invenio_records_rest.utils import allow_all, deny_all
RECORDS_REST_ENDPOINTS = dict(
recid=dict(
create_permission_factory_imp=deny_all,
delete_permission_factory_imp=deny_all,
update_permission_factory_imp=deny_all,
read_permission_factory_imp=allow_all,
)
)
This library provides the following factories and helpers:
transition_required(*transitions) allows user if he is entitled to perform any of the transitions ( method names) on the current record
states_required(*states, state_field="state" allows anyone if the record is in any of the states mentioned
require_all(*perms_or_factories) allows user only if all permissions allow. Use it with states_required as follows
require_all( states_required('editing'), editing_user_permission_factory )where editing_user_permission_factory is a permission factory allowing only editing users.
require_any(*perms_or_factories) allows user if any of the permissions allow. Example
require_any( require_all( states_required('editing'), editing_user_permission_factory ), require_all( states_required('editing', 'approving), curator_user_permission_factory ), )
Changes
Version 0.1.0 (released TBD)
Initial public release.
Metadata
Release files for oarepo-fsm 1.5.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| oarepo-fsm-1.5.1.tar.gz | 19.5 kB | Without provenance | Details for oarepo-fsm-1.5.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| oarepo_fsm-1.5.1-py2.py3-none-any.whl | Python 3, Python 2 | none | any | Details for oarepo_fsm-1.5.1-py2.py3-none-any.whl |
Total release size: 45.6 kB
Release files / oarepo-fsm-1.5.1.tar.gz
| Download URL | oarepo-fsm-1.5.1.tar.gz |
|---|---|
| Size | 19.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
96b8c02a68e8052593eb8b58d2ef2658ba2887a9e4d34ec501656fdb8d6d2c61
|
|
BLAKE2b-256 checksum How to use checksums |
0217784c44ff5673d79908653b66cfe5bddd394914c56253f054500662efd139
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.4.1 importlib_metadata/3.10.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.9.2
|
Release files / oarepo_fsm-1.5.1-py2.py3-none-any.whl
| Download URL | oarepo_fsm-1.5.1-py2.py3-none-any.whl |
|---|---|
| Size | 26.1 kB |
| Tags | Python 2 Python 3 |
|
SHA-256 checksum How to use checksums |
07105435afb23c60d740ae6bbe2caee11d2460d7bebfc7831ea5c154d82e7047
|
|
BLAKE2b-256 checksum How to use checksums |
0d45f6707335be2cbb0b2b40d06c7796a067acf02f51622847d0ac57a9c86d04
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.4.1 importlib_metadata/3.10.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.9.2
|
Security for oarepo-fsm 1.5.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.