本文整理汇总了Python中invenio_workflows.WorkflowEngine类的典型用法代码示例。如果您正苦于以下问题:Python WorkflowEngine类的具体用法?Python WorkflowEngine怎么用?Python WorkflowEngine使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了WorkflowEngine类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: test_harvesting_arxiv_workflow_accepted
def test_harvesting_arxiv_workflow_accepted(
mocked, db_only_app, record_oai_arxiv_plots):
"""Test a full harvesting workflow."""
from invenio_workflows import (
start, WorkflowEngine, ObjectStatus, workflow_object_class
)
from dojson.contrib.marc21.utils import create_record
from invenio_db import db
from inspirehep.dojson.hep import hep
from inspirehep.modules.converter.xslt import convert
# Convert to MARCXML, then dict, then HEP JSON
record_oai_arxiv_plots_marcxml = convert(
record_oai_arxiv_plots,
"oaiarXiv2marcxml.xsl"
)
record_marc = create_record(record_oai_arxiv_plots_marcxml)
record_json = hep.do(record_marc)
workflow_uuid = None
with db_only_app.app_context():
workflow_uuid = start('article', [record_json])
eng = WorkflowEngine.from_uuid(workflow_uuid)
obj = eng.processed_objects[0]
assert obj.status == ObjectStatus.HALTED
assert obj.data_type == "hep"
# Files should have been attached (tarball + pdf)
assert obj.files["1407.7587.pdf"]
assert obj.files["1407.7587.tar.gz"]
# A publication note should have been extracted
pub_info = obj.data.get('publication_info')
assert pub_info
assert pub_info[0]
assert pub_info[0].get('year') == "2014"
assert pub_info[0].get('journal_title') == "J. Math. Phys."
# This record should not have been touched yet
assert "approved" not in obj.extra_data
# Now let's resolve it as accepted and continue
# FIXME Should be accept, but record validation prevents us.
obj.remove_action()
obj.extra_data["approved"] = True
obj.extra_data["core"] = True
obj.save()
db.session.commit()
with db_only_app.app_context():
eng = WorkflowEngine.from_uuid(workflow_uuid)
obj = eng.processed_objects[0]
obj_id = obj.id
obj.continue_workflow()
obj = workflow_object_class.get(obj_id)
# It was accepted
assert obj.status == ObjectStatus.COMPLETED
示例2: test_halt
def test_halt(app, halt_workflow, halt_workflow_conditional):
"""Test halt task."""
assert 'halttest' in app.extensions['invenio-workflows'].workflows
assert 'halttestcond' in app.extensions['invenio-workflows'].workflows
with app.app_context():
data = [{'foo': 'bar'}]
eng_uuid = start('halttest', data)
eng = WorkflowEngine.from_uuid(eng_uuid)
obj = eng.processed_objects[0]
assert obj.known_statuses.WAITING == obj.status
assert WorkflowStatus.HALTED == eng.status
obj_id = obj.id
obj.continue_workflow()
obj = WorkflowObject.get(obj_id)
assert obj.known_statuses.COMPLETED == obj.status
# Check conditional workflows and pass data not as a list (to check).
eng_uuid = start('halttestcond', data[0])
eng = WorkflowEngine.from_uuid(eng_uuid)
obj = eng.processed_objects[0]
assert obj.known_statuses.WAITING == obj.status
assert WorkflowStatus.HALTED == eng.status
obj_id = obj.id
obj.continue_workflow()
obj = WorkflowObject.get(obj_id)
assert obj.known_statuses.COMPLETED == obj.status
示例3: test_match_in_holdingpen_previously_rejected_wf_stop
def test_match_in_holdingpen_previously_rejected_wf_stop(
mocked_download_arxiv,
mocked_api_request_beard,
mocked_api_request_magpie,
mocked_package_download,
workflow_app,
mocked_external_services,
):
record = generate_record()
eng_uuid = start('article', [record])
eng = WorkflowEngine.from_uuid(eng_uuid)
obj_id = eng.objects[0].id
obj = workflow_object_class.get(obj_id)
obj.extra_data["approved"] = False # reject record
obj.continue_workflow()
obj = workflow_object_class.get(obj_id)
assert obj.status == ObjectStatus.COMPLETED
assert obj.extra_data.get('approved') is False
es.indices.refresh('holdingpen-hep')
record['titles'][0]['title'] = 'This is an update that will match the wf in the holdingpen'
# this workflow matches in the holdingpen and stops because the
# matched one was rejected
eng_uuid = start('article', [record])
eng = WorkflowEngine.from_uuid(eng_uuid)
obj2 = eng.objects[0]
assert obj2.extra_data['already-in-holding-pen'] is False
assert obj2.extra_data['previously_rejected'] is True
assert obj2.extra_data['previously_rejected_matches'] == [obj_id]
示例4: test_match_in_holdingpen_different_sources_continues
def test_match_in_holdingpen_different_sources_continues(
mocked_api_request_magpie,
mocked_api_request_beard,
mocked_package_download,
mocked_is_pdf_link,
mocked_download_arxiv,
workflow_app,
mocked_external_services,
):
record = generate_record()
workflow_id = build_workflow(record).id
eng_uuid = start('article', object_id=workflow_id)
es.indices.refresh('holdingpen-hep')
eng = WorkflowEngine.from_uuid(eng_uuid)
wf_to_match = eng.objects[0].id
obj = workflow_object_class.get(wf_to_match)
assert obj.status == ObjectStatus.HALTED
# generated wf pending in holdingpen
record['titles'][0]['title'] = 'This is an update that will match the wf in the holdingpen'
record['acquisition_source']['source'] = 'but not the source'
# this workflow matches in the holdingpen but continues because has a
# different source
workflow_id = build_workflow(record).id
eng_uuid = start('article', object_id=workflow_id)
eng = WorkflowEngine.from_uuid(eng_uuid)
obj = eng.objects[0]
assert obj.extra_data['already-in-holding-pen'] is True
assert obj.extra_data['holdingpen_matches'] == [wf_to_match]
assert obj.extra_data['previously_rejected'] is False
assert not obj.extra_data.get('stopped-matched-holdingpen-wf')
示例5: test_harvesting_arxiv_workflow_manual_accepted
def test_harvesting_arxiv_workflow_manual_accepted(
mocked_refextract_extract_refs,
mocked_matching_match,
mocked_api_request_magpie,
mocked_api_request_beard,
mocked_download_utils,
mocked_download_arxiv,
mocked_package_download,
workflow_app,
mocked_external_services,
):
record = generate_record()
"""Test a full harvesting workflow."""
workflow_uuid, eng, obj = get_halted_workflow(app=workflow_app, record=record)
do_accept_core(app=workflow_app, workflow_id=obj.id)
eng = WorkflowEngine.from_uuid(workflow_uuid)
obj = eng.processed_objects[0]
assert obj.status == ObjectStatus.WAITING
do_robotupload_callback(app=workflow_app, workflow_id=obj.id, recids=[12345])
obj = workflow_object_class.get(obj.id)
assert obj.status == ObjectStatus.WAITING
do_webcoll_callback(app=workflow_app, recids=[12345])
eng = WorkflowEngine.from_uuid(workflow_uuid)
obj = eng.processed_objects[0]
# It was accepted
assert obj.status == ObjectStatus.COMPLETED
assert obj.extra_data["approved"] is True
示例6: test_merge_callback_url_with_malformed_workflow
def test_merge_callback_url_with_malformed_workflow(
mocked_api_request_magpie,
mocked_beard_api,
workflow_app,
mocked_external_services,
disable_file_upload,
enable_merge_on_update,
):
with patch('inspire_json_merger.config.ArxivOnArxivOperations.conflict_filters', ['acquisition_source.source']):
factory = TestRecordMetadata.create_from_file(
__name__, 'merge_record_arxiv.json', index_name='records-hep')
update_workflow_id = build_workflow(RECORD_WITH_CONFLICTS).id
eng_uuid = start('article', object_id=update_workflow_id)
eng = WorkflowEngine.from_uuid(eng_uuid)
obj = eng.objects[0]
conflicts = obj.extra_data.get('conflicts')
expected_url = 'http://localhost:5000/callback/workflows/resolve_merge_conflicts'
assert obj.status == ObjectStatus.HALTED
assert expected_url == obj.extra_data.get('callback_url')
assert len(conflicts) == 1
assert obj.extra_data.get('is-update') is True
assert obj.extra_data['merger_root'] == RECORD_WITH_CONFLICTS
payload = {
'id': obj.id,
'metadata': 'Jessica Jones',
'_extra_data': 'Frank Castle'
}
with workflow_app.test_client() as client:
response = client.put(
obj.extra_data.get('callback_url'),
data=json.dumps(payload),
content_type='application/json',
)
data = json.loads(response.get_data())
expected_message = 'The workflow request is malformed.'
assert response.status_code == 400
assert expected_message == data['message']
eng = WorkflowEngine.from_uuid(eng_uuid)
obj = eng.objects[0]
assert obj.status == ObjectStatus.HALTED
assert obj.extra_data.get('callback_url') is not None
assert obj.extra_data.get('conflicts') is not None
assert obj.extra_data['merger_root'] is not None
updated_root = read_wf_record_source(factory.record_metadata.id, 'arxiv')
assert updated_root is None
示例7: test_harvesting_arxiv_workflow_manual_accepted
def test_harvesting_arxiv_workflow_manual_accepted(
mocked_refextract_extract_refs,
mocked_matching_search,
mocked_api_request_beard_block,
mocked_api_request_magpie,
mocked_api_request_beard,
mocked_download,
workflow_app,
record,
):
"""Test a full harvesting workflow."""
with requests_mock.Mocker() as requests_mocker:
requests_mocker.register_uri(
requests_mock.ANY,
re.compile('.*(indexer|localhost).*'),
real_http=True,
)
requests_mocker.register_uri(
'POST',
re.compile(
'https?://localhost:1234.*',
),
text=u'[INFO]',
status_code=200,
)
workflow_uuid, eng, obj = get_halted_workflow(
app=workflow_app,
extra_config={'PRODUCTION_MODE': False},
record=record,
)
_do_accept_core(
app=workflow_app,
workflow_id=obj.id,
)
eng = WorkflowEngine.from_uuid(workflow_uuid)
obj = eng.processed_objects[0]
assert obj.status == ObjectStatus.WAITING
response = _do_robotupload_callback(
app=workflow_app,
workflow_id=obj.id,
recids=[12345],
)
assert response.status_code == 200
obj = workflow_object_class.get(obj.id)
assert obj.status == ObjectStatus.WAITING
response = _do_webcoll_callback(app=workflow_app, recids=[12345])
assert response.status_code == 200
eng = WorkflowEngine.from_uuid(workflow_uuid)
obj = eng.processed_objects[0]
# It was accepted
assert obj.status == ObjectStatus.COMPLETED
示例8: test_restart
def test_restart(app, restart_workflow):
"""Test halt task."""
assert 'restarttest' in app.extensions['invenio-workflows'].workflows
with app.app_context():
data = {}
eng_uuid = start('restarttest', data)
eng = WorkflowEngine.from_uuid(eng_uuid)
obj = eng.processed_objects[0]
assert obj.known_statuses.HALTED == obj.status
assert WorkflowStatus.HALTED == eng.status
assert obj.data == {"title": "foo"}
assert obj.get_action() == "foo"
assert obj.get_action_message() == "Test"
# Restart shall have no effect (still halted)
new_eng_uuid = restart(eng_uuid)
assert new_eng_uuid == eng_uuid
eng = WorkflowEngine.from_uuid(eng_uuid)
obj = eng.processed_objects[0]
assert obj.known_statuses.HALTED == obj.status
assert WorkflowStatus.HALTED == eng.status
assert obj.data == {"title": {"value": "bar"}}
assert obj.get_action() == "foo"
obj.remove_action()
assert obj.get_action() is None
obj_id = obj.id
# Now it should resume the next task
resume(obj_id)
obj = WorkflowObject.get(obj_id)
assert obj.known_statuses.COMPLETED == obj.status
assert obj.extra_data.get('test') == 'test'
assert obj.data.get('title').get('source') == 'TEST'
# We restart the object again
restart(obj.workflow.uuid, data=obj)
assert obj.known_statuses.HALTED == obj.status
assert WorkflowStatus.HALTED == eng.status
assert obj.data == {"title": {"value": "bar"}}
示例9: edit_workflow
def edit_workflow(workflow_app):
app_client = workflow_app.test_client()
user = User.query.filter_by(email='[email protected]').one()
login_user_via_session(app_client, user=user)
record = {
'$schema': 'http://localhost:5000/schemas/records/hep.json',
'arxiv_eprints': [
{
'categories': [
'nucl-th'
],
'value': '1802.03287'
}
],
'control_number': 123,
'document_type': ['article'],
'titles': [{'title': 'Resource Pooling in Large-Scale Content Delivery Systems'}],
'self': {'$ref': 'http://localhost:5000/schemas/records/hep.json'},
'_collections': ['Literature']
}
factory = TestRecordMetadata.create_from_kwargs(json=record)
eng_uuid = start('edit_article', data=factory.record_metadata.json)
obj = WorkflowEngine.from_uuid(eng_uuid).objects[0]
assert obj.status == ObjectStatus.WAITING
assert obj.extra_data['callback_url']
return obj
示例10: test_stop_matched_holdingpen_wfs
def test_stop_matched_holdingpen_wfs(app, simple_record):
# need to run a wf in order to assign to it the wf definition and a uuid
# for it
obj = workflow_object_class.create(
data_type='hep',
**simple_record
)
workflow_uuid = start('article', object_id=obj.id)
eng = WorkflowEngine.from_uuid(workflow_uuid)
obj = eng.processed_objects[0]
obj.status = ObjectStatus.HALTED
obj.save()
obj_id = obj.id
es.indices.refresh('holdingpen-hep')
obj2 = WorkflowObject.create(data_type='hep', **simple_record)
obj2_id = obj2.id
match_non_completed_wf_in_holdingpen(obj2, None)
assert obj2.extra_data['holdingpen_matches'] == [obj_id]
stop_matched_holdingpen_wfs(obj2, None)
stopped_wf = workflow_object_class.get(obj_id)
assert stopped_wf.status == ObjectStatus.COMPLETED
assert stopped_wf.extra_data['stopped-by-wf'] == obj2_id
示例11: test_harvesting_arxiv_workflow_already_on_legacy
def test_harvesting_arxiv_workflow_already_on_legacy(
mocked_refextract_extract_refs,
mocked_api_request_beard_block,
mocked_api_request_magpie,
mocked_api_request_beard,
mocked_download,
small_app,
already_harvested_on_legacy_record,
):
"""Test a full harvesting workflow."""
extra_config = {
"BEARD_API_URL": "http://example.com/beard",
"MAGPIE_API_URL": "http://example.com/magpie",
}
workflow_uuid = None
with small_app.app_context():
with mock.patch.dict(small_app.config, extra_config):
workflow_uuid = start('article', [
already_harvested_on_legacy_record])
eng = WorkflowEngine.from_uuid(workflow_uuid)
obj = eng.processed_objects[0]
assert obj.status == ObjectStatus.COMPLETED
assert 'already-ingested' in obj.extra_data
assert obj.extra_data['already-ingested']
示例12: start_edit_article_workflow
def start_edit_article_workflow(recid):
try:
record = get_db_record('lit', recid)
except RecordGetterError:
raise CallbackRecordNotFoundError(recid)
record_permission = RecordPermission.create(action='update', record=record)
if not record_permission.can():
abort(403, record_permission)
# has to be done before start() since, it is deattaching this session
user_id = current_user.get_id()
eng_uuid = start('edit_article', data=record)
workflow_id = WorkflowEngine.from_uuid(eng_uuid).objects[0].id
workflow = workflow_object_class.get(workflow_id)
workflow.id_user = user_id
if request.referrer:
base_rt_url = get_rt_link_for_ticket('').replace('?', '\?')
ticket_match = re.match(base_rt_url + '(?P<ticket_id>\d+)', request.referrer)
if ticket_match:
ticket_id = int(ticket_match.group('ticket_id'))
workflow.extra_data['curation_ticket_id'] = ticket_id
workflow.save()
db.session.commit()
url = "{}{}".format(current_app.config['WORKFLOWS_EDITOR_API_URL'], workflow_id)
return redirect(location=url, code=302)
示例13: stop_matched_holdingpen_wfs
def stop_matched_holdingpen_wfs(obj, eng):
"""Stop the matched workflow objects in the holdingpen.
Stops the matched workflows in the holdingpen by replacing their steps with
a new one defined on the fly, containing a ``stop`` step, and executing it.
For traceability reason, these workflows are also marked as
``'stopped-by-wf'``, whose value is the current workflow's id.
In the use case of harvesting twice an article, this function is involved
to stop the first workflow and let the current one being processed,
since it the latest metadata.
Args:
obj: a workflow object.
eng: a workflow engine.
Returns:
None
"""
stopping_steps = [mark('stopped-by-wf', int(obj.id)), stop_processing]
obj.save()
for holdingpen_wf_id in obj.extra_data['holdingpen_matches']:
holdingpen_wf = workflow_object_class.get(holdingpen_wf_id)
holdingpen_wf_eng = WorkflowEngine.from_uuid(holdingpen_wf.id_workflow)
# stop this holdingpen workflow by replacing its steps with a stop step
holdingpen_wf_eng.callbacks.replace(stopping_steps)
holdingpen_wf_eng.process([holdingpen_wf])
示例14: test_validation_error_callback_with_malformed_with_invalid_types
def test_validation_error_callback_with_malformed_with_invalid_types(workflow_app):
invalid_record = {
"_collections": ["Literature"],
"document_type": ["article"],
"titles": [{"title": "A title"}],
}
workflow_id = build_workflow(invalid_record).id
eng_uuid = start("article", object_id=workflow_id)
eng = WorkflowEngine.from_uuid(eng_uuid)
obj = eng.objects[0]
response = do_validation_callback(
workflow_app,
# id
"Alias Investigations",
obj.data,
# extra_data
"Jessica Jones",
)
data = json.loads(response.get_data())
expected_message = "The workflow request is malformed."
expected_error_code = "MALFORMED"
assert response.status_code == 400
assert expected_error_code == data["error_code"]
assert expected_message == data["message"]
assert "errors" in data
示例15: test_merge_without_conflicts_handles_update_without_acquisition_source_and_acts_as_rootless
def test_merge_without_conflicts_handles_update_without_acquisition_source_and_acts_as_rootless(
mocked_api_request_magpie,
mocked_beard_api,
workflow_app,
mocked_external_services,
disable_file_upload,
enable_merge_on_update,
):
with patch('inspire_json_merger.config.PublisherOnArxivOperations.conflict_filters', ['acquisition_source.source']):
factory = TestRecordMetadata.create_from_file(
__name__, 'merge_record_arxiv.json', index_name='records-hep')
update_workflow_id = build_workflow(RECORD_WITHOUT_ACQUISITION_SOURCE_AND_NO_CONFLICTS).id
eng_uuid = start('article', object_id=update_workflow_id)
eng = WorkflowEngine.from_uuid(eng_uuid)
obj = eng.objects[0]
conflicts = obj.extra_data.get('conflicts')
assert obj.status == ObjectStatus.COMPLETED
assert not conflicts
assert obj.extra_data.get('callback_url') is None
assert obj.extra_data.get('is-update') is True
assert obj.extra_data['merger_head_revision'] == 0
assert obj.extra_data['merger_original_root'] == {}
# source us unknown, so no new root is saved.
roots = read_all_wf_record_sources(factory.record_metadata.id)
assert not roots