22import json
33from collections import defaultdict
44from django .urls import reverse_lazy
5- from django .db .models import Q
5+ from django .db .models import Q , F
66from django .db import models
77from django .shortcuts import get_object_or_404 , redirect
88from django .views .generic import ListView , DetailView , UpdateView , CreateView , View
99from django .contrib import messages
1010from django .contrib .auth .mixins import PermissionRequiredMixin
11- from osf .models import NotificationSubscription , NotificationType , Notification , EmailTask , NotificationCampaign , OSFUser
11+ from osf .models import NotificationSubscription , NotificationType , Notification , EmailTask , NotificationCampaign , OSFUser , NotificationCampaignRecipient
1212from osf .models .notification_campaign import NotificationCampaignStatus
1313from django .forms .models import model_to_dict
1414from .forms import NotificationTypeForm , NotificationCampaignCreateForm
@@ -549,7 +549,7 @@ def get_context_data(self, **kwargs):
549549
550550
551551class NotificationCampaignsRecipientsPreview (PermissionRequiredMixin , ListView ):
552- template_name = 'users/list .html'
552+ template_name = 'notifications/notification_campaing_recipients_preview .html'
553553 permission_required = 'osf.view_osfuser'
554554 raise_exception = True
555555 paginate_by = 25
@@ -568,7 +568,10 @@ def get_queryset(self):
568568 else :
569569 filters [f'{ item ["field" ]} __{ item ["lookup" ]} ' ] = [value .strip () for value in item ['value' ].split (',' )]
570570
571- return filter_users (filters )
571+ qs = filter_users (filters )
572+ return qs .annotate (
573+ guid = F ('guids___id' )
574+ )
572575
573576 def get_context_data (self , ** kwargs ):
574577 users = self .get_queryset ()
@@ -588,6 +591,45 @@ def get_context_data(self, **kwargs):
588591 is_paginated = is_paginated ,
589592 )
590593
594+ class NotificationCampaignsRecipientsView (PermissionRequiredMixin , ListView ):
595+ template_name = 'notifications/notification_campaing_recipients_list.html'
596+ permission_required = 'osf.view_osfuser'
597+ raise_exception = True
598+ paginate_by = 25
599+
600+ def get_queryset (self ):
601+ status = self .request .GET .get ('notification_status' , None )
602+ campaign_id = self .request .GET .get ('campaign_id' , None )
603+ if not campaign_id :
604+ return NotificationCampaignRecipient .objects .none ()
605+ query = {'campaign_id' : campaign_id }
606+ if status :
607+ query ['status' ] = status
608+
609+ qs = NotificationCampaignRecipient .objects .filter (** query )
610+
611+ return qs .annotate (
612+ guid = F ('user__guids___id' )
613+ )
614+
615+ def get_context_data (self , ** kwargs ):
616+ users = self .get_queryset ()
617+
618+ page_size = self .get_paginate_by (users )
619+ paginator , page , query_set , is_paginated = self .paginate_queryset (
620+ users ,
621+ page_size ,
622+ )
623+ # append search param to pagination links
624+ kwargs .update ({'extra_query_params' : f'¬ification_status={ self .request .GET .get ("notification_status" )} &campaign_id={ self .request .GET .get ('campaign_id' )} ' })
625+ return super ().get_context_data (
626+ ** kwargs ,
627+ page = page ,
628+ query_set = query_set ,
629+ paginator = paginator ,
630+ is_paginated = is_paginated ,
631+ )
632+
591633class StartNotificationCampaign (PermissionRequiredMixin , View ):
592634 permission_required = 'osf.change_notificationtype'
593635
0 commit comments