def edit_record_subject(objectid): """Entrypoint for editing subjects from detailed pages.""" editable_obj = BibWorkflowObject.query.get(objectid) data = editable_obj.get_data() new_subjects_list = request.values.getlist('subjects[]') or [] subject_dict = [] # We need to check the type of the object due to differences # Submission: dict / Harvest: SmartJson if type(data) is dict: deposition = Deposition(editable_obj) sip = deposition.get_latest_sip() metadata = sip.metadata subject_dict.extend(metadata.get(SUBJECT_TERM)) edit_submission(deposition, metadata, sip, new_subjects_list, subject_dict) else: subject_dict.extend(data.get(SUBJECT_TERM)) edit_harvest(editable_obj, data, new_subjects_list, subject_dict) return jsonify({ "category": "success", "message": "Edit on subjects was successful." })
def arxiv_fft_get(obj, eng): """Get FFT from arXiv, if arXiv ID is provided.""" deposition = Deposition(obj) sip = deposition.get_latest_sip(sealed=False) metadata = sip.metadata if 'arxiv_id' in metadata and metadata['arxiv_id']: arxiv_pdf_url = cfg.get("ARXIV_PDF_URL", "http://arxiv.org/pdf/") + \ "{0}.{1}" from invenio.config import CFG_TMPSHAREDDIR arxiv_file, arxiv_file_path = mkstemp( prefix="%s_" % (metadata['arxiv_id'].replace("/", "_")), suffix='.pdf', dir=CFG_TMPSHAREDDIR, ) os.close(arxiv_file) download_url(url=arxiv_pdf_url.format( metadata['arxiv_id'], "pdf"), content_type="pdf", download_to_file=arxiv_file_path) # To get 1111.2222.pdf as filename. filename = "{0}.pdf".format(metadata['arxiv_id'].replace("/", "_")) try: try: save_deposition_file(deposition, filename, arxiv_file_path) except FilenameAlreadyExists: obj.log.error("PDF file not saved: filename already exists.") except Exception as e: obj.log.error("PDF file not saved: {}.".format(e.message))
def _run_tasks(obj, dummy_eng): from invenio.legacy.bibsched.bibtask import task_low_level_submission d = Deposition(obj) sip = d.get_latest_sip(sealed=True) recid = sip.metadata['recid'] communities = sip.metadata.get('provisional_communities', []) common_args = [] sequenceid = getattr(d.workflow_object, 'task_sequence_id', None) if sequenceid: common_args += ['-I', str(sequenceid)] if update: tasklet_name = 'bst_openaire_update_upload' else: tasklet_name = 'bst_openaire_new_upload' task_id = task_low_level_submission( 'bibtasklet', 'webdeposit', '-T', tasklet_name, '--argument', 'recid=%s' % recid, *common_args ) sip.task_ids.append(task_id) for c in communities: task_id = task_low_level_submission( 'webcoll', 'webdeposit', '-c', 'provisional-user-%s' % c, *common_args ) sip.task_ids.append(task_id) d.update()
def _run_tasks(obj, dummy_eng): d = Deposition(obj) sip = d.get_latest_sip(sealed=True) recid = sip.metadata['recid'] communities = sip.metadata.get('provisional_communities', []) common_args = ['-P5', ] sequenceid = getattr(d.workflow_object, 'task_sequence_id', None) if sequenceid: common_args += ['-I', str(sequenceid)] if update: tasklet_name = 'bst_openaire_update_upload' else: tasklet_name = 'bst_openaire_new_upload' task_id = task_low_level_submission( 'bibtasklet', 'webdeposit', '-T', tasklet_name, '--argument', 'recid=%s' % recid, *common_args ) sip.task_ids.append(task_id) for c in communities: task_id = task_low_level_submission( 'webcoll', 'webdeposit', '-c', 'provisional-user-%s' % c, *common_args ) sip.task_ids.append(task_id) d.update()
def create(obj, dummy_eng): #FIXME change share tmp directory from invenio.config import CFG_TMPSHAREDDIR from invenio.legacy.bibsched.bibtask import task_low_level_submission, \ bibtask_allocate_sequenceid d = Deposition(obj) sip = d.get_latest_sip(sealed=False) sip.seal() tmp_file_fd, tmp_file_path = mkstemp( prefix="webdeposit-%s-%s" % (d.id, sip.uuid), suffix='.xml', dir=CFG_TMPSHAREDDIR, ) os.write(tmp_file_fd, sip.package) os.close(tmp_file_fd) # Trick to have access to task_sequence_id in subsequent tasks. d.workflow_object.task_sequence_id = bibtask_allocate_sequenceid() task_id = task_low_level_submission( 'bibupload', 'webdeposit', '-r' if 'recid' in sip.metadata else '-i', tmp_file_path, '-I', str(d.workflow_object.task_sequence_id) ) sip.task_ids.append(task_id) d.update()
def _mint_pid(obj, dummy_eng): d = Deposition(obj) recjson = d.get_latest_sip(sealed=False).metadata if 'recid' not in recjson: raise Exception("'recid' not found in sip metadata.") pid_text = None pid = recjson.get(pid_field, None) if not pid: # No pid found in recjson, so create new pid with user supplied # function. pid_text = recjson[pid_field] = pid_creator(recjson) else: # Pid found - check if it should be minted if existing_pid_checker and existing_pid_checker(pid, recjson): pid_text = pid # Create an assign pid internally - actually registration will happen # asynchronously later. if pid_text: current_app.logger.info("Registering pid %s" % pid_text) pid_obj = PersistentIdentifier.create(pid_store_type, pid_text) if pid_obj is None: pid_obj = PersistentIdentifier.get(pid_store_type, pid_text) try: pid_obj.assign("rec", recjson['recid']) except Exception: register_exception(alert_admin=True) d.update()
def _finalize_sip(obj, dummy_eng): d = Deposition(obj) sip = d.get_latest_sip(sealed=False) sip.package = make_record( sip.metadata, is_dump=is_dump ).legacy_export_as_marc() d.update()
def create(obj, dummy_eng): #FIXME change share tmp directory from invenio.config import CFG_TMPSHAREDDIR from invenio.legacy.bibsched.bibtask import task_low_level_submission, \ bibtask_allocate_sequenceid d = Deposition(obj) sip = d.get_latest_sip(sealed=False) sip.seal() tmp_file_fd, tmp_file_path = mkstemp( prefix="webdeposit-%s-%s" % (d.id, sip.uuid), suffix='.xml', dir=CFG_TMPSHAREDDIR, ) os.write(tmp_file_fd, sip.package) os.close(tmp_file_fd) # Trick to have access to task_sequence_id in subsequent tasks. d.workflow_object.task_sequence_id = bibtask_allocate_sequenceid() task_id = task_low_level_submission( 'bibupload', 'webdeposit', '-r' if 'recid' in sip.metadata else '-i', tmp_file_path, '-I', str(d.workflow_object.task_sequence_id)) sip.task_ids.append(task_id) d.update()
def _run_tasks(obj, dummy_eng): from invenio.legacy.bibsched.bibtask import task_low_level_submission d = Deposition(obj) sip = d.get_latest_sip(sealed=True) recid = sip.metadata['recid'] common_args = [] sequenceid = getattr(d.workflow_object, 'task_sequence_id', None) if sequenceid: common_args += ['-I', str(sequenceid)] if update: tasklet_name = 'bst_openaire_update_upload' else: tasklet_name = 'bst_openaire_new_upload' task_id = task_low_level_submission( 'bibtasklet', 'webdeposit', '-T', tasklet_name, '--argument', 'recid=%s' % recid, *common_args ) sip.task_ids.append(task_id) d.update()
def _classify_paper_with_deposit(obj, eng): from invenio.modules.deposit.models import Deposition deposition = Deposition(obj) data = None if not fast_mode: for f in deposition.files: if f.name and ".pdf" in f.name.lower(): data = f.get_syspath() break callback = bibclassify_exhaustive_call if not data: try: metadata = deposition.get_latest_sip().metadata except AttributeError as err: obj.log.error("Error getting data: {0}".format(err)) data = [ metadata.get("title", {}).get("title", ""), metadata.get("abstract", {}).get("summary", "") ] callback = bibclassify_exhaustive_call_text classify_paper(obj, eng, callback, data, taxonomy, rebuild_cache, no_cache, output_mode, output_limit, spires, match_mode, with_author_keywords, extract_acronyms, only_core_tags, fast_mode)
def _classify_paper_with_deposit(obj, eng): from invenio.modules.deposit.models import Deposition deposition = Deposition(obj) data = None if not fast_mode: for f in deposition.files: if f.name and ".pdf" in f.name.lower(): data = f.get_syspath() break callback = bibclassify_exhaustive_call if not data: try: metadata = deposition.get_latest_sip().metadata except AttributeError as err: obj.log.error("Error getting data: {0}".format(err)) data = [metadata.get("title", {}).get("title", ""), metadata.get("abstract", {}).get("summary", "")] callback = bibclassify_exhaustive_call_text classify_paper(obj, eng, callback, data, taxonomy, rebuild_cache, no_cache, output_mode, output_limit, spires, match_mode, with_author_keywords, extract_acronyms, only_core_tags, fast_mode)
def add_core_deposit(obj, eng): """Check if the record was approved as CORE.""" from invenio.modules.deposit.models import Deposition if obj.extra_data.get("core"): d = Deposition(obj) sip = d.get_latest_sip(d.submitted) sip.metadata = add_core(sip.metadata) d.update()
def _reserved_recid(obj, dummy_eng): d = Deposition(obj) sip = d.get_latest_sip(sealed=False) reserved_doi = sip.metadata.get('prereserve_doi', None) if reserved_doi and reserved_doi['recid']: sip.metadata['recid'] = reserved_doi['recid'] d.update()
def _bibdocfile_update(obj, eng): if process: d = Deposition(obj) sip = d.get_latest_sip(sealed=False) recid = sip.metadata.get('recid') if recid: brd = BibRecDocs(int(recid)) process(d, brd) d.update()
def _process_sip(obj, dummy_eng): d = Deposition(obj) metadata = d.get_latest_sip(sealed=False).metadata if processor is not None: processor(d, metadata) elif processor is None and hasattr(d.type, 'process_sip_metadata'): d.type.process_sip_metadata(d, metadata) d.update()
def get_title(bwo): """Return title of object.""" deposit_object = Deposition(bwo) sip = deposit_object.get_latest_sip() if sip: # Get the SmartJSON object record = sip.metadata return record.get("title", {"title": "No title"}).get("title") else: return "User submission in progress!!"
def _create_recid(obj, dummy_eng): d = Deposition(obj) sip = d.get_latest_sip(sealed=False) if sip is None: raise Exception("No submission information package found.") if 'recid' not in sip.metadata: from invenio.legacy.bibupload.engine import create_new_record sip.metadata['recid'] = create_new_record() d.update()
def create(obj, dummy_eng): #FIXME change share tmp directory d = Deposition(obj) sip = d.get_latest_sip(sealed=True) sip.seal() #FIXME ??? create_record(data=sip.metadata) d.update()
def add_note_entry(obj, eng): """Add note entry to sip metadata on approval.""" entry = {'value': '*Temporary entry*'} if obj.extra_data.get("core") \ else {'value': '*Brief entry*'} deposition = Deposition(obj) metadata = deposition.get_latest_sip(sealed=False).metadata if metadata.get('note') is None or not isinstance(metadata.get("note"), list): metadata['note'] = [entry] else: metadata['note'].append(entry) deposition.update()
def user_pdf_get(obj, eng): """Upload user PDF file, if requested.""" if obj.extra_data.get('pdf_upload', False): fft = {'url': obj.extra_data.get('submission_data').get('pdf'), 'docfile_type': 'INSPIRE-PUBLIC'} deposition = Deposition(obj) metadata = deposition.get_latest_sip(sealed=False).metadata if metadata.get('fft'): metadata['fft'].append(fft) else: metadata['fft'] = [fft] deposition.update() obj.log.info("PDF file added to FFT.")
def _merge_record(obj, eng): d = Deposition(obj) sip = d.get_latest_sip(sealed=False) # Get the current record, which contains all fields. current_record = get_record( sip.metadata.get('recid'), reset_cache=True ) form_class = d.get_draft(draft_id).form_class # Create a simplified record from the current record, that only # contains fields concerning this deposition. current_simple_record = deposition_record( current_record, [form_class], pre_process_load=pre_process_load, post_process_load=post_process_load, process_export=partial(process_export, d), ) # Create a simplified record from the changes the user have made. changed_simple_record = make_record(sip.metadata, is_dump=True) # Make an initial patch of current record (e.g. some default values set # by the form, might not exists in the current record) for k in current_simple_record: if k not in current_record: current_record[k] = current_simple_record[k] # Export clean dumps current_simple_json = current_simple_record.dumps(clean=True) changed_simple_json = changed_simple_record.dumps(clean=True) current_full_json = current_record.dumps(clean=True) # Merge changes from changed record into the current record. sip.metadata = merge_func( d, current_full_json, current_simple_json, changed_simple_json, ) # Ensure we are based on latest version_id to prevent being rejected in # the bibupload queue. hst_record = HstRECORD.query.filter_by( id_bibrec=sip.metadata.get('recid') ).order_by(HstRECORD.job_date.desc()).first() sip.metadata['modification_date'] = hst_record.job_date.isoformat() d.update()
def get_description(bwo): """Return description of object.""" from invenio.modules.access.control import acc_get_user_email results = bwo.get_tasks_results() try: deposit_object = Deposition(bwo) except InvalidDepositionType: return "This submission is disabled: {0}.".format(bwo.workflow.name) id_user = deposit_object.workflow_object.id_user user_email = acc_get_user_email(id_user) sip = deposit_object.get_latest_sip() if sip: record = sip.metadata identifiers = [] report_numbers = record.get("report_number", {}) if not isinstance(report_numbers, list): report_numbers = [report_numbers] report_numbers += record.get("report_numbers", []) doi = record.get("doi", "") if report_numbers: for report_number in report_numbers: number = report_number.get("primary", "") if number: identifiers.append(number) if doi: identifiers.append("doi:{0}".format(doi)) categories = [] subjects = record.get("subject_term", []) if subjects: categories += [subject.get("term") for subject in subjects] categories = [record.get("type_of_doc", "")] + categories authors = [] authors += [record.get("_first_author", {})] authors += record.get("_additional_authors", []) return render_template( 'workflows/styles/submission_record.html', categories=categories, authors=authors, identifiers=identifiers, results=results, user_email=user_email, object=bwo, record=record ) else: return "Submitter: {0}".format(user_email)
def formatter(bwo, **kwargs): """Return formatted data of object.""" from invenio.modules.formatter.engine import format_record deposit_object = Deposition(bwo) submission_data = deposit_object.get_latest_sip() marcxml = submission_data.package of = kwargs.get("format", "hd") if of == "xm": return marcxml else: return format_record(recID=None, of=kwargs.get("format", "hd"), xml_record=marcxml)
def get_description(bwo): """Return description of object.""" deposit_object = Deposition(bwo) sip = deposit_object.get_latest_sip() if sip: record = sip.metadata identifiers = [record.get("arxiv_id", "")] categories = [record.get("type_of_doc", "")] return render_template('workflows/styles/submission_record.html', categories=categories, identifiers=identifiers) else: from invenio.modules.access.control import acc_get_user_email id_user = deposit_object.workflow_object.id_user return "Submitted by: %s" % str(acc_get_user_email(id_user))
def _prepare_sip(obj, dummy_eng): d = Deposition(obj) sip = d.get_latest_sip(sealed=False) if sip is None: sip = d.create_sip() # FIXME: Move to somewhere more appropriate # create_sip by default stick files into the files attribute. if 'files' in sip.metadata: sip.metadata['fft'] = sip.metadata['files'] del sip.metadata['files'] sip.agents = [Agent(role='creator', from_request_context=True)] d.update()
def formatter(bwo, **kwargs): """Return formatted data of object.""" from invenio.modules.formatter.engine import format_record deposit_object = Deposition(bwo) submission_data = deposit_object.get_latest_sip() marcxml = submission_data.package of = kwargs.get("format", "hd") if of == "xm": return marcxml else: return format_record( recID=None, of=kwargs.get("format", "hd"), xml_record=marcxml )
def get_title(bwo): """Return title of object.""" try: deposit_object = Deposition(bwo) except InvalidDepositionType: return "This submission is disabled: {0}.".format(bwo.workflow.name) sip = deposit_object.get_latest_sip() if sip: # Get the SmartJSON object record = sip.metadata try: return record.get("title", {"title": "No title"}).get("title") except AttributeError: return record.get("title") else: return "User submission in progress"
def add_submission_extra_data(obj, eng): """ Add extra data to workflow object. """ deposition = Deposition(obj) sip = deposition.get_latest_sip(sealed=False) metadata = sip.metadata submission_data = {} if "references" in metadata: submission_data["references"] = metadata["references"] del metadata["references"] if "extra_comments" in metadata: submission_data["extra_comments"] = metadata["extra_comments"] del metadata["extra_comments"] if "pdf" in metadata: submission_data["pdf"] = metadata["pdf"] del metadata["pdf"] obj.extra_data["submission_data"] = submission_data deposition.save()
def _create_ticket(obj, eng): from invenio.modules.access.control import acc_get_user_email deposition = Deposition(obj) requestors = acc_get_user_email(obj.id_user) subject, body = get_ticket_body(template, deposition, deposition.get_latest_sip(sealed=False).metadata, requestors, obj) submit_rt_ticket(obj, queue, subject, body, requestors, ticket_id_key)
def _create_curation_ticket(obj, eng): from invenio.modules.access.control import acc_get_user_email deposition = Deposition(obj) requestors = acc_get_user_email(obj.id_user) metadata = deposition.get_latest_sip(sealed=True).metadata if obj.extra_data.get("core"): subject, body = get_curation_body(template, metadata, requestors, obj.extra_data) submit_rt_ticket(obj, queue, subject, body, requestors, ticket_id_key)
def halt_to_render(obj, eng): """Halt the workflow - waiting to be resumed.""" d = Deposition(obj) sip = d.get_latest_sip(sealed=False) d.set_render_context( dict( template_name_or_list="deposit/pending.html", deposition=d, deposition_type=(None if d.type.is_default() else d.type.get_identifier()), uuid=d.id, sip=sip, my_depositions=Deposition.get_depositions(current_user, type=d.type), format_record=format_record, )) obj.last_task = "halt_to_render" eng.halt("User submission complete.")
def dump(obj, dummy_eng): #FIXME change share tmp directory d = Deposition(obj) sip = d.get_latest_sip(sealed=False) sip.seal() # FIXME now? or later? tmp_file_fd, tmp_file_path = mkstemp( prefix="webdeposit-%s-%s" % (d.id, sip.uuid), suffix='.json', dir=current_app.config.get('CFG_TMPSHAREDDIR'), ) os.write(tmp_file_fd, json.dumps(sip.metadata)) os.close(tmp_file_fd) sip.task_ids.append(None) # FIXME d.update()
def halt_to_render(obj, eng): """Halt the workflow - waiting to be resumed.""" deposition = Deposition(obj) sip = deposition.get_latest_sip(sealed=False) deposition.set_render_context(dict( template_name_or_list="deposit/completed.html", deposition=deposition, deposition_type=( None if deposition.type.is_default() else deposition.type.get_identifier() ), uuid=deposition.id, sip=sip, my_depositions=Deposition.get_depositions( current_user, type=deposition.type ), format_record=format_record, )) obj.last_task = "halt_to_render" eng.halt("User submission complete.")
def _send_robotupload_deposit(obj, eng): from invenio.modules.workflows.errors import WorkflowError from inspire.utils.robotupload import make_robotupload_marcxml callback_url = os.path.join(cfg["CFG_SITE_URL"], "callback/workflows/robotupload") deposition = Deposition(obj) sip = deposition.get_latest_sip(deposition.submitted) if not sip: raise WorkflowError("No sip found", eng.uuid, obj.id) if not deposition.submitted: sip.seal() deposition.update() marcxml = sip.package result = make_robotupload_marcxml( url=url, marcxml=marcxml, callback_url=callback_url, mode='insert', nonce=obj.id ) if "[INFO]" not in result.text: if "cannot use the service" in result.text: # IP not in the list obj.log.error("Your IP is not in " "CFG_BATCHUPLOADER_WEB_ROBOT_RIGHTS " "on host") obj.log.error(result.text) txt = "Error while submitting robotupload: {0}".format(result.text) raise WorkflowError(txt, eng.uuid, obj.id) else: obj.log.info("Robotupload sent!") obj.log.info(result.text) eng.halt("Waiting for robotupload: {0}".format(result.text)) obj.log.info("end of upload")
def _send_robotupload(obj, eng): from invenio.modules.deposit.models import Deposition from invenio.modules.workflows.errors import WorkflowError from inspire.utils.robotupload import make_robotupload_marcxml from invenio.base.globals import cfg d = Deposition(obj) sip = d.get_latest_sip(d.submitted) if not sip: raise WorkflowError("No sip found", eng.uuid, obj.id) if not d.submitted: sip.seal() d.update() if url is None: base_url = cfg.get("CFG_ROBOTUPLOAD_SUBMISSION_BASEURL") callback_url = os.path.join(cfg["CFG_SITE_URL"], "callback/workflows/robotupload") obj.log.info("Sending Robotupload to {0} with callback {1}".format( base_url, callback_url)) result = make_robotupload_marcxml(url=base_url, marcxml=sip.package, callback_url=callback_url, nonce=obj.id) if "[INFO]" not in result.text: if "cannot use the service" in result.text: # IP not in the list obj.log.error("Your IP is not in " "CFG_BATCHUPLOADER_WEB_ROBOT_RIGHTS " "on host") obj.log.error(result.text) from invenio.modules.workflows.errors import WorkflowError txt = "Error while submitting robotupload: {0}".format(result.text) raise WorkflowError(txt, eng.uuid, obj.id) else: obj.log.info("Robotupload sent!") obj.log.info(result.text) eng.halt("Waiting for robotupload: {0}".format(result.text))
def edit_record_urls(objectid): """Entrypoint for editing urls from detailed pages.""" editable_obj = BibWorkflowObject.query.get(objectid) new_urls = request.values.getlist('urls[]') or [] deposition = Deposition(editable_obj) sip = deposition.get_latest_sip() metadata = sip.metadata # Get the new urls and format them, the way the object does new_urls_array = [] for url in new_urls: new_urls_array.append({'url': url}) metadata[URL] = new_urls_array sip.package = make_record(sip.metadata).legacy_export_as_marc() deposition.save() return jsonify({ "category": "success", "message": "Edit on urls was successful." })
def _load_record(obj, eng): d = Deposition(obj) sip = d.get_latest_sip(sealed=True) record = get_record(sip.metadata.get('recid'), reset_cache=True) if not is_sip_uploaded(sip, record=record): if getattr(request, 'is_api_request', False): d.set_render_context( dict( response=dict( message="Conflict", status=409, errors="Upload not yet fully integrated. Please wait" " a few moments.", ), status=409, )) else: from flask import flash flash( "Editing is only possible after your upload have been" " fully integrated. Please wait a few moments, then try" " to reload the page.", category='warning') d.set_render_context( dict( template_name_or_list="deposit/completed.html", deposition=d, deposition_type=(None if d.type.is_default() else d.type.get_identifier()), uuid=d.id, sip=sip, my_depositions=Deposition.get_depositions(current_user, type=d.type), format_record=format_record, )) d.update() eng.halt("Wait for record to be uploaded") # Check if record is already loaded, if so, skip. if d.drafts: eng.jumpCallForward(1) # Load draft draft = d.get_or_create_draft(draft_id) # Fill draft with values from recjson record_to_draft(record, draft=draft, post_process=post_process, producer=producer) d.update() # Stop API request if getattr(request, 'is_api_request', False): d.set_render_context(dict( response=d.marshal(), status=201, )) eng.halt("API request")
def do_upgrade(): """ Implement your upgrades here """ from invenio.modules.workflows.models import BibWorkflowObject from invenio.modules.workflows.engine import ObjectVersion, WorkflowStatus from invenio.modules.deposit.models import Deposition for o in BibWorkflowObject.query.filter(BibWorkflowObject.id_user!=0).all(): d = Deposition(o) if is_error(d): warn(o, 'ERROR', "run workflow") sip = d.get_latest_sip(sealed=False) for k in ['first_author', 'additional_authors']: if k in sip.metadata: sip.metadata['_%s' % k] = sip.metadata[k] del sip.metadata[k] d.run_workflow(headless=True) elif is_done(d): if o.version != ObjectVersion.COMPLETED or o.workflow.status != WorkflowStatus.COMPLETED: if o.version == ObjectVersion.HALTED and o.workflow.status == ObjectVersion.HALTED: warn(o, 'DONE', "wf status %s -> %s" % (o.workflow.status, WorkflowStatus.COMPLETED)) warn(o, 'DONE', "obj version %s -> %s" % (o.version, ObjectVersion.COMPLETED)) o.workflow.status = WorkflowStatus.COMPLETED o.version = ObjectVersion.COMPLETED elif o.version == ObjectVersion.COMPLETED and o.workflow.status == 5: warn(o, 'DONE', "wf status %s -> %s" % (o.workflow.status, WorkflowStatus.COMPLETED)) o.workflow.status = WorkflowStatus.COMPLETED elif o.version == ObjectVersion.HALTED and o.workflow.status == WorkflowStatus.COMPLETED: warn(o, 'DONE', "obj version %s -> %s" % (o.version, ObjectVersion.COMPLETED)) o.version = ObjectVersion.COMPLETED else: warn(o, 'DONE', "Unmatched version %s status %s" % (o.version, o.workflow.status if o.workflow else None)) else: info_msg(o, 'DONE') elif is_inprogress(d): if is_submitted(d): if o.version == ObjectVersion.HALTED and o.workflow.status == WorkflowStatus.HALTED: info_msg(o, 'INPROGRESS/SUBMITTED') elif o.version == ObjectVersion.INITIAL and o.workflow.status == WorkflowStatus.NEW: info_msg(o, 'INPROGRESS/SUBMITTED') elif o.version == ObjectVersion.HALTED and o.workflow.status == WorkflowStatus.COMPLETED: warn(o, 'INPROGRESS/SUBMITTED', "wf status %s -> %s" % (o.workflow.status, WorkflowStatus.HALTED)) o.workflow.status = WorkflowStatus.HALTED else: warn(o, 'INPROGRESS/SUBMITTED', "Unmatched version %s status %s" % (o.version, o.workflow.status if o.workflow else None)) elif is_unsubmitted(d): if o.workflow is None: if o.version != ObjectVersion.INITIAL: warn(o, 'INPROGRESS/UNSUBMITTED', "Unmatched version %s status %s" % (o.version, o.workflow.status if o.workflow else None)) else: info_msg(o, 'INPROGRESS/UNSUBMITTED') elif o.version == ObjectVersion.HALTED and o.workflow.status == WorkflowStatus.HALTED: info_msg(o, 'INPROGRESS/UNSUBMITTED') elif o.version == ObjectVersion.HALTED and o.workflow.status == WorkflowStatus.RUNNING: warn(o, 'INPROGRESS/UNSUBMITTED', "wf status %s -> %s" % (o.workflow.status, WorkflowStatus.HALTED)) o.workflow.status = WorkflowStatus.HALTED elif o.version == ObjectVersion.RUNNING and o.workflow.status == WorkflowStatus.RUNNING: warn(o, 'INPROGRESS/UNSUBMITTED', "wf status %s -> %s" % (o.workflow.status, WorkflowStatus.HALTED)) warn(o, 'INPROGRESS/UNSUBMITTED', "obj version %s -> %s" % (o.version, ObjectVersion.HALTED)) o.version = ObjectVersion.HALTED o.workflow.status = WorkflowStatus.HALTED elif o.version == ObjectVersion.HALTED and o.workflow.status == WorkflowStatus.COMPLETED: warn(o, 'INPROGRESS/UNSUBMITTED', "wf status %s -> %s" % (o.workflow.status, WorkflowStatus.HALTED)) o.workflow.status = WorkflowStatus.HALTED else: warn(o, 'INPROGRESS/UNSUBMITTED', "Unmatched version %s status %s" % (o.version, o.workflow.status if o.workflow else None)) else: warn(o, 'INPROGRESS/?', "Unmatched version %s status %s" % (o.version, o.workflow.status if o.workflow else None)) global good, bad warnings.warn("Good: %s Bad: %s" % (good, bad)) db.session.commit()