This commit is contained in:
caoqianming 2020-09-08 18:23:54 +08:00
parent d944c7084d
commit a0b873510b
20 changed files with 680 additions and 87 deletions

View File

@ -1 +1 @@
2664
11768

View File

@ -33,16 +33,16 @@ app.conf.update(
'schedule': crontab(minute=2),
#'args': (5, 6)
},
'grid-task': {
'task': 'safesite.tasks.gridtasksend',
'schedule': timedelta(minutes=1),
#'args': (5, 6)
},
'riskact-task': {
'task': 'safesite.tasks.riskacttask',
'schedule': timedelta(minutes=1),
#'args': (5, 6)
},
# 'grid-task': {
# 'task': 'safesite.tasks.gridtasksend',
# 'schedule': timedelta(minutes=1),
# #'args': (5, 6)
# },
# 'riskact-task': {
# 'task': 'safesite.tasks.riskacttask',
# 'schedule': timedelta(minutes=1),
# #'args': (5, 6)
# },
'check-task': {
'task': 'safesite.tasks.checktask',
'schedule': timedelta(minutes=1),

View File

@ -42,7 +42,7 @@ INSTALLED_APPS = [
'safesite.templatetags',
'groups',
'captcha',
'django_celery_beat'
]
# CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.math_challenge'
CAPTCHA_NOISE_FUNCTIONS = ('captcha.helpers.noise_null',)
@ -142,12 +142,14 @@ STATIC_ROOT = os.path.join(BASE_DIR, 'static')
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
###配置Broker
###配置celery
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/0'
CELERY_BROKER_TRANSPORT = 'redis'
CELERYD_MAX_TASKS_PER_CHILD = 10
CELERY_TIMEZONE='Asia/Shanghai'
CELERY_ENABLE_UTC=True
# CELERY_ENABLE_UTC=True
DJANGO_CELERY_BEAT_TZ_AWARE = False
CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'
##配置session
SESSION_EXPIRE_AT_BROWSER_CLOSE = True

View File

@ -6,7 +6,8 @@ admin.site.register(models.Trouble)
admin.site.register(models.Dicclass)
admin.site.register(models.Dickey)
admin.site.register(models.Partment)
admin.site.register(models.MySchedule)
admin.site.register(models.GridTaskSet)
@admin.register(models.Menu)
class Menuadmin(admin.ModelAdmin):
list_display = ('menuname','menucode','type','url')

View File

@ -0,0 +1,50 @@
# Generated by Django 2.2.8 on 2020-09-08 11:19
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('django_celery_beat', '0012_periodictask_expire_seconds'),
('safesite', '0350_auto_20200906_2344'),
]
operations = [
# migrations.RemoveField(
# model_name='companyinfo',
# name='liaison_fax',
# ),
migrations.RemoveField(
model_name='gridtaskset',
name='count',
),
migrations.RemoveField(
model_name='gridtaskset',
name='create_time',
),
migrations.RemoveField(
model_name='gridtaskset',
name='is_paused',
),
migrations.RemoveField(
model_name='gridtaskset',
name='start_task',
),
migrations.AddField(
model_name='gridtaskset',
name='periodictask',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='django_celery_beat.PeriodicTask'),
preserve_default=False,
),
migrations.CreateModel(
name='MySchedule',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('crontab', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='django_celery_beat.CrontabSchedule')),
('interval', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='django_celery_beat.IntervalSchedule')),
('usecomp', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='safesite.Partment')),
],
),
]

View File

@ -0,0 +1,27 @@
# Generated by Django 2.2.8 on 2020-09-08 11:51
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('safesite', '0351_auto_20200908_1119'),
]
operations = [
# migrations.RemoveField(
# model_name='companyinfo',
# name='liaison_fax',
# ),
migrations.RemoveField(
model_name='gridtaskset',
name='schedule',
),
migrations.AlterField(
model_name='gridtaskset',
name='periodictask',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='gridtaskset_periodictask', to='django_celery_beat.PeriodicTask'),
),
]

View File

@ -0,0 +1,35 @@
# Generated by Django 2.2.8 on 2020-09-08 13:11
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('safesite', '0352_auto_20200908_1151'),
]
operations = [
# migrations.RemoveField(
# model_name='companyinfo',
# name='liaison_fax',
# ),
migrations.AddField(
model_name='gridtaskset',
name='expire',
field=models.IntegerField(blank=True, null=True, verbose_name='有效期'),
),
migrations.AddField(
model_name='gridtaskset',
name='myschedule',
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='safesite.MySchedule'),
preserve_default=False,
),
migrations.AddField(
model_name='myschedule',
name='name',
field=models.CharField(default='每10秒', max_length=1000, verbose_name='名称'),
preserve_default=False,
),
]

