Projet

Général

Profil

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

Valentin Deniaud, 14 novembre 2019 14:08

Télécharger (12,5 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                             |  4 ++
 .../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, 73 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
613 613

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

  
648 656
    send_mail(subject, body, from_email or settings.DEFAULT_FROM_EMAIL, [user_or_email],
649 657
              html_message=html_body, **kwargs)
650 658

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

  
759 765

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

  
777 781

  
......
826 830
                                                       set_random_password=set_random_password,
827 831
                                                       sign_next_url=sign_next_url)
828 832

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

  
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
40 40

  
41 41

  
42 42
ALLOWED_HOSTS = ALLOWED_HOSTS + ['example.net', 'cache1.example.com', 'cache2.example.com']
43

  
44
BASE_TEST_DIR = os.path.join(os.path.dirname(os.path.dirname(BASE_DIR)), 'tests')
45

  
46
TEMPLATES[0]['DIRS'].append(os.path.join(BASE_TEST_DIR, '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
-