Exemple #1
0
    def get_resolve(self, component=str()):
        da_object = DAComponent(component=component)

        message_display_templates = d_utils.json_to_pytype(
            lkup.MESSAGES_LKUPS["message_templates"])["templates"]
        lookup_messages = d_utils.json_to_pytype(
            lkup.MESSAGES_LKUPS["lookup_messages"])["properties"]
        component_dict = dict()
        message_dict = dict()

        resolved_dict = self.publication_metadata()

        if resolved_dict.get("status") == "success":
            message_dict = message_display_templates.get("success", dict())
            message_dict["text"] = lookup_messages.get(
                "doi_metadata_crosscheck", str()).get("text", str())
            for f in da_object.get_schema().get("schema"):
                data_dict = resolved_dict.get("data", dict())
                key = f.id.split(".")[-1]
                if key in data_dict:
                    val = data_dict[key]
                    # reconcile schema type mismatch
                    if isinstance(val, list) and f.type == "string":
                        val = ','.join(str(e)
                                       for e in val)  # account for numbers
                    if isinstance(val, str) and f.type == "object":
                        object_type_control = d_utils.object_type_control_map(
                        ).get(f.control.lower(), str())
                        if object_type_control == "ontology_annotation":
                            object_schema = d_utils.get_db_json_schema(
                                object_type_control)
                            value_dict = dict(annotationValue=val)
                            for k in object_schema:
                                object_schema[k] = value_dict.get(
                                    k,
                                    d_utils.default_jsontype(
                                        object_schema.get(k, dict()).get(
                                            "type", "object")))

                            val = object_schema
                    component_dict[key] = val

                if key not in component_dict:  # set default values based on type
                    component_dict[key] = d_utils.default_jsontype(f.type)
        else:
            error_list = resolved_dict.get("error", list())
            message_dict = message_display_templates.get("danger", dict())
            message_dict["text"] = '; '.join(
                str(e) for e in error_list) + lookup_messages.get(
                    "doi_metadata_error", str()).get("text", str())

        return dict(component_dict=component_dict, message_dict=message_dict)
Exemple #2
0
    def get_resolve(self, component=str()):
        da_object = DAComponent(component=component)

        message_display_templates = d_utils.json_to_pytype(lkup.MESSAGES_LKUPS["message_templates"])["templates"]
        lookup_messages = d_utils.json_to_pytype(lkup.MESSAGES_LKUPS["lookup_messages"])["properties"]
        component_dict = dict()
        message_dict = dict()

        resolved_dict = self.publication_metadata()

        if resolved_dict.get("status") == "success":
            message_dict = message_display_templates.get("success", dict())
            message_dict["text"] = lookup_messages.get("doi_metadata_crosscheck", str()).get("text", str())
            for f in da_object.get_schema().get("schema"):
                data_dict = resolved_dict.get("data", dict())
                key = f.id.split(".")[-1]
                if key in data_dict:
                    val = data_dict[key]
                    # reconcile schema type mismatch
                    if isinstance(val, list) and f.type == "string":
                        val = ','.join(str(e) for e in val)  # account for numbers
                    if isinstance(val, str) and f.type == "object":
                        object_type_control = d_utils.control_to_schema_name(f.control.lower())
                        if object_type_control == "ontology_annotation":
                            object_schema = d_utils.get_isa_schema(object_type_control)
                            value_dict = dict(annotationValue=val
                                              )
                            for k in object_schema:
                                object_schema[k] = value_dict.get(k, d_utils.default_jsontype(
                                    object_schema.get(k, dict()).get("type", "object")))

                            val = object_schema
                    component_dict[key] = val

                if key not in component_dict:  # set default values based on type
                    component_dict[key] = d_utils.default_jsontype(f.type)
        else:
            error_list = resolved_dict.get("error", list())
            message_dict = message_display_templates.get("danger", dict())
            message_dict["text"] = '; '.join(
                str(e) for e in error_list) + lookup_messages.get("doi_metadata_error", str()).get("text", str())

        return dict(component_dict=component_dict,
                    message_dict=message_dict
                    )
