1010
1111from hypha .apply .activity import tasks
1212from hypha .apply .activity .models import ALL , APPLICANT_PARTNERS , PARTNER
13- from hypha .apply .funds .models .co_applicants import COMMENT , EDIT
13+ from hypha .apply .funds .models .co_applicants import (
14+ CoApplicantProjectPermission ,
15+ CoApplicantRole ,
16+ )
1417from hypha .apply .projects .models .payment import (
1518 APPROVED_BY_FINANCE ,
1619 CHANGES_REQUESTED_BY_FINANCE ,
@@ -418,7 +421,13 @@ def recipients(self, message_type, source, user, **kwargs):
418421 APPROVED_BY_FINANCE ,
419422 PAYMENT_FAILED ,
420423 }:
421- return [source .user .email ]
424+ co_applicants = source .submission .co_applicants .filter (
425+ project_permission__contains = [
426+ CoApplicantProjectPermission .INVOICES
427+ ],
428+ role__in = [CoApplicantRole .EDIT ],
429+ ).values_list ("user__email" , flat = True )
430+ return [source .user .email , * co_applicants ]
422431 elif status in {CHANGES_REQUESTED_BY_FINANCE , RESUBMITTED }:
423432 return [source .lead .email ]
424433 return []
@@ -436,7 +445,13 @@ def recipients(self, message_type, source, user, **kwargs):
436445 )
437446 return get_compliance_email (target_user_gps = [CONTRACTING_GROUP_NAME ])
438447 if source .status == INVOICING_AND_REPORTING :
439- return [source .user .email ]
448+ co_applicants = source .submission .co_applicants .filter (
449+ project_permission__contains = [
450+ CoApplicantProjectPermission .INVOICES
451+ ],
452+ role__in = [CoApplicantRole .EDIT ],
453+ ).values_list ("user__email" , flat = True )
454+ return [source .user .email , * co_applicants ]
440455
441456 if message_type == MESSAGES .APPROVE_INVOICE :
442457 if user .is_apply_staff :
@@ -447,7 +462,13 @@ def recipients(self, message_type, source, user, **kwargs):
447462 if user == source .user :
448463 return [source .lead .email ]
449464 else :
450- return [source .user .email ]
465+ co_applicants = source .submission .co_applicants .filter (
466+ project_permission__contains = [
467+ CoApplicantProjectPermission .INVOICES
468+ ],
469+ role__in = [CoApplicantRole .EDIT ],
470+ ).values_list ("user__email" , flat = True )
471+ return [source .user .email , * co_applicants ]
451472
452473 if isinstance (source , get_user_model ()):
453474 return user .email
@@ -456,35 +477,50 @@ def recipients(self, message_type, source, user, **kwargs):
456477 Project = apps .get_model ("application_projects" , "Project" )
457478 if message_type == MESSAGES .COMMENT :
458479 # Comment handling for Submissions
480+ comment = kwargs ["related" ]
459481 if isinstance (source , ApplicationSubmission ):
460482 # add co-applicants with Comment or edit access
461483 co_applicants = source .co_applicants .filter (
462- role__in = [COMMENT , EDIT ]
484+ role__in = [CoApplicantRole . COMMENT , CoApplicantRole . EDIT ]
463485 ).values_list ("user__email" , flat = True )
464486 recipients : List [str ] = [source .user .email , * co_applicants ]
465487
466- comment = kwargs ["related" ]
467488 if partners := list (source .partners .values_list ("email" , flat = True )):
468489 if comment .visibility == PARTNER :
469490 recipients = partners
470491 elif comment .visibility in [APPLICANT_PARTNERS , ALL ]:
471492 recipients += partners
472493
473- try :
474- recipients .remove (comment .user .email )
475- except ValueError :
476- pass
477-
478- return recipients
479-
480494 # Comment handling for Projects
481- if isinstance (source , Project ) and user == source .user :
482- return []
495+ elif isinstance (source , Project ):
496+ # co_applciants with Comment permission
497+ co_applicants = (
498+ source .submission .co_applicants .filter (
499+ role__in = [CoApplicantRole .COMMENT , CoApplicantRole .EDIT ]
500+ )
501+ .exclude (project_permission = [])
502+ .values_list ("user__email" , flat = True )
503+ )
504+ recipients = [source .user .email , * co_applicants ]
505+ try :
506+ recipients .remove (comment .user .email )
507+ except ValueError :
508+ pass
509+
510+ return recipients
483511
484512 if isinstance (source , ApplicationSubmission ):
485513 # co-applicants edit/full-access access
486- co_applicants = source .co_applicants .filter (role__in = [EDIT ]).values_list (
487- "user__email" , flat = True
514+ co_applicants = source .co_applicants .filter (
515+ role__in = [CoApplicantRole .EDIT ]
516+ ).values_list ("user__email" , flat = True )
517+ return [source .user .email , * co_applicants ]
518+ elif isinstance (source , Project ):
519+ # co-applicants edit access
520+ co_applicants = (
521+ source .submission .co_applicants .exclude (project_permission = [])
522+ .filter (role__in = [CoApplicantRole .EDIT ])
523+ .values_list ("user__email" , flat = True )
488524 )
489525 return [source .user .email , * co_applicants ]
490526 return [source .user .email ]
0 commit comments