• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

mozilla / fx-private-relay / fca41f92-5491-483e-b3a5-9a03e39bd6ef

31 Jul 2024 03:44PM CUT coverage: 85.431% (-0.02%) from 85.455%
fca41f92-5491-483e-b3a5-9a03e39bd6ef

push

circleci

web-flow
Merge pull request #4913 from mozilla/dependabot/pip/typing-stubs-dc58c16c12

Bump the typing-stubs group with 2 updates

4101 of 5252 branches covered (78.08%)

Branch coverage included in aggregate %.

11 of 14 new or added lines in 2 files covered. (78.57%)

1 existing line in 1 file now uncovered.

15971 of 18243 relevant lines covered (87.55%)

10.43 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

93.26
/privaterelay/signals.py
1
import logging
1✔
2
from hashlib import sha256
1✔
3
from typing import Any
1✔
4

5
from django.contrib.auth.models import User
1✔
6
from django.db.models.signals import post_save, pre_save
1✔
7
from django.dispatch import receiver
1✔
8
from django.http import HttpRequest
1✔
9

10
from allauth.account.signals import user_logged_in, user_signed_up
1✔
11
from rest_framework.authtoken.models import Token
1✔
12

13
from emails.utils import incr_if_enabled, set_user_group
1✔
14

15
from .models import Profile
1✔
16

17
info_logger = logging.getLogger("eventsinfo")
1✔
18

19

20
@receiver(user_signed_up, dispatch_uid="privaterelay_record_user_signed_up")
1✔
21
def record_user_signed_up(request: HttpRequest, user: User, **kwargs: Any) -> None:
1✔
22
    incr_if_enabled("user_signed_up", 1)
1✔
23
    # the user_signed_up signal doesn't have access to the response object
24
    # so we have to set a user_created session var for user_logged_in receiver
25
    request.session["user_created"] = True
1✔
26
    request.session.modified = True
1✔
27

28

29
@receiver(user_logged_in, dispatch_uid="privaterelay_record_user_logged_in")
1✔
30
def record_user_logged_in(request: HttpRequest, user: User, **kwargs: Any) -> None:
1✔
31
    incr_if_enabled("user_logged_in", 1)
1✔
32
    response = kwargs.get("response")
1✔
33
    event = "user_logged_in"
1✔
34
    # the user_signed_up signal doesn't have access to the response object
35
    # so we have to check for user_created session var from user_signed_up
36
    if request.session.get("user_created", False):
1!
37
        event = "user_signed_up"
1✔
38
    if response:
1!
39
        response.set_cookie(f"server_ga_event:{event}", event, max_age=5)
1✔
40

41

42
@receiver(post_save, sender=User, dispatch_uid="privaterelay_create_user_profile")
1✔
43
def create_user_profile(
1✔
44
    sender: type[User], instance: User, created: bool, **kwargs: Any
45
) -> None:
46
    if created:
1✔
47
        set_user_group(instance)
1✔
48
        Profile.objects.create(user=instance)
1✔
49

50

51
@receiver(pre_save, sender=Profile, dispatch_uid="measure_feature_usage")
1✔
52
def measure_feature_usage(
1✔
53
    sender: type[Profile], instance: Profile, **kwargs: Any
54
) -> None:
55
    if instance._state.adding:
1✔
56
        # if newly created Profile ignore the signal
57
        return
1✔
58
    curr_profile = Profile.objects.get(id=instance.id)
1✔
59

60
    # measure tracker removal usage
61
    changed_tracker_removal_setting = (
1✔
62
        instance.remove_level_one_email_trackers
63
        != curr_profile.remove_level_one_email_trackers
64
    )
65
    if changed_tracker_removal_setting:
1✔
66
        if instance.remove_level_one_email_trackers:
1✔
67
            incr_if_enabled("tracker_removal_enabled")
1✔
68
        if not instance.remove_level_one_email_trackers:
1✔
69
            incr_if_enabled("tracker_removal_disabled")
1✔
70
        if instance.fxa:
1!
71
            # TODO create a utility function or property for hashed fxa uid
72
            hashed_uid = sha256(instance.fxa.uid.encode("utf-8")).hexdigest()
1✔
73
        else:
74
            hashed_uid = "_no_fxa_"
×
75
        info_logger.info(
1✔
76
            "tracker_removal_feature",
77
            extra={
78
                "enabled": instance.remove_level_one_email_trackers,
79
                "hashed_uid": hashed_uid,
80
            },
81
        )
82

83

84
@receiver(post_save, sender=Profile, dispatch_uid="privaterelay_copy_auth_token")
1✔
85
def copy_auth_token(
1✔
86
    sender: type[Profile],
87
    instance: Profile | None = None,
88
    created: bool = False,
89
    **kwargs: Any,
90
) -> None:
91
    if created and instance is not None:
1✔
92
        # baker triggers created during tests
93
        # so first check the user doesn't already have a Token
94
        if not hasattr(Token, "objects"):
1!
NEW
95
            raise AttributeError("Token must have objects attribute.")
×
96
        try:
1✔
97
            Token.objects.get(user=instance.user)
1✔
98
            return
1✔
99
        except Token.DoesNotExist:
1✔
100
            Token.objects.create(user=instance.user, key=instance.api_token)
1✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc