大道至简,新一代企业应用无栈开发

平台之上,一种语言,可视化、脚本化、全端一体化开发

应用软件包

软件包相关接口

docutils document without title

应用软件包是一种特殊的站点内容,通过 root.packages 管理。

目录

1   软件包管理

1.1   查看全部应用包 keys

查看已经安装的所有应用包:

package_names = root.packages.keys()

其中有一个特殊的软件包,名字叫 zopen.builtin ,用于存放站点特有的定制内容。定制的表单、流程、阶段等存放在这个软件包中。

1.2   创建一个新软件包 new

软件包里面存放了应用的定义逻辑和代码。

先得创建一个应用软件包:

package = root.packages.new('zopen.test', {'title':'zopen.xxx', description:''})

看看这个应用软件包的名字,我们发现加了一个公司名称的前缀名字空间:

>>> pkg.name
'zopen.test_app'

在软件包里面,还能够定义流程、阶段、规则、python脚本、皮肤、静态资源等各种信息。

1.3   更改站点软件包属性 update

设置应用包信息:

root.packages.update('zopen.test', **kw)

1.4   得到站点软件包属性 get

得到一个应用包信息(dict):

packge = root.packages.get('zopen.test', detail=False)

1.5   查找插件 list_plugins

平台通过前缀命名约定的脚本来定义插件。

查找出全部应用中指定前缀的脚本:

plugins = root.packages.list_plugins(
        prefix=['viewlet_datacontainer_', 'viewlet_all_'],
        categories=[])

其中:

  • prefix:脚本的前缀
  • categories:所在应用的分类

1.6   得到站点软件包对象 []

得到一个应用包对象:

pack_obj = root.packages['zopen.test']

站点默认有一组只读的内置软件包,可以检查软件包是否是内置:

pack_obj.in_memory

1.7   在站点卸载软件包 remove

卸载、删除一个安装的应用包:

root.packages.remove('zopen.test')

卸载之前会执行 uninstall 脚本,也可以忽略 uninstall 脚本卸载:

root.packages.remove('zopen.test', ignore_uninstall=True)

2   应用市场管理

2.1   搜索应用市场 search_appstore

根据名字或者分类,搜索市场,返回软件包的信息:

# 搜索全部软件包
packages = root.packages.search_appstore()
# 搜索文档分类的软件包
packages = root.packages.search_appstore(category='document')
# 搜索zopen.teamspace软件包的信息
packages = root.packages.search_appstore(name='zopen.teamspace')

2.2   在应用市场安装软件包 install

在应用市场安装 (升级) 一个应用包:

pkg_obj = root.packages.install(package, upgrade=False, is_temp=False)

其中:

  • package: 软件包的名字,如 zopen.test

  • upgrade: 安装的时候是否执行升级程序,升级程序是 upgrade_VERSION 命名的脚本

  • is_temp:是否临时修订。如果是,下次升级的时候,会先删除这个软件包

    通过 pkg_obj.is_temp 可以检查是否是一个临时修订软件包。

3   表单定义 form

3.1   在软件包中注册表单 regsiter_form

用json描述表单定义:

form_def = {"name":'sales',
  "title":'',"description":'',
  "template": "", # 生成表单的模板'on_validation':"", # 字段正确性整体校验脚本
  'object_types':['DataItem'], # 语义定义用于的对象类型
  'tag_groups': "", # 所在容器的标签组设置'on_update':""" """, # 保存之后的触发脚本"fields" : [     # 所有的字段
          {"name":"title",
            "type":"TextLine",
            "title":'任务标题', },
          {"name":'description':
             "type": "Text",
             "title":'任务说明',
             "rows":3, },
          {"name":"startend",
           "Type":"Panel",
           "title":"时间",
           "layout":'horizontal', # vertical
           "fields":[{"name":"start,
                "type": "Date",
                "title": '开始时间',},
              {"name":"end",
                "type": "Date",
                "title": '结束时间',},
              ]
          },
          {"name":"level",
            "type": "Integer",
            "title": '任务等级',
            "size":18,},
          {"name":"local_paths",
            "type": "LocalPathSelect",
            "title": '本地路径',
            "multiple": False,
            "mode": "fileonly",
            },
          {"name":"responsibles",
           "type":"PersonSelect",
           "title":'负责人',
           "validation_expr":"not value and'需要一名检查人'",}
          {"name":"reviewers",
           "type":"GrowingTable",
           "title":'审核人',
           "fields": [{"name":"title","type":"TextLine""title"" 标题 ",},
              {"name":"description",
               "type":"Text"
               "title"" 描述 ",},
           ]
          }
      ],
  }

