数据导入

1.  接口描述

电子实验记录本的数据导入API接口,使用JSON格式进行数据交换。

接口支持一次使用一个模板导入到一个记录本中多条数据。如果使用的模板不同,或要导入到不同的记录本中,请多次调用此接口。

为了保证每次数据的导入时间不会超时,每次调用最多导入100条数据。超过100条,请多次调用。

注意:在调用API时,在Header里要加入如下的信息:

Authorization: Bearer {AccessToken}

AccessToken 的获取方式,见“认证接口”

2.  接口调用

请求URL: https://eln.iphy.ac.cn:61262/eln_api/import
https://eln.iphy.ac.cn:61263/matelab/index.php?do=eln_api&action=import(已废弃)
https://eln.iphy.ac.cn:61263/open_eln/eln_api_import.php(已废弃)

参数

eln 必填,文本。要导入的记录本名称;
user 选填。字符串或整数。如果是自己的记录本,可不填写;他人的合作编辑记录本,需要填写记录本所有者的Email或系统userid
template 必填。导入数据所使用的模板;
template_user 选填。字符串。如果是自己的模板,可不填写;他人分享的组模板,需要填写模板所有者的Email
quote 选填。数组。用于引用其他记录的数据。请确保被引用的数据是存在的,否则引用不会被替换;
  • name: 必填。字符串。命名此引用,并在引用此数据的位置调用此命名。使用 #quote{name} 格式引用数据;
  • uid: 必填。字符串。记录的UID,以此为依据调用记录。注意:仅能读取当前记录本中的数据;
  • path: 必填。数组。数据在记录中的位置。具体写法见”检索“接口的说明;
dataset 必填。导入的具体数据。数据条数最少1个,最多100个。
  • uid: 必填。自定义的唯一ID,不能有重复值。用于识别导入数据的唯一性,防止重复导入。数据库中如已经存在此ID则报错误无法导入;
  • title: 必填。记录命名;
  • keyword: 选填。关键词列表。每个关键词以分号 “;” 分隔;
  • path: 选填。字符串数组列表。表示数据所在的子分类。路径依次为1级分类,2级分类...;
  • data: 必填。对应不同的模块的具体格式见下一节。

示例

{
    "eln": "记录本名称",
    "template": "模板名称",
    "quote": [
        {
            "name": "n1",
            "uid": "VUCBG5CLJQR4417DTC8FGS2KDP",
            "path": ["表格模板名称","列名",1]
        },
        {
            "name": "n2",
            "uid": "DTC8FGS2KDPVUCBG5CLJQR4417",
            "path": ["表单模板名称","文本框"]
        }
    ],
    "dataset": [{
        "title": "记录命名",
        "keyword": "关键词1;关键词2;关键词3",
        "path": ["一级分类","二级分类","三级分类"],
        "uid": "aRxU2nalSYbb",
        "data": {
            "表单模块": {
                "布尔值项": true,
                "文本项": "#quote{n1}",
                "多行文本项": "test",
                "数字项": -21.23,
                "日期项": "2022-9-6",
                "时间项": "23:59",
                "文件上传项": "#base64{test.zip, QmFzZTY057yW56CB56S65L6L}",
                "级联选择项":"1"
            },
            "富文本模块": "test",
            "表格模块": {
                "文本列": ["a", "b"],
                "数字列": [1, 2, 1],
                "日期列": ["2021-9-6", "2021-9-6"],
                "时间列": ["12:00", "12:21"],
                "文件上传列": ["#file{name1}", "#file{name2}"],
                "下拉列表列": ["1", "2"],
                "布尔值列": [true, false, true]
            },
            "文件集模块":["#file{name3}", "#file{name4}"]
        }
    }]
}

3.  返回信息

code 错误代码;
  • 0: 成功;
  • 1: 认证 Token 信息无效;
  • 2: 数据格式错误;
  • 3: 服务器原因错误;
  • 'refresh': 认证 Token 过期,需使用刷新Token重新获取。
msg 错误描述;
id 新增记录的id;
eln_id 记录本 id;

返回错误示例

{
    "code": 2,
    "msg": "应为数字 (dataset: 1, data: Table, 项目: Number)"
}

返回成功示例

{
    "code": 0,
    "eln_id": 1264,
    "id": [126456546687, 126456546688],
    "msg": "数据导入成功"
}

