Projet

Général

Profil

0003-manager-show-deleted-users-informations-in-journal-5.patch

Benjamin Dauvergne, 21 mai 2021 11:07

Télécharger (15,4 ko)

Voir les différences:

Subject: [PATCH 3/3] manager: show deleted users informations in journal
 (#51808)

 .../journal/templates/journal/event_list.html |  2 +-
 src/authentic2/custom_user/models.py          |  8 ++-
 src/authentic2/manager/journal_event_types.py | 65 ++++++++++---------
 src/authentic2/manager/journal_views.py       |  6 ++
 tests/test_manager_journal.py                 | 10 +++
 5 files changed, 60 insertions(+), 31 deletions(-)
src/authentic2/apps/journal/templates/journal/event_list.html
15 15
        {% endif %}
16 16
                    <tr data-event-id="{{ event.id }}" data-event-cursor="{{ event.cursor }}" data-event-type="{{ event.type.name }}">
17 17
                        <td class="journal-list--timestamp-column">{% block event-timestamp %}{{ event.timestamp }}{% endblock %}</td>
18
                        <td class="journal-list--user-column" {% if event.user %}data-user-id="{{ event.user.id }}"{% endif %}>{% block event-user %}{{ event.user.get_full_name|default:"-" }}{% endblock %}</td>
18
                        <td class="journal-list--user-column" {% if event.user %}data-user-id="{{ event.user.id }}"{% endif %}>{% block event-user %}{% firstof event.user.get_full_name event.user "-" %}{% endblock %}</td>
19 19
                        <td class="journal-list--session-column">{% block event-session %}{{ event.session_id_shortened|default:"-" }}{% endblock %}</td>
20 20
                        <td class="journal-list--message-column">{% block event-message %}{{ event.message|default:"-" }}{% endblock %}</td>
21 21
                    </tr>
src/authentic2/custom_user/models.py
414 414
        )
415 415
        cls.objects.filter(deleted__lt=threshold).delete()
416 416

  
417
    def __str__(self):
417
    def __repr__(self):
418 418
        return 'DeletedUser(old_id=%s, old_uuid=%s…, old_email=%s)' % (
419 419
            self.old_user_id or '-',
420 420
            (self.old_uuid or '')[:6],
421 421
            self.old_email or '-',
422 422
        )
423 423

  
424
    def __str__(self):
425
        data = ['#%d' % self.old_user_id]
426
        if self.old_email:
427
            data.append(self.old_email)
428
        return _('deleted user (%s)') % ', '.join(data)
429

  
424 430
    class Meta:
425 431
        verbose_name = _('deleted user')
426 432
        verbose_name_plural = _('deleted users')
src/authentic2/manager/journal_event_types.py
23 23
    LDAP_DEACTIVATION_REASON_NOT_PRESENT,
24 24
    LDAP_DEACTIVATION_REASON_OLD_SOURCE,
25 25
)
26
from authentic2.custom_user.models import DeletedUser
26 27
from authentic2.journal_event_types import EventTypeWithService, get_attributes_label
27 28
from django_rbac.utils import get_role_model
28 29

  
......
30 31
Role = get_role_model()
31 32

  
32 33

  
34
def user_to_str(user):
35
    if hasattr(user, 'get_full_name'):
36
        return user.get_full_name()
37
    return str(user)
38

  
39

  
33 40
class ManagerUserCreation(EventTypeDefinition):
34 41
    name = 'manager.user.creation'
35 42
    label = _('user creation')
......
40 47

  
41 48
    @classmethod
42 49
    def get_message(cls, event, context):
43
        (user,) = event.get_typed_references(User)
50
        (user,) = event.get_typed_references((DeletedUser, User))
44 51
        # user journal page
45 52
        if context and context == user:
46 53
            return _('creation by administrator')
47 54
        elif user:
48 55
            # manager gloabal journal page
49
            return _('creation of user "%s"') % user.get_full_name()
56
            return _('creation of user "%s"') % user_to_str(user)
50 57
        return super().get_message(event, context)
51 58

  
52 59

  
......
60 67

  
61 68
    @classmethod
62 69
    def get_message(cls, event, context):
63
        (user,) = event.get_typed_references(User)
70
        (user,) = event.get_typed_references((DeletedUser, User))
64 71
        new = event.get_data('new') or {}
65 72
        edited_attributes = ', '.join(get_attributes_label(new)) or ''
66 73
        if context and context == user:
67 74
            return _('edit by administrator (%s)') % edited_attributes
68 75
        elif user:
69
            user_full_name = user.get_full_name()
76
            user_full_name = user_to_str(user)
