Projet

Général

Profil

0001-utils-handle-per-ou-template-in-send_templated_mail-.patch

Valentin Deniaud, 19 mars 2020 15:19

Télécharger (12,4 ko)

Voir les différences:

Subject: [PATCH 1/2] utils: handle per ou template in send_templated_mail
 (#35774)

 src/authentic2/utils/__init__.py              | 23 +++++++----
 src/django_rbac/test_settings.py              |  3 ++
 tests/settings.py                             |  2 +
 .../templates/custom_mail_template_body.html  |  1 +
 tests/templates/custom_mail_template_body.txt |  1 +
 .../custom_mail_template_ou_name_body.html    |  1 +
 .../custom_mail_template_ou_name_body.txt     |  1 +
 .../custom_mail_template_ou_name_subject.txt  |  1 +
 .../custom_mail_template_subject.txt          |  1 +
 .../templates/default_mail_template_body.html |  1 +
 .../templates/default_mail_template_body.txt  |  1 +
 .../default_mail_template_ou_name_body.html   |  1 +
 .../default_mail_template_ou_name_body.txt    |  1 +
 .../default_mail_template_ou_name_subject.txt |  1 +
 .../default_mail_template_subject.txt         |  1 +
 tests/test_utils.py                           | 41 ++++++++++++++++++-
 16 files changed, 71 insertions(+), 10 deletions(-)
 create mode 100644 tests/templates/custom_mail_template_body.html
 create mode 100644 tests/templates/custom_mail_template_body.txt
 create mode 100644 tests/templates/custom_mail_template_ou_name_body.html
 create mode 100644 tests/templates/custom_mail_template_ou_name_body.txt
 create mode 100644 tests/templates/custom_mail_template_ou_name_subject.txt
 create mode 100644 tests/templates/custom_mail_template_subject.txt
 create mode 100644 tests/templates/default_mail_template_body.html
 create mode 100644 tests/templates/default_mail_template_body.txt
 create mode 100644 tests/templates/default_mail_template_ou_name_body.html
 create mode 100644 tests/templates/default_mail_template_ou_name_body.txt
 create mode 100644 tests/templates/default_mail_template_ou_name_subject.txt
 create mode 100644 tests/templates/default_mail_template_subject.txt
src/authentic2/utils/__init__.py
615 615

  
616 616
def send_templated_mail(user_or_email, template_names, context=None, with_html=True,
617 617
                        from_email=None, request=None, legacy_subject_templates=None,
618
                        legacy_body_templates=None, legacy_html_body_templates=None, **kwargs):
618
                        legacy_body_templates=None, legacy_html_body_templates=None,
619
                        per_ou_templates=False, **kwargs):
