Esempio n. 1
0
 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()
Esempio n. 2
0
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))
Esempio n. 3
0
 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()
Esempio n. 4
0
    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()
Esempio n. 5
0
    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()
Esempio n. 6
0
    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()
Esempio n. 7
0
    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)
Esempio n. 8
0
    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()
Esempio n. 9
0
    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."
    })
Esempio n. 11
0
    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)
Esempio n. 12
0
 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()
Esempio n. 13
0
    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()
Esempio n. 14
0
 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()
Esempio n. 15
0
    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])
Esempio n. 17
0
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()
Esempio n. 18
0
 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()
Esempio n. 19
0
    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()
Esempio n. 20
0
    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()
Esempio n. 21
0
 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()
Esempio n. 22
0
 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!!"
Esempio n. 23
0
    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()
Esempio n. 24
0
    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()
Esempio n. 25
0
    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()
Esempio n. 26
0
 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!!"
Esempio n. 27
0
    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()
Esempio n. 28
0
    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()
Esempio n. 29
0
    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
Esempio n. 30
0
    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
Esempio n. 31
0
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()
Esempio n. 32
0
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.")
Esempio n. 33
0
    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()
Esempio n. 34
0
    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)
Esempio n. 35
0
    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)
Esempio n. 36
0
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
Esempio n. 37
0
 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))
Esempio n. 38
0
    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()
Esempio n. 39
0
 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))
Esempio n. 40
0
    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.')
Esempio n. 41
0
    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
Esempio n. 42
0
 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()
Esempio n. 43
0
 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()
Esempio n. 44
0
    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)
Esempio n. 45
0
    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
            )
Esempio n. 46
0
 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)
Esempio n. 47
0
    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)
Esempio n. 48
0
    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
Esempio n. 49
0
 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)
Esempio n. 50
0
    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)
Esempio n. 51
0
 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
Esempio n. 52
0
    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)
Esempio n. 53
0
 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
Esempio n. 54
0
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
Esempio n. 55
0
    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
Esempio n. 56
0
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")
Esempio n. 57
0
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])
Esempio n. 58
0
    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))
Esempio n. 59
0
    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)