70 77
            return _('edit of user "{0}" ({1})').format(user_full_name, edited_attributes)
71 78
        return super().get_message(event, context)
72 79

  
......
85 92

  
86 93
    @classmethod
87 94
    def get_message(cls, event, context):
88
        (user,) = event.get_typed_references(User)
95
        (user,) = event.get_typed_references((DeletedUser, User))
89 96
        new_email = event.get_data('email')
90 97
        if context and context == user:
91 98
            return _('email change for email address "%s" requested by administrator') % new_email
92 99
        elif user:
93
            user_full_name = user.get_full_name()
100
            user_full_name = user_to_str(user)
94 101
            return _('email change of user "{0}" for email address "{1}"').format(user_full_name, new_email)
95 102
        return super().get_message(event, context)
96 103

  
......
109 116

  
110 117
    @classmethod
111 118
    def get_message(cls, event, context):
112
        (user,) = event.get_typed_references(User)
119
        (user,) = event.get_typed_references((DeletedUser, User))
113 120
        send_mail = event.get_data('send_mail')
114 121
        if context and context == user:
115 122
            if send_mail:
......
117 124
            else:
118 125
                return _('password change by administrator')
119 126
        elif user:
120
            user_full_name = user.get_full_name()
127
            user_full_name = user_to_str(user)
121 128
            if send_mail:
122 129
                return _('password change of user "%s" and notification by mail') % user_full_name
123 130
            else:
......
137 144

  
138 145
    @classmethod
139 146
    def get_message(cls, event, context):
140
        (user,) = event.get_typed_references(User)
147
        (user,) = event.get_typed_references((DeletedUser, User))
141 148
        email = event.get_data('email')
142 149
        if context and context == user:
143 150
            return _('password reset request by administrator sent to "%s"') % email
144 151
        elif user:
145
            return _('password reset request of "{0}" sent to "{1}"').format(user.get_full_name(), email)
152
            return _('password reset request of "{0}" sent to "{1}"').format(user_to_str(user), email)
146 153
        return super().get_message(event, context)
147 154

  
148 155

  
......
156 163

  
157 164
    @classmethod
158 165
    def get_message(cls, event, context):
159
        (user,) = event.get_typed_references(User)
166
        (user,) = event.get_typed_references((DeletedUser, User))
160 167
        if context and context == user:
161 168
            return _('mandatory password change at next login set by administrator')
162 169
        elif user:
163
            return _('mandatory password change at next login set for user "%s"') % user.get_full_name()
170
            return _('mandatory password change at next login set for user "%s"') % user_to_str(user)
164 171
        return super().get_message(event, context)
165 172

  
166 173

  
......
174 181

  
175 182
    @classmethod
176 183
    def get_message(cls, event, context):
177
        (user,) = event.get_typed_references(User)
184
        (user,) = event.get_typed_references((DeletedUser, User))
178 185
        if context and context == user:
179 186
            return _('mandatory password change at next login unset by administrator')
180 187
        elif user:
181
            return _('mandatory password change at next login unset for user "%s"') % user.get_full_name()
188
            return _('mandatory password change at next login unset for user "%s"') % user_to_str(user)
182 189
        return super().get_message(event, context)
183 190

  
184 191

  
......
192 199

  
193 200
    @classmethod
194 201
    def get_message(cls, event, context):
195
        (user,) = event.get_typed_references(User)
202
        (user,) = event.get_typed_references((DeletedUser, User))
196 203
        if context and context == user:
197 204
            return _('activation by administrator')
198 205
        elif user:
199
            return _('activation of user "%s"') % user.get_full_name()
206
            return _('activation of user "%s"') % user_to_str(user)
200 207
        return super().get_message(event, context)
201 208

  
202 209

  
......
211 218

  
212 219
    @classmethod
213 220
    def get_message(cls, event, context):
214
        (user,) = event.get_typed_references(User)
221
        (user,) = event.get_typed_references((DeletedUser, User))
215 222
        reason = event.get_data('reason')
216 223
        if context and context == user:
217 224
            if reason == LDAP_DEACTIVATION_REASON_NOT_PRESENT:
......
226 233
                    _(
227 234
                        'automatic deactivation of user "%s" because the associated LDAP account does not exist anymore'
228 235
                    )
229
                    % user.get_full_name()
236
                    % user_to_str(user)
230 237
                )
231 238
            elif reason == LDAP_DEACTIVATION_REASON_OLD_SOURCE:
232 239
                return (
233 240
                    _(
234 241
                        'automatic deactivation of user "%s" because the associated LDAP source has been deleted'
235 242
                    )
236
                    % user.get_full_name()
243
                    % user_to_str(user)
237 244
                )
