Example #1
0
def reset_workflow_object_states(obj):
    """Fix workflow positions and states.

    Old states from Prod/QA:
    {(),
     (0,),
     (3, 0),
     (5, 3, 11, 0),
     (5, 3, 14),
     (5, 3, 14, 0),
     (5, 3, 15),
     (5, 3, 15, 1)}

    {(),
     (0,),
     (5,),
     (5, 3, 1),
     (5, 3, 10),
     (5, 3, 11),
     (5, 3, 12),
     (5, 3, 14),
     (5, 3, 14, 0),
     (6, 3, 4)}

    OLD -> NEW
    5, 3, 14 -> 0 end
    5, 3, 10 -> 14, 0 halted
    """
    pos = obj.get_current_task()
    if obj.version == ObjectVersion.COMPLETED:
        obj.save(task_counter=[len(workflows.get(obj.workflow.name).workflow) - 1])
        return
    elif obj.version == ObjectVersion.RUNNING:
        # Running? Nah that cannot be.
        obj.version = ObjectVersion.ERROR
    try:
        obj.get_current_task_info()
    except IndexError:
        # The current task counter is Invalid
        obj.version = ObjectVersion.ERROR

    if obj.workflow.name == "process_record_arxiv":
        if tuple(pos) in [
                (5,), (5, 3, 14), (5, 3, 14, 0), (5, 3, 15), (5, 3, 15, 1)]:
            pos = [len(workflows.get(obj.workflow.name).workflow) - 1]  # finished
        elif tuple(pos) in [(5, 3, 10), (5, 3, 11, 0), (5, 3, 12)]:
            pos = [14, 0]  # halted
        elif tuple(pos) == (3, 0):
            pos = [4, 0]  # deleted
        elif len(pos) > 1 and pos[0] == 6:
            # We need to update pos from 6 to start of pre_processing part
            pos = [7]
        else:
            pos = [0]  # Nothing here, we go to start
        return pos
Example #2
0
def get_harvesting_workflows():
    """Return the workflows enabled in the harvester module."""
    enabled_workflows = []
    for name in cfg.get("HARVESTER_WORKFLOWS", list()):
        if workflows.get(name):
            enabled_workflows.append(name)
    return enabled_workflows
Example #3
0
def get_model_from_obj(obj):
    """Return an instance of the model from the workflow."""
    from invenio_workflows.registry import workflows
    workflow = workflows.get(obj.workflow.name)

    if workflow is not None:
        return workflow.model(obj)
    else:
        return None
Example #4
0
 def get_type(self, type_or_id):
     """Get type."""
     from invenio_workflows.registry import workflows
     return workflows.get(type_or_id)
Example #5
0
def index_holdingpen_record(sender, **kwargs):
    """Index a Holding Pen record."""
    from invenio_ext.es import es
    from invenio_records.api import Record
    from invenio_records.signals import before_record_index
    from invenio_records.recordext.functions.get_record_collections import (
        get_record_collections,
    )
    from invenio_records.tasks.index import get_record_index

    from invenio_workflows.registry import workflows

    if not sender.workflow:
        # No workflow registered to object yet. Skip indexing
        return

    if sender.version == ObjectVersion.INITIAL:
        # Ignore initial versions
        return

    workflow = workflows.get(sender.workflow.name)
    if not workflow:
        current_app.logger.info(
            "Workflow {0} not found for sender: {1}".format(
                sender.workflow.name, sender.id
            )
        )
        return

    if not hasattr(sender, 'data'):
        sender.data = sender.get_data()
    if not hasattr(sender, 'extra_data'):
        sender.extra_data = sender.get_extra_data()

    record = Record({})
    record["version"] = ObjectVersion.name_from_version(sender.version)
    record["type"] = sender.data_type
    record["status"] = sender.status
    record["created"] = sender.created.isoformat()
    record["modified"] = sender.modified.isoformat()
    record["uri"] = sender.uri
    record["id_workflow"] = sender.id_workflow
    record["id_user"] = sender.id_user
    record["id_parent"] = sender.id_parent
    record["workflow"] = sender.workflow.name
    try:
        record.update(workflow.get_record(sender))
    except Exception as err:
        current_app.logger.exception(err)

    try:
        record.update(workflow.get_sort_data(sender))
    except Exception as err:
        current_app.logger.exception(err)

    # Add collection to get correct mapping
    record["_collections"] = get_record_collections(record)

    # Depends on "_collections" being filled correctly for record
    record_index = get_record_index(record) or current_app.config["SEARCH_ELASTIC_DEFAULT_INDEX"]

    # Trigger any before_record_index receivers
    before_record_index.send(sender.id, json=record, index=record_index)

    if record_index:
        index = current_app.config['WORKFLOWS_HOLDING_PEN_ES_PREFIX'] + record_index
        es.index(
            index=index,
            doc_type=current_app.config["WORKFLOWS_HOLDING_PEN_DOC_TYPE"],
            body=dict(record),
            id=sender.id
        )