Projet

Général

Profil

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

Valentin Deniaud, 07 novembre 2019 17:58

Télécharger (7,59 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 ++++++----
 tests/test_utils.py              | 75 +++++++++++++++++++++++++++++++-
 2 files changed, 88 insertions(+), 10 deletions(-)
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

  
tests/test_utils.py
15 15
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 16
# authentic2
17 17

  
18
import pytest
19

  
18 20
from django.contrib.auth.middleware import AuthenticationMiddleware
19 21
from django.contrib.sessions.middleware import SessionMiddleware
22
from django.core import mail
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
@pytest.fixture
126
def templates(settings):
127
    from django.template import engines
128
    templates = {}
129
    settings.TEMPLATES[0]['APP_DIRS'] = False
130
    loaders = settings.TEMPLATES[0]['OPTIONS'].get('loaders')
131
    settings.TEMPLATES[0]['OPTIONS']['loaders'] = [
132
            ('django.template.loaders.locmem.Loader', templates)
133
    ]
134
    try:
135
        del engines.templates
136
    except AttributeError:
137
        pass
138
    engines._templates = None
139
    engines._engines = {}
140
    yield templates
141
    if loaders:
142
        settings.TEMPLATES[0]['OPTIONS']['loaders'] = loaders
143
    else:
144
        del settings.TEMPLATES[0]['OPTIONS']['loaders']
145
    try:
146
        del engines.templates
147
    except AttributeError:
148
        pass
149
    engines._templates = None
150
    engines._engines = {}
151

  
152

  
153
def test_send_templated_mail_template_selection(templates, simple_user):
154
    default_template = 'default_template'
155
    specific_template = 'specific_template'
156
    default_template_ou = '_'.join((default_template, simple_user.ou.slug))
157
    specific_template_ou = '_'.join((specific_template, simple_user.ou.slug))
158
    template_names = [specific_template, default_template]
159

  
160
    def add_template(template):
161
        extensions = ['_body.html', '_body.txt', '_subject.txt']
162
        for ext in extensions:
163
            templates[template + ext] = template
164

  
165
    add_template(default_template)
166
    send_templated_mail(simple_user, template_names, per_ou_templates=True)
167
    assert len(mail.outbox) == 1
168
    sent_mail = mail.outbox.pop()
169
    assert sent_mail.subject == default_template
170
    assert sent_mail.body == default_template
171

  
172
    add_template(default_template_ou)
173
    send_templated_mail(simple_user, template_names, per_ou_templates=True)
174
    assert len(mail.outbox) == 1
175
    sent_mail = mail.outbox.pop()
176
    assert sent_mail.subject == default_template_ou
177
    assert sent_mail.body == default_template_ou
178

  
179
    add_template(specific_template)
180
    send_templated_mail(simple_user, template_names, per_ou_templates=True)
181
    assert len(mail.outbox) == 1
182
    sent_mail = mail.outbox.pop()
183
    assert sent_mail.subject == specific_template
184
    assert sent_mail.body == specific_template
185

  
186
    add_template(specific_template_ou)
187
    send_templated_mail(simple_user, template_names, per_ou_templates=True)
188
    assert len(mail.outbox) == 1
189
    sent_mail = mail.outbox.pop()
190
    assert sent_mail.subject == specific_template_ou
191
    assert sent_mail.body == specific_template_ou
119
-