def schedule(self, dt, func, interval=0, repeat=0, *args, **kwargs): """ Add the job to the scheduler for the specified time, interval, and number of repeats. Repeat of None with a specified interval means the job will repeat forever at that interval. """ if not isinstance(dt, datetime): raise ValueError("Time argument must be a datetime object.") if not interval and repeat != 0: raise ValueError( "Must specify an interval if the task is repeating") if dt.tzinfo is None: raise ValueError( "Must use a timezone aware datetime object for scheduling tasks" ) if isinstance(func, Job): job = func # else, turn it into a job first. else: job = Job(func, *args, **kwargs) job.state = State.SCHEDULED with self.session_scope() as session: scheduled_job = ScheduledJob( id=job.job_id, queue=self.queue.name, interval=interval, repeat=repeat, scheduled_time=naive_utc_datetime(dt), obj=job, ) session.merge(scheduled_job) return job.job_id
def test_schedule_a_function_sets_time(self, scheduler): now = local_now() job_id = scheduler.schedule(now, id) with scheduler.session_scope() as session: scheduled_job = (scheduler._ns_query(session).filter_by( id=job_id).one_or_none()) scheduled_time = scheduled_job.scheduled_time assert scheduled_time == naive_utc_datetime(now)
def test_scheduled_repeating_function_sets_new_job_at_interval(self, scheduler): now = local_now() scheduler.schedule(now, id, interval=1000, repeat=1) scheduler._now = lambda: now scheduler.check_schedule() with scheduler.session_scope() as session: scheduled_job = scheduler._ns_query(session).one_or_none() scheduled_time = scheduled_job.scheduled_time assert scheduled_time == naive_utc_datetime(now) + datetime.timedelta( seconds=1000 )
def test_enqueue_in_a_function_sets_time(self, scheduler): diff = datetime.timedelta(seconds=1000) now = local_now() scheduler._now = lambda: now job_id = scheduler.enqueue_in(diff, id) with scheduler.session_scope() as session: scheduled_job = (scheduler._ns_query(session).filter_by( id=job_id).one_or_none()) scheduled_time = scheduled_job.scheduled_time assert scheduled_time == naive_utc_datetime(now) + diff
def change_execution_time(self, job, date_time): """ Change a job's execution time. """ if date_time.tzinfo is None: raise ValueError( "Must use a timezone aware datetime object for scheduling tasks" ) with self.session_scope() as session: scheduled_job = (session.query(ScheduledJob).filter_by( id=job.job_id).one_or_none()) if scheduled_job: scheduled_job.scheduled_time = naive_utc_datetime(date_time) session.merge(scheduled_job) else: raise ValueError("Job not in scheduled jobs queue")