def post_username():
    username = request.forms.get('username')
    if username: username = username.strip()

    if not username:
        if is_XHR():
            return render_json({"error": "need valid username"}, 409)
        else:
            redirect("/")

    if UserProcess.is_still_processing(username):
        if is_XHR():
            return render_json({
                "update": "/get-update/%s" % username,
                "ws_update": "ws://%s/ws/%s" % (HOST, username)
            })
        else:
            redirect("/await/%s" % username)
    UserProcess(username).get_new_recommendations()

    if is_XHR():
        return render_json({
            "update": "/get-update/%s" % username,
            "ws_update": "ws://%s/ws/%s" % (HOST, username)
        })

    redirect("/await/%s" % username)
def get_update(username):
    g = UserProcess.get_greenlet_for(username)
    if not g:
        return render_json({"done": True, "results": "/results/%s" % username})
    g.join(55)
    if g.ready():
        return render_json({"done": True, "results": "/results/%s" % username})
    else:
        return render_json({
            "done": False,
            "update": "/get-update/%s" % username
        })
def echo(ws, username):
    if not ws: return "please provide websocket"

    q = UserProcess.get_message_queue(username)
    try:
        if not UserProcess.is_still_processing(username):
            return ws.send(
                json.dumps({
                    "done": True,
                    "results": "/results/%s" % username
                }))
        while True:
            msg = q.get()
            if msg.get("type") == "everything" and msg.get("done"):
                return ws.send(
                    json.dumps({
                        "done": True,
                        "results": "/results/%s" % username
                    }))
            else:
                ws.send(json.dumps({"done": False, "message": msg}))
    finally:
        UserProcess.remove_message_queue(username, q)
def show_more(username, topic, offset, past_album):
    results = UserProcess(username).retrieve_results_for_topic(
        int(topic), int(offset), unicode(past_album.decode("utf-8")))
    if is_XHR():
        return render("show-more-xhr",
                      username=username,
                      topic=topic,
                      results=results,
                      nextoffset=int(offset) + len(results))
    return render("show-more",
                  username=username,
                  topic=topic,
                  results=results,
                  nextoffset=int(offset) + len(results))
def show_results(username):
    if UserProcess.is_still_processing(username):
        redirect("/await/%s" % username)
    results = UserProcess(username).retrieve_results()
    return render("results", username=username, results=results)
def await_results(username):
    if not UserProcess.is_still_processing(username):
        redirect("/results/%s" % username)
    return render("await", username=username)