1 importrequests2 importjson3 importtime4 from dingtalk.crypto importDingTalkCrypto5

6 from django.conf importsettings7 #settings.BASE_DIR

8

9

10 classCrypto(object):11 def __init__(self, token):12 #随便填的字符串

13 self.token =token14 #自己生成的43位随机字符串

15 self.aes_key = settings.DINGDING.get("DINGTALK_AES_TOKEN")16 #钉钉企业ID

17 self.corp_id = settings.DINGDING.get("CorpId") #18 print("corp_id:", self.corp_id)19 self.nonce = settings.DINGDING.get("nonce")20 self.crypto =DingTalkCrypto(21 token=self.nonce,22 encoding_aes_key=self.aes_key,23 corpid_or_suitekey=self.corp_id24 )25

26 defencrypt_success(self):27 #返回加密success

28 result =self.crypto.encrypt_message(29 msg="success",30 nonce=self.nonce,31 timestamp=int(time.time()*1000)32 )33 returnresult34

35

36 classDING(object):37 def __init__(self, approve_process):38 self.AgentId = settings.DINGDING.get("AgentId")39 self.AppKey = settings.DINGDING.get("AppKey")40 self.AppSecret = settings.DINGDING.get("AppSecret")41 self.dingding_url = settings.DINGDING.get("URL")42 self.process_code = settings.DINGDING.get("APPROVE_PROCESS").get(approve_process)['process_code']43 self.aes_key = settings.DINGDING.get("DINGTALK_AES_TOKEN")44 self.nonce = settings.DINGDING.get("nonce")45

46 defget_token(self):47 '''

48 获取钉钉的token49 :return: 钉钉token50 '''

51 url = self.dingding_url + '/gettoken?appkey={}&appsecret={}'.format(self.AppKey, self.AppSecret)52 req =requests.get(url)53 req =json.loads(req.text)54 return req['access_token']55

56 #def createCallbackDd():

57 #'''

58 #注册钉钉回调函数

59 #:return:

60 #'''

61 #url = 'https://oapi.dingtalk.com/call_back/register_call_back?access_token=' + self.getToken()

62 #data = {

63 #"call_back_tag": ["bpms_task_change", "bpms_instance_change"], #这两个回调种类是审批的

64 #"token": TOKEN, #自定义的字符串

65 #"aes_key": AES_KEY, #自定义的43位字符串,密钥

66 #"url": URL #回调地址

67 #}

68 #requests.post(url, data=json.dumps(data))

69 #return ('OK')

70

71 def create_process(self, originator_user_id, dept_id, form_component_value_vo, approvers, cc_list, has_cc=0):72 '''

73 创建钉钉审批74 approvers为list 元素为钉钉userid cc_list同理75 '''

76 url = self.dingding_url + '/topapi/processinstance/create?access_token=' +self.get_token()77 print("form_component_value_vo:", form_component_value_vo)78 if has_cc ==0:79 data ={80 'agent_id': self.AgentId,81 'process_code': self.process_code, #工单id

82 'originator_user_id': originator_user_id,

83 'dept_id': dept_id, #创建人的钉钉部门id

84 'form_component_values': str(form_component_value_vo), #钉钉后台配置的需要填写的字段,

85 'approvers': approvers,86 'cc_list': cc_list,87 'cc_position': 'START_FINISH' #发起和完成时与抄送

88 }89 else:90 data ={91 'agent_id': self.AgentId,92 'process_code': self.process_code, #工单id

93 'originator_user_id': originator_user_id, #创建人的钉钉userid

94 'dept_id': dept_id, #创建人的钉钉部门id

95 'form_component_values': str(form_component_value_vo), #钉钉后台配置的需要填写的字段,

96 'approvers': approvers,97 }98 print("dingding_utils:", data)99 response = requests.post(url, data=data)100 returnresponse.json()101

102 defget_status(self, process_instance_id):103 url = self.dingding_url + '/topapi/processinstance/get?access_token=' +self.get_token()104 data ={105 "process_instance_id": process_instance_id106 }107 response = requests.post(url, data=data)108 returnresponse.json()109

110 defregister_callback(self, call_back_url):111 #注册回调

