public
Description: Mobile FriendFeed Client
Homepage: http://www.fftogo.com/
Clone URL: git://github.com/bgolub/fftogo.git
lists
Benjamin Golub (author)
Mon Aug 25 19:27:07 -0700 2008
commit  bb2d8fcc55558b7eff52e426b3d651402e7eedd0
tree    b58756b517619fcc3ffd1685467b111f7f6fa36f
parent  f4d3fec9b669f2fea1c6fc9c7d3a9557923333ea
...
468
469
470
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
471
472
473
...
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
0
@@ -468,6 +468,64 @@ def room(request, nickname):
0
         return atom(entries)
0
     return render_to_response('room.html', extra_context, context_instance=RequestContext(request))
0
 
0
+def list(request, nickname):
0
+    '''Render a list feed.
0
+
0
+    Authentication is required.
0
+    '''
0
+    if not request.session.get('nickname', None):
0
+        return HttpResponseRedirect(reverse('login'))
0
+    f = friendfeed.FriendFeed(request.session['nickname'],
0
+        request.session['key'])
0
+    try:
0
+        start = max(int(request.GET.get('start', 0)), 0)
0
+    except:
0
+        start = 0
0
+    service = request.GET.get('service', None)
0
+    num = int(request.session.get('num', NUM))
0
+    data = f.fetch_list_feed(nickname, num=num, start=start, service=service)
0
+    if 'errorCode' in data:
0
+        if data['statusCode'] == 401:
0
+            del request.session['nickname']
0
+            del request.session['key']
0
+        return render_to_response('error.html', data, context_instance=RequestContext(request))
0
+    profile = f.fetch_list_profile(nickname)
0
+    entries = [entry for entry in data['entries'] if not entry['hidden']]
0
+    hidden = [entry for entry in data['entries'] if entry['hidden']]
0
+    extra_context = {
0
+        'entries': entries,
0
+        'next': start + num,
0
+        'hidden': hidden,
0
+        'profile': profile,
0
+        'list': nickname,
0
+    }
0
+    if start > 0:
0
+        extra_context['has_previous'] = True
0
+        extra_context['previous'] = max(start - num, 0)
0
+    if request.GET.get('output', 'html') == 'atom':
0
+        return atom(entries)
0
+    return render_to_response('list.html', extra_context, context_instance=RequestContext(request))
0
+
0
+def lists(request):
0
+    '''Display the authenticated users lists
0
+    
0
+    Authentication is required.
0
+    '''
0
+    if not request.session.get('nickname', None):
0
+        return HttpResponseRedirect(reverse('login'))
0
+    f = friendfeed.FriendFeed(request.session['nickname'],
0
+        request.session['key'])
0
+    data = f.fetch_user_profile(request.session['nickname'])
0
+    if 'errorCode' in data:
0
+        if data['statusCode'] == 401:
0
+            del request.session['nickname']
0
+            del request.session['key']
0
+        return render_to_response('error.html', data, context_instance=RequestContext(request))
0
+    extra_context = {
0
+        'lists': data['lists'],
0
+    }
0
+    return render_to_response('lists.html', extra_context, context_instance=RequestContext(request))
0
+
0
 def rooms(request):
