Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

don't override rule params with start's params #232

Open
wants to merge 1 commit into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
108 changes: 2 additions & 106 deletions schedule/models/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,26 +21,6 @@
from schedule.utils import OccurrenceReplacer
from schedule.utils import get_model_bases

freq_dict_order = {
'YEARLY': 0,
'MONTHLY': 1,
'WEEKLY': 2,
'DAILY': 3,
'HOURLY': 4,
'MINUTELY': 5,
'SECONDLY': 6
}
param_dict_order = {
'byyearday': 1,
'bymonth': 1,
'bymonthday': 2,
'byweekno': 2,
'byweekday': 3,
'byhour': 4,
'byminute': 5,
'bysecond': 6
}


class EventManager(models.Manager):
def get_for_object(self, content_object, distinction=None, inherit=True):
Expand Down Expand Up @@ -150,18 +130,14 @@ def get_occurrences(self, start, end):

def get_rrule_object(self, tzinfo):
if self.rule is not None:
params, empty = self._event_params()
params = self.rule.get_params()
frequency = self.rule.rrule_frequency()
if timezone.is_naive(self.start):
dtstart = self.start
else:
dtstart = tzinfo.normalize(self.start).replace(tzinfo=None)

if not empty:
return rrule.rrule(frequency, dtstart=dtstart, **params)
else:
year = self.start.year - 1
return rrule.rrule(frequency, dtstart=dtstart, until=self.start.replace(year=year))
return rrule.rrule(frequency, dtstart=dtstart, **params)

def _create_occurrence(self, start, end=None):
if end is None:
Expand Down Expand Up @@ -280,86 +256,6 @@ def occurrences_after(self, after=None, max_occurences=None):
yield trickies.pop(0)
yield occ_replacer.get_occurrence(nxt)

@property
def event_start_params(self):
start = self.start
params = {
'byyearday': start.timetuple().tm_yday,
'bymonth': start.month,
'bymonthday': start.day,
'byweekno': start.isocalendar()[1],
'byweekday': start.weekday(),
'byhour': start.hour,
'byminute': start.minute,
'bysecond': start.second
}
return params

@property
def event_rule_params(self):
return self.rule.get_params()

def _event_params(self):
freq_order = freq_dict_order[self.rule.frequency]
rule_params = self.event_rule_params
start_params = self.event_start_params
empty = False

event_params = {}

for param in rule_params:
# start date influences rule params
if (param in param_dict_order and param_dict_order[param] > freq_order and
param in start_params):
sp = start_params[param]
if sp == rule_params[param] or sp in rule_params[param]:
event_params[param] = [sp]
else:
event_params = {'count': 0}
empty = True
break
else:
event_params[param] = rule_params[param]
return event_params, empty

@property
def event_params(self):
event_params, empty = self._event_params()
start = self.effective_start
if not start:
empty = True
elif self.end_recurring_period and start > self.end_recurring_period:
empty = True
return event_params, empty

@property
def effective_start(self):
if self.pk and self.end_recurring_period:
occ_generator = self._occurrences_after_generator(self.start)
try:
return next(occ_generator).start
except StopIteration:
pass
elif self.pk:
return self.start
return None

@property
def effective_end(self):
if self.pk and self.end_recurring_period:
params, empty = self.event_params
if empty or not self.effective_start:
return None
elif self.end_recurring_period:
occ = None
occ_generator = self._occurrences_after_generator(self.start)
for occ in occ_generator:
pass
return occ.end
elif self.pk:
return datetime.max
return None


class EventRelationManager(models.Manager):
'''
Expand Down
16 changes: 16 additions & 0 deletions tests/test_event.py
Original file line number Diff line number Diff line change
Expand Up @@ -468,6 +468,22 @@ def test_recurring_event_get_occurrence_different_end_timezone(self):
)
self.assertEqual(occurrences[-1].end, end_recurring)

def test_recurring_event_get_occurrences_multiple_byweekdays(self):
# weekly, every Friday and Saturday, for two weeks
event = self.__create_recurring_event(
'Recurring event with multiple byweekdays in rule params',
datetime.datetime(2016, 7, 29, 10, 0, tzinfo=pytz.utc),
datetime.datetime(2016, 7, 29, 11, 0, tzinfo=pytz.utc),
datetime.datetime(2016, 8, 6, 11, 0, tzinfo=pytz.utc),
Rule.objects.create(frequency="WEEKLY", params='byweekday:4,5'),
Calendar.objects.create(name='MyCal'),
)

occurrences = event.get_occurrences(
datetime.datetime(2016, 1, 1, 0, 0, tzinfo=pytz.utc),
datetime.datetime(2016, 12, 31, 23, 59, tzinfo=pytz.utc),
)
self.assertEqual(len(occurrences), 4)

def test_(self):
pass
Expand Down