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 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): 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 _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 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 _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 _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): 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 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 _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 _prefill_draft(obj, eng): if not getattr(request, 'is_api_request', False): draft_cache = DepositionDraftCacheManager.get() if draft_cache.has_data(): d = Deposition(obj) draft_cache.fill_draft(d, draft_id, clear=clear) 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 do_upgrade(): """Implement your upgrades here.""" from invenio.modules.workflows.models import BibWorkflowObject from invenio.modules.deposit.models import Deposition q = BibWorkflowObject.query.filter(BibWorkflowObject.id_user != 0).all() for b in q: try: d = Deposition(b) except KeyError: logger.info("Fixing data in {}".format(b.id)) b.set_data(dict( type='upload', title='Untitled', files=[], drafts={}, sips=[], )) d = Deposition(b) d.save() s = _get_state(d) c = str(b.get_extra_data().get('_task_counter')) co = str(b.get_extra_data().get('task_counter')) if s == 'inprogress-new': if c == "[0, 0, 3, 1]": b.save(task_counter=[0, 3, 1]) elif c == "[0, 0, 3, 2]": b.save(task_counter=[0, 3, 2]) elif c == "None" and co == "[0, 0, 3, 1]": b.save(task_counter=[0, 3, 1]) elif s == 'inprogress-edit': if c == "[0, 0, 1, 0]": b.save(task_counter=[0, 1, 0]) elif c == "[0, 0, 1, 1]": b.save(task_counter=[0, 1, 1]) elif c == "[0, 4, 3, 0]": b.save(task_counter=[4, 3, 0]) elif c == "None" and co == "[0, 0, 1, 1]": b.save(task_counter=[0, 1, 1]) elif c == "None" and co == "[0, 0, 1, 0]": b.save(task_counter=[0, 1, 0]) elif b.id == 2076: b.save(task_counter=[4, 3, 0]) b.workflow.save(status=4) elif s == 'error': if c == "[0, 0, 1, 0]": b.save(task_counter=[0, 1, 0]) elif c == "[0, 0, 1, 1]": b.save(task_counter=[0, 1, 1]) elif c == "[0, 0, 3, 1]": b.save(task_counter=[0, 3, 1]) elif c == "[0, 0, 3, 2]": b.save(task_counter=[0, 3, 2]) elif c == "[0, 4, 3, 0]": b.save(task_counter=[4, 3, 0]) elif c == "[0, 4, 3, 1]": b.save(task_counter=[4, 3, 1])
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 _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 _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 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 _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 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 test_create(self): from invenio.ext.login.legacy_user import UserInfo from invenio.modules.deposit.models import Deposition user = UserInfo(uid=1) d = Deposition.create(user) assert d.type == self.DefaultType assert Deposition.get(d.id).type == self.DefaultType d = Deposition.create(user, type=self.AnotherType) assert d.type == self.AnotherType assert Deposition.get(d.id).type == self.AnotherType
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 deposition_with_files(files, user_id=None, deposition_id=None): """Add very big files to a deposition.""" if deposition_id: d = Deposition.get(deposition_id) else: d = Deposition.create(User.query.get(user_id)) for filepath in files: with open(filepath, "rb") as fileobj: filename = os.path.basename(filepath) df = DepositionFile(backend=DepositionStorage(d.id)) df.save(fileobj, filename=filename) d.add_file(df) return d
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 _render_form(obj, eng): d = Deposition(obj) draft = d.get_or_create_draft(draft_id) if getattr(request, 'is_api_request', False): form = draft.get_form(validate_draft=True) if form.errors: error_messages = [] for field, msgs in form.errors: for m in msgs: error_messages.append( field=field, message=m, code=error_codes['validation_error'], ) d.set_render_context(dict( response=dict( message="Bad request", status=400, errors=error_messages, ), status=400, )) eng.halt("API: Draft did not validate") else: if draft.is_completed(): eng.jumpCallForward(1) else: form = draft.get_form(validate_draft=draft.validate) form.validate = True d.set_render_context(dict( template_name_or_list=form.get_template(), deposition=d, deposition_type=( None if d.type.is_default() else d.type.get_identifier() ), uuid=d.id, draft=draft, form=form, my_depositions=list(Deposition.get_depositions( current_user, type=d.type )), )) d.update() eng.halt('Wait for form submission.')
def post(self, oauth, resource_id): """ Upload a file """ d = Deposition.get(resource_id, user=current_user) # Bail-out early if not permitted (add_file will also check, but then # we already uploaded the file) if not d.authorize('add_file'): raise ForbiddenAction('add_file', d) uploaded_file = request.files['file'] filename = secure_filename( request.form.get('filename') or uploaded_file.filename ) df = DepositionFile(backend=DepositionStorage(d.id)) if df.save(uploaded_file, filename=filename): try: d.add_file(df) d.save() except FilenameAlreadyExists as e: df.delete() raise e return d.type.marshal_file(df), 201
def put(self, oauth, resource_id): """ Update a deposition """ d = Deposition.get(resource_id, user=current_user) self.validate_input(d) self.process_input(d) d.save() return d.marshal()
def put(self, resource_id): """Update a deposition.""" d = Deposition.get(resource_id, user=current_user) self.validate_input(d) self.process_input(d) d.save() return d.marshal()
def put(self, resource_id, file_id): """Update a deposition file - i.e. rename it.""" v = APIValidator() if not v.validate(request.json, file_schema): abort( 400, message="Bad request", status=400, errors=map(lambda x: dict(message=x, code=error_codes["validation_error"]), v.errors), ) d = Deposition.get(resource_id, user=current_user) df = d.get_file(file_id) if not d.type.authorize_file(d, df, "update_metadata"): raise ForbiddenAction("update_metadata", df) new_name = secure_filename(request.json["filename"]) if new_name != request.json["filename"]: abort( 400, message="Bad request", status=400, errors=[dict(message="Not a valid filename", code=error_codes["validation_error"])], ) df.name = new_name d.save() return d.type.marshal_file(df)
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(self, oauth, resource_id, file_id): """ Get a deposition file """ d = Deposition.get(resource_id, user=current_user) df = d.get_file(file_id) if df is None: abort(404, message="File does not exist", status=404) return d.type.marshal_file(df)
def run_deposition_tasks(self, deposition_id, with_webcoll=True): """ Run all task ids specified in the latest SIP and optionally run webcoll. """ # Run submitted tasks from invenio.modules.deposit.models import Deposition dep = Deposition.get(deposition_id) sip = dep.get_latest_sip(sealed=True) for task_id in sip.task_ids: self.run_task_id(task_id) if with_webcoll: # Run webcoll (to ensure record is assigned permissions) from invenio.legacy.bibsched.bibtask import \ task_low_level_submission task_id = task_low_level_submission('webcoll', 'webdeposit', '-q') self.run_task_id(task_id) # Check if record is accessible response = self.client.get( url_for('record.metadata', recid=sip.metadata['recid']), base_url=self.app.config['CFG_SITE_SECURE_URL'], ) self.assertStatus(response, 200)
def post(self, resource_id): """Upload a file.""" d = Deposition.get(resource_id, user=current_user) # Bail-out early if not permitted (add_file will also check, but then # we already uploaded the file) if not d.authorize('add_file'): raise ForbiddenAction('add_file', d) uploaded_file = request.files['file'] filename = secure_filename( request.form.get('filename') or uploaded_file.filename ) df = DepositionFile(backend=DepositionStorage(d.id)) if df.save(uploaded_file, filename=filename): try: d.add_file(df) d.save() except FilenameAlreadyExists as e: df.delete() raise e return d.type.marshal_file(df), 201
def get(self, resource_id, file_id): """Get a deposition file.""" d = Deposition.get(resource_id, user=current_user) df = d.get_file(file_id) if df is None: abort(404, message="File does not exist", status=404) return d.type.marshal_file(df)
def test_load_workflow(self): from invenio.modules.workflows.models import BibWorkflowObject from invenio.modules.deposit.models import Deposition q = BibWorkflowObject.query.filter( BibWorkflowObject.id_user != 0).all() for b in q: Deposition(b)
def _create_obj(o): try: obj = Deposition(o) except InvalidDepositionType as err: current_app.logger.exception(err) return None if type is None or obj.type == type: return obj return None
def get(self): """List depositions. :param type: Upload type identifier (optional) """ args = list_parser.parse_args() result = Deposition.get_depositions( user=current_user, type=args['type'] or None ) return map(lambda o: o.marshal(), result)
def post(self): """Create a new deposition.""" # Create deposition (uses default deposition type unless type is given) d = Deposition.create(current_user, request.json.get('type', None)) # Validate input data according to schema self.validate_input(d) # Process input data self.process_input(d) # Save if all went fine d.save() return d.marshal(), 201
def get(query, from_date, limit=0, **kwargs): """Get deposits.""" from invenio.modules.deposit.models import Deposition dep_generator = Deposition.get_depositions() total_depids = 1 # Count of depositions is hard to determine # If limit provided, serve only first n=limit items if limit > 0: dep_generator = islice(dep_generator, limit) total_depids = limit return total_depids, dep_generator
def delete(self, resource_id, file_id): """Delete existing deposition file.""" d = Deposition.get(resource_id, user=current_user) # Sort files raise ForbiddenAction if not authorized df = d.remove_file(file_id) if df is None: abort(404, message="File does not exist", status=404) df.delete() d.save() return "", 204
def add_files_to_task_results(obj, eng): """Add Deposition attached files to task results.""" from invenio.modules.deposit.models import Deposition d = Deposition(obj) for file_obj in d.files: fileinfo = { "type": "file", "filename": file_obj.name, "full_path": file_obj.get_syspath(), } obj.add_task_result(file_obj.name, fileinfo, "workflows/results/files.html")
def do_upgrade(): """Implement your upgrades here.""" from invenio.modules.workflows.models import BibWorkflowObject from invenio.modules.deposit.models import Deposition q = BibWorkflowObject.query.filter(BibWorkflowObject.id_user != 0).all() for b in q: try: d = Deposition(b) except KeyError: logger.info("Fixing data in {}".format(b.id)) b.set_data( dict( type='upload', title='Untitled', files=[], drafts={}, sips=[], )) d = Deposition(b) d.save() s = _get_state(d) c = str(b.get_extra_data().get('_task_counter')) co = str(b.get_extra_data().get('task_counter')) if s == 'inprogress-new': if c == "[0, 0, 3, 1]": b.save(task_counter=[0, 3, 1]) elif c == "[0, 0, 3, 2]": b.save(task_counter=[0, 3, 2]) elif c == "None" and co == "[0, 0, 3, 1]": b.save(task_counter=[0, 3, 1]) elif s == 'inprogress-edit': if c == "[0, 0, 1, 0]": b.save(task_counter=[0, 1, 0]) elif c == "[0, 0, 1, 1]": b.save(task_counter=[0, 1, 1]) elif c == "[0, 4, 3, 0]": b.save(task_counter=[4, 3, 0]) elif c == "None" and co == "[0, 0, 1, 1]": b.save(task_counter=[0, 1, 1]) elif c == "None" and co == "[0, 0, 1, 0]": b.save(task_counter=[0, 1, 0]) elif b.id == 2076: b.save(task_counter=[4, 3, 0]) b.workflow.save(status=4) elif s == 'error': if c == "[0, 0, 1, 0]": b.save(task_counter=[0, 1, 0]) elif c == "[0, 0, 1, 1]": b.save(task_counter=[0, 1, 1]) elif c == "[0, 0, 3, 1]": b.save(task_counter=[0, 3, 1]) elif c == "[0, 0, 3, 2]": b.save(task_counter=[0, 3, 2]) elif c == "[0, 4, 3, 0]": b.save(task_counter=[4, 3, 0]) elif c == "[0, 4, 3, 1]": b.save(task_counter=[4, 3, 1])
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 render_completed(cls, d): """Page to render when deposition was successfully completed.""" ctx = dict( deposition=d, deposition_type=(None if d.type.is_default() else d.type.get_identifier()), uuid=d.id, my_depositions=Deposition.get_depositions(current_user, type=d.type), sip=d.get_latest_sip(), format_record=format_record, ) return render_template('deposit/completed.html', **ctx)