diff --git a/CHANGELOG.rst b/CHANGELOG.rst index c136388d..e014f80c 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -31,10 +31,11 @@ Added - ``checkusers`` management command (#1410) - ``SODARPageNumberPagination`` pagination class (#1313) - Optional pagination for REST API list views (#1313) - - Email notification opt-out settings (#1417) + - Email notification opt-out settings (#1417, #1418) - CC and BCC field support in sending generic emails (#415) - ``SODARUserAdditionalEmail`` model (#874) - ``is_source_site()`` and ``is_target_site()`` rule predicates + - ``settings_link`` kwarg in ``send_generic_email()`` (#1418) - **Timeline** - ``sodar_uuid`` field in ``TimelineEventObjectRef`` model (#1415) - REST API views (#1350) diff --git a/projectroles/email.py b/projectroles/email.py index a9a9d6a2..8bfa7be0 100644 --- a/projectroles/email.py +++ b/projectroles/email.py @@ -11,6 +11,7 @@ from projectroles.app_settings import AppSettingAPI from projectroles.models import SODARUserAdditionalEmail +from projectroles.plugins import get_app_plugin from projectroles.utils import build_invite_url, get_display_name @@ -54,6 +55,11 @@ contact {admin_name} ({admin_email}). ''' +SETTINGS_LINK = r''' +You can manage receiving of automated emails in your user settings: +{url} +''' + # Role Change Template --------------------------------------------------------- @@ -277,23 +283,33 @@ def get_email_header(header): return getattr(settings, 'PROJECTROLES_EMAIL_HEADER', None) or header -def get_email_footer(): +def get_email_footer(request, settings_link=True): """ Return the email footer. + :param request: HttpRequest object + :param settings_link: Include link to user settings if True (optional) :return: string """ + footer = '' custom_footer = getattr(settings, 'PROJECTROLES_EMAIL_FOOTER', None) - if custom_footer: - return '\n' + custom_footer admin_recipient = settings.ADMINS[0] if settings.ADMINS else None - if admin_recipient: - return MESSAGE_FOOTER.format( + if custom_footer: + footer += '\n' + custom_footer + elif admin_recipient: + footer += MESSAGE_FOOTER.format( site_title=SITE_TITLE, admin_name=admin_recipient[0], admin_email=admin_recipient[1], ) - return '' + # Add user settings link if enabled and userprofile app is active + if request and settings_link and get_app_plugin('userprofile'): + footer += SETTINGS_LINK.format( + url=request.build_absolute_uri( + reverse('userprofile:settings_update') + ) + ) + return footer def get_invite_subject(project): @@ -331,7 +347,7 @@ def get_role_change_subject(change_type, project): def get_role_change_body( - change_type, project, user_name, role_name, issuer, project_url + change_type, project, user_name, role_name, issuer, request ): """ Return role change email body. @@ -341,9 +357,12 @@ def get_role_change_body( :param user_name: Name of target user :param role_name: Name of role as string :param issuer: User object for issuing user - :param project_url: URL for the project + :param request: HttpRequest object :return: String """ + project_url = request.build_absolute_uri( + reverse('projectroles:detail', kwargs={'project': project.sodar_uuid}) + ) body = get_email_header( MESSAGE_HEADER.format(recipient=user_name, site_title=SITE_TITLE) ) @@ -375,7 +394,7 @@ def get_role_change_body( ) if not issuer.email and not settings.PROJECTROLES_EMAIL_SENDER_REPLY: body += NO_REPLY_NOTE - body += get_email_footer() + body += get_email_footer(request) return body @@ -413,7 +432,7 @@ def send_mail( :param subject: Message subject (string) :param message: Message body (string) :param recipient_list: Recipients of email (list) - :param request: Request object (optional) + :param request: HttpRequest object (optional) :param reply_to: List of emails for the "reply-to" header (optional) :param cc: List of emails for "cc" field (optional) :param bcc: List of emails for "bcc" field (optional) @@ -436,7 +455,6 @@ def send_mail( ) ) return ret - except Exception as ex: error_msg = 'Error sending email: {}'.format(str(ex)) logger.error(error_msg) @@ -458,12 +476,9 @@ def send_role_change_mail(change_type, project, user, role, request): :param project: Project object :param user: User object :param role: Role object (can be None for deletion) - :param request: HTTP request + :param request: HttpRequest object :return: Amount of sent email (int) """ - project_url = request.build_absolute_uri( - reverse('projectroles:detail', kwargs={'project': project.sodar_uuid}) - ) subject = get_role_change_subject(change_type, project) message = get_role_change_body( change_type=change_type, @@ -471,7 +486,7 @@ def send_role_change_mail(change_type, project, user, role, request): user_name=user.get_full_name(), role_name=role.name if role else '', issuer=request.user, - project_url=project_url, + request=request, ) issuer_emails = get_user_addr(request.user) return send_mail( @@ -484,7 +499,7 @@ def send_invite_mail(invite, request): Send an email invitation to user not yet registered in the system. :param invite: ProjectInvite object - :param request: HTTP request + :param request: HttpRequest object :return: Amount of sent email (int) """ invite_url = build_invite_url(invite, request) @@ -498,7 +513,7 @@ def send_invite_mail(invite, request): ), ) message += get_invite_message(invite.message) - message += get_email_footer() + message += get_email_footer(request, settings_link=False) subject = get_invite_subject(invite.project) issuer_emails = get_user_addr(invite.issuer) return send_mail(subject, message, [invite.email], request, issuer_emails) @@ -510,7 +525,7 @@ def send_accept_note(invite, request, user): accepts the invitation. :param invite: ProjectInvite object - :param request: HTTP request + :param request: HttpRequest object :param user: User invited :return: Amount of sent email (int) """ @@ -534,7 +549,7 @@ def send_accept_note(invite, request, user): if not settings.PROJECTROLES_EMAIL_SENDER_REPLY: message += NO_REPLY_NOTE - message += get_email_footer() + message += get_email_footer(request) return send_mail(subject, message, get_user_addr(invite.issuer), request) @@ -544,7 +559,7 @@ def send_expiry_note(invite, request, user_name): attempts to accept an expired invitation. :param invite: ProjectInvite object - :param request: HTTP request + :param request: HttpRequest object :param user_name: User name of invited user :return: Amount of sent email (int) """ @@ -568,7 +583,7 @@ def send_expiry_note(invite, request, user_name): if not settings.PROJECTROLES_EMAIL_SENDER_REPLY: message += NO_REPLY_NOTE - message += get_email_footer() + message += get_email_footer(request) return send_mail(subject, message, get_user_addr(invite.issuer), request) @@ -578,7 +593,7 @@ def send_project_create_mail(project, request): they are a different user than the project creator. :param project: Project object for the newly created project - :param request: Request object + :param request: HttpRequest object :return: Amount of sent email (int) """ parent = project.parent @@ -609,7 +624,7 @@ def send_project_create_mail(project, request): ) ), ) - message += get_email_footer() + message += get_email_footer(request) return send_mail( subject, message, @@ -625,7 +640,7 @@ def send_project_move_mail(project, request): they are a different user than the project creator. :param project: Project object for the newly created project - :param request: Request object + :param request: HttpRequest object :return: Amount of sent email (int) """ parent = project.parent @@ -656,7 +671,7 @@ def send_project_move_mail(project, request): ) ), ) - message += get_email_footer() + message += get_email_footer(request) return send_mail( subject, message, @@ -672,7 +687,7 @@ def send_project_archive_mail(project, action, request): :param project: Project object :param action: String ("archive" or "unarchive") - :param request: HTTP request + :param request: HttpRequest object :return: Amount of sent email (int) """ user = request.user @@ -719,7 +734,7 @@ def send_project_archive_mail(project, action, request): message += body_final if not settings.PROJECTROLES_EMAIL_SENDER_REPLY: message += NO_REPLY_NOTE - message += get_email_footer() + message += get_email_footer(request) mail_count += send_mail(subject, message, get_user_addr(user), request) return mail_count @@ -732,6 +747,7 @@ def send_generic_mail( reply_to=None, cc=None, bcc=None, + settings_link=True, ): """ Send a generic mail with standard header and footer and no-reply @@ -740,10 +756,11 @@ def send_generic_mail( :param subject_body: Subject body without prefix (string) :param message_body: Message body before header or footer (string) :param recipient_list: Recipients (list of User objects or email strings) - :param request: Request object (optional) + :param request: HttpRequest object (optional) :param reply_to: List of emails for the "reply-to" header (optional) :param cc: List of emails for "cc" field (optional) :param bcc: List of emails for "bcc" field (optional) + :param settings_link: Include link to user settings if True (optional) :return: Amount of mail sent (int) """ subject = SUBJECT_PREFIX + subject_body @@ -761,7 +778,7 @@ def send_generic_mail( message += message_body if not reply_to and not settings.PROJECTROLES_EMAIL_SENDER_REPLY: message += NO_REPLY_NOTE - message += get_email_footer() + message += get_email_footer(request, settings_link) ret += send_mail( subject, message, recp_addr, request, reply_to, cc, bcc ) diff --git a/projectroles/tests/test_email.py b/projectroles/tests/test_email.py index 30d4cb4a..4eeaabc3 100644 --- a/projectroles/tests/test_email.py +++ b/projectroles/tests/test_email.py @@ -16,6 +16,7 @@ get_email_user, get_user_addr, get_email_footer, + SETTINGS_LINK, ) from projectroles.tests.test_models import ( ProjectMixin, @@ -54,8 +55,17 @@ class TestEmailSending( SODARUserAdditionalEmailMixin, TestCase, ): + """Tests for email sending""" + + def _get_settings_link(self): + """Return message footer settings link""" + return SETTINGS_LINK.format( + url=self.request.build_absolute_uri( + reverse('userprofile:settings_update') + ) + ) + def setUp(self): - self.factory = RequestFactory() # Init roles self.init_roles() # Init users @@ -83,49 +93,47 @@ def setUp(self): self.user_as = self.make_assignment( self.project, self.user, self.role_contributor ) + # Set up request factory and default request + self.factory = RequestFactory() + self.request = self.factory.get(reverse('home')) + self.request.user = self.user_owner def test_role_create_mail(self): """Test role creation mail sending""" - with self.login(self.user_owner): - request = self.factory.get(reverse('home')) - request.user = self.user_owner - email_sent = send_role_change_mail( - change_type='create', - project=self.project, - user=self.user, - role=self.user_as.role, - request=request, - ) - self.assertEqual(email_sent, 1) - self.assertEqual(len(mail.outbox), 1) - self.assertEqual(len(mail.outbox[0].to), 1) - self.assertEqual(mail.outbox[0].to[0], self.user.email) - self.assertEqual(len(mail.outbox[0].reply_to), 1) - self.assertEqual(mail.outbox[0].reply_to[0], self.user_owner.email) + email_sent = send_role_change_mail( + change_type='create', + project=self.project, + user=self.user, + role=self.user_as.role, + request=self.request, + ) + self.assertEqual(email_sent, 1) + self.assertEqual(len(mail.outbox), 1) + self.assertEqual(len(mail.outbox[0].to), 1) + self.assertEqual(mail.outbox[0].to[0], self.user.email) + self.assertEqual(len(mail.outbox[0].reply_to), 1) + self.assertEqual(mail.outbox[0].reply_to[0], self.user_owner.email) def test_role_create_mail_additional(self): """Test role creation with additional sender emails""" self.make_email(self.user, USER_ADD_EMAIL) self.make_email(self.user, USER_ADD_EMAIL2) - with self.login(self.user_owner): - request = self.factory.get(reverse('home')) - request.user = self.user_owner - email_sent = send_role_change_mail( - change_type='create', - project=self.project, - user=self.user, - role=self.user_as.role, - request=request, - ) - self.assertEqual(email_sent, 1) - self.assertEqual(len(mail.outbox), 1) - self.assertEqual(len(mail.outbox[0].to), 3) - self.assertEqual( - mail.outbox[0].to, - [self.user.email, USER_ADD_EMAIL, USER_ADD_EMAIL2], - ) - self.assertEqual(len(mail.outbox[0].reply_to), 1) - self.assertEqual(mail.outbox[0].reply_to[0], self.user_owner.email) + email_sent = send_role_change_mail( + change_type='create', + project=self.project, + user=self.user, + role=self.user_as.role, + request=self.request, + ) + self.assertEqual(email_sent, 1) + self.assertEqual(len(mail.outbox), 1) + self.assertEqual(len(mail.outbox[0].to), 3) + self.assertEqual( + mail.outbox[0].to, + [self.user.email, USER_ADD_EMAIL, USER_ADD_EMAIL2], + ) + self.assertEqual(len(mail.outbox[0].reply_to), 1) + self.assertEqual(mail.outbox[0].reply_to[0], self.user_owner.email) def test_role_create_mail_additional_no_default(self): """Test role creation with additional sender emails but no default email""" @@ -133,90 +141,78 @@ def test_role_create_mail_additional_no_default(self): self.make_email(self.user, USER_ADD_EMAIL2) self.user.email = '' self.user.save() - with self.login(self.user_owner): - request = self.factory.get(reverse('home')) - request.user = self.user_owner - email_sent = send_role_change_mail( - change_type='create', - project=self.project, - user=self.user, - role=self.user_as.role, - request=request, - ) - self.assertEqual(email_sent, 1) - self.assertEqual(len(mail.outbox), 1) - self.assertEqual(len(mail.outbox[0].to), 2) - self.assertEqual( - mail.outbox[0].to, - [USER_ADD_EMAIL, USER_ADD_EMAIL2], - ) - self.assertEqual(len(mail.outbox[0].reply_to), 1) - self.assertEqual(mail.outbox[0].reply_to[0], self.user_owner.email) + email_sent = send_role_change_mail( + change_type='create', + project=self.project, + user=self.user, + role=self.user_as.role, + request=self.request, + ) + self.assertEqual(email_sent, 1) + self.assertEqual(len(mail.outbox), 1) + self.assertEqual(len(mail.outbox[0].to), 2) + self.assertEqual( + mail.outbox[0].to, + [USER_ADD_EMAIL, USER_ADD_EMAIL2], + ) + self.assertEqual(len(mail.outbox[0].reply_to), 1) + self.assertEqual(mail.outbox[0].reply_to[0], self.user_owner.email) def test_role_create_mail_additional_reply(self): """Test role creation with additional reply-to emails""" self.make_email(self.user_owner, USER_ADD_EMAIL) self.make_email(self.user_owner, USER_ADD_EMAIL2) - with self.login(self.user_owner): - request = self.factory.get(reverse('home')) - request.user = self.user_owner - email_sent = send_role_change_mail( - change_type='create', - project=self.project, - user=self.user, - role=self.user_as.role, - request=request, - ) - self.assertEqual(email_sent, 1) - self.assertEqual(len(mail.outbox), 1) - self.assertEqual(len(mail.outbox[0].to), 1) - self.assertEqual( - mail.outbox[0].to, - [self.user.email], - ) - self.assertEqual(len(mail.outbox[0].reply_to), 3) - self.assertEqual( - mail.outbox[0].reply_to, - [self.user_owner.email, USER_ADD_EMAIL, USER_ADD_EMAIL2], - ) + email_sent = send_role_change_mail( + change_type='create', + project=self.project, + user=self.user, + role=self.user_as.role, + request=self.request, + ) + self.assertEqual(email_sent, 1) + self.assertEqual(len(mail.outbox), 1) + self.assertEqual(len(mail.outbox[0].to), 1) + self.assertEqual( + mail.outbox[0].to, + [self.user.email], + ) + self.assertEqual(len(mail.outbox[0].reply_to), 3) + self.assertEqual( + mail.outbox[0].reply_to, + [self.user_owner.email, USER_ADD_EMAIL, USER_ADD_EMAIL2], + ) def test_role_update_mail(self): """Test role updating mail sending""" - with self.login(self.user_owner): - request = self.factory.get(reverse('home')) - request.user = self.user_owner - email_sent = send_role_change_mail( - change_type='update', - project=self.project, - user=self.user, - role=self.user_as.role, - request=request, - ) - self.assertEqual(email_sent, 1) - self.assertEqual(len(mail.outbox), 1) - self.assertEqual(len(mail.outbox[0].to), 1) - self.assertEqual(mail.outbox[0].to[0], self.user.email) - self.assertEqual(len(mail.outbox[0].reply_to), 1) - self.assertEqual(mail.outbox[0].reply_to[0], self.user_owner.email) + email_sent = send_role_change_mail( + change_type='update', + project=self.project, + user=self.user, + role=self.user_as.role, + request=self.request, + ) + self.assertEqual(email_sent, 1) + self.assertEqual(len(mail.outbox), 1) + self.assertEqual(len(mail.outbox[0].to), 1) + self.assertEqual(mail.outbox[0].to[0], self.user.email) + self.assertEqual(len(mail.outbox[0].reply_to), 1) + self.assertEqual(mail.outbox[0].reply_to[0], self.user_owner.email) def test_role_delete_mail(self): """Test role deletion mail sending""" - with self.login(self.user_owner): - request = self.factory.get(reverse('home')) - request.user = self.user_owner - email_sent = send_role_change_mail( - change_type='delete', - project=self.project, - user=self.user, - role=None, - request=request, - ) - self.assertEqual(email_sent, 1) - self.assertEqual(len(mail.outbox), 1) - self.assertEqual(len(mail.outbox[0].to), 1) - self.assertEqual(mail.outbox[0].to[0], self.user.email) - self.assertEqual(len(mail.outbox[0].reply_to), 1) - self.assertEqual(mail.outbox[0].reply_to[0], self.user_owner.email) + email_sent = send_role_change_mail( + change_type='delete', + project=self.project, + user=self.user, + role=None, + request=self.request, + ) + self.assertEqual(email_sent, 1) + self.assertEqual(len(mail.outbox), 1) + self.assertEqual(len(mail.outbox[0].to), 1) + self.assertEqual(mail.outbox[0].to[0], self.user.email) + self.assertEqual(len(mail.outbox[0].reply_to), 1) + self.assertEqual(mail.outbox[0].reply_to[0], self.user_owner.email) def test_project_create_mail(self): """Test project creation mail sending""" @@ -224,140 +220,129 @@ def test_project_create_mail(self): 'New Project', PROJECT_TYPE_PROJECT, self.category ) self.make_assignment(new_project, self.user, self.role_owner) - with self.login(self.user): - request = self.factory.get(reverse('home')) - request.user = self.user - email_sent = send_project_create_mail( - project=new_project, - request=request, - ) - self.assertEqual(email_sent, 1) - self.assertEqual(len(mail.outbox), 1) - self.assertEqual(len(mail.outbox[0].to), 1) - self.assertEqual(mail.outbox[0].to[0], self.user_owner.email) - self.assertEqual(len(mail.outbox[0].reply_to), 1) - self.assertEqual(mail.outbox[0].reply_to[0], self.user.email) + self.request.user = self.user + email_sent = send_project_create_mail( + project=new_project, + request=self.request, + ) + self.assertEqual(email_sent, 1) + self.assertEqual(len(mail.outbox), 1) + self.assertEqual(len(mail.outbox[0].to), 1) + self.assertEqual(mail.outbox[0].to[0], self.user_owner.email) + self.assertEqual(len(mail.outbox[0].reply_to), 1) + self.assertEqual(mail.outbox[0].reply_to[0], self.user.email) def test_generic_mail_user(self): """Test send_generic_mail() with a User recipient""" - with self.login(self.user_owner): - request = self.factory.get(reverse('home')) - request.user = self.user_owner - email_sent = send_generic_mail( - subject_body=SUBJECT_BODY, - message_body=MESSAGE_BODY, - recipient_list=[self.user], - request=request, - reply_to=[self.user_owner.email], - ) - self.assertEqual(email_sent, 1) - self.assertEqual(len(mail.outbox), 1) - self.assertEqual(len(mail.outbox[0].to), 1) - self.assertEqual(mail.outbox[0].to[0], self.user.email) - self.assertEqual(len(mail.outbox[0].reply_to), 1) - self.assertEqual(mail.outbox[0].reply_to[0], self.user_owner.email) + email_sent = send_generic_mail( + subject_body=SUBJECT_BODY, + message_body=MESSAGE_BODY, + recipient_list=[self.user], + request=self.request, + reply_to=[self.user_owner.email], + ) + self.assertEqual(email_sent, 1) + self.assertEqual(len(mail.outbox), 1) + self.assertEqual(len(mail.outbox[0].to), 1) + self.assertEqual(mail.outbox[0].to[0], self.user.email) + self.assertEqual(len(mail.outbox[0].reply_to), 1) + self.assertEqual(mail.outbox[0].reply_to[0], self.user_owner.email) def test_generic_mail_user_additional(self): """Test send_generic_mail() with a User and additional emails""" self.make_email(self.user, USER_ADD_EMAIL) self.make_email(self.user, USER_ADD_EMAIL2) - with self.login(self.user_owner): - request = self.factory.get(reverse('home')) - request.user = self.user_owner - email_sent = send_generic_mail( - subject_body=SUBJECT_BODY, - message_body=MESSAGE_BODY, - recipient_list=[self.user], - request=request, - reply_to=[self.user_owner.email], - ) - self.assertEqual(email_sent, 1) - self.assertEqual(len(mail.outbox), 1) - self.assertEqual(len(mail.outbox[0].to), 3) - self.assertEqual( - mail.outbox[0].to, - [self.user.email, USER_ADD_EMAIL, USER_ADD_EMAIL2], - ) - self.assertEqual(len(mail.outbox[0].reply_to), 1) - self.assertEqual(mail.outbox[0].reply_to[0], self.user_owner.email) + email_sent = send_generic_mail( + subject_body=SUBJECT_BODY, + message_body=MESSAGE_BODY, + recipient_list=[self.user], + request=self.request, + reply_to=[self.user_owner.email], + ) + self.assertEqual(email_sent, 1) + self.assertEqual(len(mail.outbox), 1) + self.assertEqual(len(mail.outbox[0].to), 3) + self.assertEqual( + mail.outbox[0].to, + [self.user.email, USER_ADD_EMAIL, USER_ADD_EMAIL2], + ) + self.assertEqual(len(mail.outbox[0].reply_to), 1) + self.assertEqual(mail.outbox[0].reply_to[0], self.user_owner.email) def test_generic_mail_str(self): """Test send_generic_mail() with an email string recipient""" - with self.login(self.user_owner): - request = self.factory.get(reverse('home')) - request.user = self.user_owner - email_sent = send_generic_mail( - subject_body=SUBJECT_BODY, - message_body=MESSAGE_BODY, - recipient_list=[self.user.email], - request=request, - reply_to=[self.user_owner.email], - ) - self.assertEqual(email_sent, 1) - self.assertEqual(len(mail.outbox), 1) - self.assertEqual(len(mail.outbox[0].to), 1) - self.assertEqual(mail.outbox[0].to[0], self.user.email) - self.assertEqual(len(mail.outbox[0].reply_to), 1) - self.assertEqual(mail.outbox[0].reply_to[0], self.user_owner.email) + email_sent = send_generic_mail( + subject_body=SUBJECT_BODY, + message_body=MESSAGE_BODY, + recipient_list=[self.user.email], + request=self.request, + reply_to=[self.user_owner.email], + ) + self.assertEqual(email_sent, 1) + self.assertEqual(len(mail.outbox), 1) + self.assertEqual(len(mail.outbox[0].to), 1) + self.assertEqual(mail.outbox[0].to[0], self.user.email) + self.assertEqual(len(mail.outbox[0].reply_to), 1) + self.assertEqual(mail.outbox[0].reply_to[0], self.user_owner.email) def test_generic_mail_multiple(self): """Test send_generic_mail() with multiple recipients""" - # Init new user user_new = self.make_user('newuser') - with self.login(self.user_owner): - request = self.factory.get(reverse('home')) - request.user = self.user_owner - email_sent = send_generic_mail( - subject_body=SUBJECT_BODY, - message_body=MESSAGE_BODY, - recipient_list=[self.user_owner, user_new], - request=request, - ) - self.assertEqual(email_sent, 2) - self.assertEqual(len(mail.outbox), 2) + email_sent = send_generic_mail( + subject_body=SUBJECT_BODY, + message_body=MESSAGE_BODY, + recipient_list=[self.user_owner, user_new], + request=self.request, + ) + self.assertEqual(email_sent, 2) + self.assertEqual(len(mail.outbox), 2) def test_get_email_footer(self): """Test get_email_footer() with default admin""" - footer = get_email_footer() + footer = get_email_footer(self.request) self.assertIn(settings.ADMINS[0][0], footer) self.assertIn(settings.ADMINS[0][1], footer) + self.assertIn(self._get_settings_link(), footer) @override_settings(ADMINS=[]) def test_get_email_footer_no_admin(self): """Test get_email_footer() with empty admin list""" - self.assertEqual(get_email_footer(), '') + self.assertEqual( + get_email_footer(self.request), self._get_settings_link() + ) + + def test_get_email_footer_no_settings(self): + """Test get_email_footer() with no settings link""" + footer = get_email_footer(self.request, settings_link=False) + self.assertIn(settings.ADMINS[0][0], footer) + self.assertIn(settings.ADMINS[0][1], footer) + self.assertNotIn(self._get_settings_link(), footer) @override_settings(PROJECTROLES_EMAIL_HEADER=CUSTOM_HEADER) def test_custom_header(self): """Test send_generic_mail() with custom header""" - with self.login(self.user_owner): - request = self.factory.get(reverse('home')) - request.user = self.user_owner - send_generic_mail( - subject_body=SUBJECT_BODY, - message_body=MESSAGE_BODY, - recipient_list=[self.user_owner.email], - request=request, - reply_to=[self.user_owner.email], - ) - self.assertIn(CUSTOM_HEADER, mail.outbox[0].body) - self.assertNotIn(CUSTOM_FOOTER, mail.outbox[0].body) + send_generic_mail( + subject_body=SUBJECT_BODY, + message_body=MESSAGE_BODY, + recipient_list=[self.user_owner.email], + request=self.request, + reply_to=[self.user_owner.email], + ) + self.assertIn(CUSTOM_HEADER, mail.outbox[0].body) + self.assertNotIn(CUSTOM_FOOTER, mail.outbox[0].body) @override_settings(PROJECTROLES_EMAIL_FOOTER=CUSTOM_FOOTER) def test_custom_footer(self): """Test send_generic_mail() with custom footer""" - with self.login(self.user_owner): - request = self.factory.get(reverse('home')) - request.user = self.user_owner - send_generic_mail( - subject_body=SUBJECT_BODY, - message_body=MESSAGE_BODY, - recipient_list=[self.user_owner.email], - request=request, - reply_to=[self.user_owner.email], - ) - self.assertNotIn(CUSTOM_HEADER, mail.outbox[0].body) - self.assertIn(CUSTOM_FOOTER, mail.outbox[0].body) + send_generic_mail( + subject_body=SUBJECT_BODY, + message_body=MESSAGE_BODY, + recipient_list=[self.user_owner.email], + request=self.request, + reply_to=[self.user_owner.email], + ) + self.assertNotIn(CUSTOM_HEADER, mail.outbox[0].body) + self.assertIn(CUSTOM_FOOTER, mail.outbox[0].body) def test_get_email_user(self): """Test get_email_user()""" diff --git a/projectroles/views.py b/projectroles/views.py index ec74ea5d..5b9e04c4 100644 --- a/projectroles/views.py +++ b/projectroles/views.py @@ -1729,12 +1729,7 @@ def get_context_data(self, *args, **kwargs): user_name='{user_name}', issuer=self.request.user, role_name='{role_name}', - project_url=self.request.build_absolute_uri( - reverse( - 'projectroles:detail', - kwargs={'project': project.sodar_uuid}, - ) - ), + request=self.request, ).replace('\n', '\\n') return context @@ -2416,9 +2411,9 @@ def get_context_data(self, *args, **kwargs): context['preview_message'] = email.get_invite_message( '{message}' ).replace('\n', '\\n') - context['preview_footer'] = email.get_email_footer().replace( - '\n', '\\n' - ) + context['preview_footer'] = email.get_email_footer( + self.request + ).replace('\n', '\\n') return context def get_form_kwargs(self):