def handle(self, *args, **kwargs):
        missing = []
        missed_contacts = []

        self.stdout.write("Retrieving all sms_messages set to account.")

        client = Client(settings.TWILIO_ACCOUNT_SID,
                        settings.TWILIO_AUTH_TOKEN)

        for phone_number in PhoneNumber.objects.all():
            if "dev" in phone_number.friendly_name.lower():
                continue

            self.stdout.write("Retrieving sms_messages for {0}"
                              "".format(phone_number.e164))
            sms_messages = client.messages.list(to=phone_number.e164)
            self.stdout.write("{0} sms_messages retrieved."
                              "".format(len(sms_messages)))

            for sms_message in sms_messages:
                if sms_message.date_created.date() < date(2018, 5, 1):
                    continue
                try:
                    SmsMessage.objects.get(sid=sms_message.sid)
                except SmsMessage.DoesNotExist:
                    self.stdout.write("{0} does not exist. Saving..."
                                      "".format(sms_message.sid))
                    missing.append(sms_message)

                    try:
                        contact = Contact \
                            .objects \
                            .filter(phone_number=sms_message.from_) \
                            .latest('date_created')
                    except Contact.DoesNotExist:
                        self.stdout.write("Contact does not exist for {0}"
                                          "...".format(sms_message.from_))
                        contact = Contact(phone_number=sms_message.from_)
                        try:
                            contact.save()
                            contact.date_created = sms_message.date_created
                            contact.save()
                            missed_contacts.append(contact)
                        except Exception:
                            contact = None

                    record = self.save_sms_message(sms_message)

                    record.related_contact = contact
                    record.related_phone_number = phone_number
                    record.save()

                    self.stdout.write("{0} saved." "".format(sms_message.sid))
        self.stdout.write("Missing sms_messages: {0}".format(len(missing)))
        self.stdout.write("Missing contacts: {0}".format(len(missed_contacts)))
    def handle(self, *args, **options):
        for call in Call.objects.all():
            self.stdout.write("Checking call: {0}".format(call.sid))

            if not call.related_phone_number:
                for number in (call.from_number, call.to_number):
                    result = PhoneNumber.objects.filter(e164=number)

                    if result:
                        self.stdout.write("Related number found: "
                                          "{0}".format(number))
                        call.related_phone_number = \
                            result.latest('date_created')
                        call.save()

            if not call.related_contact:
                for number in (call.from_number, call.to_number):
                    result = Contact.objects.filter(phone_number=number)

                    if result:
                        self.stdout.write("Related contact found: "
                                          "{0}".format(number))
                        call.related_contact = result.latest('date_created')
                        call.save()

                    if not call.related_contact:
                        result = PhoneNumber.objects.filter(e164=number)

                        if not result:
                            self.stdout.write("Creating related contact for "
                                              "{0}".format(number))
                            try:
                                c = Contact(phone_number=number)
                                c.save()

                                c.date_created = call.date_created
                                c.save()

                                lookup_contact.apply_async(args=[c.id])

                                for related in (call.from_number,
                                                call.to_number):
                                    if number is not related:
                                        num = PhoneNumber \
                                            .objects.get(e164=related)
                                        c.related_phone_numbers.add(num)
                                        c.save()
                            except Exception as e:
                                self.stdout.write("Failure creating contact "
                                                  "for {0}: {1}".format(
                                                      number, e))
    def handle(self, *args, **kwargs):
        self.stdout.write("Opening CSV file: {0}..."
                          "".format(kwargs['csv_file_path']))

        with open(kwargs['csv_file_path'], 'r') as csv_file:
            reader = csv.DictReader(csv_file)

            for row in reader:
                self.stdout.write("Checking contact: {0}"
                                  "".format(row['phone']))

                number = phonenumbers.parse(row['phone'], 'US')
                e164 = phonenumbers.format_number(
                    number, phonenumbers.PhoneNumberFormat.E164)

                check = Contact.objects.filter(phone_number=e164)

                if len(check) > 0:
                    self.stdout.write("Contact exists, skipping.")
                else:
                    self.stdout.write("Adding contact: {0}"
                                      "".format(row['phone']))
                    timestamp = "{0} 2018 18:00:00+0000".format(row['date'])

                    self.stdout.write("Timestamp is: {0}" "".format(timestamp))

                    timestamp = datetime.strptime(timestamp,
                                                  '%m/%d/%Y %H:%M:%S%z')

                    contact = Contact(phone_number=e164)
                    contact.save()
                    contact.date_created = timestamp

                    if 'Y' in row['arrested'].upper():
                        contact.arrested = True

                    contact.save()
                    self.stdout.write("Contact added.")
Exemple #4
0
    def handle(self, *args, **kwargs):
        self.stdout.write("Gathering Garfield numbers...")

        phone_numbers = [p.e164 for p in PhoneNumber.objects.all()]

        self.stdout.write("Checking contacts for {0} phone numbers..."
                          "".format(len(phone_numbers)))

        error_contacts = Contact \
            .objects.filter(phone_number__in=phone_numbers)

        self.stdout.write("Found {0} contacts that are Garfield "
                          "numbers...".format(len(error_contacts)))

        messages = SmsMessage \
            .objects.filter(related_contact__in=error_contacts)

        self.stdout.write("Found {0} messages erroneously "
                          "related to Garfield contacts..."
                          "".format(len(messages)))

        for message in messages:
            self.stdout.write("Fixing {0}...".format(message.sid))

            for number in [message.to_number, message.from_number]:
                if number in phone_numbers or number.startswith('sim:'):
                    continue
                else:
                    try:
                        result = Contact.objects.get(phone_number=number)
                        self.stdout.write("Contact exists...")
                    except Contact.DoesNotExist:
                        self.stdout.write("Contact does not exist...")
                        result = Contact(phone_number=number)
                        result.save()

                        result.date_created = message.date_created
                        result.save()
                    except Contact.MultipleObjectsReturned:
                        result = Contact \
                            .objects \
                            .filter(phone_number=number) \
                            .latest('date_created')

                    self.stdout.write("Relating {0} to {1}..."
                                      "".format(result, message.sid))
                    message.related_contact = result
                    message.save()

        calls = Call \
            .objects.filter(related_contact__in=error_contacts)

        self.stdout.write("Found {0} calls erroneously "
                          "related to Garfield contacts..."
                          "".format(len(messages)))

        for call in calls:
            self.stdout.write("Fixing {0}...".format(message.sid))

            for number in [call.to_number, call.from_number]:
                if number in phone_numbers or number.startswith('sim:'):
                    continue
                else:
                    try:
                        result = Contact.objects.get(phone_number=number)
                        self.stdout.write("Contact exists...")
                    except Contact.DoesNotExist:
                        self.stdout.write("Contact does not exist...")
                        result = Contact(phone_number=number)
                        result.save()
                    except Contact.MultipleObjectsReturned:
                        result = Contact \
                            .objects \
                            .filter(phone_number=number) \
                            .latest('date_created')

                    self.stdout.write("Relating {0} to {1}..."
                                      "".format(result, call.sid))
                    call.related_contact = result
                    call.save()