def test_schedule_start_to_finish(self, utcnow_patch, send_patch): self.assertNumInstancesForSchedule(0) # Schedule the instance using an explicit start date (a Sunday) # Based on the schedule (with start offset 3) we should start sending on the next Monday utcnow_patch.return_value = datetime(2017, 8, 2, 7, 0) refresh_timed_schedule_instances( self.schedule, (('CommCareUser', self.user1.get_id), ), date(2017, 8, 6)) self.assertNumInstancesForSchedule(1) [instance] = get_timed_schedule_instances_for_schedule(self.schedule) self.assertTimedScheduleInstance(instance, 0, 1, datetime(2017, 8, 14, 16, 0), True, date(2017, 8, 6), self.user1) self.assertEqual(send_patch.call_count, 0) # Send first event utcnow_patch.return_value = datetime(2017, 8, 14, 16, 1) instance.handle_current_event() save_timed_schedule_instance(instance) self.assertNumInstancesForSchedule(1) self.assertTimedScheduleInstance(instance, 0, 2, datetime(2017, 8, 15, 16, 0), True, date(2017, 8, 6), self.user1) self.assertEqual(send_patch.call_count, 1) # Send second (and final) event utcnow_patch.return_value = datetime(2017, 8, 15, 16, 1) instance.handle_current_event() save_timed_schedule_instance(instance) self.assertNumInstancesForSchedule(1) self.assertTimedScheduleInstance(instance, 0, 3, datetime(2017, 8, 16, 16, 0), False, date(2017, 8, 6), self.user1) self.assertEqual(send_patch.call_count, 2)
def refresh_timed_schedule_instances(schedule, recipients, start_date=None): """ :param schedule: the TimedSchedule :param start_date: the date to start the TimedSchedule :param recipients: a list of (recipient_type, recipient_id) tuples; the recipient type should be one of the values checked in ScheduleInstance.recipient """ existing_instances = { (instance.recipient_type, instance.recipient_id): instance for instance in get_timed_schedule_instances_for_schedule(schedule) } recipients = convert_to_tuple_of_tuples(recipients) new_recipients = set(recipients) for recipient_type, recipient_id in new_recipients: if (recipient_type, recipient_id) not in existing_instances: instance = TimedScheduleInstance.create_for_recipient( schedule, recipient_type, recipient_id, start_date=start_date, move_to_next_event_not_in_the_past=True, ) save_timed_schedule_instance(instance) for key, schedule_instance in existing_instances.iteritems(): if key not in new_recipients: delete_timed_schedule_instance(schedule_instance) elif start_date and start_date != schedule_instance.start_date: schedule_instance.recalculate_schedule(schedule, new_start_date=start_date) save_timed_schedule_instance(schedule_instance)
def test_schedule_start_to_finish(self, utcnow_patch, send_patch): self.assertNumInstancesForSchedule(0) # Schedule the instance utcnow_patch.return_value = datetime(2017, 3, 16, 6, 0) refresh_timed_schedule_instances(self.schedule, (('CommCareUser', self.user1.get_id),), date(2017, 3, 16)) self.assertNumInstancesForSchedule(1) [instance] = get_timed_schedule_instances_for_schedule(self.schedule) self.assertTimedScheduleInstance(instance, 0, 1, datetime(2017, 3, 16, 16, 0), True, date(2017, 3, 16), self.user1) self.assertEqual(send_patch.call_count, 0) # Send first event utcnow_patch.return_value = datetime(2017, 3, 16, 16, 1) instance.handle_current_event() save_timed_schedule_instance(instance) self.assertNumInstancesForSchedule(1) self.assertTimedScheduleInstance(instance, 0, 2, datetime(2017, 3, 17, 16, 0), True, date(2017, 3, 16), self.user1) self.assertEqual(send_patch.call_count, 1) # Send second (and final) event utcnow_patch.return_value = datetime(2017, 3, 17, 16, 1) instance.handle_current_event() save_timed_schedule_instance(instance) self.assertNumInstancesForSchedule(1) self.assertTimedScheduleInstance(instance, 0, 3, datetime(2017, 3, 18, 16, 0), False, date(2017, 3, 16), self.user1) self.assertEqual(send_patch.call_count, 2)
def test_save_timed_schedule_instance(self): self.assertEqual(TimedScheduleInstance.objects.using(self.db).count(), 0) instance = self.make_timed_schedule_instance() save_timed_schedule_instance(instance) self.assertEqual(TimedScheduleInstance.objects.using(self.db).count(), 1)
def save_instance(instance): if isinstance(instance, AlertScheduleInstance): save_alert_schedule_instance(instance) elif isinstance(instance, TimedScheduleInstance): save_timed_schedule_instance(instance) elif isinstance(instance, (CaseAlertScheduleInstance, CaseTimedScheduleInstance)): save_case_schedule_instance(instance) else: raise TypeError("Unexpected type: %s" % type(instance))
def test_get_timed_schedule_instance(self): instance1 = self.make_timed_schedule_instance() save_timed_schedule_instance(instance1) instance2 = get_timed_schedule_instance(instance1.schedule_instance_id) self.assertTrue(isinstance(instance2, TimedScheduleInstance)) self.assertEqual(instance1.schedule_instance_id, instance2.schedule_instance_id) with self.assertRaises(TimedScheduleInstance.DoesNotExist): get_timed_schedule_instance(uuid.uuid4())
def save_instance(instance): if isinstance(instance, AlertScheduleInstance): save_alert_schedule_instance(instance) elif isinstance(instance, TimedScheduleInstance): save_timed_schedule_instance(instance) elif isinstance( instance, (CaseAlertScheduleInstance, CaseTimedScheduleInstance)): save_case_schedule_instance(instance) else: raise TypeError("Unexpected type: %s" % type(instance))
def test_save_timed_schedule_instance(self): self.assertEqual(TimedScheduleInstance.objects.using(partition_config.get_proxy_db()).count(), 0) self.assertEqual(TimedScheduleInstance.objects.using(self.db1).count(), 0) self.assertEqual(TimedScheduleInstance.objects.using(self.db2).count(), 0) instance = self.make_timed_schedule_instance(self.p2_uuid) save_timed_schedule_instance(instance) self.assertEqual(TimedScheduleInstance.objects.using(partition_config.get_proxy_db()).count(), 0) self.assertEqual(TimedScheduleInstance.objects.using(self.db1).count(), 0) self.assertEqual(TimedScheduleInstance.objects.using(self.db2).count(), 1)
def test_save_timed_schedule_instance(self): self.assertEqual(TimedScheduleInstance.objects.using(partition_config.proxy_db).count(), 0) self.assertEqual(TimedScheduleInstance.objects.using(self.db1).count(), 0) self.assertEqual(TimedScheduleInstance.objects.using(self.db2).count(), 0) instance = self.make_timed_schedule_instance(self.p2_uuid) save_timed_schedule_instance(instance) self.assertEqual(TimedScheduleInstance.objects.using(partition_config.proxy_db).count(), 0) self.assertEqual(TimedScheduleInstance.objects.using(self.db1).count(), 0) self.assertEqual(TimedScheduleInstance.objects.using(self.db2).count(), 1)
def setUp(self): self.alert_instance1_p1 = self.make_alert_schedule_instance(self.p1_uuid1) save_alert_schedule_instance(self.alert_instance1_p1) self.alert_instance2_p2 = self.make_alert_schedule_instance(self.p2_uuid1, schedule_id=self.schedule_id1) save_alert_schedule_instance(self.alert_instance2_p2) self.alert_instance3_p1 = self.make_alert_schedule_instance(self.p1_uuid2, schedule_id=self.schedule_id1, active=False) save_alert_schedule_instance(self.alert_instance3_p1) self.timed_instance1_p2 = self.make_timed_schedule_instance(self.p2_uuid2) save_timed_schedule_instance(self.timed_instance1_p2) self.timed_instance2_p1 = self.make_timed_schedule_instance(self.p1_uuid3, schedule_id=self.schedule_id2) save_timed_schedule_instance(self.timed_instance2_p1) self.timed_instance3_p2 = self.make_timed_schedule_instance(self.p2_uuid3, schedule_id=self.schedule_id2, active=False) save_timed_schedule_instance(self.timed_instance3_p2)
def setUp(self): self.alert_instance1 = self.make_alert_schedule_instance(self.uuid1) save_alert_schedule_instance(self.alert_instance1) self.alert_instance2 = self.make_alert_schedule_instance(self.uuid2, schedule_id=self.schedule_id1) save_alert_schedule_instance(self.alert_instance2) self.alert_instance3 = self.make_alert_schedule_instance(self.uuid3, schedule_id=self.schedule_id1, active=False) save_alert_schedule_instance(self.alert_instance3) self.timed_instance1 = self.make_timed_schedule_instance(self.uuid4) save_timed_schedule_instance(self.timed_instance1) self.timed_instance2 = self.make_timed_schedule_instance(self.uuid5, schedule_id=self.schedule_id2) save_timed_schedule_instance(self.timed_instance2) self.timed_instance3 = self.make_timed_schedule_instance(self.uuid6, schedule_id=self.schedule_id2, active=False) save_timed_schedule_instance(self.timed_instance3)