def test_expand_location_recipients(self): schedule_without_descendants = TimedSchedule.create_simple_daily_schedule( self.domain, TimedEvent(time=time(9, 0)), SMSContent(message={'en': 'Hello'})) schedule_without_descendants.include_descendant_locations = False schedule_without_descendants.save() schedule_with_descendants = TimedSchedule.create_simple_daily_schedule( self.domain, TimedEvent(time=time(9, 0)), SMSContent(message={'en': 'Hello'})) schedule_with_descendants.include_descendant_locations = True schedule_with_descendants.save() instance = CaseTimedScheduleInstance( domain=self.domain, timed_schedule_id=schedule_without_descendants.schedule_id, recipient_type='Location', recipient_id=self.city_location.location_id) self.assertEqual(self.user_ids(instance.expand_recipients()), [self.mobile_user.get_id]) instance = CaseTimedScheduleInstance( domain=self.domain, timed_schedule_id=schedule_without_descendants.schedule_id, recipient_type='Location', recipient_id=self.state_location.location_id) self.assertEqual(list(instance.expand_recipients()), []) instance = CaseTimedScheduleInstance( domain=self.domain, timed_schedule_id=schedule_with_descendants.schedule_id, recipient_type='Location', recipient_id=self.state_location.location_id) self.assertEqual(self.user_ids(instance.expand_recipients()), [self.mobile_user.get_id])
def test_case_group_recipient_with_user_data_filter(self): # The user data filter should have no effect here because all # the recipients are cases. schedule = TimedSchedule.create_simple_daily_schedule( self.domain, TimedEvent(time=time(9, 0)), SMSContent(message={'en': 'Hello'}) ) schedule.user_data_filter = {'role': ['nurse']} schedule.save() with create_case(self.domain, 'person') as case: case_group = CommCareCaseGroup(domain=self.domain, cases=[case.case_id]) case_group.save() self.addCleanup(case_group.delete) instance = CaseTimedScheduleInstance( domain=self.domain, timed_schedule_id=schedule.schedule_id, recipient_type=ScheduleInstance.RECIPIENT_TYPE_CASE_GROUP, recipient_id=case_group.get_id, ) recipients = list(instance.expand_recipients()) self.assertEqual(len(recipients), 1) self.assertEqual(recipients[0].case_id, case.case_id)
def create_aww_indicator_6(domain): with transaction.atomic(): schedule = TimedSchedule.create_simple_daily_schedule( domain, TimedEvent(time=time(9, 0)), CustomContent(custom_content_id='ICDS_CF_VISITS_COMPLETE'), total_iterations=1, ) schedule.default_language_code = 'hin' schedule.custom_metadata = {'icds_indicator': 'aww_6'} schedule.save() rule = AutomaticUpdateRule.objects.create( domain=domain, name="AWW #6: CF Visits Complete", case_type='ccs_record', active=True, deleted=False, filter_on_server_modified=False, server_modified_boundary=None, migrated=True, workflow=AutomaticUpdateRule.WORKFLOW_SCHEDULING, ) for i in [1, 2, 3, 4, 5, 6, 7]: rule.add_criteria( MatchPropertyDefinition, property_name='cf%s_date' % i, match_type=MatchPropertyDefinition.MATCH_HAS_VALUE, ) rule.add_action( CreateScheduleInstanceActionDefinition, timed_schedule_id=schedule.schedule_id, recipients=(('Owner', None),), )
def test_expand_location_recipients_without_descendants(self): schedule = TimedSchedule.create_simple_daily_schedule( self.domain, TimedEvent(time=time(9, 0)), SMSContent(message={'en': 'Hello'}) ) schedule.include_descendant_locations = False schedule.save() instance = CaseTimedScheduleInstance( domain=self.domain, timed_schedule_id=schedule.schedule_id, recipient_type='Location', recipient_id=self.country_location.location_id ) self.assertEqual( list(instance.expand_recipients()), [] ) instance = CaseTimedScheduleInstance( domain=self.domain, timed_schedule_id=schedule.schedule_id, recipient_type='Location', recipient_id=self.state_location.location_id ) self.assertEqual( self.user_ids(instance.expand_recipients()), [self.mobile_user2.get_id] )
def create_ls_indicator_4a(domain): with transaction.atomic(): schedule = TimedSchedule.create_simple_daily_schedule( domain, TimedEvent(time=time(9, 0)), CustomContent(custom_content_id='ICDS_CHILD_ILLNESS_REPORTED'), total_iterations=1, ) schedule.default_language_code = 'hin' schedule.custom_metadata = {'icds_indicator': 'ls_4a'} schedule.save() rule = AutomaticUpdateRule.objects.create( domain=domain, name="LS #4a: Child Fever Reported in Exclusive Breastfeeding form", case_type='person', active=True, deleted=False, filter_on_server_modified=False, server_modified_boundary=None, migrated=True, workflow=AutomaticUpdateRule.WORKFLOW_SCHEDULING, ) rule.add_criteria( MatchPropertyDefinition, property_name='last_reported_fever_date', match_type=MatchPropertyDefinition.MATCH_HAS_VALUE, ) rule.add_action( CreateScheduleInstanceActionDefinition, timed_schedule_id=schedule.schedule_id, recipients=(('CustomRecipient', 'ICDS_SUPERVISOR_FROM_AWC_OWNER'),), reset_case_property_name='last_reported_fever_date', )
def create_aww_indicator_4(domain): with transaction.atomic(): # Monthly schedule for the last day of the month schedule = TimedSchedule.create_simple_monthly_schedule( domain, TimedEvent(time=time(9, 30)), [-1], CustomContent(custom_content_id='ICDS_DPT3_AND_MEASLES_ARE_DUE'), total_iterations=TimedSchedule.REPEAT_INDEFINITELY ) schedule.default_language_code = 'hin' schedule.custom_metadata = {'icds_indicator': 'aww_4'} schedule.save() rule = AutomaticUpdateRule.objects.create( domain=domain, name="AWW #4: DPT3 and Measles Vaccinations Due", case_type='tasks', active=True, deleted=False, filter_on_server_modified=False, server_modified_boundary=None, migrated=True, workflow=AutomaticUpdateRule.WORKFLOW_SCHEDULING, ) rule.add_criteria( CustomMatchDefinition, name='ICDS_CONSIDER_CASE_FOR_DPT3_AND_MEASLES_REMINDER', ) rule.add_action( CreateScheduleInstanceActionDefinition, timed_schedule_id=schedule.schedule_id, recipients=(('Owner', None),), )
def create_beneficiary_indicator_2(domain): with transaction.atomic(): schedule = TimedSchedule.create_simple_daily_schedule( domain, TimedEvent(time=time(9, 0)), CustomContent(custom_content_id='ICDS_STATIC_NEGATIVE_GROWTH_MESSAGE'), total_iterations=1 ) schedule.default_language_code = 'hin' schedule.custom_metadata = {'icds_indicator': 'beneficiary_2'} schedule.save() rule = AutomaticUpdateRule.objects.create( domain=domain, name="Beneficiary #2: Static / Negative Weight Indicator", case_type='child_health', active=True, deleted=False, filter_on_server_modified=False, server_modified_boundary=None, migrated=True, workflow=AutomaticUpdateRule.WORKFLOW_SCHEDULING, ) rule.add_criteria( MatchPropertyDefinition, property_name='static_negative_growth_time', match_type=MatchPropertyDefinition.MATCH_HAS_VALUE, ) rule.add_action( CreateScheduleInstanceActionDefinition, timed_schedule_id=schedule.schedule_id, recipients=(('CustomRecipient', 'ICDS_MOTHER_PERSON_CASE_FROM_CHILD_HEALTH_CASE'),), reset_case_property_name='static_negative_growth_time', )
def test_web_user_recipient_with_user_data_filter(self): schedule = TimedSchedule.create_simple_daily_schedule( self.domain, TimedEvent(time=time(9, 0)), SMSContent(message={'en': 'Hello'}) ) schedule.user_data_filter = {'role': ['nurse']} schedule.save() instance = CaseTimedScheduleInstance( domain=self.domain, timed_schedule_id=schedule.schedule_id, recipient_type=ScheduleInstance.RECIPIENT_TYPE_WEB_USER, recipient_id=self.web_user.get_id, ) self.assertEqual(list(instance.expand_recipients()), []) instance = CaseTimedScheduleInstance( domain=self.domain, timed_schedule_id=schedule.schedule_id, recipient_type=ScheduleInstance.RECIPIENT_TYPE_WEB_USER, recipient_id=self.web_user2.get_id, ) recipients = list(instance.expand_recipients()) self.assertEqual(len(recipients), 1) self.assertIsInstance(recipients[0], WebUser) self.assertEqual(recipients[0].get_id, self.web_user2.get_id)
def _add_daily_rule(self, content): schedule = TimedSchedule.create_simple_daily_schedule( self.domain, TimedEvent(time=time(9, 0)), content ) return self._add_rule(timed_schedule_id=schedule.schedule_id)
def setUpClass(cls): super(DailyScheduleTest, cls).setUpClass() cls.schedule = TimedSchedule.create_simple_daily_schedule( cls.domain, time(12, 0), SMSContent(), total_iterations=2, )
def setUpClass(cls): super(StartDayOfWeekTest, cls).setUpClass() cls.schedule = TimedSchedule.create_simple_daily_schedule( cls.domain, time(12, 0), SMSContent(), total_iterations=2, start_day_of_week=TimedSchedule.MONDAY, )
def _add_monthly_rule(self, content): schedule = TimedSchedule.create_simple_monthly_schedule( self.domain, TimedEvent(time=time(11, 0)), [23, -1], content, total_iterations=2, ) return self._add_rule(timed_schedule_id=schedule.schedule_id)
def create_scheduled_broadcast(self, domain, content): schedule = TimedSchedule.create_simple_daily_schedule(domain, TimedEvent(time=time(12, 0)), content) return ScheduledBroadcast.objects.create( domain=domain, name='', start_date=date(2018, 1, 1), schedule=schedule, recipients=[['CommCareUser', uuid.uuid4().hex]], )
def migrate_custom_daily_schedule(handler, migrator): return TimedSchedule.create_custom_daily_schedule( handler.domain, [(get_timed_event(handler, event), get_content(handler, event)) for event in handler.events], total_iterations=handler.max_iteration_count, start_offset=handler.start_offset, extra_options=get_extra_scheduling_options(handler, migrator, include_utc_option=True), repeat_every=handler.schedule_length, )
def migrate_offset_based_start_date_schedule(handler, migrator): base_datetime = datetime(2000, 1, 1) running_datetime = datetime(2000, 1, 1) event_and_content_objects = [] for event in handler.events: running_datetime += timedelta(days=event.day_num) running_datetime += timedelta(hours=event.fire_time.hour) running_datetime += timedelta(minutes=event.fire_time.minute) event_and_content_objects.append((TimedEvent( day=(running_datetime - base_datetime).days, time=running_datetime.time(), ), get_content(handler, event))) if handler.max_iteration_count == 1: repeat_every = event_and_content_objects[-1][0].day + 1 elif repeat_every_override: repeat_every = repeat_every_override else: raise ValueError("Expected repeat_every_override") if len(event_and_content_objects ) == 1 and event_and_content_objects[0][0].day == 0: return TimedSchedule.create_simple_daily_schedule( handler.domain, event_and_content_objects[0][0], event_and_content_objects[0][1], total_iterations=handler.max_iteration_count, start_offset=handler.start_offset, extra_options=get_extra_scheduling_options( handler, migrator, include_utc_option=True), repeat_every=repeat_every, ) else: return TimedSchedule.create_custom_daily_schedule( handler.domain, event_and_content_objects, total_iterations=handler.max_iteration_count, start_offset=handler.start_offset, extra_options=get_extra_scheduling_options( handler, migrator, include_utc_option=True), repeat_every=repeat_every, )
def test_timed_schedule_instance_creation(self, utcnow_patch): schedule = TimedSchedule.create_simple_daily_schedule( self.domain, TimedEvent(time=time(9, 0)), SMSContent(message={'en': 'Hello'}) ) rule = create_empty_rule(self.domain, AutomaticUpdateRule.WORKFLOW_SCHEDULING) rule.add_criteria( MatchPropertyDefinition, property_name='start_sending', property_value='Y', match_type=MatchPropertyDefinition.MATCH_EQUAL, ) rule.add_action( CreateScheduleInstanceActionDefinition, timed_schedule_id=schedule.schedule_id, recipients=(('CommCareUser', self.user.get_id),) ) AutomaticUpdateRule.clear_caches(self.domain, AutomaticUpdateRule.WORKFLOW_SCHEDULING) utcnow_patch.return_value = datetime(2017, 5, 1, 7, 0) with create_case(self.domain, 'person') as case: # Rule does not match, no instances created instances = get_case_timed_schedule_instances_for_schedule(case.case_id, schedule) self.assertEqual(instances.count(), 0) # Make the rule match. On the first iteration, the instance is created. On the second, # no new instance is created since it already exists. for minute in [1, 2]: utcnow_patch.return_value = datetime(2017, 5, 1, 7, minute) update_case(self.domain, case.case_id, case_properties={'start_sending': 'Y'}) instances = get_case_timed_schedule_instances_for_schedule(case.case_id, schedule) self.assertEqual(instances.count(), 1) self.assertEqual(instances[0].case_id, case.case_id) self.assertEqual(instances[0].rule_id, rule.pk) self.assertEqual(instances[0].timed_schedule_id, schedule.schedule_id) self.assertEqual(instances[0].start_date, date(2017, 5, 1)) self.assertEqual(instances[0].domain, self.domain) self.assertEqual(instances[0].recipient_type, 'CommCareUser') self.assertEqual(instances[0].recipient_id, self.user.get_id) self.assertEqual(instances[0].current_event_num, 0) self.assertEqual(instances[0].schedule_iteration_num, 1) self.assertEqual(instances[0].next_event_due, datetime(2017, 5, 1, 13, 0)) self.assertTrue(instances[0].active) # Make the rule not match. Instance should no longer exist. utcnow_patch.return_value = datetime(2017, 5, 1, 7, 3) update_case(self.domain, case.case_id, case_properties={'start_sending': 'N'}) instances = get_case_timed_schedule_instances_for_schedule(case.case_id, schedule) self.assertEqual(instances.count(), 0)
def migrate_simple_daily_schedule(handler): return TimedSchedule.create_simple_daily_schedule( handler.domain, get_timed_event(handler, handler.events[0]), get_content(handler, handler.events[0]), total_iterations=handler.max_iteration_count, start_offset=handler.start_offset, extra_options=get_extra_scheduling_options(handler, include_utc_option=True), repeat_every=handler.schedule_length, )
def _add_weekly_rule(self, content): schedule = TimedSchedule.create_simple_weekly_schedule( self.domain, TimedEvent(time=time(12, 0)), content, [0, 4], 0, total_iterations=3, repeat_every=2, ) return self._add_rule(timed_schedule_id=schedule.schedule_id)
def setUpClass(cls): super(TestUCLACustomHandler, cls).setUpClass() cls.domain = Domain.get_or_create_with_name(cls.domain_name, is_active=True) email = '*****@*****.**' cls.user = WebUser.create(cls.domain_name, email, '***', email=email) cls.user.save() cls.schedule = TimedSchedule.create_simple_daily_schedule( cls.domain_name, TimedEvent(time=time(12, 0)), CustomContent(custom_content_id='UCLA_GENERAL_HEALTH'), )
def test_expand_group_recipients(self): schedule = TimedSchedule.create_simple_daily_schedule( self.domain, TimedEvent(time=time(9, 0)), SMSContent(message={'en': 'Hello'})) instance = CaseTimedScheduleInstance( domain=self.domain, timed_schedule_id=schedule.schedule_id, recipient_type='Group', recipient_id=self.group.get_id) self.assertEqual(self.user_ids(instance.expand_recipients()), [self.mobile_user.get_id])
def _add_custom_daily_rule(self, content_list): event_and_content_objects = [ (TimedEvent(day=i % 7, time=time(i * 2 % 24, 30 + i % 60)), content) for i, content in enumerate(content_list) ] schedule = TimedSchedule.create_custom_daily_schedule( self.domain, event_and_content_objects, repeat_every=2, ) return self._add_rule(timed_schedule_id=schedule.schedule_id)
def setUpClass(cls): super(DailyScheduleTest, cls).setUpClass() cls.domain = 'scheduling-test' cls.domain_obj = Domain(name=cls.domain, default_timezone='America/New_York') cls.domain_obj.save() cls.user1 = CommCareUser.create(cls.domain, 'user1', 'password') cls.user2 = CommCareUser.create(cls.domain, 'user2', 'password') cls.schedule = TimedSchedule.create_simple_daily_schedule( cls.domain, time(12, 0), SMSContent(), total_iterations=2, )
def test_mobile_worker_recipients_with_user_data_filter(self): schedule = TimedSchedule.create_simple_daily_schedule( self.domain, TimedEvent(time=time(9, 0)), SMSContent(message={'en': 'Hello'})) schedule.user_data_filter = {'role': ['nurse']} schedule.save() instance = CaseTimedScheduleInstance( domain=self.domain, timed_schedule_id=schedule.schedule_id, recipient_type='Group', recipient_id=self.group2.get_id) self.assertEqual(self.user_ids(instance.expand_recipients()), [self.mobile_user4.get_id, self.mobile_user5.get_id])
def test_expand_location_recipients_with_location_type_filter(self): schedule = TimedSchedule.create_simple_daily_schedule( self.domain, TimedEvent(time=time(9, 0)), SMSContent(message={'en': 'Hello'})) schedule.include_descendant_locations = True schedule.location_type_filter = [self.city_location.location_type_id] schedule.save() instance = CaseTimedScheduleInstance( domain=self.domain, timed_schedule_id=schedule.schedule_id, recipient_type='Location', recipient_id=self.country_location.location_id) self.assertItemsEqual(self.user_ids(instance.expand_recipients()), [self.mobile_user.get_id])
def _add_rule(self, content): schedule = TimedSchedule.create_simple_daily_schedule( self.domain, TimedEvent(time=time(9, 0)), content) rule = create_empty_rule(self.domain, AutomaticUpdateRule.WORKFLOW_SCHEDULING) self.addCleanup(rule.delete) rule.add_action(CreateScheduleInstanceActionDefinition, timed_schedule_id=schedule.schedule_id, recipients=(('CommCareUser', self.user.get_id), )) rule.save() return rule
def test_expand_group_recipients(self): schedule = TimedSchedule.create_simple_daily_schedule( self.domain, TimedEvent(time=time(9, 0)), SMSContent(message={'en': 'Hello'}) ) instance = CaseTimedScheduleInstance( domain=self.domain, timed_schedule_id=schedule.schedule_id, recipient_type='Group', recipient_id=self.group.get_id ) self.assertEqual( self.user_ids(instance.expand_recipients()), [self.mobile_user.get_id] )
def create_ls_indicator_4b(domain): with transaction.atomic(): schedule = TimedSchedule.create_simple_daily_schedule( domain, time(9, 0), CustomContent(custom_content_id='ICDS_CHILD_ILLNESS_REPORTED'), total_iterations=1, start_offset=7, ) schedule.default_language_code = 'hin' schedule.custom_metadata = {'icds_indicator': 'ls_4b'} schedule.save() rule = AutomaticUpdateRule.objects.create( domain=domain, name="LS #4b: Child Illness Reported in Referral Form", case_type='person', active=True, deleted=False, filter_on_server_modified=False, server_modified_boundary=None, migrated=True, workflow=AutomaticUpdateRule.WORKFLOW_SCHEDULING, ) rule.add_criteria( MatchPropertyDefinition, property_name='last_referral_date', match_type=MatchPropertyDefinition.MATCH_HAS_VALUE, ) rule.add_criteria( MatchPropertyDefinition, property_name='referral_health_problem', match_type=MatchPropertyDefinition.MATCH_HAS_VALUE, ) rule.add_criteria( MatchPropertyDefinition, property_name='dob', match_type=MatchPropertyDefinition.MATCH_DAYS_BEFORE, property_value='-2192', ) rule.add_action( CreateScheduleInstanceActionDefinition, timed_schedule_id=schedule.schedule_id, recipients=(('CustomRecipient', 'ICDS_SUPERVISOR_FROM_AWC_OWNER'), ), reset_case_property_name='last_referral_date', )
def migrate_simple_weekly_schedule(handler, migrator): if handler.schedule_length > 0 and (handler.schedule_length % 7) == 0: repeat_every = handler.schedule_length // 7 elif handler.max_iteration_count == 1: repeat_every = 1 else: raise ValueError("Unable to convert schedule_length for handler %s" % handler._id) return TimedSchedule.create_simple_weekly_schedule( handler.domain, get_timed_event(handler, handler.events[0]), get_content(handler, handler.events[0]), [handler.start_day_of_week], handler.start_day_of_week, total_iterations=handler.max_iteration_count, extra_options=get_extra_scheduling_options(handler, migrator, include_utc_option=True), repeat_every=repeat_every, )
def create_beneficiary_indicator_1(domain): with transaction.atomic(): schedule = TimedSchedule.create_simple_daily_schedule( domain, TimedEvent(time=time(9, 0)), SMSContent( message={ u'en': u'{case.host.name} is severely malnourished. Please consult the Anganwadi for advice in the next visit', u'hin': u'{case.host.name} \u0917\u093e\u0902\u092d\u0940\u0930 \u0930\u0942\u092a \u0938\u0947 \u0915\u0941\u092a\u094b\u0937\u093f\u0924 \u0939\u0948\u0902 | \u0915\u0943\u092a\u093e \u0905\u0917\u0932\u0947 \u0917\u094d\u0930\u0939 \u092d\u094d\u0930\u092e\u0923 \u092e\u0947\u0902 \u0906\u0901\u0917\u0928\u0935\u093e\u095c\u0940 \u0938\u0947 \u092a\u0930\u093e\u092e\u0930\u094d\u0936 \u0915\u0930 \u0938\u0932\u093e\u0939 \u092a\u094d\u0930\u093e\u092a\u094d\u0924 \u0915\u0930\u0947 |', u'tel': u'{case.host.name} \u0c24\u0c40\u0c35\u0c4d\u0c30\u0c2e\u0c48\u0c28 \u0c15\u0c41\u0c2a\u0c4b\u0c37\u0c23\u0c32\u0c4b \u0c09\u0c28\u0c4d\u0c28\u0c3e\u0c30\u0c41. \u0c08 \u0c38\u0c3e\u0c30\u0c3f \u0c05\u0c02\u0c17\u0c28\u0c4d \u0c35\u0c3e\u0c21\u0c40 \u0c38\u0c46\u0c02\u0c1f\u0c30\u0c41\u0c15\u0c41 \u0c35\u0c46\u0c33\u0c4d\u0c33\u0c3f\u0c28\u0c2a\u0c4d\u0c2a\u0c41\u0c21\u0c41 \u0c24\u0c17\u0c41 \u0c38\u0c32\u0c39\u0c3e \u0c15\u0c4a\u0c30\u0c15\u0c41 \u0c15\u0c3e\u0c30\u0c4d\u0c2f\u0c15\u0c30\u0c4d\u0c24\u0c28\u0c41 \u0c38\u0c02\u0c2a\u0c4d\u0c30\u0c26\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f.', }), total_iterations=1) schedule.default_language_code = 'hin' schedule.custom_metadata = {'icds_indicator': 'beneficiary_1'} schedule.save() rule = AutomaticUpdateRule.objects.create( domain=domain, name="Beneficiary #1: Z-Score Grading Indicator", case_type='child_health', active=True, deleted=False, filter_on_server_modified=False, server_modified_boundary=None, migrated=True, workflow=AutomaticUpdateRule.WORKFLOW_SCHEDULING, ) rule.add_criteria( MatchPropertyDefinition, property_name='zscore_grading_wfa', property_value='red', match_type=MatchPropertyDefinition.MATCH_EQUAL, ) rule.add_action( CreateScheduleInstanceActionDefinition, timed_schedule_id=schedule.schedule_id, recipients=(('CustomRecipient', 'ICDS_MOTHER_PERSON_CASE_FROM_CHILD_HEALTH_CASE'), ), reset_case_property_name='last_date_gmp', )
def test_mobile_worker_recipients_with_user_data_filter(self): schedule = TimedSchedule.create_simple_daily_schedule( self.domain, TimedEvent(time=time(9, 0)), SMSContent(message={'en': 'Hello'}) ) schedule.user_data_filter = {'role': ['nurse']} schedule.save() instance = CaseTimedScheduleInstance( domain=self.domain, timed_schedule_id=schedule.schedule_id, recipient_type='Group', recipient_id=self.group2.get_id ) self.assertEqual( self.user_ids(instance.expand_recipients()), [self.mobile_user4.get_id, self.mobile_user5.get_id] )
def _create_ls_indicator_5(domain, visit_num): with transaction.atomic(): schedule = TimedSchedule.create_simple_daily_schedule( domain, TimedEvent(time=time(9, 0)), CustomContent(custom_content_id='ICDS_MISSED_PNC_VISIT_TO_LS'), total_iterations=1, start_offset=1, ) schedule.default_language_code = 'hin' schedule.custom_metadata = {'icds_indicator': 'ls_5'} schedule.save() rule = AutomaticUpdateRule.objects.create( domain=domain, name="LS #5: Missed PNC #%s" % visit_num, case_type='ccs_record', active=True, deleted=False, filter_on_server_modified=False, server_modified_boundary=None, migrated=True, workflow=AutomaticUpdateRule.WORKFLOW_SCHEDULING, ) rule.add_criteria( MatchPropertyDefinition, property_name='pnc%s_date' % visit_num, match_type=MatchPropertyDefinition.MATCH_HAS_NO_VALUE, ) rule.add_action( CreateScheduleInstanceActionDefinition, timed_schedule_id=schedule.schedule_id, recipients=(('CustomRecipient', 'ICDS_SUPERVISOR_FROM_AWC_OWNER'), ), scheduler_module_info=CreateScheduleInstanceActionDefinition. SchedulerModuleInfo( enabled=True, app_id='48cc1709b7f62ffea24cc6634a004745', form_unique_id='f55da33c32fb41489d5082b7b3acfe43c739e988', visit_number=visit_num - 1, window_position=VISIT_WINDOW_END, ), )
def create_ls_indicator_3(domain): with transaction.atomic(): schedule = TimedSchedule.create_simple_daily_schedule( domain, time(9, 0), CustomContent(custom_content_id='ICDS_MISSED_CF_VISIT_TO_LS'), total_iterations=1, start_offset=1, ) schedule.default_language_code = 'hin' schedule.custom_metadata = {'icds_indicator': 'ls_3'} schedule.save() rule = AutomaticUpdateRule.objects.create( domain=domain, name="LS #3: Missed CF #1", case_type='ccs_record', active=True, deleted=False, filter_on_server_modified=False, server_modified_boundary=None, migrated=True, workflow=AutomaticUpdateRule.WORKFLOW_SCHEDULING, ) rule.add_criteria( MatchPropertyDefinition, property_name='cf1_date', match_type=MatchPropertyDefinition.MATCH_HAS_NO_VALUE, ) rule.add_action( CreateScheduleInstanceActionDefinition, timed_schedule_id=schedule.schedule_id, recipients=(('CustomRecipient', 'ICDS_SUPERVISOR_FROM_AWC_OWNER'), ), scheduler_module_info=CreateScheduleInstanceActionDefinition. SchedulerModuleInfo( enabled=True, app_id='48cc1709b7f62ffea24cc6634a004745', form_unique_id='84ea09b6aa5aba125ec82bf2bb8dfa44cc5ea150', visit_number=0, window_position=VISIT_WINDOW_END, ), )
def create_aww_indicator_5(domain): with transaction.atomic(): schedule = TimedSchedule.create_simple_daily_schedule( domain, TimedEvent(time=time(9, 0)), CustomContent( custom_content_id='ICDS_CHILD_VACCINATIONS_COMPLETE'), total_iterations=1, ) schedule.default_language_code = 'hin' schedule.custom_metadata = {'icds_indicator': 'aww_5'} schedule.save() rule = AutomaticUpdateRule.objects.create( domain=domain, name="AWW #5: Child Vaccinations Complete", case_type='tasks', active=True, deleted=False, filter_on_server_modified=False, server_modified_boundary=None, migrated=True, workflow=AutomaticUpdateRule.WORKFLOW_SCHEDULING, ) rule.add_criteria( MatchPropertyDefinition, property_name='tasks_type', property_value='child', match_type=MatchPropertyDefinition.MATCH_EQUAL, ) rule.add_criteria( MatchPropertyDefinition, property_name='immun_one_year_complete', property_value='yes', match_type=MatchPropertyDefinition.MATCH_EQUAL, ) rule.add_action( CreateScheduleInstanceActionDefinition, timed_schedule_id=schedule.schedule_id, recipients=(('Owner', None), ), )
def handle(self, domain, filename, **options): domain_obj = Domain.get_by_name(domain) if domain_obj is None: raise CommandError("Project space '%s' not found" % domain) json_rules = [] with open_for_json_read(filename) as f: for line in f: json_rules.append(json.loads(line)) print("Importing %s rules..." % len(json_rules)) rules = [] with transaction.atomic(): for entry in json_rules: json_rule = SimpleSchedulingRule(entry['rule']) schedule_type = entry['schedule']['schedule_type'] if schedule_type == SIMPLE_SMS_DAILY_SCHEDULE_WITH_TIME: json_schedule = SimpleSMSDailyScheduleWithTime(entry['schedule']) schedule = TimedSchedule.create_simple_daily_schedule( domain, TimedEvent(time=json_schedule.time), SMSContent(message=json_schedule.message), total_iterations=json_schedule.total_iterations, start_offset=json_schedule.start_offset, start_day_of_week=json_schedule.start_day_of_week, extra_options=json_schedule.extra_options.to_json(), repeat_every=json_schedule.repeat_every, ) elif schedule_type == SIMPLE_SMS_ALERT_SCHEDULE: json_schedule = SimpleSMSAlertSchedule(entry['schedule']) schedule = AlertSchedule.create_simple_alert( domain, SMSContent(message=json_schedule.message), extra_options=json_schedule.extra_options.to_json(), ) else: raise CommandError("Unexpected schedule_type: %s" % schedule_type) rule = AutomaticUpdateRule.objects.create( domain=domain, name=json_rule.name, case_type=json_rule.case_type, active=True, filter_on_server_modified=False, workflow=AutomaticUpdateRule.WORKFLOW_SCHEDULING, ) for criterion in json_rule.criteria: rule.add_criteria( MatchPropertyDefinition, property_name=criterion.property_name, property_value=criterion.property_value, match_type=criterion.match_type, ) rule.add_action( CreateScheduleInstanceActionDefinition, alert_schedule_id=schedule.schedule_id if isinstance(schedule, AlertSchedule) else None, timed_schedule_id=schedule.schedule_id if isinstance(schedule, TimedSchedule) else None, recipients=json_rule.recipients, reset_case_property_name=json_rule.reset_case_property_name, start_date_case_property=json_rule.start_date_case_property, specific_start_date=json_rule.specific_start_date, scheduler_module_info=json_rule.scheduler_module_info.to_json(), ) rules.append(rule) print("Import complete. Starting instance refresh tasks...") for rule in rules: initiate_messaging_rule_run(rule.domain, rule.pk) print("Done.")
def handle(self, domain, filename, **options): domain_obj = Domain.get_by_name(domain) if domain_obj is None: raise CommandError("Project space '%s' not found" % domain) if not project_is_on_new_reminders(domain_obj): raise CommandError( "Project space '%s' does not have new reminders enabled" % domain) json_rules = [] with open_for_json_read(filename) as f: for line in f: json_rules.append(json.loads(line)) print("Importing %s rules..." % len(json_rules)) rules = [] with transaction.atomic(): for entry in json_rules: json_rule = SimpleSchedulingRule(entry['rule']) schedule_type = entry['schedule']['schedule_type'] if schedule_type == SIMPLE_SMS_DAILY_SCHEDULE_WITH_TIME: json_schedule = SimpleSMSDailyScheduleWithTime( entry['schedule']) schedule = TimedSchedule.create_simple_daily_schedule( domain, TimedEvent(time=json_schedule.time), SMSContent(message=json_schedule.message), total_iterations=json_schedule.total_iterations, start_offset=json_schedule.start_offset, start_day_of_week=json_schedule.start_day_of_week, extra_options=json_schedule.extra_options.to_json(), repeat_every=json_schedule.repeat_every, ) elif schedule_type == SIMPLE_SMS_ALERT_SCHEDULE: json_schedule = SimpleSMSAlertSchedule(entry['schedule']) schedule = AlertSchedule.create_simple_alert( domain, SMSContent(message=json_schedule.message), extra_options=json_schedule.extra_options.to_json(), ) else: raise CommandError("Unexpected schedule_type: %s" % schedule_type) rule = AutomaticUpdateRule.objects.create( domain=domain, name=json_rule.name, case_type=json_rule.case_type, active=True, filter_on_server_modified=False, workflow=AutomaticUpdateRule.WORKFLOW_SCHEDULING, ) for criterion in json_rule.criteria: rule.add_criteria( MatchPropertyDefinition, property_name=criterion.property_name, property_value=criterion.property_value, match_type=criterion.match_type, ) rule.add_action( CreateScheduleInstanceActionDefinition, alert_schedule_id=schedule.schedule_id if isinstance( schedule, AlertSchedule) else None, timed_schedule_id=schedule.schedule_id if isinstance( schedule, TimedSchedule) else None, recipients=json_rule.recipients, reset_case_property_name=json_rule. reset_case_property_name, start_date_case_property=json_rule. start_date_case_property, specific_start_date=json_rule.specific_start_date, scheduler_module_info=json_rule.scheduler_module_info. to_json(), ) rules.append(rule) print("Import complete. Starting instance refresh tasks...") for rule in rules: initiate_messaging_rule_run(rule.domain, rule.pk) print("Done.")