可以注册一个表单定义,用于表单、表单库,或者栏目:

root.packages.register_form('zopen.sales', form_def)

3.2   得到表单对象 get_form_obj

获取表单对象:

form_obj = root.packages.get_form_obj(name, custom=False)

其中 :

  • custom是否读取可能存在的定制版本

3.3   得到表单定义json get_form

获取表单(dict):

data = root.packages.get_form(name, custom=False)

其中 :

  • custom是否读取可能存在的定制版本

3.4   获取表单字段定义json get_form_field

获取表单字段信息(dict, 是否定制版本):

data = root.packages.get_form_field(form_name, name, custom=False)

其中:

  • form_name: 表单名字,比如 zopen.tasks:task
  • name: 字段的名字,比如 title
  • custom是否读取可能存在的定制版本

3.5   更改表单信息 update_form

更改表单属性:

root.packages.update_form(form, data)

3.6   添加表单字段 add_form_field

增加表单字段:

root.packages.add_form_field(form, field)

3.7   更改表单字段 update_field

root.packages.update_field(field, data)

3.8   表单是否存在 has_form

root.packages.has_form(form)

3.9   移除表单 remove_form

root.packages.remove_form(name)

3.10   查看软件包的所有表单 list_form

root.packages.list_forms('zopen.test')

3.11   查看软件包的所有表单 list_all_forms

root.packages.list_all_forms(object_types=['DataItem', 'DataContainer', 'AppContainer'])

输入:

  • object_types: 表单的类型条件
  • includ_custom : 是否包含定制

输出按照应用分隔的全部属性集:

{'<应用的标题>':[{name:<完整的名字>, title:}]}

4   扩展属性

4.1   注册扩展属性定义 register_mdset

属性集的注册类似表单:

root.packages.register_mdset('zopen.sales',
      {name:
       title:,
       description:,
       fields:,
       on_update:,
       template:,
       obejct_types})

4.2   获取扩展资源对象 get_mdset_obj

obj = root.packages.(name, custom=False)

其中:

  • custom是否读取可能存在的定制版本

4.3   获取扩展属性定义json get_mdset

data = root.packages.get_mdset(name, custom=False)

4.4   获取扩展属性字段 get_mdset_field

data = root.packages.get_mdset_field(mdset_name, name, custom=False)

4.5   移除扩展属性 remove_mdset

root.packages.remove_mdset(name)

4.6   查看软件包的所有扩展属性 list_mdsets

root.packages.list_mdsets('zopen.test')

4.7   获取全部属性集 list_all_mdsets

root.packages.list_all_mdsets()

可选择是否包含定制项,输出按照应用分隔的全部属性集:

{'<应用的标题>':[{name:<完整的名字>, title:}]}

5   阶段

5.1   注册阶段定义 register_stage

采用 json 格式来描述阶段:

