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

mozilla / fx-private-relay / 98c45938-8d23-4015-90f8-7dff916ce789

21 Jun 2024 01:50PM CUT coverage: 85.357% (+0.02%) from 85.337%
98c45938-8d23-4015-90f8-7dff916ce789

push

circleci

web-flow
Merge pull request #4799 from mozilla/split-exceptions-validators-mpp-3827

MPP-3827: Move non-model code out of `emails/models.py`

4004 of 5135 branches covered (77.97%)

Branch coverage included in aggregate %.

335 of 339 new or added lines in 9 files covered. (98.82%)

1 existing line in 1 file now uncovered.

15746 of 18003 relevant lines covered (87.46%)

10.31 hits per line

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

96.72
/emails/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

9
from rest_framework.authtoken.models import Token
1✔
10

11
from emails.models import Profile
1✔
12
from emails.utils import incr_if_enabled, set_user_group
1✔
13

14
info_logger = logging.getLogger("eventsinfo")
1✔
15

16

17
@receiver(post_save, sender=User)
1✔
18
def create_user_profile(
1✔
19
    sender: type[User], instance: User, created: bool, **kwargs: Any
20
) -> None:
21
    if created:
1✔
22
        set_user_group(instance)
1✔
23
        Profile.objects.create(user=instance)
1✔
24

25

26
@receiver(pre_save, sender=Profile)
1✔
27
def measure_feature_usage(
1✔
28
    sender: type[Profile], instance: Profile, **kwargs: Any
29
) -> None:
30
    if instance._state.adding:
1✔
31
        # if newly created Profile ignore the signal
32
        return
1✔
33
    curr_profile = Profile.objects.get(id=instance.id)
1✔
34

35
    # measure tracker removal usage
36
    changed_tracker_removal_setting = (
1✔
37
        instance.remove_level_one_email_trackers
38
        != curr_profile.remove_level_one_email_trackers
39
    )
40
    if changed_tracker_removal_setting:
1✔
41
        if instance.remove_level_one_email_trackers:
1✔
42
            incr_if_enabled("tracker_removal_enabled")
1✔
43
        if not instance.remove_level_one_email_trackers:
1✔
44
            incr_if_enabled("tracker_removal_disabled")
1✔
45
        if instance.fxa:
1!
46
            # TODO create a utility function or property for hashed fxa uid
47
            hashed_uid = sha256(instance.fxa.uid.encode("utf-8")).hexdigest()
1✔
48
        else:
NEW
49
            hashed_uid = "_no_fxa_"
×
50
        info_logger.info(
1✔
51
            "tracker_removal_feature",
52
            extra={
53
                "enabled": instance.remove_level_one_email_trackers,
54
                "hashed_uid": hashed_uid,
55
            },
56
        )
57

58

59
@receiver(post_save, sender=Profile)
1✔
60
def copy_auth_token(
1✔
61
    sender: type[Profile],
62
    instance: Profile | None = None,
63
    created: bool = False,
64
    **kwargs: Any,
65
) -> None:
66
    if created and instance is not None:
1✔
67
        # baker triggers created during tests
68
        # so first check the user doesn't already have a Token
69
        try:
1✔
70
            Token.objects.get(user=instance.user)
1✔
71
            return
1✔
72
        except Token.DoesNotExist:
1✔
73
            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