Skip to content

Commit

Permalink
Merge pull request #96 from tylerneu/release
Browse files Browse the repository at this point in the history
  • Loading branch information
tylerneu authored Jul 24, 2023
2 parents d3f67d7 + 0786fc6 commit 1b8f377
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 40 deletions.
5 changes: 5 additions & 0 deletions ambition_utils/docs/release_notes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@
Release Notes
=============

3.1.7
-----
* RecurrenceForm will no longer refresh the next occurrence if the occurrence is expired.


3.1.6
-----
* Update migrations to point to utils time zone field
Expand Down
7 changes: 4 additions & 3 deletions ambition_utils/rrule/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -250,12 +250,13 @@ def save(self, **kwargs):
Saves the RRule model and returns it
"""
# Keep track if this is an existing rrule that needs occurrence updated
need_to_refresh_next_recurrence = False
need_to_refresh_next_occurrence = False

# Get the rrule model from the cleaned data
rrule_model = self.cleaned_data.get('rrule')
if rrule_model:
need_to_refresh_next_recurrence = True
# Refresh if the next occurrence is not expired.
need_to_refresh_next_occurrence = rrule_model.next_occurrence > datetime.utcnow()
else:
# Use the recurrence passed into save kwargs
rrule_model = kwargs.get('recurrence') or RRule()
Expand All @@ -273,7 +274,7 @@ def save(self, **kwargs):
pass

# Check if this was an existing model that needs to have its next occurrence updated
if need_to_refresh_next_recurrence:
if need_to_refresh_next_occurrence:
rrule_model.refresh_next_occurrence()

rrule_model.save()
Expand Down
79 changes: 43 additions & 36 deletions ambition_utils/rrule/tests/form_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -450,46 +450,53 @@ def test_kwargs_setting(self):

self.assertEqual(rrule_model.occurrence_handler_path, 'ambition_utils.rrule.handler.OccurrenceHandler')

@freeze_time(datetime.datetime(2017, 6, 4))
def test_update_from_id_field(self):
def test_update(self):
"""
Verifies that an existing rrule object will get updated from passing an id in the form data and that
the next recurrence is refreshed
Verifies an existing RRule object will be updated when the id of the RRule object is passed in the form data.
The next occurrence is refreshed when the occurrence is not expired to ensure the next occurrence is not
updated before its handler runs.
"""
data = {
'freq': rrule.DAILY,
'interval': 1,
'dtstart': '6/4/2017',
'byhour': '0',
'time_zone': 'UTC',
'ends': RecurrenceEnds.NEVER,
}
form = RecurrenceForm(data=data)
self.assertTrue(form.is_valid())
rrule_model = form.save(
occurrence_handler_path='ambition_utils.rrule.handler.OccurrenceHandler',
)
self.assertEqual(RRule.objects.count(), 1)
self.assertEqual(rrule_model.next_occurrence, datetime.datetime(2017, 6, 4))
# Create an object, update its next occurrence, and assert it changes.
with freeze_time(datetime.datetime(2017, 6, 4)):
data = {
'freq': rrule.DAILY,
'interval': 1,
'dtstart': '6/4/2017',
'byhour': '0',
'time_zone': 'UTC',
'ends': RecurrenceEnds.NEVER,
}
form = RecurrenceForm(data=data)
self.assertTrue(form.is_valid())
rrule_model = form.save(
occurrence_handler_path='ambition_utils.rrule.handler.OccurrenceHandler',
)
self.assertEqual(RRule.objects.count(), 1)
self.assertEqual(rrule_model.next_occurrence, datetime.datetime(2017, 6, 4))

# Handle overdue and assert next day.
RRule.objects.update_next_occurrences([rrule_model])
self.assertEqual(rrule_model.next_occurrence, datetime.datetime(2017, 6, 5))

# Next day. Update object's start date, by passing RRule.id along. Ensure next occurrence is not updated
# by the update since it's overdue.
with freeze_time(datetime.datetime(2017, 6, 5)):
data['rrule'] = str(rrule_model.id)
data['dtstart'] = '6/7/2017'

# Handle update
data = {
'rrule': str(rrule_model.id),
'freq': rrule.DAILY,
'interval': 1,
'dtstart': '6/7/2017',
'byhour': '0',
'time_zone': 'UTC',
'ends': RecurrenceEnds.NEVER,
}
form = RecurrenceForm(data=data)
self.assertTrue(form.is_valid())
rrule_model = form.save(
occurrence_handler_path='ambition_utils.rrule.handler.OccurrenceHandler',
)
self.assertEqual(RRule.objects.count(), 1)

form = RecurrenceForm(data=data)
self.assertTrue(form.is_valid())
rrule_model = form.save(
occurrence_handler_path='ambition_utils.rrule.handler.OccurrenceHandler',
)
self.assertEqual(RRule.objects.count(), 1)
self.assertEqual(rrule_model.next_occurrence, datetime.datetime(2017, 6, 7))
# Next occurrence should not be updated because it is expired and needs to be resolved by its handler.
self.assertEqual(rrule_model.next_occurrence, datetime.datetime(2017, 6, 5))

# Handle overdue and assert next occurrence now reflects the new start date instead of the next day, 6/6.
RRule.objects.update_next_occurrences([rrule_model])
self.assertEqual(rrule_model.next_occurrence, datetime.datetime(2017, 6, 7))

def test_exclusion_rule(self):
exclusion_data = {
Expand Down
2 changes: 1 addition & 1 deletion ambition_utils/version.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = '3.1.6'
__version__ = '3.1.7'

0 comments on commit 1b8f377

Please sign in to comment.