4.  各种模块的数据格式

  1. 表单模块
    一级 key 模块名称
    一级 value 数组。模块中各项的数据
    二级 key 对应模板中的字段名
    二级 value 多种格式。不同的数据,格式要求如下
    • 布尔值: true 或 false;
    • 文本: 双引号包含的字符串。
    • 多行文本: 双引号包含的字符串。
    • 数字: 允许整数、小数。
    • 日期: 双引号包含的字符串,日期格式:2000-12-31。
    • 时间: 双引号包含的字符串,时间格式:23:59。
    • 级联选择: 双引号包含的字符串,必须在模板此项的备选中。
    • 文件上传: 字符串
      1、#file{name} 格式,name 部分为引用上传接口的数据。
      2、#base64{filename.ext, base64code},base64 格式上传文件。参数第一部分为文件名,允许的扩展名为pdf|zip|doc|docx|png|gif|tiff|jpg|jpeg|svg。 参数第二部分为base64编码的数据,数据会被转换为文件的方式存储在服务器上。
    示例:
    {
        "表单模块": {
            "布尔值项": true,
            "文本项": "terst",
            "多行文本项": "terst",
            "数字项": -3.1415926,
            "日期项": "2022-9-6",
            "时间项": "23:59",
            "级联选择项": "1",
            "文件上传项": "#file{name1}"
        }
    }
  2. 富文本模块
    key 模块名称
    value 双引号包含的字符串
    示例:
    {
        "富文本模块": "<p>text</p>"
    }
  3. 表格模块
    一级 key 模块名称
    一级 value 数组。模块中各项的数据
    二级 key 对应模板中表格的列名
    二级 value 多种格式。某列中的数据。不同的数据,格式要求如下
    • 布尔值: true 或 false;
    • 文本: 双引号包含的字符串。
    • 多行文本: 双引号包含的字符串。
    • 数字: 允许整数、小数。
    • 日期: 双引号包含的字符串,日期格式:2000-12-31。
    • 时间: 双引号包含的字符串,时间格式:23:59。
    • 下拉列表: 双引号包含的字符串,必须在模板此项的备选中。
    • 文件上传: 字符串,#file{name} 格式或#base64{filename.ext,base64code}格式。
    示例:
    {
        "表格模块": {
            "文本列": ["a", "b"],
            "数字列": [1, 2, 1],
            "日期列": ["2021-9-6", "2021-9-6"],
            "时间列": ["12:00", "12:21"],
            "文件上传列": ["#file{name1}", "#file{name2}"],
            "下拉列表列": ["1", "2"],
            "布尔值列": [true, false, true]
        }
    }
  4. 文件集模块
    key 模块名称
    value 数组列表。
    • file: 文本。#file{name} 格式或#base64{filename.ext,base64code}格式;
    • text: 文本。图片说明文本。
    示例:
    {
        "文件集模块":[
            {
                "file": "#file{name1}",
                "text": "<p>text</p>"
            },
            {
                "file": "#file{name2}",
                "text": "<p>text</p>"
            }
        ]
    }
     

api接口python示例:(https://gitee.com/iopwsy/iop_eln)

from iop_eln import eln
import pandas as pd

def my_template(data:pd.Series):
    return  [
             {
             "data type":"richtext",
             "data name":"标题",
             "data":f"""<p align="center"><font style="font-size:24px"><b><a href="{data["url"]}" title="{data["url"]}" target="_blank">{data["title"].replace("<","&lt")}</a></b></font></p>"""
             },
             {
             "data type":"richtext",
             "data name":"作者",
             "data":data["author"]
             },
             {
             "data type":"richtext",
             "data name":"领域",
             "data":data["subject"]
             },
             {
             "data type":"richtext",
             "data name":"摘要",
             "data":data["abstract"].replace("<","&lt")
             }
            ]

E2C = {
       'battery':'电池',
       'superconductor':'超导',
       'topological':'拓扑',
       'quantumcomputating':'量子计算'
      }
df = pd.read_csv("D:/eln/input.csv",index_col=0)
#%%
arXiv = eln()
for name in E2C.keys():
    df_n = df[df[name] > 0.5]
    # 根据模板导入第一个数据
    arXiv.import_data(
                      eln_name="测试",
                      template_name="arXiv更新",
                      title_list=[f"arXiv_{name}"],
                      uid_list=[f"arXiv_{name}"],
                      keyword_list=[f"{E2C[name]};arXiv"],
                      dataset_in=[{"Introduction":f"""<p align="center"><font style="font-size:24px"><b>arXiv文献关于{E2C[name]}的{len(df_n)}篇文献</b></font></p>"""}]
                     )
    arXiv.update_dataset(
                         eln_name="测试",
                         uid=f"arXiv_{name}",
                         module_name=[f"arXiv_{name}_{index}" for index in df_n.index],
                         module_type=["form"]*len(df_n),
                         data_func=my_template,
                         data_in=df_n
                        )