112 url = self.dingding_url + '/call_back/register_call_back?access_token=' +self.get_token()113 print("self.get_token():", self.get_token())114 data ={115 "call_back_tag": ['bpms_task_change', 'bpms_instance_change'],116 "token": self.nonce,117 "aes_key": self.aes_key,118 "url": call_back_url,119 }120 response = requests.post(url, data=json.dumps(data))121 returnresponse.json()122

123 defget_callback(self):124 url = self.dingding_url + '/call_back/get_call_back?access_token=' +self.get_token()125 req =requests.get(url)126 req =json.loads(req.text)127 returnreq128

129 defcreate_process_approver_v2(self, originator_user_id, dept_id, form_component_value_vo, approvers, cc_list):130 '''

131 创建钉钉审批132 '''

133 url = self.dingding_url + '/topapi/processinstance/create?access_token=' +self.get_token()134 data ={135 'agent_id': self.AgentId,136 'process_code': self.process_code,137 'originator_user_id': originator_user_id,138 'dept_id': dept_id,139 'form_component_values': str(form_component_value_vo),140 'approvers_v2': json.dumps(approvers)141 }142 ifcc_list:143 data['cc_list'] =cc_list144 data['cc_position'] = 'FINISH'

145

146 response = requests.post(url, data=data)147 returnresponse.json()148

149 defcreate_process_approver_v2_test(self, originator_user_id, dept_id, form_component_value_vo):150 '''

151 创建钉钉审批152 '''

153 url = self.dingding_url + '/topapi/processinstance/create?access_token=' +self.get_token()154 data ={155 'agent_id': self.AgentId,156 'process_code': self.process_code,157 'originator_user_id': originator_user_id,158 'dept_id': dept_id,159 'form_component_values': str(form_component_value_vo),160 'approvers_v2': json.dumps([161 {162 "task_action_type": "NONE",163 "user_ids": ["dingding_id"], #单独审批人

164 },165 {166 "task_action_type": "OR",167 "user_ids": ["dingding_id1", "dingding_id2"], #或签

168 },169 {170 "task_action_type": "AND",171 "user_ids": ["dingding_id1", "dingding_id2"], #会签

172 }173 ])174 }175

176 response = requests.post(url, data=data)177 returnresponse.json()178

179

180 if __name__ == "__main__":181

182 importdjango, os, sys183 sys.path.append('xxxxxx') #项目路径

184 os.environ['DJANGO_SETTINGS_MODULE'] = 'OMS.settings'

185 #print("settings.DINGDING", settings.DINGDING)

186 ding = DING("create_sendexplain")187 #print(ding.get_token())

188 #info = [{'name': '单行输入框','value': 'testixxxxxxxx'}]

189 ## print(ding.create_process('11', 11, info))

190 a =[191 {'name': "输入框1", 'value': "value1"},192 {'name': "输入框2", 'value': "value2"},193 ]194 #print(ding.create_process_test('11', 11, a))

195 #print(ding.create_process_approver_v2_test('11', 11, a))

196 #print(ding.create_process_test2())

197 #print(ding.get_status('xxx'))

198 print(ding.get_status('xx'))199

200 ## 验证 回调

201 #a = ding.get_token()

202 #print(a)

203 #c = Crypto(a)

204 #print(c.encrypt_success())

205

206 #注册回调

207 #print(ding.register_callback("http://xxxx.vaiwan.com/xxx"))

208 #print(ding.get_callback())

