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
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
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
def get_type(self, type_or_id): """Get type.""" from invenio_workflows.registry import workflows return workflows.get(type_or_id)
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 )