0
     '''Display the authenticated users rooms page or a list of the users rooms
0
 
...
106
107
108
109
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
110
111
112
...
179
180
181
 
182
183
184
...
331
332
333
 
 
 
 
 
334
335
 
336
337
338
...
106
107
108
 
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
...
196
197
198
199
200
201
202
...
349
350
351
352
353
354
355
356
357
 
358
359
360
361
0
@@ -106,7 +106,24 @@ class FriendFeed(object):
0
         Authentication is required for private users.
0
         """
0
         return self._fetch(
0
-            "/api/user/" + urllib.quote_plus(nickname) + "/profile", None)
0
+            "/api/user/" + urllib.quote_plus(nickname) + "/profile", None, beta=1)
0
+
0
+    def fetch_list_profile(self, nickname):
0
+        """Returns a lists profile for the given nickname.
0
+
0
+        Authentication is required.
0
+        """
0
+        return self._fetch(
0
+            "/api/list/" + urllib.quote_plus(nickname) + "/profile", None, beta=1)
0
+
0
+    def fetch_list_feed(self, nickname, **kwargs):
0
+        """Returns a list feed for the given nickname.
0
+
0
+        Authentication is required.
0
+        """
0
+        kwargs["beta"] = 1
0
+        return self._fetch_feed(
0
+            "/api/feed/list/" + urllib.quote_plus(nickname), **kwargs)
0
 
0
     def fetch_room_profile(self, nickname):
0
         """Returns a rooms profile for the given nickname.
0
@@ -179,6 +196,7 @@ class FriendFeed(object):
0
 
0
         Authentication is always required.
0
         """
0
+        kwargs["beta"] = 1
0
         return self._fetch_feed("/api/feed/home", **kwargs)
0
 
0
     def search(self, q, **kwargs):
0
@@ -331,8 +349,13 @@ class FriendFeed(object):
0
         from django.utils.http import urlencode
0
         url_args["format"] = "json"
0
         url_args["apikey"] = settings.APIKEY 
0
+        if "beta" in url_args:
0
+            url = "http://beta.friendfeed.com"
0
+            del url_args["beta"]
0
+        else:
0
+            url = "http://friendfeed.com"
0
         args = urlencode(url_args)
0
-        url = "http://friendfeed.com" + uri + "?" + args
0
+        url += uri + "?" + args
0
         headers = {}
0
         if post_args is not None:
0
             # If we are POSTing then set the method/content-type (urllib2
...
26
27
28
29
 
30
31
32
...
64
65
66
67
 
 
 
 
 
68
69
70
...
73
74
75
76
77
 
 
78
79
80
81
 
 
82
83
84
...
26
27
28
 
29
30
31
32
...
64
65
66
 
67
68
69
70
71
72
73
74
...
77
78
79
 
 
80
81
82
83
 
 
84
85
86
87
88
0
@@ -26,7 +26,7 @@
0
             .profile img.picture { float: left; margin-bottom: 10px; margin-right: 10px; }
0
             .profile .section { margin-top: 5px; }
0
             ul.entries { clear: both; margin-top: 10px; }
0
-            ul.entries li.entry, ul.rooms li.room { margin-bottom: 10px; }
0
+            ul.entries li.entry, ul.rooms li.room, ul.lists li.list { margin-bottom: 10px; }
0
             ul.comments li { margin-top: 5px; padding-left: 20px ;}
0
             ul.comments li.comment { background: url('/static/images/quote.png') 2px 2px no-repeat; }
0
             ul.comments li.permalink { font-style: italic; }
0
@@ -64,7 +64,11 @@
0
                 </li>
0
                 <li>
0
                     2
0
-                    <a href="{% url user request.session.nickname %}" accesskey="2">Me</a>
0
+                    <a href="{% url lists %}" accesskey="2">Lists</a>
0
+                </li>
0
+                <li>
0
+                    3
0
+                    <a href="{% url user request.session.nickname %}" accesskey="3">Me</a>
0
                 </li>
0
             {% else %}
0
                 <li>
0
@@ -73,12 +77,12 @@
0
                 </li>
0
             {% endif %}
0
             <li>
0
-                3
0
-                <a href="{% url public %}" accesskey="3">Everyone</a>
0
+                4
0
+                <a href="{% url public %}" accesskey="4">Everyone</a>
0
             </li>
0
             <li>
0
-                4
0
-                <a href="{% url search %}" accesskey="4">Search</a>
0
+                5
0
+                <a href="{% url search %}" accesskey="5">Search</a>
0
             </li>
0
         </ul>
0
     </div>
...
14
15
16
 
 
17
18
19
...
14
15
16
17
18
19
20
21
0
@@ -14,6 +14,8 @@ urlpatterns = patterns('',
0
     url(r'^logout/$', 'fftogo.views.logout', name='logout'),
0
     url(r'^rooms/(?P<nickname>[\w-]+)/$', 'fftogo.views.room', name='room'),
0
     url(r'^rooms/$', 'fftogo.views.rooms', name='rooms'),
0
+    url(r'^lists/(?P<nickname>[\w-]+)/$', 'fftogo.views.list', name='list'),
0
+    url(r'^lists/$', 'fftogo.views.lists', name='lists'),
0
     url(r'^settings/$', 'fftogo.views.settings', name='settings'),
0
     url(r'^share/$', 'fftogo.views.share', name='share'),
0
     url(r'^search/$', 'fftogo.views.search', name='search'),

Comments