Coverage for sites/ptf_tools/ptf_tools/signals.py: 84%
73 statements
« prev ^ index » next coverage.py v7.3.2, created at 2024-11-04 17:46 +0000
« prev ^ index » next coverage.py v7.3.2, created at 2024-11-04 17:46 +0000
1from itertools import chain
3from allauth.account.signals import user_signed_up
5from django.contrib.auth.models import Group
6from django.contrib.auth.models import User
7from django.dispatch import receiver
8from django.http import HttpRequest
9from django.urls import reverse_lazy
11from comments_moderation.models import CommentModerator
12from comments_moderation.rights import ModeratorUserRights
13from comments_moderation.utils import update_moderation_right
14from ptf.models import Collection
15from ptf.utils import send_email_from_template
17from .models import Invitation
18from .models import InvitationExtraData
21@receiver(user_signed_up)
22def update_user_from_invite(
23 sender, request: HttpRequest | None = None, user: User | None = None, **kwargs
24):
25 """
26 Update extra information on the user signing up from the attached invitation.
27 The extra information is either basic data (first name, last name)
28 or app specific extra information (eg. for comment moderation).
29 """
31 if not isinstance(user, User): 31 ↛ 32line 31 didn't jump to line 32, because the condition on line 31 was never true
32 return
34 try:
35 invite: Invitation | None = Invitation.objects.get(email__iexact=user.email)
36 # TODO: Log if no invitation attached to the user
37 # This should not happened since signup is closed outside of invitation system
38 except Invitation.DoesNotExist:
39 invite = None
41 if invite is None: 41 ↛ 42line 41 didn't jump to line 42, because the condition on line 41 was never true
42 return
44 if invite.first_name: 44 ↛ 46line 44 didn't jump to line 46, because the condition on line 44 was never false
45 user.first_name = invite.first_name
46 if invite.last_name: 46 ↛ 49line 46 didn't jump to line 49, because the condition on line 46 was never false
47 user.last_name = invite.last_name
49 extra_data = InvitationExtraData(**invite.extra_data)
51 # Handle comment moderation related data
52 if extra_data.moderator: 52 ↛ 119line 52 didn't jump to line 119, because the condition on line 52 was never false
53 # The list of users that "invited" the signing up user as a comment moderator.
54 # We will send an e-mail to notify them of the account creation.
55 users_to_mail = []
56 # Mark the user as a comment moderator
57 try:
58 comment_moderator = CommentModerator.objects.get(user=user)
59 except CommentModerator.DoesNotExist:
60 comment_moderator = CommentModerator(user=user)
62 comment_moderator.is_moderator = True
63 comment_moderator.save()
65 # Staff moderators - Fill the selected collections
66 if extra_data.moderator.collections:
67 pids = chain.from_iterable(c.pid for c in extra_data.moderator.collections)
68 collections_id = Collection.objects.filter(pid__in=set(pids)).values_list(
69 "pk", flat=True
70 )
71 comment_moderator.collections.add(*collections_id)
73 users_to_mail.extend(c.user_id for c in extra_data.moderator.collections)
75 # Base moderatos - Create a moderaton right entry associated to
76 # the selected comments
77 if extra_data.moderator.comments:
78 processed_comments = []
79 for comment in extra_data.moderator.comments:
80 try:
81 users_to_mail.append(comment.user_id)
82 if comment.id in processed_comments: 82 ↛ 83line 82 didn't jump to line 83, because the condition on line 82 was never true
83 continue
84 right_creator = User.objects.get(pk=comment.user_id)
85 rights = ModeratorUserRights(right_creator)
86 error, _ = update_moderation_right(comment.id, user.pk, rights)
87 # TODO: Log if the the POST request is unsuccessful ?
88 processed_comments.append(comment.id)
89 # Catch any exception and continue the workflow.
90 # We don't want this additional processing to result in the sign up
91 # failing.
92 except Exception:
93 continue
94 # Send notification e-mail
95 if users_to_mail:
96 recipient_list = User.objects.filter(pk__in=set(users_to_mail)).values(
97 "first_name", "last_name", "email"
98 )
99 if recipient_list: 99 ↛ 119line 99 didn't jump to line 119, because the condition on line 99 was never false
100 for r in recipient_list:
101 context_data = {
102 "full_name": f"{r['first_name']} {r['last_name']}",
103 "sign_up_name": f"{user.first_name} {user.last_name}",
104 "sign_up_email": user.email,
105 "comment_moderator_url": request.build_absolute_uri(
106 reverse_lazy("comment_moderators")
107 ),
108 "invitation_date": invite.created,
109 "email_signature": "The editorial team",
110 }
111 send_email_from_template(
112 "mail/comment_moderator_account_created.html",
113 context_data,
114 "[TRAMMEL] Comment moderator sign up",
115 to=[r["email"]],
116 )
118 # Add the newly created user to the given user groups.
119 if extra_data.user_groups:
120 group_pks = []
121 for group_pk in extra_data.user_groups:
122 try:
123 group_pks.append(int(group_pk))
124 except ValueError:
125 pass
126 if group_pks: 126 ↛ 131line 126 didn't jump to line 131, because the condition on line 126 was never false
127 user_groups = Group.objects.filter(pk__in=group_pks)
128 if user_groups: 128 ↛ 131line 128 didn't jump to line 131, because the condition on line 128 was never false
129 user.groups.add(*user_groups)
131 user.save()