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.")
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()