From ff906ef0737357d8a36cc4abdc712047e2a30d92 Mon Sep 17 00:00:00 2001 From: Ostap Zherebetskyi Date: Thu, 16 Jul 2026 17:21:13 +0300 Subject: [PATCH] Refactor filter handling in notification campaign --- admin/notifications/views.py | 9 +++++---- .../notifications/notification_campaigns_detail.html | 5 +++-- osf/email/notification_campaign.py | 12 +++++++----- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/admin/notifications/views.py b/admin/notifications/views.py index 0627063259e..6815d77534c 100644 --- a/admin/notifications/views.py +++ b/admin/notifications/views.py @@ -561,10 +561,11 @@ def get_queryset(self): if predefined := json_filters.get('predefined'): filters = FILTER_PRESETS.get(predefined, {}) else: - filters = { - f'{item["field"]}__{item["lookup"]}': item['value'] - for item in json_filters.get('manual', []) - } + for item in json_filters.get('manual', []): + if item['lookup'] != 'in': + filters[f'{item["field"]}__{item["lookup"]}'] = item['value'] + else: + filters[f'{item["field"]}__{item["lookup"]}'] = [value.strip() for value in item['value'].split(',')] return filter_users(filters) diff --git a/admin/templates/notifications/notification_campaigns_detail.html b/admin/templates/notifications/notification_campaigns_detail.html index fd520e77f79..12590cf1a70 100644 --- a/admin/templates/notifications/notification_campaigns_detail.html +++ b/admin/templates/notifications/notification_campaigns_detail.html @@ -40,7 +40,7 @@

Progress

style="display:inline;" > {% csrf_token %} - @@ -74,6 +74,7 @@

General

+
General style="display:inline;" > {% csrf_token %} -
diff --git a/osf/email/notification_campaign.py b/osf/email/notification_campaign.py index e88c41cc01b..31a041a5642 100644 --- a/osf/email/notification_campaign.py +++ b/osf/email/notification_campaign.py @@ -146,11 +146,13 @@ def start_notification_campaign(campaign_id, restart_failed=False): if predefined_filter_name := filters.get('predefined'): filters = FILTER_PRESETS.get(predefined_filter_name, {}) else: - filters = { - f'{item["field"]}__{item["lookup"]}': item['value'] - for item in filters.get('manual', []) - } - + manual_filters = {} + for item in filters.get('manual', []): + if item['lookup'] != 'in': + manual_filters[f'{item["field"]}__{item["lookup"]}'] = item['value'] + else: + manual_filters[f'{item["field"]}__{item["lookup"]}'] = [value.strip() for value in item['value'].split(',')] + filters = manual_filters tasks = [] total_recipients = 0 batch_size = campaign.metadata.get('execution', {}).get('batch_size', 1000)