def post(self):
        """ Adds a new user

        This does not need any extra security because it only changes the
        information for the currently logged in google user. If there is no
        google user logged in an error is thrown.
        """
        # TODO (phillip): this method throws generic exceptions that really can't be
        # properly handled by the client in a user-friendly way. I should
        # really return error codes here so the client knows what went wrong
        # other than a generic server error
        data = request.form
        user = users.get_current_user()
        if not user:
            raise Exception("Where is the user?")

        # NOTE: I am using the user.user_id() as the UserData id so that I can
        # query for UserData with strong consistency. I believe this works as
        # intended and the only issue I can think of is if I decide to allow
        # logging in from something other than a google account (which would mean
        # the user is not connected to a google user with a user_id)
        user_data = UserData(id=user.user_id())
        user_data.user = user
        user_data.user_id = user.user_id()
        if data["fname"] == "":
            raise Exception("The first name was empty")
        user_data.first_name = data["fname"]
        if data["lname"] == "":
            raise Exception("The first name was empty")

        # TODO (phillip): A duplicate username should produce a better error than a 500
        other_users = UserData.query()
        other_user = None
        for user in other_users:
            if user.username == data["fname"] + data["lname"]:
                other_user = user
        if other_user is not None:
            raise Exception("There is already a user with that name.")

        user_data.last_name = data["lname"]
        user_data.graduation_year = int(data["grad_year"])
        user_data.graduation_semester = data["grad_semester"]
        user_data.classification = data["classification"]
        user_data.active = True
        user_data.user_permissions = ["user"]
        user_data.put()

        # TODO (phillip): find a better way that doesn't require you to remember to add
        # this line every single time you want to create a UserData object.
        # Create the necessary point records
        user_data.populate_records()

        response = jsonify()
        response.status_code = 201
        response.headers["location"] = "/api/users/" + str(user_data.user_id)
        return response