619 620
    '''Send mail to an user by using templates:
620 621
       - <template_name>_subject.txt for the subject
621 622
       - <template_name>_body.txt for the plain text body
......
624 625
    from .. import middleware
625 626
    if isinstance(template_names, six.string_types):
626 627
        template_names = [template_names]
628
    if per_ou_templates and getattr(user_or_email, 'ou', None):
629
        new_template_names = []
630
        for template in template_names:
631
            new_template_names.append('_'.join((template, user_or_email.ou.slug)))
632
            new_template_names.append(template)
633
        template_names = new_template_names
627 634
    if hasattr(user_or_email, 'email'):
628 635
        user_or_email = user_or_email.email
629 636
    if not request:
......
647 654
            html_body = render_to_string(html_body_template_names, ctx, request=request)
648 655
        except TemplateDoesNotExist:
649 656
            html_body = None
657

  
650 658
    send_mail(subject, body, from_email or settings.DEFAULT_FROM_EMAIL, [user_or_email],
651 659
              html_message=html_body, **kwargs)
652 660

  
......
753 761
        'deletion_url': deletion_url}
754 762
    template_names = [
755 763
        'authentic2/account_deletion_code']
756
    if user.ou:
757
        template_names.insert(0, 'authentic2/account_deletion_code_%s' % user.ou.slug)
758
    send_templated_mail(user.email, template_names, context, request=request)
764
    send_templated_mail(user, template_names, context, request=request, per_ou_templates=True)
759 765
    logger.info(u'account deletion code sent to %s', user.email)
760 766

  
761 767

  
......
771 777
        'site': request.get_host()}
772 778
    template_names = [
773 779
        'authentic2/account_delete_notification']
774
    if user.ou:
775
        template_names.insert(0, 'authentic2/account_delete_notification_%s' % user.ou.slug)
776
    send_templated_mail(user.email, template_names, context, request=request)
780
    send_templated_mail(user, template_names, context, request=request, per_ou_templates=True)
777 781
    logger.info(u'account deletion mail sent to %s', user.email)
778 782

  
779 783

  
......
828 832
                                                       set_random_password=set_random_password,
829 833
                                                       sign_next_url=sign_next_url)
830 834

  
831
    send_templated_mail(user.email, template_names, ctx, request=request,
835
    send_templated_mail(user, template_names, ctx, request=request,
832 836
                        legacy_subject_templates=legacy_subject_templates,
833
                        legacy_body_templates=legacy_body_templates, **kwargs)
837
                        legacy_body_templates=legacy_body_templates,
838
                        per_ou_templates=True, **kwargs)
834 839
    logger.info(u'password reset request for user %s, email sent to %s '
835 840
                'with token %s', user, user.email, token[:9])
836 841

  
src/django_rbac/test_settings.py
21 21

  
22 22
ALLOWED_HOSTS = []
23 23

  
24
BASE_DIR = os.path.dirname(__file__)
25
TEMPLATES = [{'DIRS': []}]
26

  
24 27
if 'AUTHENTIC2_SETTINGS_FILE' in os.environ:
25 28
    with open(os.environ['AUTHENTIC2_SETTINGS_FILE']) as fd:
26 29
        exec(fd.read())
tests/settings.py
44 44
A2_AUTH_KERBEROS_ENABLED = False
45 45

  
46 46
A2_VALIDATE_EMAIL_DOMAIN = False
47

  
48
TEMPLATES[0]['DIRS'].append('tests/templates')
tests/templates/custom_mail_template_body.html
1
custom_mail_template
tests/templates/custom_mail_template_body.txt
1
custom_mail_template
tests/templates/custom_mail_template_ou_name_body.html
1
custom_mail_template_ou_name
tests/templates/custom_mail_template_ou_name_body.txt
1
custom_mail_template_ou_name
tests/templates/custom_mail_template_ou_name_subject.txt
1
custom_mail_template_ou_name
tests/templates/custom_mail_template_subject.txt
1
custom_mail_template
tests/templates/default_mail_template_body.html
1
default_mail_template
tests/templates/default_mail_template_body.txt
1
default_mail_template
tests/templates/default_mail_template_ou_name_body.html
1
default_mail_template_ou_name
tests/templates/default_mail_template_ou_name_body.txt
1
default_mail_template_ou_name
tests/templates/default_mail_template_ou_name_subject.txt
1
default_mail_template_ou_name
tests/templates/default_mail_template_subject.txt
1
default_mail_template
tests/test_utils.py
17 17

  
18 18
from django.contrib.auth.middleware import AuthenticationMiddleware
19 19
from django.contrib.sessions.middleware import SessionMiddleware
20
from django.core import mail
21

  
22
from django_rbac.utils import get_ou_model
20 23

  
21 24
from authentic2.utils import (good_next_url, same_origin, select_next_url,
22 25
                              user_can_change_password, login,
23
                              get_authentication_events, authenticate)
26
                              get_authentication_events, authenticate,
27
                              send_templated_mail)
24 28

  
25 29

  
26 30
def test_good_next_url(db, rf, settings):
......
116 120
    request.COOKIES['preferrence'] = '1 2 3 4 5'
117 121
    prepend_remember_cookie(request, response, 'preferrence', 7)
118 122
    assert response.cookies['preferrence'].value == '7 1 2 3 4'
123

  
124

  
125
def test_send_templated_mail_template_selection(simple_user):
126
    ou = get_ou_model().objects.create(slug='ou_name')
127
    simple_user.ou = ou
128
    default_template = 'default_mail_template'
129
    specific_template = 'custom_mail_template'
130
    default_template_ou = '_'.join((default_template, ou.slug))
131
    specific_template_ou = '_'.join((specific_template, ou.slug))
132
    template_names = [default_template]
133

  
134
    send_templated_mail(simple_user, template_names)
135
    assert len(mail.outbox) == 1
136
    sent_mail = mail.outbox.pop()
137
    assert sent_mail.subject == default_template
138
    assert sent_mail.body == default_template
139

  
140
    send_templated_mail(simple_user, template_names, per_ou_templates=True)
141
    assert len(mail.outbox) == 1
142
    sent_mail = mail.outbox.pop()
143
    assert sent_mail.subject == default_template_ou
144
    assert sent_mail.body == default_template_ou
145

  
146
    template_names.insert(0, specific_template)
147
    send_templated_mail(simple_user, template_names)
148
    assert len(mail.outbox) == 1
149
    sent_mail = mail.outbox.pop()
150
    assert sent_mail.subject == specific_template
151
    assert sent_mail.body == specific_template
152

  
153
    send_templated_mail(simple_user, template_names, per_ou_templates=True)
154
    assert len(mail.outbox) == 1
155
    sent_mail = mail.outbox.pop()
156
    assert sent_mail.subject == specific_template_ou
157
    assert sent_mail.body == specific_template_ou
119
-