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

mozilla / fx-private-relay / 8a6415bf-ba72-4b32-8500-2abed6e5eccd

16 May 2024 03:17PM UTC coverage: 84.179% (-0.2%) from 84.386%
8a6415bf-ba72-4b32-8500-2abed6e5eccd

push

circleci

groovecoder
for MPP-3400: wip: start remove_unused_numbers_from_twilio command

3611 of 4751 branches covered (76.01%)

Branch coverage included in aggregate %.

0 of 41 new or added lines in 1 file covered. (0.0%)

1 existing line in 1 file now uncovered.

14778 of 17094 relevant lines covered (86.45%)

10.81 hits per line

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

0.0
/phones/management/commands/remove_unused_numbers_from_twilio.py
NEW
1
import logging
×
NEW
2
from typing import Any
×
3

NEW
4
from django.core.management.base import BaseCommand
×
5

NEW
6
from phones.apps import twilio_client
×
NEW
7
from phones.models import RelayNumber
×
8

NEW
9
logger = logging.getLogger("events")
×
10

11

NEW
12
class Command(BaseCommand):
×
NEW
13
    help = "Checks for twilio numbers that are not assigned to a subscriber."
×
14

NEW
15
    def handle(self, *args: Any, **kwargs: Any) -> None | str:
×
NEW
16
        try:
×
NEW
17
            client = twilio_client()
×
NEW
18
            twilio_numbers = client.incoming_phone_numbers.stream()
×
NEW
19
            total_twilio_numbers = 0
×
NEW
20
            numbers_not_in_db = 0
×
NEW
21
            for number in twilio_numbers:
×
NEW
22
                total_twilio_numbers += 1
×
NEW
23
                try:
×
NEW
24
                    RelayNumber.objects.get(number=number.phone_number)
×
NEW
25
                except RelayNumber.DoesNotExist:
×
NEW
26
                    numbers_not_in_db += 1
×
NEW
27
                    self.stdout.write(
×
28
                        f"{number.phone_number} is in Twilio but not in Relay."
29
                    )
NEW
30
                self.stdout.write(f"total_twilio_numbers: {total_twilio_numbers}")
×
NEW
31
                self.stdout.write(f"numbers_not_in_db: {numbers_not_in_db}")
×
NEW
32
        except Exception:
×
NEW
33
            logger.exception("Could not get list of twilio numbers")
×
34

NEW
35
        confirmed = self.confirm()
×
NEW
36
        if confirmed:
×
NEW
37
            for number in twilio_numbers:
×
NEW
38
                client.incoming_phone_numbers(number).delete()
×
NEW
39
                return f"Deleted {number} from twilio."
×
NEW
40
        return "User still has their phone data... FOR NOW!"
×
41

NEW
42
    def confirm(self) -> bool:
×
NEW
43
        answer = ""
×
NEW
44
        first_time = True
×
NEW
45
        while answer not in ("Y", "N"):
×
NEW
46
            if first_time:
×
NEW
47
                first_time = False
×
48
            else:
NEW
49
                self.stdout.write("Please answer 'Y' or 'N'")
×
NEW
50
            raw_answer = input("Delete phone number from twilio? (Y/N) ")
×
NEW
51
            answer = raw_answer.strip().upper()
×
NEW
52
        return answer == "Y"
×
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