]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Update facebook demo to use the graph api instead of the older api.
authorBen Darnell <ben@bendarnell.com>
Thu, 3 Mar 2011 21:45:58 +0000 (13:45 -0800)
committerBen Darnell <ben@bendarnell.com>
Thu, 3 Mar 2011 21:45:58 +0000 (13:45 -0800)
demos/facebook/facebook.py
demos/facebook/templates/modules/post.html
demos/facebook/templates/stream.html

index 0c984ddaa0a0db3e566485c068f21431e37d8c8a..1428c709f5114773664ced656d2075eee066f8de 100755 (executable)
@@ -61,32 +61,39 @@ class BaseHandler(tornado.web.RequestHandler):
         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:
@@ -95,25 +102,15 @@ class AuthLoginHandler(BaseHandler, tornado.auth.FacebookMixin):
         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():
index 6b50ac0f726ef1219504c619034b9cca7d99d246..1738805a714a9e563098d273209e0997648d89f1 100644 (file)
@@ -1,29 +1,15 @@
 <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>
index 19baa28cbf013ad309f057a00cb645320d70e101..4e6fc80c6ea1da09bd7571dd03a4c0fce4c05bad 100644 (file)
@@ -13,8 +13,8 @@
       </div>
       <div style="margin-bottom:1em"><a href="/">{{ _("Refresh stream") }}</a></div>
       <div id="stream">
-        {% for post in stream["posts"] %}
-          {{ modules.Post(post, stream["profiles"][post["actor_id"]]) }}
+        {% for post in stream["data"] %}
+          {{ modules.Post(post) }}
         {% end %}
       </div>
     </div>