238 245
            else:
239
                return _('deactivation of user "%s"') % user.get_full_name()
246
                return _('deactivation of user "%s"') % user_to_str(user)
240 247
        return super().get_message(event, context)
241 248

  
242 249

  
......
250 257

  
251 258
    @classmethod
252 259
    def get_message(cls, event, context):
253
        (user,) = event.get_typed_references(User)
260
        (user,) = event.get_typed_references((DeletedUser, User))
254 261
        if context and context == user:
255 262
            return _('deletion by administrator')
256 263
        elif user:
257
            return _('deletion of user "%s"') % user.get_full_name()
264
            return _('deletion of user "%s"') % user_to_str(user)
258 265
        return super().get_message(event, context)
259 266

  
260 267

  
......
269 276
    @classmethod
270 277
    def get_message(cls, event, context):
271 278
        # first reference is to the service
272
        __, user = event.get_typed_references(None, User)
279
        __, user = event.get_typed_references(None, (DeletedUser, User))
273 280
        service_name = cls.get_service_name(event)
274 281
        if context and context == user:
275 282
            return _('deletion of authorization of single sign on with "{service}" by administrator').format(
......
278 285
        elif user:
279 286
            return _('deletion of authorization of single sign on with "{service}" of user "{user}"').format(
280 287
                service=service_name,
281
                user=user.get_full_name(),
288
                user=user_to_str(user),
282 289
            )
283 290
        return super().get_message(event, context)
284 291

  
......
357 364

  
358 365
    @classmethod
359 366
    def get_message(cls, event, context):
360
        role, member = event.get_typed_references(Role, User)
367
        role, member = event.get_typed_references(Role, (DeletedUser, User))
361 368
        role = role or event.get_data('role_name')
362 369
        member = member or event.get_data('member_name')
363 370
        if context == member:
......
379 386

  
380 387
    @classmethod
381 388
    def get_message(cls, event, context):
382
        role, member = event.get_typed_references(Role, User)
389
        role, member = event.get_typed_references(Role, (DeletedUser, User))
383 390
        role = role or event.get_data('role_name')
384 391
        member = member or event.get_data('member_name')
385 392
        if context == member:
......
491 498
    @classmethod
492 499
    def record(cls, user, session, role, admin_user):
493 500
        data = {
494
            'admin_user_name': admin_user.get_full_name(),
501
            'admin_user_name': user_to_str(admin_user),
495 502
            'admin_user_uuid': admin_user.uuid,
496 503
        }
497 504
        super().record(user=user, session=session, role=role, references=[admin_user], data=data)
498 505

  
499 506
    @classmethod
500 507
    def get_message(cls, event, context):
501
        role, admin_user = event.get_typed_references(Role, User)
508
        role, admin_user = event.get_typed_references(Role, (DeletedUser, User))
502 509
        role = role or event.get_data('role_name')
503 510
        admin_user = admin_user or event.get_data('admin_user_name')
504 511
        if context == role:
......
517 524

  
518 525
    @classmethod
519 526
    def get_message(cls, event, context):
520
        role, admin_user = event.get_typed_references(Role, User)
527
        role, admin_user = event.get_typed_references(Role, (DeletedUser, User))
521 528
        role = role or event.get_data('role_name')
522 529
        admin_user = admin_user or event.get_data('admin_user_name')
523 530
        if context == role:
src/authentic2/manager/journal_views.py
125 125

  
126 126
        return qs
127 127

  
128
    def prefetcher(self, model, pks):
129
        if not issubclass(model, User):
130
            return
131
        for deleted_user in DeletedUser.objects.filter(old_user_id__in=pks):
132
            yield deleted_user.old_user_id, deleted_user
133

  
128 134

  
129 135
class BaseJournalView(views.TitleMixin, views.MediaMixin, views.MultipleOUMixin, JournalView):
130 136
    template_name = 'authentic2/manager/journal.html'
tests/test_manager_journal.py
1041 1041
        'addition of user "user (111111)" as administrator of role "role1"',
1042 1042
        'removal of role "role2" as administrator of role "role1"',
1043 1043
    ]
1044

  
1045

  
1046
def test_delete_user(app, superuser, events):
1047
    old_user_id = events['user'].id
1048
    events['user'].delete()
1049
    response = login(app, user=superuser, path="/manage/journal/")
1050
    response.form.set('search', events['user'].email)
1051
    response = response.form.submit()
1052
    assert len(response.pyquery('tbody tr')) == 20
1053
    assert 'deletion of user &quot;deleted user (#%s, user@example.com)&quot;' % old_user_id in str(response)
1044
-