예제 #1
0
def index_after_commit(sender, changes):
    """Index a record in ES after it was committed to the DB.

    This cannot happen in an ``after_record_commit`` receiver from Invenio-Records
    because, despite the name, at that point we are not yet sure whether the record
    has been really committed to the DB.
    """
    for model_instance, change in changes:
        if isinstance(model_instance, RecordMetadata):
            if change in ("insert", "update", "delete"):
                LOGGER.debug(
                    "Record commited, indexing.",
                    change=change,
                    uuid=str(model_instance.id),
                )
                force_delete = "delete" == change
                InspireRecord(
                    model_instance.json,
                    model=model_instance).index(force_delete=force_delete)
                if "new_record" in model_instance.json:
                    redirect_references_to_merged_record.delay(
                        str(model_instance.id))
                if (PidStoreBase.get_pid_type_from_schema(
                        model_instance.json["$schema"]) == "lit"
                        and "documents" in model_instance.json and
                        current_app.config["FEATURE_FLAG_ENABLE_FULLTEXT"]):
                    index_fulltext.delay(str(model_instance.id),
                                         model_instance.version_id)
예제 #2
0
def get_revisions(endpoint, pid_value):
    """Get revisions of given record"""
    try:
        Transaction = transaction_class(RecordMetadata)
        pid_type = PidStoreBase.get_pid_type_from_endpoint(endpoint)
        record = InspireRecord.get_record_by_pid_value(pid_value, pid_type)

        revisions = []
        for revision in reversed(record.revisions):
            transaction_id = revision.model.transaction_id

            user = Transaction.query.filter(Transaction.id == transaction_id).one().user
            if user:
                user_email = user.email
            else:
                user_email = "system"

            revisions.append(
                {
                    "updated": revision.updated,
                    "revision_id": revision.revision_id,
                    "user_email": user_email,
                    "transaction_id": transaction_id,
                    "rec_uuid": record.id,
                }
            )
        return jsonify(revisions)
    except Exception:
        raise EditorGetRevisionError
예제 #3
0
def get_record_and_schema(endpoint, pid_value):
    pid_type = PidStoreBase.get_pid_type_from_endpoint(endpoint)
    record = InspireRecord.get_record_by_pid_value(pid_value,
                                                   pid_type,
                                                   original_record=True)
    if not check_permissions_for_private_collection_read(
            record.get("_collections", [])):
        return jsonify(message="Unauthorized", code=403), 403
    editor_soft_lock_service = EditorSoftLock(
        recid=record["control_number"],
        record_version=record.model.version_id,
        user_email=current_user.email,
    )
    editor_lock_payload = editor_soft_lock_service.prepare_editor_lock_api_payload(
    )
    editor_soft_lock_service.add_lock()
    json = {
        "record": {
            "metadata": record
        },
        "schema": load_schema(record["$schema"]),
    }
    json.update(editor_lock_payload)
    response = make_response(json)
    set_headers_for_record_caching_and_concurrency(response, record)

    return response
예제 #4
0
def get_revisions(endpoint, pid_value):
    """Get revisions of given record"""
    try:
        Transaction = transaction_class(RecordMetadata)
        pid_type = PidStoreBase.get_pid_type_from_endpoint(endpoint)
        record = InspireRecord.get_record_by_pid_value(pid_value,
                                                       pid_type,
                                                       original_record=True)

        if not check_permissions_for_private_collection_read(
                record.get("_collections", [])):
            return jsonify(message="Unauthorized", code=403), 403

        revisions = []
        for revision in reversed(record.revisions):
            transaction_id = revision.model.transaction_id

            user = Transaction.query.filter(
                Transaction.id == transaction_id).one().user
            if user:
                user_email = user.email
            else:
                user_email = "system"

            revisions.append({
                "updated": revision.updated,
                "revision_id": revision.revision_id,
                "user_email": user_email,
                "transaction_id": transaction_id,
                "rec_uuid": record.id,
            })
        return jsonify(revisions)
    except Exception:
        raise EditorGetRevisionError
예제 #5
0
 def get_affiliations(data):
     affiliations = deepcopy(data.get("affiliations", []))
     for affiliation in affiliations:
         if "record" in affiliation:
             _, affiliation[
                 "control_number"] = PidStoreBase.get_pid_from_record_uri(
                     affiliation["record"].get("$ref"))
     return affiliations
예제 #6
0
def get_record_and_schema(endpoint, pid_value):
    pid_type = PidStoreBase.get_pid_type_from_endpoint(endpoint)
    record = InspireRecord.get_record_by_pid_value(pid_value, pid_type)
    return jsonify({
        "record": {
            "metadata": record
        },
        "schema": load_schema(record["$schema"])
    })
예제 #7
0
    def convert_to_form_data(self, data):
        speakers = data.get_value("speakers", [])
        for speaker in speakers:
            affiliation = get_value(speaker, "affiliations[0]")
            if affiliation:
                affiliation_value = affiliation.get("value")
                affiliation_record = affiliation.get("record")
                speaker["affiliation"] = affiliation_value
                if affiliation_record:
                    speaker["affiliation_record"] = affiliation_record
                del speaker["affiliations"]

        address = data.get_value("address")
        if address and "country_code" in address:
            address["country"] = country_code_to_name(address["country_code"])
            del address["country_code"]

        if address and "cities" in address:
            address["city"] = get_value(address, "cities[0]")
            del address["cities"]

        timezone = data.get("timezone")

        start_datetime = data.get("start_datetime")
        form_start_datetime = iso_utc_to_local_form_datetime(start_datetime, timezone)

        end_datetime = data.get("end_datetime")
        form_end_datetime = iso_utc_to_local_form_datetime(end_datetime, timezone)

        literature_records = [
            PidStoreBase.get_pid_from_record_uri(rec["record"]["$ref"])[1]
            for rec in data.get("literature_records", [])
        ]

        processed_data = {
            "name": data.get_value("title.title", missing),
            "additional_info": data.get_value("public_notes[0].value", missing),
            "address": address or missing,
            "speakers": speakers,
            "contacts": data.get_value("contact_details", missing),
            "series_name": data.get_value("series[0].name", missing),
            "series_number": data.get_value("series[0].number", missing),
            "field_of_interest": data.get_value("inspire_categories.term", missing),
            "dates": [form_start_datetime, form_end_datetime],
            "websites": data.get_value("urls.value", missing),
            "material_urls": data.get_value("material_urls", missing),
            "join_urls": data.get_value("join_urls", missing),
            "captioned": data.get("captioned", missing),
            "timezone": timezone,
            "abstract": data.get_value("abstract.value", missing),
            "keywords": data.get_value("keywords.value", missing),
            "literature_records": literature_records or missing,
        }
        return processed_data
