在“任务管理”里,催办是一个很常见的功能:点击“催办”按钮,钉钉机器人会去发信息,提醒任务负责人。
Django:2.1.8
Python:3.6.4
project的名称是:naxx
APP的名称是:naxxramas
首先,在钉钉群里申请一个自定义机器人,并且获取到对应的webhook,如图:
然后设计一下任务数据库的models.py
:
1
2
3
4
5# 大促任务表,给日历用的
class Events(models.Model):
event_name = models.CharField(max_length=255, null=True, blank=True) # 大促任务名称
promotion_name = models.ForeignKey(Promotion, on_delete=models.CASCADE) # 大促名称,是从大促表里取外键,这里做了联级删除,即大促表里的大促删除了,这里的事件也会删除
principal = models.CharField(max_length=20, null=True, blank=True) # 责任人
由于一次大促会有很多个任务,是一个一对多的关系,所以引入了foreignkey,那么大促的models.py
如下:
1
2
3
4
5# 大促名单记录
class Promotion(models.Model):
promotionname = models.CharField(max_length=50) # 大促名称
dingding = models.CharField(max_length=50) # 群钉钉机器人
description = models.CharField(max_length=2000, null=True, blank=True) # 大促描述
保证这两个表里都有对应数据之后,就可以写前端和后台了。
对应的前端按钮的设计如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18<td class="project-actions text-right">
<a class="btn btn-primary btn-sm swalDefaultSuccess" id="AJAX_dingding">
<!-- swalDefaultSuccess 这个是给alerts用的-->
<i class="fas fa-bell">
</i>
催办
</a>
<a class="btn btn-info btn-sm" href="/naxx/update_event/?id={{ event.id }}">
<i class="fas fa-pencil-alt">
</i>
编辑
</a>
<a class="btn btn-danger btn-sm toastrDefaultError" href="/naxx/delete_event/?id={{ event.id }}">
<i class="fas fa-trash">
</i>
删除
</a>
</td>
按钮的样式如图:
对应的script
如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18<script type="text/javascript">
// 请求服务器,返回JSON
$(document).ready(function(){
$("#AJAX_dingding").click(function(){ // 点击事件
{% for event in events_list %}
var id = {{ event.id }}; // 获取到活动的id值
{% endfor %}
var data = {"id": id}; // 打包成get请求发送的数据到view.py
$.get(
// 请求的url
"{% url 'dingding_event' %}",
// 发送的数据
data,
)
})
})
</script>
对应的views.py
内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28from .models import Promotion, Events
import json
# 钉钉催办大促任务
def dingding_event(request):
event_pk = request.GET.get('id')
promotion_id = Events.objects.filter(pk=event_pk).values_list("promotion_name_id")[0][0]
responsible_person = Events.objects.filter(pk=event_pk).values_list("principal")[0][0]
the_event = Events.objects.filter(pk=event_pk).values_list("event_name")[0][0]
dingding_bot = Promotion.objects.filter(id=promotion_id).values_list("dingding")[0][0] # 获取对应的机器人编号
webhook = "https://oapi.dingtalk.com/robot/send?access_token=" + dingding_bot
header = {
"Content-Type": "application/json",
"Charset": "UTF-8"
}
text = "大促任务提醒!" + '\n' + "@" + str(responsible_person) + ",您负责的【" + str(the_event) + "】任务,请尽快处理~"
message = {
"msgtype": "text",
"text": {"content": text},
"at": {"isAtAll": True} # 这里是@所有人
} # 对请求的数据进行json封装
message_json = json.dumps(message)
info = requests.post(url=webhook, data=message_json, headers=header) # 发送post请求
data = dict()
data['info'] = info.text
return JsonResponse(data)
在urls.py
里新增一条记录:
1
path('dingding_event/', views.dingding_event, name='dingding_event'), # 钉钉催办大促任务
启动之后,整个的效果如下:
我这个效果是@所有人,这样肯定会打扰到其他人。其实如果你有成员的钉钉注册手机号就可以在"at": {"isAtAll": True}
改成 @对应的人。