stages = {'name':'sales',
          'title':'Sales',
          'description':'Description',
          'stages': [{"name":"valid",
                      "title":"需求确认",
                      "description": "分配的新单",
                      "on_enter": ""# 进入阶段的触发脚本},
                     {"name":"initial",
                      "title":"初始"}
                    ]
         }

注册一个阶段定义到应用包:

root.packages.register_stage('zopen.sales', stages)

5.2   获取阶段对象 get_stage_obj

obj = root.packages.get_stage_obj(name, custom=False)

5.3   获取阶段定义json get_stage

data = root.packages.get_stage(name, custom=False)

5.4   移除阶段 remove_stage

root.packages.remove_stage(name)

5.5   查看应用包的所有阶段

root.packages.list_stages('zopen.test')

6   工作流

6.1   注册工作流定义 register_workflow

工作流由步骤 Step 和操作 Action 组成:

workflow_json = {'name':'sales',
                 'title':'销售流程',
                 'description':'销售',
                 'steps':[{"name":"start","title":'新的销售机会',"fields": ['title','client','responsibles','case_info','subjects'],"invisible_fields": ['plan_info','files','folder','lastlog','log','start'],"on_enter":"",
                     "condition": '',"hours": 0,  # 时限, 如果非 0,流程任务会创建生成 deadline"stage":'valid',"responsibles":'[request.principal.id]',
                     "actions": [{"name":'submit',"title":'提交',"type":'default',   # 正常的流程操作"condition":'',
                                    "finish_condition":'',"next_steps":['communicate'],"on_submit":"",
                                  }
                                ]
                   },

                    {"name":"auto_step"
                      "title": '这是一个自动步骤,无人参与',
                      "condition":'',"on_enter":"",
                      "stage":'planing',
                      "actions": [{"name":'submit',"title":'触发',"type":'auto',   # 自动步骤"condition":'',
                                    "finish_condition":'',"next_steps":['communicate'],"on_submit":"",
                                  }
                                ]
                    },

                    {"name": "communicate",
                     "title": '了解需求背景',
                      "fields": ['title', 'case_info', 'files', 'log', 'start', 'subjects'],
                      "invisible_fields":['plan_info', 'lastlog'],
                      "on_enter": "","condition":'',
                      "stage":'planing',
                      "responsibles":'context["responsibles"]',
                      "actions": [{"name":'duplicated',"title":'重复或无效, 不再跟进',"type":'error',   # 这里 error,表示流程异常操作"next_steps":[],
                                    "finish_condition":'',"condition":'',
                                   },
                                   {"name": '8372',
                                    "title": '需求了解完毕',
                                    "type": 'default',
                                    "next_steps": ['submit_plan'],
                                    "finish_condition":'',}
                                  ]
                          }
                     }]}

将这个工作流注册到系统:

root.packages.register_workflow('zopen.sales', workflow_json)

6.2   获取流程对象 get_workflow_obj

obj = root.packages.get_workflow_obj(name, custom=False)

6.3   获取流程定义json get_workflow

root.packages.get_workflow(name, custom=False)

如:

salse_query_wfl = root.packages.get_workflow('zopen.sales:sales_query')

6.4   获取流程步骤 get_workflow_step

root.packages.get_workflow_step('zopen.test', workflow_name, step_name)

6.5   查看应用包的所有流程 list_workflows

root.packages.list_workflows('zopen.test')

6.6   删除流程 remove_workflow

root.packages.remove_workflow(name)

6.7   移除流程步骤 remove_workflow_step

root.packages.remove_workflow_step('zopen.test', workflow_name, step_name)

6.8   增加流程步骤 add_workflow_step

root.packages.add_workflow_step('zopen.test', workflow_name, step_name)

6.9   查看应用包的所有流程步骤 list_workflow_steps

root.packages.list_workflow_steps('zopen.test', workflow_name)

6.10   更新流程步骤 update_workflow_step

root.packages.update_workflow_step('zopen.test', workflow_name, **kw)

6.11   增加流程动作 add_workflow_action

root.packages.add_workflow_action('zopen.test', workflow_name, step_name, action_name)

6.12   获取流程动作 get_workflow_action

root.packages.get_workflow_action('zopen.test', workflow_name, step_name, action_name)

6.13   删除流程动作 remove_workflow_action

root.packages.remove_workflow_action('zopen.test', workflow_name, step_name, action_name)

6.14   更新流程动作 update_workflow_action

root.packages.update_workflow_action('zopen.test', workflow_name, step_name, action_name)

7   python 脚本

7.1   注册python脚本 register_script

在应用包里面注册一个脚本:

root.packages.register_script('zopen.sales',
      {'name':'setup',
       'permission':'Access',
       'template':'standard',
       'icon':'folder-o',
       'args':'','script':'print "hello, world"',
      })

其中 icon 使用fontawsome中的图标名字, template 是输出套用的模板:

  • standard: 系统标准模版,支持应用权限、编辑和设置
  • blank: 不使用现有模版页首和页脚,但保持现有界面风格, 保留 css/js 的模板
  • json: json api
  • kss: 页面调用处理脚本(ajax)
  • none: 不使用任何模版

7.2   得到脚本 get_script

script_json = root.packages.get_script(name='xxx.xxx:xxx')

返回的是一个脚本信息的json对象

7.3   得到脚本对象 get_script_obj

通过名字,可以得到:

script_obj = root.packages.get_script_obj(name='xxx.xxx:xxx')

返回的是脚本对象

7.4   查看应用包的所有脚本 list_scripts

root.packages.list_scripts(package_name)

7.5   移除脚本 remove_script

root.packages.remove_script(name)

8   规则

8.1   创建一个规则 register_rule

root.packages.register_rule('zopen.ocr',
                {'name':'ocr',
                 'title':'中文 OCR',
                 'description':'对移入文件夹的文档进行 ocr',
                 'event':'movein',
                 'object_types':['File'],
                 'extensions':"jpg, tiff, png, pdf, gif, jpeg, tif",
                 'script':'root.call_code()'})

8.2   获取规则对象 get_rule_obj

root.packages.get_rule_obj(name)

8.3   获取规则 get_rule

root.packages.get_rule(name)

8.4   查看软件包的所有规则 list_rules

root.packages.list_rules('zopen.test')

8.5   移除规则 remove_rule

root.packages.remove_rule(name)

8.6   获取所有规则集 list_all_rules

root.packages.list_all_rules()

按照应用分隔的全部规则:

{'<应用的标题>':[{name:<完整的名字>, title:}]}

9   站点模板

9.1   注册皮肤 register_skin

把这个皮肤注册到站点的皮肤注册表:

root.packages.register_skin('',
           {'name':'bootstrap',
             'title':'Twitter 的 Bootstrap 风格皮肤',
             'template':template,
             'description':''})

也可以注册到某个应用包中:

root.packages.register_skin('zopen.cool_skin',
     {'name':'bootstrap',
             'title':'Twitter 的 Bootstrap 风格皮肤',
             'template':template,
             'description':''})

9.2   得到皮肤 get_skin

得到一个皮肤:

root.packages.get_skin(name)

9.3   得到皮肤对象 get_skin_obj

得到皮肤对象:

root.packages.get_skin_obj(name)

9.4   查看软件包的所有皮肤 list_skins

root.packages.list_skins(package_name)

9.5   移除皮肤 remove_skin

root.packages.remove_skin(name)

9.6   得到皮肤模板 get_skin_template

root.packages.get_skin_template(name)

9.7   获取全部皮肤 list_all_skins

root.packages.list_all_skins()

按照应用分隔的全部皮肤:

{'<应用的标题>':[{name:<完整的名字>, title:}]}

10   资源文件

10.1   得到软件包的缓存路径 packages_cache_url

root.packages.cache_url(request)

需要获取一个资源文件的完整 URL,参考以下代码:

root.packages.cache_url(request) + 'zopen.pkg_name/resources/filename.ext'

10.2   其他的接口

root.packages.add_resource(ackage_name, path, stream, overwrite=False)
root.packages.get_resource(package_name, path='/')
root.packages.list_resources(package_name='')
root.packages.remove_resource(package_name, path)

11   模板

11.1   注册一个模板对象 register_template

root.packages.register_template('zopen.sales',
      {'name':'lal',
          'code':'',})

11.2   获取模板对象 get_template_obj

root.packages.get_template_obj(name)

11.3   获取模板 get_template

root.packages.get_template(name)

11.4   查看应用包的所有模板 list_templates

root.packages.list_templates('zopen.test')

11.5   移除模板 remove_template

root.packages.remove_template(name)