Example #1
0
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)
Example #2
0
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)
Example #3
0
    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"])
Example #4
0
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)