python小项目实例流程-公司内项目对接钉钉审批流程(python)相关推荐

  1. html审核流程状态,一种web应用的审批流程状态字段设计方法与流程

    本发明涉及数据库字段设计技术领域,尤其是涉及一种能够节省数据库存储空间的一种web应用的审批流程状态字段设计方法. 背景技术: web应用是一种可以通过web访问的应用程序,用户只需要有浏览器即可,不 ...

  2. python小项目实例流程-Python小项目:快速开发出一个简单的学生管理系统

    原标题:Python小项目:快速开发出一个简单的学生管理系统 本文根据实际项目中的一部分api 设计抽象出来,实例化成一个简单小例子,暂且叫作「学生管理系统」. 这个系统主要完成下面增删改查的功能: ...

  3. python小项目实例流程-python实现的简单RPG游戏流程实例

    本文实例讲述了python实现的简单RPG游戏流程.分享给大家供大家参考.具体如下: #RPG rpg = True whp = 100 mahp = 100 hhp = 100 MHP = 10 d ...

  4. python django项目实例_最新Django项目实战-从零开发NB的任务平台python视频学习教程...

    saas导学视频 .mp4 │ 模态框.zip │ ├─day01 │ │ 01 day01 sass项目介绍 .mp4 │ │ 02 day01 sass项目演示 .mp4 │ │ 04 day01 ...

  5. python小程序嵌入excel_用原生的方式操作Excel,Python玩转Excel神器xlsxwriter详解!...

    大家好,在之前的Python办公自动化系列文章中,我们已经介绍了两个Python操作Excel的库openpyxl与xlwings,并且相信大家已经了解这两者之间的异同. 但是在Python中操作Ex ...

  6. python小课是什么-攻陷朋友圈的8.9元Python小课,有哪些新套路?

    欢迎关注"创事记"微信订阅号:sinachuangshiji 文/套路编辑部 来源:运营研究社(ID:U_quan) 记得有那么一段时间,我经常会在朋友圈刷到同一条广告.神奇的是, ...

  7. python小课网站_攻陷朋友圈的8.9元Python小课,有哪些新套路?

    欢迎关注"创事记"微信订阅号:sinachuangshiji 文/套路编辑部 来源:运营研究社(ID:U_quan) 记得有那么一段时间,我经常会在朋友圈刷到同一条广告.神奇的是, ...

  8. python字典导入mongodb_Python语言生成内嵌式字典(dict)-案例从python提取内嵌json写入mongodb...

    本文主要向大家介绍了Python语言生成内嵌式字典(dict)-案例从python提取内嵌json写入mongodb,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 从mongo查 ...

  9. 解析approvalFlow——仿钉钉后台审批流程

    文章目录 1. approval介绍 1.1 功能应用 1.2 项目地址 2. jsxPreview.vue应用 2.1 页面结构 2.2 表单解析 3. 功能拓展 3.1 数据回显 3.2 拓展样式 ...

最新文章

  1. 深入研究ConcurrentHashMap 源码从7到8的变迁
  2. 模型大十倍,性能提升几倍?谷歌研究员进行了一番研究
  3. 编写一个程序,找出数组中元素的最大值,要求用到成员函数。
  4. 判断能否被3,5,7整除(信息学奥赛一本通-T1047)
  5. Jmock-使用ClassImposteriser扩展mock class对象
  6. (8)Linux内核中的hash与bucket
  7. Mybatis-学习笔记(3)mapper配置文件
  8. Linux内核探索之路——关于书
  9. LINGO--Error Code 1017
  10. 群晖NAS、硬盘及路由器选购及组网,打造家庭资源共享环境
  11. HoneyFramework蜂巢框架六边形生成unity地图使用教程提示和技巧
  12. 曾国藩:人生的三个阶段,做对了,剩下就是好运气
  13. 华为手机浏览器 onclick失灵的问题
  14. 冒号后面跟着function()是什么意思
  15. 模型压缩工具Distiller-INT8量化
  16. JAVA分页代码实例
  17. 小小总结—— 数字删除
  18. Airplay相关协议
  19. 面试官最常问的面试题及答案,每1题都很经典
  20. 用python写一个彩票过滤器_Python实现的彩票机选器实例

热门文章

  1. 最短路模板 - Floyd / Dijkstra
  2. think组合查询AND和OR一起用
  3. 支付宝的kill-ie
  4. Struts2 - Check Login Interceptor
  5. 大学计算机基础课程报告python-Python程序设计习题解析(大学计算机基础教育规划教材)...
  6. python菜鸟工具-第一行Python代码之菜鸟逃离记
  7. python浪漫代码-Python打造浪漫的心形,助你情人节表白成功!
  8. python for android-Python-for-Android安装笔记
  9. 学python需要多久-零基础学习python,要多久才可以学好并且找到工作?
  10. python的优点-Python语言的优势有哪些?