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

Add field to choose conditional alert recipients filter source #35272

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft
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
19 changes: 19 additions & 0 deletions corehq/messaging/scheduling/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
from corehq.apps.groups.models import Group
from corehq.apps.hqwebapp import crispy as hqcrispy
from corehq.apps.hqwebapp.crispy import HQFormHelper
from corehq.apps.hqwebapp.widgets import SelectToggle
from corehq.apps.locations.models import LocationType, SQLLocation
from corehq.apps.reminders.util import (
get_combined_id,
Expand Down Expand Up @@ -1344,6 +1345,18 @@ class ScheduleForm(Form):
required=False,
)

use_user_case_for_filter_choices = [("false", "User Properties"), ("true", "User Case Properties")]

use_user_case_for_filter = ChoiceField(
label=gettext_lazy("Filter on"),
required=False,
initial='ALL',
choices=use_user_case_for_filter_choices,
widget=SelectToggle(
choices=use_user_case_for_filter_choices,
),
)

user_data_property_name = TrimmedCharField(
label=gettext_lazy("User data filter: property name"),
required=False,
Expand Down Expand Up @@ -1569,6 +1582,7 @@ def compute_initial(self, domain):
result['use_user_data_filter'] = choice
result['user_data_property_name'] = name
result['user_data_property_value'] = value
result['use_user_case_for_filter'] = schedule.use_user_case_for_filter

result['use_utc_as_default_timezone'] = schedule.use_utc_as_default_timezone
if isinstance(schedule, AlertSchedule):
Expand Down Expand Up @@ -2086,6 +2100,7 @@ def get_advanced_layout_fields(self):
),
),
crispy.Div(
crispy.Field('use_user_case_for_filter'),
crispy.Field('user_data_property_name'),
crispy.Field('user_data_property_value'),
data_bind="visible: use_user_data_filter() !== 'N'",
Expand Down Expand Up @@ -2487,6 +2502,9 @@ def clean_occurrences(self):

return validate_int(self.cleaned_data.get('occurrences'), 2)

def clean_use_user_case_for_filter(self):
return self.cleaned_data.get('use_user_case_for_filter') == 'true'

def clean_user_data_property_name(self):
if self.cleaned_data.get('use_user_data_filter') == self.NO:
return None
Expand Down Expand Up @@ -2567,6 +2585,7 @@ def distill_extra_scheduling_options(self):
'location_type_filter': form_data['location_types'],
'use_utc_as_default_timezone': form_data['use_utc_as_default_timezone'],
'user_data_filter': self.distill_user_data_filter(),
'use_user_case_for_filter': self.cleaned_data['use_user_case_for_filter']
}

def distill_user_data_filter(self):
Expand Down
4 changes: 4 additions & 0 deletions corehq/messaging/scheduling/models/abstract.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,10 @@ class Schedule(models.Model):
# type is android and whose nickname is either bob or jim.
user_data_filter = jsonfield.JSONField(default=dict)

# If set to True, use the user case properties instead of the user properties
# to filter recipients
use_user_case_for_filter = models.BooleanField(default=False)

# Only applies when this Schedule is used with CaseAlertScheduleInstances or
# CaseTimedScheduleInstances.
# If null, this is ignored. Otherwise, it's the name of a case property which
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,14 @@ def passes_user_data_filter(self, contact):
if not self.memoized_schedule.user_data_filter:
return True

user_data = contact.get_user_data(self.domain)
if self.memoized_schedule.use_user_case_for_filter:
if contact.is_commcare_user():
user_case = contact.memoized_usercase
else:
user_case = contact.get_usercase_by_domain(self.domain)
user_data = user_case.case_json
else:
user_data = contact.get_user_data(self.domain)
for key, value in self.memoized_schedule.user_data_filter.items():
if key not in user_data:
return False
Expand Down
1 change: 1 addition & 0 deletions migrations.lock
Original file line number Diff line number Diff line change
Expand Up @@ -890,6 +890,7 @@ scheduling
0025_schedule_and_broadcast_deleted_on
0026_add_model_fcm_notification_content
0027_emailcontent_html_message
0028_alertschedule_use_user_case_for_filter_and_more
scheduling_partitioned
0001_initial
0002_case_schedule_instances
Expand Down
Loading