Skip to content

Commit

Permalink
Implemented __getstate__ and __setstate__ for trigger classes (fixes #…
Browse files Browse the repository at this point in the history
  • Loading branch information
agronholm committed Apr 3, 2016
1 parent ba5e8dd commit 72e75a9
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 0 deletions.
24 changes: 24 additions & 0 deletions apscheduler/triggers/cron/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,30 @@ def get_next_fire_time(self, previous_fire_time, now):
if fieldnum >= 0:
return next_date

def __getstate__(self):
return {
'version': 1,
'timezone': self.timezone,
'start_date': self.start_date,
'end_date': self.end_date,
'fields': self.fields
}

def __setstate__(self, state):
# This is for compatibility with APScheduler 3.0.x
if isinstance(state, tuple):
state = state[1]

if state.get('version', 1) > 1:
raise ValueError(
'Got serialized data for version %s of %s, but only version 1 can be handled' %
(state['version'], self.__class__.__name__))

self.timezone = state['timezone']
self.start_date = state['start_date']
self.end_date = state['end_date']
self.fields = state['fields']

def __str__(self):
options = ["%s='%s'" % (f.name, f) for f in self.fields if not f.is_default]
return 'cron[%s]' % (', '.join(options))
Expand Down
18 changes: 18 additions & 0 deletions apscheduler/triggers/date.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,24 @@ def __init__(self, run_date=None, timezone=None):
def get_next_fire_time(self, previous_fire_time, now):
return self.run_date if previous_fire_time is None else None

def __getstate__(self):
return {
'version': 1,
'run_date': self.run_date
}

def __setstate__(self, state):
# This is for compatibility with APScheduler 3.0.x
if isinstance(state, tuple):
state = state[1]

if state.get('version', 1) > 1:
raise ValueError(
'Got serialized data for version %s of %s, but only version 1 can be handled' %
(state['version'], self.__class__.__name__))

self.run_date = state['run_date']

def __str__(self):
return 'date[%s]' % datetime_repr(self.run_date)

Expand Down
26 changes: 26 additions & 0 deletions apscheduler/triggers/interval.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from datetime import timedelta, datetime
from math import ceil

import six
from tzlocal import get_localzone

from apscheduler.triggers.base import BaseTrigger
Expand Down Expand Up @@ -59,6 +60,31 @@ def get_next_fire_time(self, previous_fire_time, now):
if not self.end_date or next_fire_time <= self.end_date:
return self.timezone.normalize(next_fire_time)

def __getstate__(self):
return {
'version': 1,
'timezone': self.timezone,
'start_date': self.start_date,
'end_date': self.end_date,
'interval': self.interval
}

def __setstate__(self, state):
# This is for compatibility with APScheduler 3.0.x
if isinstance(state, tuple):
state = state[1]

if state.get('version', 1) > 1:
raise ValueError(
'Got serialized data for version %s of %s, but only version 1 can be handled' %
(state['version'], self.__class__.__name__))

self.timezone = state['timezone']
self.start_date = state['start_date']
self.end_date = state['end_date']
self.interval = state['interval']
self.interval_length = timedelta_seconds(self.interval)

def __str__(self):
return 'interval[%s]' % str(self.interval)

Expand Down
6 changes: 6 additions & 0 deletions docs/versionhistory.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,12 @@ Version history
To find out how to migrate your application from a previous version of
APScheduler, see the :doc:`migration section <migration>`.

3.1.1
-----

* Fixed pickling problems with persistent jobs when upgrading from 3.0.x


3.1.0
-----

Expand Down

0 comments on commit 72e75a9

Please sign in to comment.