class Article(object): """Article ingestion workflow for Literature collection.""" name = "HEP" data_type = "hep" workflow = ( PRE_PROCESSING + NOTIFY_IF_SUBMISSION + MARK_IF_MATCH_IN_HOLDINGPEN + CHECK_IS_UPDATE + STOP_IF_EXISTING_SUBMISSION + CHECK_AUTO_APPROVE + PROCESS_HOLDINGPEN_MATCHES + ENHANCE_RECORD + HALT_FOR_APPROVAL_IF_NEW_OR_STOP_IF_NOT_RELEVANT + [ IF_ELSE( is_record_accepted, (POSTENHANCE_RECORD + STORE_RECORD + SEND_TO_LEGACY + STORE_ROOT + NOTIFY_ACCEPTED + NOTIFY_CURATOR_IF_NEEDED), NOTIFY_NOT_ACCEPTED, ), IF( is_submission, do_not_repeat('close_ticket_user_submission')( close_ticket(ticket_id_key="ticket_id")), ) ] + FIND_NEXT_AND_RUN_IF_NECESSARY)
wait_webcoll, ) from inspirehep.modules.workflows.utils import do_not_repeat from inspirehep.modules.literaturesuggest.tasks import ( curation_ticket_needed, reply_ticket_context, new_ticket_context, curation_ticket_context, ) NOTIFY_SUBMISSION = [ do_not_repeat('create_ticket_curator_new_submission')( create_ticket( template="literaturesuggest/tickets/curator_submitted.html", queue="HEP_add_user", context_factory=new_ticket_context, ticket_id_key="ticket_id" ), ), do_not_repeat('reply_ticket_user_new_submission')( reply_ticket( template="literaturesuggest/tickets/user_submitted.html", context_factory=reply_ticket_context, keep_new=True ), ) ] CHECK_AUTO_APPROVE = [ IF_ELSE( is_submission,
def test_do_not_repeat( mocked_refextract_extract_refs, mocked_api_request_magpie, mocked_api_request_beard, mocked_is_pdf_link, mocked_package_download, mocked_arxiv_download, workflow_app, mocked_external_services, ): def return_value(val): def _return_value(obj, eng): obj.extra_data["id"] = val obj.save() return {"id": val} return _return_value custom_wf_steps = [ load_from_source_data, do_not_repeat("one")(return_value(1)), do_not_repeat("two")(return_value(2)), ] custom_wf_steps_to_repeat = [ load_from_source_data, do_not_repeat("one")(return_value(41)), do_not_repeat("two")(return_value(42)), do_not_repeat("three")(return_value(43)), ] expected_persistent_data_first_run = { 'one': { 'id': 1 }, 'two': { 'id': 2 } }.viewitems() expected_persistent_data_second_run = { 'one': { 'id': 1 }, 'two': { 'id': 2 }, 'three': { 'id': 43 }, }.viewitems() record = generate_record() with workflow_app.app_context(): wf_id = build_workflow(record).id workflow_uuid = start("article", object_id=wf_id) eng = WorkflowEngine.from_uuid(workflow_uuid) obj = eng.processed_objects[0] eng = WorkflowEngine.from_uuid(obj.id_workflow) eng.callbacks.replace(custom_wf_steps) eng.process([obj]) eng = WorkflowEngine.from_uuid(workflow_uuid) obj = eng.processed_objects[0] persistent_data = obj.extra_data['source_data'][ 'persistent_data'].viewitems() assert expected_persistent_data_first_run <= persistent_data assert obj.extra_data['id'] == 2 assert obj.status == ObjectStatus.COMPLETED eng = WorkflowEngine.from_uuid(obj.id_workflow) eng.callbacks.replace(custom_wf_steps_to_repeat) obj.callback_pos = [0] obj.save() db.session.commit() eng.process([obj]) eng = WorkflowEngine.from_uuid(workflow_uuid) obj = eng.processed_objects[0] persistent_data = obj.extra_data['source_data'][ 'persistent_data'].viewitems() assert expected_persistent_data_second_run <= persistent_data assert obj.extra_data['id'] == 43
def test_do_not_repeat( mocked_refextract_extract_refs, mocked_api_request_magpie, mocked_api_request_beard, mocked_is_pdf_link, mocked_package_download, mocked_arxiv_download, workflow_app, mocked_external_services, ): def return_value(val): def _return_value(obj, eng): obj.extra_data["id"] = val obj.save() return {"id": val} return _return_value custom_wf_steps = [ load_from_source_data, do_not_repeat("one")(return_value(1)), do_not_repeat("two")(return_value(2)), ] custom_wf_steps_to_repeat = [ load_from_source_data, do_not_repeat("one")(return_value(41)), do_not_repeat("two")(return_value(42)), do_not_repeat("three")(return_value(43)), ] expected_persistent_data_first_run = { 'one': {'id': 1}, 'two': {'id': 2} }.viewitems() expected_persistent_data_second_run = { 'one': {'id': 1}, 'two': {'id': 2}, 'three': {'id': 43}, }.viewitems() record = generate_record() with workflow_app.app_context(): wf_id = build_workflow(record).id workflow_uuid = start("article", object_id=wf_id) eng = WorkflowEngine.from_uuid(workflow_uuid) obj = eng.processed_objects[0] eng = WorkflowEngine.from_uuid(obj.id_workflow) eng.callbacks.replace(custom_wf_steps) eng.process([obj]) eng = WorkflowEngine.from_uuid(workflow_uuid) obj = eng.processed_objects[0] persistent_data = obj.extra_data['source_data']['persistent_data'].viewitems() assert expected_persistent_data_first_run <= persistent_data assert obj.extra_data['id'] == 2 assert obj.status == ObjectStatus.COMPLETED eng = WorkflowEngine.from_uuid(obj.id_workflow) eng.callbacks.replace(custom_wf_steps_to_repeat) obj.callback_pos = [0] obj.save() db.session.commit() eng.process([obj]) eng = WorkflowEngine.from_uuid(workflow_uuid) obj = eng.processed_objects[0] persistent_data = obj.extra_data['source_data']['persistent_data'].viewitems() assert expected_persistent_data_second_run <= persistent_data assert obj.extra_data['id'] == 43
from inspirehep.modules.authors.tasks import ( curation_ticket_context, curation_ticket_needed, new_ticket_context, reply_ticket_context, update_ticket_context, ) from inspirehep.modules.workflows.utils import do_not_repeat SEND_TO_LEGACY = [ send_robotupload(mode="insert"), ] NOTIFY_ACCEPTED = [ do_not_repeat('reply_ticket_author_submission_accepted')(reply_ticket( template="authors/tickets/user_accepted.html", context_factory=reply_ticket_context)), do_not_repeat('close_ticket_author_submission_accepted')( close_ticket(ticket_id_key="ticket_id")), ] CLOSE_TICKET_IF_NEEDED = [ IF(curation_ticket_needed, [ do_not_repeat('create_ticket_author_submission_curation_needed')( create_ticket(template="authors/tickets/curation_needed.html", queue="AUTHORS_curation", context_factory=curation_ticket_context, ticket_id_key="curation_ticket_id")), ]), ]
new_ticket_context, reply_ticket_context, update_ticket_context, ) from inspirehep.modules.workflows.utils import do_not_repeat SEND_TO_LEGACY = [ send_robotupload(mode="insert", priority_config_key='LEGACY_ROBOTUPLOAD_PRIORITY_AUTHOR'), ] NOTIFY_ACCEPTED = [ do_not_repeat('reply_ticket_author_submission_accepted')( reply_ticket( template="authors/tickets/user_accepted.html", context_factory=reply_ticket_context) ), do_not_repeat('close_ticket_author_submission_accepted')( close_ticket(ticket_id_key="ticket_id") ), ] CLOSE_TICKET_IF_NEEDED = [ IF(curation_ticket_needed, [ do_not_repeat('create_ticket_author_submission_curation_needed')( create_ticket( template="authors/tickets/curation_needed.html", queue="AUTHORS_curation", context_factory=curation_ticket_context,