예제 #1
0
    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])
예제 #2
0
    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)
예제 #3
0
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),),
        )
예제 #4
0
    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]
        )
예제 #5
0
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',
        )
예제 #6
0
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),),
        )
예제 #7
0
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',
        )
예제 #8
0
    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)
예제 #9
0
    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)
예제 #10
0
 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)
예제 #11
0
    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)
예제 #12
0
 def setUpClass(cls):
     super(DailyScheduleTest, cls).setUpClass()
     cls.schedule = TimedSchedule.create_simple_daily_schedule(
         cls.domain,
         time(12, 0),
         SMSContent(),
         total_iterations=2,
     )
예제 #13
0
 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]],
     )
예제 #16
0
 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]],
     )
예제 #17
0
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)
예제 #22
0
 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'),
     )
예제 #23
0
 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])
예제 #24
0
 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)
예제 #25
0
 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,
     )
예제 #26
0
    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])
예제 #27
0
    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])
예제 #28
0
    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
예제 #29
0
 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]
     )
예제 #30
0
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',
        )
예제 #31
0
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,
    )
예제 #32
0
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',
        )
예제 #33
0
    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]
        )
예제 #34
0
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,
            ),
        )
예제 #35
0
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,
            ),
        )
예제 #36
0
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.")