#!/usr/bin/python3 # -*- coding: utf-8 -*- # Author: İsmail BAŞARAN from base.scheduler.custom.all_match import AllMatch from base.Scope import Scope class ScheduleTaskJob(object): def __init__(self, task): self.task = task cron_sj = self.parse_cron_str(task.cron_str) if cron_sj: self.mins = self.conv_to_set(cron_sj[0]) self.hours= self.conv_to_set(cron_sj[1]) self.days = self.conv_to_set(cron_sj[2]) self.months = self.conv_to_set(cron_sj[3]) self.dow = self.conv_to_set(cron_sj[4]) self.action = self.processTask scope = Scope.getInstance() self.logger = scope.getLogger() self.task_manager = scope.getTaskManager() def processTask(self): try: self.task_manager.addTask(self.task) if self.is_single_shot(): Scope.getInstance().get_scheduler().remove_job(self.task) except Exception as e: self.logger.error(e) def parse_cron_str(self, cron_str): try: cron_exp_arr = cron_str.split(" ") cron_sj = [] count = 0 for exp in cron_exp_arr: if exp.isdigit(): cron_sj.append(exp) elif '*' == exp: cron_sj.append(AllMatch()) elif '/' in exp: range_val = int(exp.split("/")[1]) if count == 0: cron_sj.append(range(0, 60, range_val)) elif count == 1: cron_sj.append(range(0, 24, range_val)) elif count == 2: cron_sj.append(range(0, 7, range_val)) elif count == 3: cron_sj.append(range(0, 12, range_val)) elif count == 3: cron_sj.append(range(0, 7, range_val)) else: print("it is not supported") elif ',' in exp: cron_sj.append("(" + str(exp) + ")") else: print("it is not supported") count = count + 1 return cron_sj except Exception as e: self.logger.error(str(e)) def conv_to_set(obj): if isinstance(obj, (int)): return set([obj]) if not isinstance(obj, set): obj = set(obj) return obj def is_single_shot(self): if '*' in self.task.cron_str: return True else: return False def matchtime(self, t): """Return True if this event should trigger at the specified datetime""" return ((t.minute in self.mins) and (t.hour in self.hours) and (t.day in self.days) and (t.month in self.months) and (t.weekday() in self.dow)) def check(self, t): if self.matchtime(t): self.action(*self.args, **self.kwargs)