View File

@ -0,0 +1,27 @@
# Generated by Django 2.2.8 on 2020-09-08 14:07
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('safesite', '0353_auto_20200908_1311'),
]
operations = [
# migrations.RemoveField(
# model_name='companyinfo',
# name='liaison_fax',
# ),
migrations.AddField(
model_name='gridtaskset',
name='start_time',
field=models.DateTimeField(blank=True, null=True, verbose_name='开始派发时间'),
),
migrations.AlterField(
model_name='gridtaskset',
name='expire',
field=models.IntegerField(blank=True, null=True, verbose_name='派发有效期'),
),
]

View File

@ -0,0 +1,17 @@
# Generated by Django 2.2.8 on 2020-09-08 14:07
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('safesite', '0354_auto_20200908_1407'),
]
operations = [
# migrations.RemoveField(
# model_name='companyinfo',
# name='liaison_fax',
# ),
]

View File

@ -0,0 +1,27 @@
# Generated by Django 2.2.8 on 2020-09-08 16:46
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('safesite', '0355_remove_companyinfo_liaison_fax'),
]
operations = [
# migrations.RemoveField(
# model_name='companyinfo',
# name='liaison_fax',
# ),
migrations.AddField(
model_name='myschedule',
name='deletemark',
field=models.IntegerField(default=1),
),
migrations.AddField(
model_name='myschedule',
name='typeset',
field=models.CharField(default=1, max_length=10, verbose_name='类型'),
),
]

View File