예제 #8
0
def revert_to_revision(endpoint, pid_value):
    """Revert given record to given revision"""
    try:
        pid_type = PidStoreBase.get_pid_type_from_endpoint(endpoint)
        record = InspireRecord.get_record_by_pid_value(pid_value, pid_type)
        revision_id = request.json["revision_id"]
        record.revert(revision_id)
        db.session.commit()
        return jsonify(success=True)
    except Exception:
        raise EditorRevertToRevisionError
예제 #9
0
def get_record_and_schema(endpoint, pid_value):
    pid_type = PidStoreBase.get_pid_type_from_endpoint(endpoint)
    record = InspireRecord.get_record_by_pid_value(
        pid_value, pid_type, original_record=True
    )
    json = {"record": {"metadata": record}, "schema": load_schema(record["$schema"])}

    response = make_response(json)
    set_headers_for_record_caching_and_concurrency(response, record)

    return response
예제 #10
0
 def _get_putcodes_and_recids_iter(self, putcodes):
     for putcode, url in self._get_urls_for_putcodes_iter(putcodes):
         # Filter out putcodes that do not belong to Inspire.
         if INSPIRE_WORK_URL_REGEX.match(url):
             recid = PidStoreBase.get_pid_from_record_uri(url)[1]
             if not recid:
                 LOGGER.error(
                     "OrcidPutcodeGetter: cannot parse recid from url",
                     url=url,
                     orcid=self.orcid,
                 )
                 continue
             yield putcode, recid
예제 #11
0
    def resolve_record_as_root(self, data):
        record = data.get("record")
        if record is None:
            return {}

        _, recid = PidStoreBase.get_pid_from_record_uri(record.get("$ref"))
        try:
            record = InspireRecord.get_record_by_pid_value(pid_value=recid,
                                                           pid_type="lit")
        except PIDDoesNotExistError:
            return {}

        titles = record.get("titles")
        if not titles:
            return {}
        data.update(record)
        return data
예제 #12
0
    def resolve_experiments_record_as_root(self, data):
        record = data.get("record")
        if record is None:
            return {}

        _, recid = PidStoreBase.get_pid_from_record_uri(record.get("$ref"))
        try:
            experiment = InspireRecord.get_record_by_pid_value(pid_value=recid,
                                                               pid_type="exp")
        except PIDDoesNotExistError:
            return {}

        legacy_name = experiment.get("legacy_name")
        if not legacy_name:
            return {}
        data.update(experiment)
        return data
예제 #13
0
    def resolve_institutions_record_as_root(self, data):
        institution_record = data.get("record")
        if institution_record is None:
            return {}

        _, recid = PidStoreBase.get_pid_from_record_uri(
            institution_record.get("$ref"))
        try:
            conference = InspireRecord.get_record_by_pid_value(pid_value=recid,
                                                               pid_type="ins")
        except PIDDoesNotExistError:
            return {}

        legacy_ICN = conference.get("legacy_ICN")
        if not legacy_ICN:
            return {}
        data.update(conference)
        return data
예제 #14
0
def revert_to_revision(endpoint, pid_value):
    """Revert given record to given revision"""
    try:
        pid_type = PidStoreBase.get_pid_type_from_endpoint(endpoint)
        record = InspireRecord.get_record_by_pid_value(pid_value,
                                                       pid_type,
                                                       original_record=True)

        if not check_permissions_for_private_collection_read_write(
                record.get("_collections", [])):
            return jsonify(message="Unauthorized", code=403), 403

        revision_id = request.json["revision_id"]
        record.revert(revision_id)
        db.session.commit()
        return jsonify(success=True)
    except Exception:
        raise EditorRevertToRevisionError
예제 #15
0
    def get_linked_advisors_when_name_changes(self):
        if not self.get("advisors"):
            return set()
        if (self.get_value("name.preferred_name") !=
                self._previous_version.get_value("name.preferred_name")) or (
                    not self.get_value("name.preferred_name") and
                    (self.get_value("name.value") !=
                     self._previous_version.get_value("name.value"))):
            advisors_references = self.get_value("advisors.record.$ref")
            advisors_pids = [
                PidStoreBase.get_pid_from_record_uri(uri)[1]
                for uri in advisors_references
            ]
            advisor_uuids = (PersistentIdentifier.query.with_entities(
                PersistentIdentifier.object_uuid).filter(
                    PersistentIdentifier.pid_type == "aut",
                    PersistentIdentifier.pid_value.in_(advisors_pids),
                ).all())
            return set(str(uuid_list[0]) for uuid_list in advisor_uuids)

        return set()
예제 #16
0
 def get_control_number(data):
     if "record" not in data:
         return missing
     _, recid = PidStoreBase.get_pid_from_record_uri(
         data["record"].get("$ref"))
     return recid