From d80dac7e7666395b7c35695f3a5abe9bc69b6067 Mon Sep 17 00:00:00 2001 From: Logan Hanks Date: Fri, 15 Jul 2011 11:23:29 -0700 Subject: [PATCH] Add /api/flairlist.json. --- r2/r2/config/templates.py | 2 + r2/r2/controllers/api.py | 8 ++++ r2/r2/controllers/reddit_base.py | 53 ++++++++++++++---------- r2/r2/controllers/validator/validator.py | 7 +++- r2/r2/lib/jsontemplates.py | 20 +++++++++ 5 files changed, 66 insertions(+), 24 deletions(-) diff --git a/r2/r2/config/templates.py b/r2/r2/config/templates.py index 7d29b597d..59e6cd0e5 100644 --- a/r2/r2/config/templates.py +++ b/r2/r2/config/templates.py @@ -49,3 +49,5 @@ api('account', AccountJsonTemplate) api('organiclisting', OrganicListingJsonTemplate) api('reddittraffic', TrafficJsonTemplate) api('takedownpane', TakedownJsonTemplate) + +api('flairlist', FlairListJsonTemplate) diff --git a/r2/r2/controllers/api.py b/r2/r2/controllers/api.py index fd47af3d3..63d1fa5e8 100644 --- a/r2/r2/controllers/api.py +++ b/r2/r2/controllers/api.py @@ -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), diff --git a/r2/r2/controllers/reddit_base.py b/r2/r2/controllers/reddit_base.py index d6c764aab..99b133a70 100644 --- a/r2/r2/controllers/reddit_base.py +++ b/r2/r2/controllers/reddit_base.py @@ -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): diff --git a/r2/r2/controllers/validator/validator.py b/r2/r2/controllers/validator/validator.py index 31153b066..f7be3b21e 100644 --- a/r2/r2/controllers/validator/validator.py +++ b/r2/r2/controllers/validator/validator.py @@ -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 diff --git a/r2/r2/lib/jsontemplates.py b/r2/r2/lib/jsontemplates.py index 4f123798a..470e6ab98 100644 --- a/r2/r2/lib/jsontemplates.py +++ b/r2/r2/lib/jsontemplates.py @@ -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)