Add /api/flairlist.json.

This commit is contained in:
Logan Hanks
2011-07-15 11:23:29 -07:00
parent 59c95b6c17
commit d80dac7e76
5 changed files with 66 additions and 24 deletions

View File

@@ -49,3 +49,5 @@ api('account', AccountJsonTemplate)
api('organiclisting', OrganicListingJsonTemplate)
api('reddittraffic', TrafficJsonTemplate)
api('takedownpane', TakedownJsonTemplate)
api('flairlist', FlairListJsonTemplate)

View File

@@ -20,6 +20,7 @@
# CondeNet, Inc. All Rights Reserved.
################################################################################
from reddit_base import RedditController, MinimalController, set_user_cookie
from reddit_base import paginated_listing
from pylons.i18n import _
from pylons import c, request
@@ -2051,6 +2052,13 @@ class ApiController(RedditController):
c.site._commit()
jquery.refresh()
@paginated_listing(max_page_size=1000)
@validate(VFlairManager(),
user = VOptionalExistingUname('name'))
def GET_flairlist(self, num, after, reverse, count, user):
flair = FlairList(num, after, reverse, user)
return BoringPage(_("API"), content = flair).render()
@validatedForm(VAdmin(),
award = VByName("fullname"),
description = VLength("description", max_length=1000),

View File

@@ -444,34 +444,41 @@ def ratelimit_throttled():
abort(503, 'service temporarily unavailable')
def paginated_listing(default_page_size=25, max_page_size=100):
def decorator(fn):
@validate(num=VLimit('limit', default=default_page_size,
max_limit=max_page_size),
after=VByName('after'),
before=VByName('before'),
count=VCount('count'),
target=VTarget("target"),
show=VLength('show', 3))
def new_fn(self, before, **env):
if c.render_style == "htmllite":
c.link_target = env.get("target")
elif "target" in env:
del env["target"]
if "show" in env and env['show'] == 'all':
c.ignore_hide_rules = True
kw = build_arg_list(fn, env)
#turn before into after/reverse
kw['reverse'] = False
if before:
kw['after'] = before
kw['reverse'] = True
return fn(self, **kw)
return new_fn
return decorator
#TODO i want to get rid of this function. once the listings in front.py are
#moved into listingcontroller, we shouldn't have a need for this
#anymore
def base_listing(fn):
@validate(num = VLimit('limit'),
after = VByName('after'),
before = VByName('before'),
count = VCount('count'),
target = VTarget("target"),
show = VLength('show', 3))
def new_fn(self, before, **env):
if c.render_style == "htmllite":
c.link_target = env.get("target")
elif "target" in env:
del env["target"]
return paginated_listing()(fn)
if "show" in env and env['show'] == 'all':
c.ignore_hide_rules = True
kw = build_arg_list(fn, env)
#turn before into after/reverse
kw['reverse'] = False
if before:
kw['after'] = before
kw['reverse'] = True
return fn(self, **kw)
return new_fn
class MinimalController(BaseController):

View File

@@ -359,10 +359,15 @@ class VCount(Validator):
class VLimit(Validator):
def __init__(self, param, default=25, max_limit=100, **kw):
self.default = default
self.max_limit = max_limit
Validator.__init__(self, param, **kw)
def run(self, limit):
default = c.user.pref_numsites
if c.render_style in ("compact", api_type("compact")):
default = 25 # TODO: ini param?
default = self.default # TODO: ini param?
if limit is None:
return default

View File

@@ -455,3 +455,23 @@ class TrafficJsonTemplate(JsonTemplate):
res[ival] = [[time.mktime(date.timetuple())] + list(data)
for date, data in getattr(thing, ival+"_data")]
return ObjectTemplate(res)
class FlairListJsonTemplate(JsonTemplate):
def render(self, thing, *a, **kw):
def row_to_json(row):
if hasattr(row, 'user'):
return dict(user=row.user.name, flair_text=row.flair_text,
flair_css_class=row.flair_css_class)
else:
# prev/next link
return dict(after=row.after, reverse=row.reverse)
json_rows = [row_to_json(row) for row in thing.flair]
result = dict(users=[row for row in json_rows if 'user' in row])
for row in json_rows:
if 'after' in row:
if row['reverse']:
result['prev'] = row['after']
else:
result['next'] = row['after']
return ObjectTemplate(result)