diff --git a/auto_pt/admin.py b/auto_pt/admin.py index 6473f39..5872ad7 100644 --- a/auto_pt/admin.py +++ b/auto_pt/admin.py @@ -27,7 +27,7 @@ class TaskAdmin(admin.ModelAdmin): # instead of ModelAdmin ) # list_display_links = None search_fields = ('name',) - readonly_fields = ('name',) + readonly_fields = ('name', 'desc') def get_queryset(self, request): # print(self.kwargs['username']) @@ -45,8 +45,8 @@ class TaskAdmin(admin.ModelAdmin): # instead of ModelAdmin return False # 禁止修改按钮 - # def has_change_permission(self, request, obj=None): - # return False + def has_change_permission(self, request, obj=None): + return False @admin.register(TaskJob) @@ -68,16 +68,15 @@ class TaskJobAdmin(admin.ModelAdmin): # instead of ModelAdmin def save_model(self, request, obj: TaskJob, form, change): # 从字符串获取function func = getattr(tasks, obj.task.name) - # 检查任务是否存在,已存在就删除任务 + # 检查任务是否存在,存在且job_id和任务名称不一致,则删除任务 exist_job = scheduler.get_job(obj.job_id) + if exist_job and obj.job_id != obj.name: + exist_job.remove() + exist_job = None + obj.job_id = obj.name logger.info('当前任务:{} | {}'.format(obj.job_id, exist_job)) try: - if not obj.task_exec: - logger.info(obj.job_id + '任务未开启!') - super().save_model(request, obj, form, change) - # else: # 添加任务 - if obj.trigger == Trigger.cron: if exist_job: logger.info(obj.job_id + '任务已存在,修改中!') diff --git a/auto_pt/migrations/0003_taskjob_name_alter_taskjob_args_and_more.py b/auto_pt/migrations/0003_taskjob_name_alter_taskjob_args_and_more.py new file mode 100644 index 0000000..f407c80 --- /dev/null +++ b/auto_pt/migrations/0003_taskjob_name_alter_taskjob_args_and_more.py @@ -0,0 +1,55 @@ +# Generated by Django 4.1.2 on 2022-11-24 19:01 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('auto_pt', '0002_alter_notify_name_alter_taskjob_expression_time_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='taskjob', + name='name', + field=models.CharField(default='', help_text='任务名称具有唯一性,修改任务时不要修改此项,如果确实需要修改此项,请删除后重新添加', max_length=16, verbose_name='任务名称'), + preserve_default=False, + ), + migrations.AlterField( + model_name='taskjob', + name='args', + field=models.CharField(blank=True, help_text='执行代码所需要的参数。默认不需要填写,有需要填写参数的任务会特别说明', max_length=128, null=True, verbose_name='任务参数'), + ), + migrations.AlterField( + model_name='taskjob', + name='end_date', + field=models.DateTimeField(blank=True, editable=False, null=True, verbose_name='任务结束时间'), + ), + migrations.AlterField( + model_name='taskjob', + name='jitter', + field=models.IntegerField(default=1200, editable=False, help_text='增强时间随机性', verbose_name='时间浮动参数'), + ), + migrations.AlterField( + model_name='taskjob', + name='job_id', + field=models.CharField(editable=False, help_text='任务名称具有唯一性,修改任务时不要修改此项,如果确实需要修改此项,请删除后重新添加', max_length=16, unique=True, verbose_name='任务id'), + ), + migrations.AlterField( + model_name='taskjob', + name='misfire_grace_time', + field=models.IntegerField(default=600, editable=False, help_text='强制执行结束的时间, 为避免撞车导致任务丢失, 没执行完就别执行了', verbose_name='任务运行时间'), + ), + migrations.AlterField( + model_name='taskjob', + name='start_date', + field=models.DateTimeField(blank=True, editable=False, null=True, verbose_name='任务开始时间'), + ), + migrations.AlterField( + model_name='taskjob', + name='task', + field=models.ForeignKey(help_text='在这里选择你要执行的任务', on_delete=django.db.models.deletion.CASCADE, to='auto_pt.task', verbose_name='选择任务'), + ), + ] diff --git a/auto_pt/migrations/0004_alter_taskjob_job_id_alter_taskjob_name.py b/auto_pt/migrations/0004_alter_taskjob_job_id_alter_taskjob_name.py new file mode 100644 index 0000000..d9182ea --- /dev/null +++ b/auto_pt/migrations/0004_alter_taskjob_job_id_alter_taskjob_name.py @@ -0,0 +1,23 @@ +# Generated by Django 4.1.2 on 2022-11-24 19:12 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('auto_pt', '0003_taskjob_name_alter_taskjob_args_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='taskjob', + name='job_id', + field=models.CharField(editable=False, max_length=16, unique=True, verbose_name='任务id'), + ), + migrations.AlterField( + model_name='taskjob', + name='name', + field=models.CharField(help_text='你对任务的描述,此项具有唯一性', max_length=16, verbose_name='任务名称'), + ), + ] diff --git a/auto_pt/models.py b/auto_pt/models.py index a420dec..12ee198 100644 --- a/auto_pt/models.py +++ b/auto_pt/models.py @@ -1,5 +1,7 @@ # Create your models here. from django.db import models +from django.db.models.signals import pre_save, post_save +from django.dispatch import receiver from ptools.base import BaseEntity, Trigger, PushConfig, OCRConfig @@ -26,8 +28,11 @@ class TaskJob(BaseEntity): next_run_time:  datetime 开始执行时间 misfire_grace_time:   强制执行结束的时间, 为避免撞车导致任务丢失, 没执行完就别执行了 """ - task = models.ForeignKey(verbose_name='任务名称', to=Task, on_delete=models.CASCADE) - job_id = models.CharField(verbose_name='任务ID', max_length=16, unique=True) + task = models.ForeignKey(verbose_name='选择任务', to=Task, on_delete=models.CASCADE, + help_text='在这里选择你要执行的任务') + name = models.CharField(verbose_name='任务名称', max_length=16, + help_text='你对任务的描述,此项具有唯一性') + job_id = models.CharField(verbose_name='任务id', max_length=16, unique=True, editable=False) trigger = models.CharField(verbose_name='任务类型', choices=Trigger.choices, default=Trigger.cron, max_length=64) task_exec = models.BooleanField(verbose_name='开启任务', default=True) replace_existing = models.BooleanField(verbose_name='覆盖任务', default=True, @@ -35,14 +40,14 @@ class TaskJob(BaseEntity): expression_time = models.CharField(verbose_name='时间表达式', help_text='在间隔任务表示间隔时长使用数字,单位:秒,corn任务中为五位corn表达式:“15 8 * * 2022”', max_length=64) - start_date = models.DateTimeField(verbose_name='任务开始时间', null=True, blank=True) - end_date = models.DateTimeField(verbose_name='任务结束时间', null=True, blank=True) - misfire_grace_time = models.IntegerField(verbose_name='任务运行时间', default=600, + start_date = models.DateTimeField(verbose_name='任务开始时间', null=True, blank=True, editable=False) + end_date = models.DateTimeField(verbose_name='任务结束时间', null=True, blank=True, editable=False) + misfire_grace_time = models.IntegerField(verbose_name='任务运行时间', default=600, editable=False, help_text='强制执行结束的时间, 为避免撞车导致任务丢失, 没执行完就别执行了') - jitter = models.IntegerField(verbose_name='时间浮动参数', default=1200, + jitter = models.IntegerField(verbose_name='时间浮动参数', default=1200, editable=False, help_text='增强时间随机性') args = models.CharField(verbose_name='任务参数', - help_text='执行代码所需要的参数。', + help_text='执行代码所需要的参数。默认不需要填写,有需要填写参数的任务会特别说明', max_length=128, null=True, blank=True) def __str__(self): @@ -73,7 +78,8 @@ class Notify(BaseEntity): touser = models.CharField(verbose_name='接收者', max_length=64, help_text='接收者用户名/UID', null=True, blank=True) - custom_server = models.URLField(verbose_name='自定义服务器', null=True, blank=True, help_text='无自定义服务器的,请勿填写!') + custom_server = models.URLField(verbose_name='自定义服务器', null=True, blank=True, + help_text='无自定义服务器的,请勿填写!') class Meta: verbose_name = '通知推送'