Projet

Général

Profil

0001-manager-look-for-duplicates-on-user-creation-45419.patch

Valentin Deniaud, 06 octobre 2020 15:28

Télécharger (6,29 ko)

Voir les différences:

Subject: [PATCH] manager: look for duplicates on user creation (#45419)

 src/authentic2/manager/app_settings.py        |  1 +
 .../authentic2/manager/user_add.html          | 21 +++++++++
 src/authentic2/manager/user_views.py          | 16 +++++++
 tests/test_user_manager.py                    | 43 +++++++++++++++++++
 4 files changed, 81 insertions(+)
src/authentic2/manager/app_settings.py
28 28
        'USER_SEARCH_MINIMUM_CHARS': 0,
29 29
        'LOGIN_URL': None,
30 30
        'SITE_TITLE': None,
31
        'CHECK_DUPLICATE_USERS': False,
31 32
    }
32 33

  
33 34
    def __getattr__(self, name):
src/authentic2/manager/templates/authentic2/manager/user_add.html
5 5
  {% trans "Add an user" %}
6 6
{% endblock %}
7 7

  
8
{% block beforeform %}
9
{% if duplicate_users %}
10
<input type="hidden" name="confirm-creation-token" value="{{ form.cleaned_data.first_name }} {{ form.cleaned_data.last_name }}">
11
<div class=warningnotice>
12
  <p>{% trans "This user may already exist, please check the list below before creating it :" %}</p>
13
  <ul>
14
    {% for user in duplicate_users %}
15
    <li>
16
      <a href="{% url 'a2-manager-user-detail' pk=user.pk %}">{{ user.get_full_name }}</a> {{ user.email }}
17
      {% for attribute in user.attribute_values.all %}
18
      {% if attribute.content and attribute.attribute.name != "first_name" and attribute.attribute.name != "last_name" %}
19
      - {{ attribute.content }}
20
      {% endif %}
21
      {% endfor %}
22
    </li>
23
    {% endfor %}
24
  </ul>
25
</div>
26
{% endif %}
27
{% endblock %}
28

  
8 29
{% block hidden_inputs %}
9 30
  {{ block.super }}
10 31
  {% if next %}<input type="hidden" name="next" value="{{ next }}">{% endif %}
src/authentic2/manager/user_views.py
148 148
    form_class = UserAddForm
149 149
    permissions = ['custom_user.add_user']
150 150
    template_name = 'authentic2/manager/user_add.html'
151
    duplicate_users = None
151 152

  
152 153
    def dispatch(self, request, *args, **kwargs):
153 154
        qs = request.user.ous_with_perm('custom_user.add_user')
......
193 194
            field_name='cancel')
194 195
        context['next'] = select_next_url(self.request, default=None, include_post=True)
195 196
        context['ou'] = self.ou
197
        context['duplicate_users'] = self.duplicate_users
196 198
        return context
197 199

  
198 200
    def form_valid(self, form):
201
        if app_settings.CHECK_DUPLICATE_USERS:
202
            first_name = form.cleaned_data['first_name']
203
            last_name = form.cleaned_data['last_name']
204
            duplicate_users = User.objects.find_duplicates(
205
                first_name=first_name,
206
                last_name=last_name,
207
                birthdate=form.cleaned_data.get('birthdate'),
208
            )
209
            token = self.request.POST.get('confirm-creation-token')
210
            valid_confirmation_token = bool(token == '%s %s' % (first_name, last_name))
211
            if duplicate_users and not valid_confirmation_token:
212
                self.duplicate_users = duplicate_users
213
                return self.form_invalid(form)
214

  
199 215
        response = super(UserAddView, self).form_valid(form)
200 216
        hooks.call_hooks('event', name='manager-add-user', user=self.request.user,
201 217
                         instance=form.instance, form=form)
tests/test_user_manager.py
18 18
from __future__ import unicode_literals
19 19

  
20 20
import csv
21
import datetime
21 22
import re
22 23
import time
23 24
from urllib.parse import urlparse
......
920 921
    resp = resp.follow()
921 922
    assert resp.html.find('td').text == \
922 923
        'This user has not granted profile data access to any service yet.'
924

  
925

  
926
def test_manager_create_user_duplicates(admin, app, ou1, settings):
927
    settings.A2_MANAGER_CHECK_DUPLICATE_USERS = True
928
    Attribute.objects.create(kind='string', name='address', label='address', required=False)
929
    Attribute.objects.create(kind='birthdate', name='birthdate', label='birthdate', required=False)
930

  
931
    user = User.objects.create(first_name='Alexander', last_name='Longname')
932
    user.attributes.birthdate = datetime.date(1980, 1, 2)
933
    user.attributes.address = 'bakers street'
934
    user2 = User.objects.create(first_name='Alexandra', last_name='Longname')
935
    user3 = User.objects.create(first_name='Alex', last_name='Shortname')
936

  
937
    login(app, admin)
938
    resp = app.get('/manage/users/%s/add/' % ou1.pk)
939

  
940
    form = resp.form
941
    form.set('first_name', 'Alexandre')
942
    form.set('last_name', 'Longname')
943
    form.set('email', 'alexandre.longname@entrouvert.com')
944
    form.set('password1', 'ABcd1234')
945
    form.set('password2', 'ABcd1234')
946
    resp = form.submit()
947

  
948
    assert 'user may already exist' in resp.text
949
    assert 'Alexander Longname' in resp.text and 'bakers street' in resp.text and '1980-01-02' in resp.text
950
    assert '/users/%s/' % user.pk in resp.text
951
    assert '/users/%s/' % user2.pk in resp.text
952

  
953
    # This user was in fact duplicate. Agent reuses the form to fill details on another user
954
    form = resp.form
955
    form.set('first_name', 'Alexa')
956
    form.set('last_name', 'Shortname')
957
    form.set('email', 'ashortname@entrouvert.com')
958
    resp = form.submit()
959

  
960
    assert 'user may already exist' in resp.text
961
    assert '/users/%s/' % user3.pk in resp.text
962

  
963
    # Not a duplicate this time. Simply submitting again creates user
964
    resp = resp.form.submit().follow()
965
    assert User.objects.filter(first_name='Alexa').count() == 1
923
-