# 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 class Task(BaseEntity): name = models.CharField(verbose_name='任务名称', max_length=32) desc = models.CharField(verbose_name='任务描述', max_length=32) def __str__(self): return self.desc class Meta: verbose_name = '任务' verbose_name_plural = verbose_name ordering = ('name',) class TaskJob(BaseEntity): """ trigger:    'date'、'interval'、'cron'。 id:   任务的名字,不传的话会自动生成。不过为了之后对任务进行暂停、开启、删除等操作,建议给一个名字。并且是唯一的,如果多个任务取一个名字,之前的任务就会被覆盖。 args:   list 执行代码所需要的参数。 replace_existing:   默认不设置的话回导致重启项目后, 爆id已存在的错误, 设置此参数后会对已有的 id 进行覆盖从而避免报错 next_run_time:  datetime 开始执行时间 misfire_grace_time:   强制执行结束的时间, 为避免撞车导致任务丢失, 没执行完就别执行了 """ 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, editable=False, help_text='不设置此项重启项目后会报任务id已存在的错误, 设置此参数后会对已有的任务进行覆盖') 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, 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, editable=False, help_text='增强时间随机性') args = models.CharField(verbose_name='任务参数', help_text='执行代码所需要的参数。默认不需要填写,有需要填写参数的任务会特别说明', max_length=128, null=True, blank=True) def __str__(self): return self.task.name class Meta: verbose_name = '计划任务' verbose_name_plural = verbose_name class Notify(BaseEntity): """ corpid=企业ID,在管理后台获取 corpsecret: 自建应用的Secret,每个自建应用里都有单独的secret agentid: 应用ID,在后台应用中获取 touser: 接收者用户名(微信账号), 多个用户用 | 分割, 与发送消息的touser至少存在一个 """ name = models.CharField(verbose_name='通知方式', choices=PushConfig.choices, default=PushConfig.wechat_work_push, max_length=64) enable = models.BooleanField(verbose_name='开启通知', default=True, help_text='只有开启才能发送哦!') corpid = models.CharField(verbose_name='企业ID', max_length=64, help_text='微信企业ID', null=True, blank=True) corpsecret = models.CharField(verbose_name='Secret', max_length=64, help_text='应用的Secret/Token', null=True, blank=True) agentid = models.CharField(verbose_name='应用ID', max_length=64, help_text='APP ID', null=True, blank=True) 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='IYuu与BARK请必填,详情参考教程!') class Meta: verbose_name = '通知推送' verbose_name_plural = verbose_name class OCR(BaseEntity): """ corpid=企业ID,在管理后台获取 corpsecret: 自建应用的Secret,每个自建应用里都有单独的secret agentid: 应用ID,在后台应用中获取 app_id = '2695' api_key = 'TUoKvq3w1d' secret_key = 'XojLDC9s5qc' """ name = models.CharField(verbose_name='OCR', choices=OCRConfig.choices, default=OCRConfig.baidu_aip, max_length=64) enable = models.BooleanField(verbose_name='启用', default=False) api_key = models.CharField(verbose_name='API-Key', max_length=64, null=True, blank=True) secret_key = models.CharField(verbose_name='Secret', max_length=64, help_text='应用的Secret', null=True, blank=True) app_id = models.CharField(verbose_name='应用ID', max_length=64, help_text='APP ID', null=True, blank=True) def __str__(self): return self.name class Meta: verbose_name = 'OCR识别' verbose_name_plural = verbose_name