Skip to content

Commit eb86bb1

Browse files
authored
Merge pull request #5 from wccdev/dev
Dev
2 parents 0ed686b + b8e92e0 commit eb86bb1

File tree

6 files changed

+104
-7
lines changed

6 files changed

+104
-7
lines changed

README.md

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
[![pypi](https://img.shields.io/pypi/v/drf-oa-workflow.svg)](https://pypi.wochacha.cn/simple/drf-oa-workflow/)
55
[![python](https://img.shields.io/pypi/pyversions/drf-oa-workflow.svg)](https://pypi.wochacha.cn/simple/drf-oa-workflow/)
6-
[![Build Status](https://github.com/wccdev/drf-oa-workflow/actions/workflows/dev.yml/badge.svg)](https://github.com/wccdev/drf-oa-workflow/actions/workflows/dev.yml)
6+
[![Build Status](https://github.com/wccdev/drf-oa-workflow/actions/workflows/python-publish.yml/badge.svg)](https://github.com/wccdev/drf-oa-workflow/actions/workflows/python-publish.yml)
77
[![codecov](https://codecov.io/gh/wccdev/drf-oa-workflow/branch/main/graphs/badge.svg)](https://codecov.io/github/wccdev/drf-oa-workflow)
88

99

@@ -41,7 +41,7 @@ INSTALLED_APPS = [
4141
]
4242

4343
# 由oa提供
44-
OA_WORKFLOW_API = {
44+
DRF_OA_WORKFLOW = {
4545
# oa接口应用id
4646
"APP_ID": "xxxx",
4747
# oa接口应用secret
@@ -167,8 +167,9 @@ urlpatterns = [
167167
```
168168

169169
### 5.同步OA账号到当前项目
170-
- 同步数据前需要在项目设置OA_WORKFLOW_API中配置AO数据库连接以及指定用户表信息
170+
- 同步数据前需要在项目设置DRF_OA_WORKFLOW中配置OA数据库连接以及指定用户表信息
171171
#### 5.1 设置保存数据的表
172+
- 5.1.1 使用drf-oa-workflow内置表
172173
drf_oa_workflow已经设置了相关表,可执直接执行迁移命令生成
173174
详情请查看drf_oa_workflow.models.OaUserInfo
174175
```python
@@ -195,9 +196,34 @@ python manage.py migrate drf_oa_workflow
195196

196197
```
197198

199+
- 5.1.2 使用你自己的表
200+
```python
201+
from django.db.models import CharField
202+
from drf_oa_workflow.models import AbstractOaUserInfo
203+
204+
205+
class YouOAUserModel(AbstractOaUserInfo):
206+
extra_field1 = CharField(max_length=20, blank=True, verbose_name="额外字段1")
207+
extra_field2 = CharField(max_length=20, blank=True, verbose_name="额外字段2")
208+
209+
class Meta:
210+
abstract = True
211+
verbose_name = verbose_name_plural = "OA用户信息"
212+
db_table = "xxxxx"
213+
```
214+
215+
#### 注意!!!
216+
如果项目使用5.1.2方式中的OA用户模型,请在项目配置中配置SYNC_OA_USER_MODEL变量
217+
```python
218+
# 指定项目使用的OA用户模型: SYNC_OA_USER_MODEL = "模型所属APP.模型类名"
219+
# 如果不配置,项目默认OA用户模型仍为drf_oa_workflow.models.OaUserInfo
220+
# 参考Django AUTH_USER_MODEL变量
221+
SYNC_OA_USER_MODEL = "xxxx.YouOAUserModel"
222+
```
223+
198224
#### 5.2 在admin后台添加drf_oa_workflow中的定时任务
199225
需要celery以及django-celery-beat
200-
![img.png](static/img.png)
226+
![img.png](static/sync_user_task.png)
201227

202228
#### 5.3 项目User获取同步到的oa用户信息
203229
```python

drf_oa_workflow/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22

33
__author__ = """Leslie Chan"""
44
__email__ = '[email protected]'
5-
__version__ = '0.4.11'
5+
__version__ = '0.5.0'

drf_oa_workflow/settings.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@
4848
"OA_SSO_TOKEN_APP_ID": "",
4949
# requests包
5050
"REQUESTS_LIBRARY": "requests",
51+
# DEBUG
52+
"DEBUG": False,
5153
}
5254

5355

drf_oa_workflow/utils.py

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import base64
22
import json
33
import re
4+
import time
45
from io import BytesIO
56
from itertools import groupby
67
from json.decoder import JSONDecodeError as BaseJSONDecodeError
@@ -324,7 +325,10 @@ def __request(
324325
return self.__request(api_path, rf, headers=headers, need_json=need_json, **kwargs)
325326
raise ValueError(f"Error: {resp.text}")
326327
if type(res) is dict and res.get("code", "") and res["code"] != "SUCCESS":
327-
raise APIException(detail=f"OA提示: {res['code']}, {res.get('errMsg', '')}")
328+
error_msg = f"OA提示: {res['code']}, {res.get('errMsg', '')};"
329+
if api_settings.DEBUG:
330+
error_msg = f"{error_msg}\n{json.dumps(res)}"
331+
raise APIException(detail=error_msg)
328332
return res
329333

330334
def _get_oa(self, api: str, params: dict = None, headers: dict = None, need_json=True):
@@ -801,3 +805,68 @@ def recover(self, request_id):
801805
resp = self._post_oa(api_path, post_data=post_data)
802806
_ = {"code": "SUCCESS", "errMsg": {}} # noqa
803807
return resp
808+
809+
def withdraw(self, request_id, remind="0", remark: str = ""):
810+
"""
811+
流程撤回
812+
:param request_id:
813+
:param remind: 是否提醒 0:不提醒 1:提醒
814+
:param remark: 备注
815+
:return:
816+
"""
817+
api_path = "/api/workflow/paService/withdrawRequest"
818+
post_data = {
819+
"isremind": remind, # 是否提醒 0:不提醒 1:提醒
820+
"remark": remark,
821+
"requestId": request_id,
822+
}
823+
res = self._post_oa(api_path, post_data=post_data)
824+
return res
825+
826+
def delete(self, request_id):
827+
"""
828+
删除流程
829+
-- OA功能实践,退回到创建节点可删除流程
830+
-- 注意,需要OA在后台流程配置开启对应功能
831+
-- 后端应用中心 > 流程引擎 > 路径管理 > 路径设置 > ${找到相关流程} > 基础设置 > 功能设置 > 退回到创建节点可删除流程 开启
832+
:param request_id:
833+
:return:
834+
"""
835+
api_path = "/api/workflow/paService/deleteRequest"
836+
post_data = {"requestId": request_id}
837+
res = self._post_oa(api_path, post_data=post_data)
838+
return res
839+
840+
def get_operate_buttons(self, request_id):
841+
"""
842+
获取用户在当前流程的操作按钮
843+
:return:
844+
"""
845+
# 1.获取OA loadForm 参数
846+
load_form_api = "/api/workflow/reqform/loadForm"
847+
timestamp = f"{int(time.time() * 1000)}"
848+
load_form_body = {
849+
"preloadkey": timestamp,
850+
"requestid": request_id,
851+
"timestamp": timestamp,
852+
}
853+
load_form_data = self._post_oa(load_form_api, post_data=load_form_body)
854+
if not load_form_data.get("params", {}).get("verifyRight", False):
855+
raise APIException("对不起,您没有该流程的相关权限!")
856+
857+
# 2.获取OA流程的菜单按钮
858+
secret_data = {
859+
"signatureSecretKey": load_form_data["params"]["signatureSecretKey"],
860+
"signatureAttributesStr": load_form_data["params"]["signatureAttributesStr"],
861+
"requestType": load_form_data["params"]["requestType"],
862+
}
863+
right_menu_api = "/api/workflow/reqform/rightMenu"
864+
right_menu_body = {
865+
"requestid": request_id,
866+
**secret_data,
867+
}
868+
right_menu_data = self._post_oa(right_menu_api, post_data=right_menu_body)
869+
if right_menu_data.get("verifyFailMsg"):
870+
raise APIException(right_menu_data["verifyFailMsg"])
871+
872+
return right_menu_data

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[tool]
22
[tool.poetry]
33
name = "drf-oa-workflow"
4-
version = "0.4.11"
4+
version = "0.5.0"
55
homepage = "https://github.com/wccdev/drf-oa-workflow"
66
description = "Skeleton project created by Cookiecutter PyPackage."
77
authors = ["Leslie CHan <[email protected]>"]

static/sync_user_task.png

131 KB
Loading

0 commit comments

Comments
 (0)