diff --git a/celerybeat.pid b/celerybeat.pid index ec65132f..ed638e47 100644 --- a/celerybeat.pid +++ b/celerybeat.pid @@ -1 +1 @@ -2664 +11768 diff --git a/mysite/celery.py b/mysite/celery.py index 922ff46c..b6d72001 100644 --- a/mysite/celery.py +++ b/mysite/celery.py @@ -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), diff --git a/mysite/settings.py b/mysite/settings.py index 44417c50..231f44f3 100644 --- a/mysite/settings.py +++ b/mysite/settings.py @@ -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 diff --git a/safesite/admin.py b/safesite/admin.py index 8f8beaad..5eee4138 100644 --- a/safesite/admin.py +++ b/safesite/admin.py @@ -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') diff --git a/safesite/migrations/0351_auto_20200908_1119.py b/safesite/migrations/0351_auto_20200908_1119.py new file mode 100644 index 00000000..7004ccec --- /dev/null +++ b/safesite/migrations/0351_auto_20200908_1119.py @@ -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')), + ], + ), + ] diff --git a/safesite/migrations/0352_auto_20200908_1151.py b/safesite/migrations/0352_auto_20200908_1151.py new file mode 100644 index 00000000..4117e4de --- /dev/null +++ b/safesite/migrations/0352_auto_20200908_1151.py @@ -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'), + ), + ] diff --git a/safesite/migrations/0353_auto_20200908_1311.py b/safesite/migrations/0353_auto_20200908_1311.py new file mode 100644 index 00000000..4f38d640 --- /dev/null +++ b/safesite/migrations/0353_auto_20200908_1311.py @@ -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, + ), + ] diff --git a/safesite/migrations/0354_auto_20200908_1407.py b/safesite/migrations/0354_auto_20200908_1407.py new file mode 100644 index 00000000..70cd77db --- /dev/null +++ b/safesite/migrations/0354_auto_20200908_1407.py @@ -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='派发有效期'), + ), + ] diff --git a/safesite/migrations/0355_remove_companyinfo_liaison_fax.py b/safesite/migrations/0355_remove_companyinfo_liaison_fax.py new file mode 100644 index 00000000..f34d9a0f --- /dev/null +++ b/safesite/migrations/0355_remove_companyinfo_liaison_fax.py @@ -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', + # ), + ] diff --git a/safesite/migrations/0356_auto_20200908_1646.py b/safesite/migrations/0356_auto_20200908_1646.py new file mode 100644 index 00000000..e7caf1b2 --- /dev/null +++ b/safesite/migrations/0356_auto_20200908_1646.py @@ -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='类型'), + ), + ] diff --git a/safesite/models.py b/safesite/models.py index 5de05aa7..c500042a 100644 --- a/safesite/models.py +++ b/safesite/models.py @@ -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) diff --git a/safesite/tasks.py b/safesite/tasks.py index b064d58c..dc82a0b1 100644 --- a/safesite/tasks.py +++ b/safesite/tasks.py @@ -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() diff --git a/safesite/templates/gridtaskset.html b/safesite/templates/gridtaskset.html index c0e1b3d6..643d9f05 100644 --- a/safesite/templates/gridtaskset.html +++ b/safesite/templates/gridtaskset.html @@ -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) { diff --git a/safesite/templates/gridtasksetadd.html b/safesite/templates/gridtasksetadd.html index 805c1304..394cd873 100644 --- a/safesite/templates/gridtasksetadd.html +++ b/safesite/templates/gridtasksetadd.html @@ -25,12 +25,23 @@