A 任务计划添加Corn触发器支持

pull/103/head
vapao 2020-05-15 14:37:42 +08:00
parent 9045235e41
commit 9aa904c753
3 changed files with 45 additions and 1 deletions

View File

@ -40,6 +40,8 @@ class Task(models.Model, ModelMixin):
tmp = super().to_dict(*args, **kwargs) tmp = super().to_dict(*args, **kwargs)
tmp['targets'] = json.loads(self.targets) tmp['targets'] = json.loads(self.targets)
tmp['latest_status_alias'] = self.get_latest_status_display() tmp['latest_status_alias'] = self.get_latest_status_display()
if self.trigger == 'cron':
tmp['trigger_args'] = json.loads(self.trigger_args)
return tmp return tmp
def __repr__(self): def __repr__(self):

View File

@ -4,6 +4,7 @@
from apscheduler.schedulers.background import BackgroundScheduler from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.interval import IntervalTrigger from apscheduler.triggers.interval import IntervalTrigger
from apscheduler.triggers.date import DateTrigger from apscheduler.triggers.date import DateTrigger
from apscheduler.triggers.cron import CronTrigger
from apscheduler.events import EVENT_SCHEDULER_SHUTDOWN, EVENT_JOB_MAX_INSTANCES, EVENT_JOB_ERROR, EVENT_JOB_EXECUTED from apscheduler.events import EVENT_SCHEDULER_SHUTDOWN, EVENT_JOB_MAX_INSTANCES, EVENT_JOB_ERROR, EVENT_JOB_EXECUTED
from django_redis import get_redis_connection from django_redis import get_redis_connection
from django.utils.functional import SimpleLazyObject from django.utils.functional import SimpleLazyObject
@ -37,6 +38,11 @@ class Scheduler:
return IntervalTrigger(seconds=int(trigger_args), timezone=cls.timezone) return IntervalTrigger(seconds=int(trigger_args), timezone=cls.timezone)
elif trigger == 'date': elif trigger == 'date':
return DateTrigger(run_date=trigger_args, timezone=cls.timezone) return DateTrigger(run_date=trigger_args, timezone=cls.timezone)
elif trigger == 'cron':
args = json.loads(trigger_args) if not isinstance(trigger_args, dict) else trigger_args
minute, hour, day, month, week = args['rule'].split()
return CronTrigger(minute=minute, hour=hour, day=day, month=month, week=week, start_date=args['start'],
end_date=args['stop'])
else: else:
raise TypeError(f'unknown schedule policy: {trigger!r}') raise TypeError(f'unknown schedule policy: {trigger!r}')

View File

@ -13,6 +13,7 @@ import store from './store';
import hostStore from '../host/store'; import hostStore from '../host/store';
import styles from './index.module.css'; import styles from './index.module.css';
import moment from 'moment'; import moment from 'moment';
import lds from 'lodash';
@observer @observer
class ComForm extends React.Component { class ComForm extends React.Component {
@ -39,6 +40,13 @@ class ComForm extends React.Component {
switch (trigger) { switch (trigger) {
case 'date': case 'date':
return this.state.args['date'].format('YYYY-MM-DD HH:mm:ss'); return this.state.args['date'].format('YYYY-MM-DD HH:mm:ss');
case 'cron':
const {rule, start, stop} = this.state.args['cron'];
return JSON.stringify({
rule,
start: start ? start.format('YYYY-MM-DD HH:mm:ss') : null,
stop: stop ? stop.format('YYYY-MM-DD HH:mm:ss') : null
});
default: default:
return this.state.args[trigger]; return this.state.args[trigger];
} }
@ -89,6 +97,12 @@ class ComForm extends React.Component {
this.setState({args}) this.setState({args})
}; };
handleCronArgs = (key, value) => {
let args = this.state.args['cron'] || {};
args = Object.assign(args, {[key]: value});
this.setState({args: Object.assign(this.state.args, {cron: args})})
};
verifyButtonStatus = () => { verifyButtonStatus = () => {
const data = this.props.form.getFieldsValue(); const data = this.props.form.getFieldsValue();
let b1 = data['type'] && data['name'] && this.state.command; let b1 = data['type'] && data['name'] && this.state.command;
@ -210,7 +224,29 @@ class ComForm extends React.Component {
onChange={v => this.handleArgs('date', v)}/> onChange={v => this.handleArgs('date', v)}/>
</Form.Item> </Form.Item>
</Tabs.TabPane> </Tabs.TabPane>
<Tabs.TabPane disabled tab="UNIX Cron" key="cron"> <Tabs.TabPane tab="UNIX Cron" key="cron">
<Form.Item required label="执行规则" help="兼容Cron风格可参考官方例子">
<Input
value={lds.get(args, 'cron.rule')}
placeholder="例如每天凌晨1点执行0 1 * * *"
onChange={e => this.handleCronArgs('rule', e.target.value)}/>
</Form.Item>
<Form.Item label="生效时间" help="定义的执行规则在到达该时间后生效">
<DatePicker
showTime
style={{width: '100%'}}
placeholder="可选输入"
value={lds.get(args, 'cron.start') ? moment(args['cron']['start']) : undefined}
onChange={v => this.handleCronArgs('start', v)}/>
</Form.Item>
<Form.Item label="结束时间" help="执行规则在到达该时间后不再执行">
<DatePicker
showTime
style={{width: '100%'}}
placeholder="可选输入"
value={lds.get(args, 'cron.stop') ? moment(args['cron']['stop']) : undefined}
onChange={v => this.handleCronArgs('stop', v)}/>
</Form.Item>
</Tabs.TabPane> </Tabs.TabPane>
<Tabs.TabPane disabled tab="日历间隔" key="calendarinterval"> <Tabs.TabPane disabled tab="日历间隔" key="calendarinterval">
</Tabs.TabPane> </Tabs.TabPane>