def POST_user_numbers(request, format): """ Respond to a "POST user_numbers" request. """ params = apiHelper.get_params(request, "user_number") error = apiHelper.check_params(params, required_params=["token", "number"], optional_params=["country"]) if error != None: return error token = params['token'] number = params['number'] if "country" in params: country = params['country'] else: country = "US" if not session.validate(token): return HttpResponseBadRequest("Invalid token") user = session.get_user(token) # Ask the "phonenumbers" library to format the phone number into E.164 # format. phone_number = phonenumbers.parse(number, country) phone_format = phonenumbers.PhoneNumberFormat.E164 formatted_number = phonenumbers.format_number(phone_number, phone_format) # If we already have a UserNumber record for this phone number, delete the # old one. try: user_num = UserNumber.objects.get(number=formatted_number) except UserNumber.DoesNotExist: user_num = None if user_num != None: user_num.delete() # ??? What if the number is owned by someone else? # Create the UserNumber record for this phone number. user_num = UserNumber() user_num.user = user user_num.number = formatted_number user_num.code = utils.calc_random_digits(num_digits=4) user_num.verified = False user_num.created_at = datetime.datetime.now() user_num.updated_at = datetime.datetime.now() user_num.save() # Ask our SMS gateway to send a verification message to the phone. _send_verification_code(user_num) # Finally, return the newly-created user number back to the caller. return apiHelper.response({'user_number' : user_num.to_dict()}, format=format, status=HTTP_RESPONSE_POST_OK)
def PUT_user_numbers(request, format): """ Respond to a "PUT user_numbers" request. """ params = apiHelper.get_params(request, "user_number") error = apiHelper.check_params(params, required_params=["token", "id"], optional_params=["code"]) if error != None: return error token = params['token'] id = params['id'] if "code" in params: code = params['code'] else: code = None if not session.validate(token): return HttpResponseBadRequest("Invalid token") user = session.get_user(token) # Get the UserNumber record with the specified ID. try: user_num = UserNumber.objects.get(id=id) except UserNumber.DoesNotExist: return HttpResponseBadRequest("No such number") if user_num.user != user: return HttpResponseBadRequest("Not your number") # If the caller didn't specify a code, or the code is incorrect, send # another code. if code == None or user_num.code != code: user_num.code = utils.calc_random_digits(num_digits=4) user_num.verified = False user_num.updated_at = datetime.datetime.now() user_num.save() _send_verification_code(user_num) else: # If we get here, the verification code is correct -> verify the # number. user_num.verified = True user_num.updated_at = datetime.datetime.now() user_num.save() # Finally, return an empty response back to the caller. return apiHelper.response(None, format=format, status=HTTP_RESPONSE_PUT_OK)
def test_create_link_by_phone_number(self): """ Test the creation of a Link using a phone number. """ phone_number = utils.calc_random_digits(num_digits=6) response = self.sendRequest("POST", "/links", {'number' : phone_number, 'tag' : ["tom", "dick", "harry"]}) self.assertEqual(response.status_code, HTTP_RESPONSE_POST_OK) self.assertEqual(response['Content-Type'], "application/json") jsonResponse = json.loads(response.content) self.assertItemsEqual(jsonResponse['link'].keys(), ["id", "profile_id", "tags", "created_at", "updated_at"]) self.assertItemsEqual(jsonResponse['link']['tags'], ["tom", "dick", "harry"])
def create_for_phone(phone_number): """ Create a new (unvalidated) session for the given phone number. We create a new session associated with the given phone number, and return the verification code that needs to be used to validate the session. Upon completion, we return a (token, verification_code) tuple. """ session = Session() session.token = uuid.uuid4().hex session.user = None session.phone_number = phone_number session.verified = False session.verification_code = utils.calc_random_digits(num_digits=4) session.last_access = datetime.datetime.utcnow() session.save() return (session.token, session.verification_code)