return tornado.escape.json_decode(user_json)
-class MainHandler(BaseHandler, tornado.auth.FacebookMixin):
+class MainHandler(BaseHandler, tornado.auth.FacebookGraphMixin):
@tornado.web.authenticated
@tornado.web.asynchronous
def get(self):
- self.facebook_request(
- method="stream.get",
- callback=self.async_callback(self._on_stream),
- session_key=self.current_user["session_key"])
+ self.facebook_request("/me/home", self._on_stream,
+ access_token=self.current_user["access_token"])
def _on_stream(self, stream):
if stream is None:
# Session may have expired
self.redirect("/auth/login")
return
- # Turn profiles into a dict mapping id => profile
- stream["profiles"] = dict((p["id"], p) for p in stream["profiles"])
self.render("stream.html", stream=stream)
-class AuthLoginHandler(BaseHandler, tornado.auth.FacebookMixin):
+import logging
+class AuthLoginHandler(BaseHandler, tornado.auth.FacebookGraphMixin):
@tornado.web.asynchronous
def get(self):
- if self.get_argument("session", None):
- self.get_authenticated_user(self.async_callback(self._on_auth))
+ my_url = (self.request.protocol + "://" + self.request.host +
+ "/auth/login?next=" +
+ tornado.escape.url_escape(self.get_argument("next", "/")))
+ if self.get_argument("code", False):
+ self.get_authenticated_user(
+ redirect_uri=my_url,
+ client_id=self.settings["facebook_api_key"],
+ client_secret=self.settings["facebook_secret"],
+ code=self.get_argument("code"),
+ callback=self._on_auth)
return
- self.authorize_redirect("read_stream")
+ self.authorize_redirect(redirect_uri=my_url,
+ client_id=self.settings["facebook_api_key"],
+ extra_params={"scope": "read_stream"})
def _on_auth(self, user):
if not user:
self.redirect(self.get_argument("next", "/"))
-class AuthLogoutHandler(BaseHandler, tornado.auth.FacebookMixin):
- @tornado.web.asynchronous
+class AuthLogoutHandler(BaseHandler, tornado.auth.FacebookGraphMixin):
def get(self):
self.clear_cookie("user")
- if not self.current_user:
- self.redirect(self.get_argument("next", "/"))
- return
- self.facebook_request(
- method="auth.revokeAuthorization",
- callback=self.async_callback(self._on_deauthorize),
- session_key=self.current_user["session_key"])
-
- def _on_deauthorize(self, response):
self.redirect(self.get_argument("next", "/"))
class PostModule(tornado.web.UIModule):
- def render(self, post, actor):
- return self.render_string("modules/post.html", post=post, actor=actor)
+ def render(self, post):
+ return self.render_string("modules/post.html", post=post)
def main():
<div class="post">
<div class="picture">
- <a href="{{ actor["url"] }}"><img src="{{ actor["pic_square"] }}"/></a>
+ {% set author_url="http://www.facebook.com/profile.php?id=" + escape(post["from"]["id"]) %}
+ <a href="{{ author_url }}"><img src="//graph.facebook.com/{{ escape(post["from"]["id"]) }}/picture?type=square"/></a>
</div>
<div class="body">
- <a href="{{ actor["url"] }}" class="actor">{{ escape(actor["name"]) }}</a>
+ <a href="{{ author_url }}" class="actor">{{ escape(post["from"]["name"]) }}</a>
{% if post["message"] %}
<span class="message">{{ escape(post["message"]) }}</span>
{% end %}
- {% if post["attachment"] %}
- <div class="attachment">
- {% if post["attachment"].get("name") %}
- <div class="name"><a href="{{ post["attachment"]["href"] }}">{{ escape(post["attachment"]["name"]) }}</a></div>
- {% end %}
- {% if post["attachment"].get("description") %}
- <div class="description">{{ post["attachment"]["description"] }}</div>
- {% end %}
- {% for media in filter(lambda m: m.get("src") and m["type"] in ("photo", "link"), post["attachment"].get("media", [])) %}
- <span class="media">
- <a href="{{ media["href"] }}"><img src="{{ media["src"] }}" alt="{{ escape(media.get("alt", "")) }}"/></a>
- </span>
- {% end %}
- </div>
- {% end %}
<div class="meta">
- <a href="{{ post["permalink"] }}" class="permalink">{{ locale.format_date(post["created_time"]) }}</a>
+ <a href="{{ escape(post["actions"][0]["link"]) }}" class="permalink">{{ locale.format_date(datetime.datetime.strptime(post["created_time"], "%Y-%m-%dT%H:%M:%S+0000")) }}</a>
</div>
</div>
</div>