@ -1041,6 +1041,16 @@ class EdulessonWatch(models.Model): # 在线视频观看情况表
user = models.ForeignKey(User, on_delete=models.CASCADE)
submittime = models.DateTimeField(default=timezone.now)
from django_celery_beat.models import PeriodicTask, IntervalSchedule, CrontabSchedule
class MySchedule(models.Model):
name = models.CharField('名称', max_length=1000)
typeset = models.CharField('类型', default=1,max_length=10)
deletemark = models.IntegerField(default=1)
interval = models.ForeignKey(IntervalSchedule, null=True, blank=True, on_delete=models.SET_NULL)
crontab = models.ForeignKey(CrontabSchedule, null=True, blank=True, on_delete=models.SET_NULL)
usecomp = models.ForeignKey(
Partment, on_delete=models.CASCADE)
class GridTaskSet(models.Model):
"""
@ -1049,12 +1059,11 @@ class GridTaskSet(models.Model):
riskact = models.ForeignKey(RiskAct, on_delete=models.CASCADE, related_name='gridtaskset_riskact')
gridlevel = models.ForeignKey(Dickey, on_delete=models.CASCADE, verbose_name='网格化层级')
user = models.ForeignKey(User,on_delete=models.CASCADE,verbose_name='执行人')
schedule = JSONField('定时配置',null=True, blank=True)
note = models.TextField('检查备注', null=True)
start_task = models.DateTimeField('最近/初始派发时间', null=True, blank=True)
is_paused = models.BooleanField(default=True, verbose_name='是否暂停派发')
count = models.IntegerField('任务派发次数', default=0)
create_time = models.DateTimeField(auto_now_add=True)
myschedule = models.ForeignKey(MySchedule,on_delete=models.CASCADE)
start_time = models.DateTimeField('开始派发时间', null=True, blank=True)
expire = models.IntegerField('派发有效期', null=True, blank=True)
periodictask = models.ForeignKey(PeriodicTask, on_delete=models.CASCADE, related_name='gridtaskset_periodictask')
class RiskActTask(models.Model): # 风险点排查执行记录
id = models.AutoField(primary_key=True)

View File

@ -291,21 +291,6 @@ def gridtasksend():
from dateutil.relativedelta import *
# def shifttime(number, type_, time1):
# if type_ is 'hours':
# return time1 + relativedelta(hours=+number)
# elif type_ is 'days':
# return time1 + relativedelta(days=+number)
# elif type_ is 'weeks':
# return time1 + relativedelta(weeks=+number)
# elif type_ is 'months':
# return time1 + relativedelta(months=+number)
# elif type_ is 'years':
# return time1 + relativedelta(years=+number)
# elif type_ is 'seconds':
# print(time1, time1 + relativedelta(seconds=+number))
# return time1 + relativedelta(seconds=+number)
def sendGridtask(obj):
nowtime = datetime.datetime.now()
schedule = obj.schedule
@ -323,6 +308,17 @@ def sendGridtask(obj):
else:
pass
@shared_task
def sendGridtask2(**kwargs):
obj = GridTaskSet.objects.get(id=kwargs['gridtaskset'])
RiskActTask.objects.filter(taskset=obj, usable=1).update(usable=0)
nowtime = datetime.datetime.now()
if obj.expire:
newm = nowtime + datetime.timedelta(hours=int(obj.expire))
RiskActTask.objects.create(riskact=obj.riskact,taskexpire = newm,taskadd=nowtime,istask=1,taskset=obj,tasknote=obj.note,user=obj.user)
else:
RiskActTask.objects.create(riskact=obj.riskact,taskadd=nowtime,istask=1,taskset=obj,tasknote=obj.note,user=obj.user)
@shared_task
def checktask():
nowtime = datetime.datetime.now()

View File

@ -105,29 +105,31 @@
{ field: 'id', title: 'ID', hidden: true },
{ field: 'gridlevel__dickeyname', title: '网格层级', width: 100 },
{ field: 'user__name', title: '执行人', width: 100 },
{ field: 'schedule', title: '任务周期', width: 100 ,
formatter: function (value, row, index) {
if(value.hasOwnProperty('interval')){
return value.interval.replace(',hours', '小时').replace(',days', '天').replace(',weeks', '星期').replace(',months', '月').replace(',years', '年').replace(',seconds', '秒')
}
}
{ field: 'myschedule__name', title: '任务策略', width: 100 ,
// formatter: function (value, row, index) {
// if(value.hasOwnProperty('interval')){
// return value.interval.replace(',hours', '小时').replace(',days', '天').replace(',weeks', '星期').replace(',months', '月').replace(',years', '年').replace(',seconds', '秒')
// }
// }
},
{ field: 'start_task', title: '最近/初始派发时间', width: 200 },
{ field: 'is_paused', title: '派发状态', width: 100,
{ field: 'periodictask__start_time', title: '开始派发时间', width: 150 },
{ field: 'periodictask__last_run_at', title: '最近派发时间', width: 150 },
{ field: 'periodictask__enabled', title: '派发状态', width: 100,
formatter: function (value, row, index) {
switch (value) {
case false: return '正常'; break;
case true: return '暂停'; break;
case true: return '正常'; break;
case false: return '暂停'; break;
}
},
styler: function (value, row, index) {
switch (value) {
case false: return 'font-weight:bold;color:green'; break;
case true: return 'color:red;font-weight:bold'; break;
case true: return 'font-weight:bold;color:green'; break;
case false: return 'color:red;font-weight:bold'; break;
}
}
},
{ field: 'count', title: '已派发次数', width: 100 },
{ field: 'periodictask__total_run_count', title: '已派发次数', width: 100 },
{ field: 'note', title: '执行备注', width: 100 },
]],
});
@ -153,9 +155,9 @@
function togglegridtaskset() {
var row = $('#girdtasksettable').datagrid('getSelected');
if (row) {
var msg = '确定暂停派发吗?'
if(row.is_paused){
msg = '确定启动派发吗?'
var msg = '确定启动派发吗?'
if(row.periodictask__enabled){
msg = '确定暂停派发吗?'
}
$.messager.confirm('提示', msg, function (r) {
if (r) {

View File

@ -25,12 +25,23 @@
<input id="note" name="note" class="easyui-textbox" style="width:480px;height:80px" data-options="label:'检查备注',multiline:true,">
</div>
<div style="margin-bottom:5px;">
<label style='display:inline-block;'>最近/初始派发时间</label>
<input id="start_task" name="start_task" class="easyui-datetimebox" style="width:auto"
<label style='display:inline-block;'>始派发时间</label>
<input id="start_time" name="start_time" class="easyui-datetimebox" style="width:auto"
data-options="currentText:'今天',closeText:'关闭',showSeconds:false" required=true />
</div>
<div style="margin-bottom:5px">
<div style="margin-bottom:10px">
<input id="myschedule" class="easyui-combobox" name="myschedule" style="width:480px" data-options="
label:'策略',
url: 'api/myschedule/?a=listcombobox',
method: 'get',
editable: false,"
required=true>
</div>
<div style="margin-bottom:10px">
<input id="expire" name="expire" type="text" class="easyui-numberbox" value="8" data-options="label:'有效期(小时)'"/>
</div>
<!-- <div style="margin-bottom:5px">
<label style='display:inline-block;'>定时配置</label>
<span style="font-weight:bold">每隔</span>
<input id="setnumber" name="setnumber" type="text" class="easyui-numberbox" value="1" data-options="min:1,max:31"/>
@ -42,7 +53,7 @@
<option value="months"></option>
<option value="years"></option>
</select>
</div>
</div> -->
</form>
</div>
<script>
@ -71,8 +82,8 @@
function submitform() {
var data = $('#gridtasksetff').serializeJSON();
data['riskact'] = riskact
var mm = $('#setnumber').numberbox('getValue')+','+$('#unit').val()
data['schedule'] = {'interval':mm}
// var mm = $('#setnumber').numberbox('getValue')+','+$('#unit').val()
// data['schedule'] = {'interval':mm}
$.messager.confirm('提示', '确定创建并开始派发任务吗?', function (r) {
if (r) {
$.ajax({

View File

@ -25,12 +25,23 @@
<input id="note" name="note" class="easyui-textbox" style="width:480px;height:80px" data-options="label:'检查备注',multiline:true,">
</div>
<div style="margin-bottom:5px;">
<label style='display:inline-block;'>最近/初始派发时间</label>
<input id="start_task" editable="false" name="start_task" class="easyui-datetimebox" style="width:auto"
<label style='display:inline-block;'>始派发时间</label>
<input id="start_time" editable="false" name="start_time" class="easyui-datetimebox" style="width:auto"
data-options="currentText:'今天',closeText:'关闭',showSeconds:false" required=true />
</div>
<div style="margin-bottom:5px">
<div style="margin-bottom:10px">
<input id="myschedule" class="easyui-combobox" name="myschedule" style="width:480px" data-options="
label:'策略',
url: 'api/myschedule/?a=listcombobox',
method: 'get',
editable: false,"
required=true>
</div>
<div style="margin-bottom:10px">
<input id="expire" name="expire" type="text" class="easyui-numberbox" value="8" data-options="label:'有效期(小时)'"/>
</div>
<!-- <div style="margin-bottom:5px">
<label style='display:inline-block;'>定时配置</label>
<span style="font-weight:bold">每隔</span>
<input id="setnumber" name="setnumber" type="text" class="easyui-numberbox" value="1" data-options="min:1,max:31"/>
@ -42,7 +53,7 @@
<option value="months"></option>
<option value="years"></option>
</select>
</div>
</div> -->
</form>
</div>
<script>
@ -53,12 +64,13 @@
$('#username').textbox('setValue',data.user__name)
$('#user').val(data.user__userid)
$('#note').textbox('setValue',data.note)
$('#start_task').datetimebox('setValue', data.start_task)
if(data.schedule.hasOwnProperty('interval')){
var interval = data.schedule.interval.split(',')
$('#setnumber').numberbox('setValue', interval[0])
$('#unit').val(interval[1])
}
$('#myschedule').combobox('setValue',data.myschedule__id)
$('#start_time').datetimebox('setValue', data.periodictask__start_time)
// if(data.schedule.hasOwnProperty('interval')){
// var interval = data.schedule.interval.split(',')
// $('#setnumber').numberbox('setValue', interval[0])
// $('#unit').val(interval[1])
// }
})
function choseuser() {
var myh = screen.availHeight * 0.5;
@ -84,8 +96,8 @@
function submitform() {
var data = $('#gridtasksetff').serializeJSON();
data['id']=girdtasksetid
var mm = $('#setnumber').numberbox('getValue')+','+$('#unit').val()
data['schedule'] = {'interval':mm}
// var mm = $('#setnumber').numberbox('getValue')+','+$('#unit').val()
// data['schedule'] = {'interval':mm}
$.messager.confirm('提示', '确定修改吗?', function (r) {
if (r) {
$.ajax({

View File

@ -0,0 +1,80 @@
<div class="easyui-layout" style="width:100%;height:100%;">
<div id="schedulesetbar" style="padding:5px;height:auto">
<a onclick="addscheduleset()" class="easyui-linkbutton"
data-options="iconCls:'fa-plus',plain:true">新增</a>
<!-- <a onclick="editscheduleset()" class="easyui-linkbutton"
data-options="iconCls:'fa-pencil',plain:true">编辑</a> -->
<a onclick="delgirdtaskset()" class="easyui-linkbutton"
data-options="iconCls:'fa-trash',plain:true">删除</a>
</div>
<table id="schedulesettable" style="height:100%;width:auto"></table>
</div>
<script>
$('#schedulesettable').datagrid({
url: 'api/myschedule/?a=listall',
rownumbers: true,
singleSelect: true,
striped: true,
method: 'get',
toolbar: '#schedulesetbar',
pagination: 'true',
pageSize: 20,
columns: [[
{ field: 'id', title: 'ID', hidden: true },
{ field: 'name', title: '名称', width: 500 },
]],
});
function addscheduleset(){
opendg('新增定时策略','html/scheduleset/add/')
}
function editscheduleset(){
var row = $('#schedulesettable').datagrid('getSelected');
if (row) {
opendg('编辑','html/scheduleset/edit/' + row.id)
}
else {
$.messager.alert('提示', '请先选择一个策略!');
}
}
function delgirdtaskset() {
var row = $('#schedulesettable').datagrid('getSelected');
if (row) {
$.messager.confirm('提示', '确定删除吗?', function (r) {
if (r) {
$.ajax({
type: "GET",
url: 'api/scheduleset?a=del&id=' + row.id,
datatype: "json",
beforeSend: function () { },
success: function (data) {
if (data.code == 1) {
$("#schedulesettable").datagrid('reload');
} else {
$.messager.alert('提示', '您无权删除!');
}
},
complete: function (XMLHttpRequest, textStatus) {
},
error: function () {
}
});
}
}
);
}
else {
$.messager.alert('提示', '未选择数据!');
}
}
</script>

View File

@ -0,0 +1,97 @@
<div class="easyui-layout" style="width:100%;height:100%">
<div id='southdiv' data-options="region:'south'" style="width:100%;height:50px;padding:5px">
<div style="text-align:center;padding:2px">
<a id="submitb" class="easyui-linkbutton" iconCls="fa-floppy-o" onclick="submitform()">保存</a>
<a class="easyui-linkbutton" iconCls="fa-close" onclick="javascript:$('#dd').dialog('close')">取消</a>
</div>
</div>
<div data-options="region:'center'" style="width:100%;height:100%;padding:5px 15px;">
<form method="post" id="schedulesetff">
<div style="margin-bottom:10px">
<input id="name" class="easyui-textbox" name="name" style="width:480px" data-options="
label:'名称'"
required=true>
</div>
<div style="margin-bottom:5px">
<select id="set" class="easyui-combobox" name="set" style="width:200px" data-options="
label:'配置方案',
onSelect: function(res){
if(res.value=='interval'){
$('#set1').show()
$('#set2').hide()
}else{
$('#set2').show()
$('#set1').hide()
}
}
"
>
<option value="interval">简单配置</option>
<option value="crontab">高级配置</option>
</select>
</div>
<div style="margin-bottom:5px" id="set1">
<label style='display:inline-block;'>简单配置</label>
<span style="font-weight:bold">每隔</span>
<input id="every" name="every" type="text" class="easyui-numberbox" value="1" data-options="min:1,max:31"/>
<select id="period" class="easyui-combobox" style="width:80px" name="period">
<option value="days"></option>
<option value="hours">小时</option>
<option value="minutes"></option>
<option value="seconds"></option>
</select>
</div>
<div id="set2">
<div >高级配置</div>
<div style="margin-bottom:5px">
<input id="minute" class="easyui-textbox" name="minute" style="width:480px" data-options="label:'分钟'" value="*">
</div>
<div style="margin-bottom:5px">
<input id="hour" class="easyui-textbox" name="hour" style="width:480px" data-options="label:'小时'" value="*">
</div>
<div style="margin-bottom:5px">
<input id="day_of_week" class="easyui-textbox" name="day_of_week" style="width:480px" data-options="label:'每周中的天'" value="*">
</div>
<div style="margin-bottom:5px">
<input id="day_of_month" class="easyui-textbox" name="day_of_month" style="width:480px" data-options="label:'每月中的天'" value="*">
</div>
<div style="margin-bottom:5px">
<input id="month_of_year" class="easyui-textbox" name="month_of_year" style="width:480px" data-options="label:'每年中的月'" value="*">
</div>
</div>
</form>
</div>
<script>
function submitform() {
var data = $('#schedulesetff').serializeJSON();
$.ajax({
type: "POST",
url: 'api/myschedule/?a=add',
data: JSON.stringify(data),
datatype: "json",
processData: false,
contentType: "application/json;charset=utf-8",
beforeSend: function () {
var bo = $('#schedulesetff').form('validate')
if (bo == false) {
return bo
} else {
$('#submitb').linkbutton('disable');
}
},
success: function (data) {
if (data.code == 1) {
$("#schedulesettable").datagrid('reload');
$("#dd").dialog("close");
} else { $.messager.alert('提示', '失败!'); }
$('#submitb').linkbutton('enable');
},
});
}
</script>
</div>

View File

@ -0,0 +1,131 @@
<div class="easyui-layout" style="width:100%;height:100%">
<div id='southdiv' data-options="region:'south'" style="width:100%;height:50px;padding:5px">
<div style="text-align:center;padding:2px">
<a id="submitb" class="easyui-linkbutton" iconCls="fa-floppy-o" onclick="submitform()">保存</a>
<a class="easyui-linkbutton" iconCls="fa-close" onclick="javascript:$('#dd').dialog('close')">取消</a>
</div>
</div>
<div data-options="region:'center'" style="width:100%;height:100%;padding:5px 15px;">
<form method="post" id="gridtasksetff">
<div style="margin-bottom:10px">
<input id="gridlevel" class="easyui-combobox" name="gridlevel" style="width:480px" data-options="
label:'网格类型',
url: 'getdickey?a=combobox&dicclass=58',
method: 'get',
editable: false,"
required=true>
</div>
<div style="margin-bottom:10px">
<input id="username" name="username" class="easyui-textbox" style="width:480px" data-options="label:'执行人', editable:false"
required=true >
<input type="hidden" name="user" id="user"/>
<a class='easyui-linkbutton' onclick="choseuser()" style="width:auto">选择</a>
</div>
<div style="margin-bottom:5px">
<input id="note" name="note" class="easyui-textbox" style="width:480px;height:80px" data-options="label:'检查备注',multiline:true,">
</div>
<div style="margin-bottom:5px;">
<label style='display:inline-block;'>开始派发时间</label>
<input id="start_time" editable="false" name="start_time" class="easyui-datetimebox" style="width:auto"
data-options="currentText:'今天',closeText:'关闭',showSeconds:false" required=true />
</div>
<div style="margin-bottom:10px">
<input id="myschedule" class="easyui-combobox" name="myschedule" style="width:480px" data-options="
label:'策略',
url: 'api/myschedule/?a=listcombobox',
method: 'get',
editable: false,"
required=true>
</div>
<div style="margin-bottom:10px">
<input id="expire" name="expire" type="text" class="easyui-numberbox" value="8" data-options="label:'有效期(小时)'"/>
</div>
<!-- <div style="margin-bottom:5px">
<label style='display:inline-block;'>定时配置</label>
<span style="font-weight:bold">每隔</span>
<input id="setnumber" name="setnumber" type="text" class="easyui-numberbox" value="1" data-options="min:1,max:31"/>
<select id="unit" class="easyui-combobox" style="width:80px">
<option value="seconds"></option>
<option value="hours">小时</option>
<option value="days"></option>
<option value="weeks"></option>
<option value="months"></option>
<option value="years"></option>
</select>
</div> -->
</form>
</div>
<script>
var girdtasksetid = {{id}}
$.get('api/gridtaskset?a=detail&id='+girdtasksetid,function(res){
var data = res.data
$('#gridlevel').combobox('setValue', data.gridlevel__dickeyid)
$('#username').textbox('setValue',data.user__name)
$('#user').val(data.user__userid)
$('#note').textbox('setValue',data.note)
$('#myschedule').combobox('setValue',data.myschedule__id)
$('#start_time').datetimebox('setValue', data.periodictask__start_time)
// if(data.schedule.hasOwnProperty('interval')){
// var interval = data.schedule.interval.split(',')
// $('#setnumber').numberbox('setValue', interval[0])
// $('#unit').val(interval[1])
// }
})
function choseuser() {
var myh = screen.availHeight * 0.5;
$('#userdd').dialog({
maximizable: true,
title: '选择人员',
width: 700,
height: myh,
closed: false,
cache: false,
href: 'getuserf?a=user',
modal: true,
border:false,
});
$('#userdd').window('center');
}
function aaa(x) {
if (x == "user") {
$('#user').attr('value', top.$('#in').val());
$('#username').textbox('setValue', top.$('#in').attr('show'));
}
}
function submitform() {
var data = $('#gridtasksetff').serializeJSON();
data['id']=girdtasksetid
// var mm = $('#setnumber').numberbox('getValue')+','+$('#unit').val()
// data['schedule'] = {'interval':mm}
$.messager.confirm('提示', '确定修改吗?', function (r) {
if (r) {
$.ajax({
type: "POST",
url: 'api/gridtaskset/?a=edit',
data: JSON.stringify(data),
datatype: "json",
processData: false,
contentType: "application/json;charset=utf-8",
beforeSend: function () {
var bo = $('#gridtasksetff').form('validate')
if (bo == false) {
return bo
} else {
$('#submitb').linkbutton('disable');
}
},
success: function (data) {
if (data.code == 1) {
$("#girdtasksettable").datagrid('reload');
$("#dd").dialog("close");
} else { $.messager.alert('提示', '失败!'); }
$('#submitb').linkbutton('enable');
},
});
}
});
}
</script>
</div>

View File

@ -127,6 +127,10 @@ urlpatterns = [
path('html/checkdetail/<int:id>/',views.checkdetail),#任务分配详情
#html页面
# 任务策略配置
path('html/scheduleset/', views.scheduleset),
path('html/scheduleset/add/', views.schedulesetadd),
path('html/scheduleset/edit/<int:id>/',views.schedulesetedit),
path('getuser', views.getuser),
path('addyh', views.addyh),
@ -198,6 +202,7 @@ urlpatterns = [
path('api/equipmentcheckform/<int:pk>',viewsdrf.EquipmentCheckFormDetailView.as_view()),
path('api/equipmentcheckform',viewsdrf.EquipmentCheckFormAPIView.as_view()),
path('api/gridtaskset/',views.apigridtaskset),
path('api/myschedule/',views.apimyschedule),
path('api/examtestrate',views.apiexamtestrate),

View File

@ -216,6 +216,15 @@ def gridtasksetadd(req, riskact):
def gridtasksetedit(req, id):
return render(req, 'gridtasksetedit.html', {'id': id})
def scheduleset(req):
return render(req, 'scheduleset.html')
def schedulesetadd(req):
return render(req, 'schedulesetadd.html')
def schedulesetedit(req, id):
return render(req, 'schedulesetedit.html', {'id': id})
def inspect(req):
return render(req, 'inspect.html')
@ -7059,6 +7068,41 @@ def apiriskact(req):
riskact=obj, taskadd=tasktime, taskexpire=tasktime + timedelta(days=7), istask=1)
return JsonResponse({"code": 1})
def apimyschedule(req):
a = req.GET.get('a')
userid = req.session['userid']
companyid = getcompany(userid)
if a == 'listcombobox':
objs = MySchedule.objects.filter(usecomp__partid=companyid,deletemark=1)
objsdata = objs.values('id','name')
keystr = transstr(objsdata, 'id', 'name')
return HttpResponse(keystr, content_type="application/json")
elif a == 'listall':
objs = MySchedule.objects.filter(usecomp__partid=companyid, deletemark=1)
total = objs.count()
startnum, endnum = fenye(req)
objdata = objs.order_by('-pk')[startnum:endnum].values('id', 'name')
return HttpResponse(transjson(total, objdata), content_type="application/json")
elif a == 'add':
data = json.loads(req.body.decode('utf-8'))
print(data)
if data['set'] == 'interval':
iobj = IntervalSchedule()
iobj.every = data['every']
iobj.period = data['period']
iobj.save()
MySchedule.objects.create(name=data['name'], typeset=data['set'], interval=iobj, usecomp=Partment.objects.get(partid=companyid))
elif data['set'] == 'crontab':
iobj = CrontabSchedule()
iobj.minute = data['minute']
iobj.hour = data['hour']
iobj.day_of_week = data['day_of_week']
iobj.day_of_month = data['day_of_month']
iobj.month_of_year = data['month_of_year']
iobj.timezone = 'Asia/Shanghai'
iobj.save()
MySchedule.objects.create(name=data['name'], typeset=data['set'], crontab=iobj, usecomp=Partment.objects.get(partid=companyid))
return JsonResponse({'code': 1})
def apigridtaskset(req):
a = req.GET.get('a')
userid = req.session['userid']
@ -7070,30 +7114,42 @@ def apigridtaskset(req):
total = objs.count()
startnum, endnum = fenye(req)
objs = objs.order_by('-pk')[startnum:endnum].values('id', 'gridlevel__dickeyname', 'user__name',
'schedule', 'note', 'start_task', 'is_paused', 'count')
'myschedule__name', 'note', 'periodictask__enabled','periodictask__start_time','periodictask__last_run_at','periodictask__total_run_count')
return HttpResponse(transjson(total, objs), content_type="application/json")
elif a == 'add':
data = json.loads(req.body.decode('utf-8'))
obj = GridTaskSet()
obj.riskact = RiskAct.objects.get(id=data['riskact'])
obj.user = User.objects.get(userid=data['user'])
obj.gridlevel = Dickey.objects.get(dickeyid=data['gridlevel'])
obj.note = data['note'] if 'note' in data and data['note'] else None
obj.start_task = data['start_task']
obj.schedule = data['schedule']
obj.is_paused = False
obj.save()
if 'myschedule' in data and data['myschedule']:
schobj = MySchedule.objects.get(id=data['myschedule'])
pobj = PeriodicTask()
pobj.name = 'gridtask_' + time.strftime('%Y%m%d%H%M%S')
pobj.task = 'safesite.tasks.sendGridtask2'
pobj.interval = schobj.interval if schobj.interval else None
pobj.crontab = schobj.crontab if schobj.crontab else None
pobj.start_time = data['start_time'] if ('start_time' in data and data['start_time']) else None
pobj.save()
obj = GridTaskSet()
obj.riskact = RiskAct.objects.get(id=data['riskact'])
obj.user = User.objects.get(userid=data['user'])
obj.gridlevel = Dickey.objects.get(dickeyid=data['gridlevel'])
obj.note = data['note'] if 'note' in data and data['note'] else None
obj.expire = data['expire'] if 'expire' in data and data['expire'] else None
obj.periodictask = pobj
obj.myschedule = schobj
obj.save()
pobj.kwargs=json.dumps({'gridtaskset':obj.id})
pobj.save()
return JsonResponse({'code': 1})
elif a == 'detail':
objs = GridTaskSet.objects.filter(id=req.GET.get('id'))
objdata = objs.values('id', 'gridlevel__dickeyname', 'user__name','user__userid','gridlevel__dickeyid',
'schedule', 'note', 'start_task', 'is_paused', 'count')[0]
objdata = objs.values('id', 'gridlevel__dickeyname', 'user__name','user__userid','gridlevel__dickeyid','myschedule__id',
'myschedule__name', 'note', 'periodictask__start_time')[0]
xx = {'code':1, 'data':objdata}
return HttpResponse(json.dumps(xx, cls=MyEncoder), content_type="application/json")
elif a == 'del':
id = req.GET.get('id')
obj = GridTaskSet.objects.get(id=id)
obj.delete()
obj.periodictask.delete()
return JsonResponse({"code": 1})
elif a == 'edit':
data = json.loads(req.body.decode('utf-8'))
@ -7101,19 +7157,27 @@ def apigridtaskset(req):
obj.user = User.objects.get(userid=data['user'])
obj.gridlevel = Dickey.objects.get(dickeyid=data['gridlevel'])
obj.note = data['note'] if 'note' in data and data['note'] else None
obj.start_task = data['start_task']
obj.schedule = data['schedule']
obj.expire = data['expire'] if 'expire' in data and data['expire'] else None
pobj = obj.periodictask
if 'myschedule' in data and data['myschedule']:
schobj = MySchedule.objects.get(id=data['myschedule'])
pobj.interval = schobj.interval if schobj.interval else None
pobj.crontab = schobj.crontab if schobj.crontab else None
pobj.start_time = data['start_time'] if ('start_time' in data and data['start_time']) else None
pobj.save()
obj.myschedule = schobj
obj.save()
# from .tasks import shifttime
# print(shifttime(10, 'seconds', datetime.now()))
return JsonResponse({'code': 1})
elif a == 'toggle':
obj = GridTaskSet.objects.get(id=req.GET.get('id'))
if obj.is_paused:
obj.is_paused = False
if obj.periodictask.enabled:
obj.periodictask.enabled = False
obj.periodictask.save()
else:
obj.is_paused = True
obj.save()
obj.periodictask.enabled = True
obj.periodictask.save()
return JsonResponse({'code': 1})
def apirisk(req):