Exemple #3
0
    def save_record(self, auto_fields=dict(), **kwargs):
        fields = dict()

        # set auto fields
        if auto_fields:
            fields = DecoupleFormSubmission(auto_fields, self.get_schema().get("schema")).get_schema_fields_updated()

        # should have target_id for updates and return empty string for inserts
        target_id = kwargs.pop("target_id", str())

        # set system fields
        system_fields = dict(
            date_modified=data_utils.get_datetime(),
            deleted=data_utils.get_not_deleted_flag()
        )

        if not target_id:
            system_fields["date_created"] = data_utils.get_datetime()
            system_fields["profile_id"] = self.profile_id

        # extend system fields
        for k, v in kwargs.items():
            system_fields[k] = v

        # add system fields to 'fields' and set default values - insert mode only
        for f in self.get_schema().get("schema"):
            f_id = f.id.split(".")[-1]

            if f_id in system_fields:
                fields[f_id] = system_fields.get(f_id)

            if not target_id and f_id not in fields:
                fields[f_id] = data_utils.default_jsontype(f.type)

        # if True, then the database action (to save/update) is never performed, but validated 'fields' is returned
        validate_only = kwargs.pop("validate_only", False)

        # prefer this testto save guard against all sorts of value the 'validate_only' can assume
        if validate_only == True:
            return fields
        else:
            if target_id:
                self.get_collection_handle().update(
                    {"_id": ObjectId(target_id)},
                    {'$set': fields})
            else:
                doc = self.get_collection_handle().insert(fields)
                target_id = str(doc)

            # return saved record
            rec = self.get_record(target_id)

            return rec
Exemple #4
0
    def save_record(self, auto_fields=dict(), **kwargs):
        fields = dict()
        schema = kwargs.get("schema", list()) or self.get_component_schema()

        # set auto fields
        if auto_fields:
            fields = DecoupleFormSubmission(
                auto_fields, schema).get_schema_fields_updated_dict()

        # should have target_id for updates and return empty string for inserts
        target_id = kwargs.pop("target_id", str())

        # set system fields
        system_fields = dict(date_modified=data_utils.get_datetime(),
                             deleted=data_utils.get_not_deleted_flag())

        if not target_id:
            system_fields["date_created"] = data_utils.get_datetime()
            system_fields["profile_id"] = self.profile_id

        # extend system fields
        for k, v in kwargs.items():
            system_fields[k] = v

        # add system fields to 'fields' and set default values - insert mode only
        for f in schema:
            f_id = f["id"].split(".")[-1]

            if f_id in system_fields:
                fields[f_id] = system_fields.get(f_id)

            if not target_id and f_id not in fields:
                fields[f_id] = data_utils.default_jsontype(f["type"])

        # if True, then the database action (to save/update) is never performed, but validated 'fields' are returned
        validate_only = kwargs.pop("validate_only", False)

        if validate_only is True:
            return fields
        else:
            if target_id:
                self.get_collection_handle().update(
                    {"_id": ObjectId(target_id)}, {'$set': fields})
            else:
                doc = self.get_collection_handle().insert(fields)
                target_id = str(doc)

            # return saved record
            rec = self.get_record(target_id)

            return rec
Exemple #5
0
def generate_component_records(component=str(), profile_id=str()):
    da_object = DAComponent(component=component, profile_id=profile_id)
    component_records = list()

    for record in da_object.get_all_records():
        rec_dict = dict(_id=str(record["_id"]))
        for f in da_object.get_schema().get("schema_dict"):
            if f.get("show_in_form", True):
                key_split = f["id"].split(".")[-1]
                rec_dict[key_split] = record.get(key_split, d_utils.default_jsontype(f.get("type", str())))

        component_records.append(rec_dict)

    return component_records