mirror of
https://github.com/reddit-archive/reddit.git
synced 2026-01-29 16:58:21 -05:00
multi API: Revert to array of subreddit data; return data on PUT.
I've decided to return to using an array for multi API subreddit data since it more closely resembles a collection of objects.
This commit is contained in:
@@ -46,6 +46,7 @@ from r2.lib.validator import (
|
||||
VMultiByPath,
|
||||
)
|
||||
from r2.lib.pages.things import wrap_things
|
||||
from r2.lib.jsontemplates import LabeledMultiJsonTemplate
|
||||
from r2.lib.errors import errors, reddit_http_error, RedditError
|
||||
from r2.lib.base import abort
|
||||
|
||||
@@ -113,11 +114,11 @@ class MultiApiController(RedditController, OAuth2ResourceController):
|
||||
|
||||
if 'subreddits' in data:
|
||||
multi.clear_srs()
|
||||
srs = Subreddit._by_name(data['subreddits'].keys())
|
||||
srs = Subreddit._by_name(sr['name'] for sr in data['subreddits'])
|
||||
sr_props = {}
|
||||
for sr_name, sr_data in data['subreddits'].iteritems():
|
||||
for sr_data in data['subreddits']:
|
||||
try:
|
||||
sr = srs[sr_name]
|
||||
sr = srs[sr_data['name']]
|
||||
except KeyError:
|
||||
raise RedditError('SUBREDDIT_NOEXIST', code=400)
|
||||
else:
|
||||
@@ -144,11 +145,26 @@ class MultiApiController(RedditController, OAuth2ResourceController):
|
||||
"""Delete a multi."""
|
||||
multi.delete()
|
||||
|
||||
def _get_multi_subreddit(self, multi, sr):
|
||||
resp = LabeledMultiJsonTemplate.sr_props(multi, [sr])[0]
|
||||
return self.api_wrapper(resp)
|
||||
|
||||
@require_oauth2_scope("subscribe")
|
||||
@api_doc(
|
||||
api_section.multis,
|
||||
uri="/api/multi/{multipath}/r/{srname}",
|
||||
)
|
||||
@validate(
|
||||
VUser(),
|
||||
multi=VMultiByPath("path", require_view=True),
|
||||
sr=VSRByName('sr_name'),
|
||||
)
|
||||
def GET_multi_subreddit(self, multi, sr):
|
||||
"""Get data about a subreddit in a multi."""
|
||||
return self._get_multi_subreddit(multi, sr)
|
||||
|
||||
@require_oauth2_scope("subscribe")
|
||||
@api_doc(api_section.multis, extends=GET_multi_subreddit)
|
||||
@validate(
|
||||
VUser(),
|
||||
VModhash(),
|
||||
@@ -165,6 +181,8 @@ class MultiApiController(RedditController, OAuth2ResourceController):
|
||||
else:
|
||||
multi._commit()
|
||||
|
||||
return self._get_multi_subreddit(multi, sr)
|
||||
|
||||
@require_oauth2_scope("subscribe")
|
||||
@api_doc(api_section.multis, extends=PUT_multi_subreddit)
|
||||
@validate(
|
||||
|
||||
@@ -262,9 +262,14 @@ class LabeledMultiJsonTemplate(ThingJsonTemplate):
|
||||
def kind(self, wrapped):
|
||||
return "LabeledMulti"
|
||||
|
||||
@classmethod
|
||||
def sr_props(cls, thing, srs):
|
||||
sr_props = thing.sr_props
|
||||
return [dict(sr_props[sr._id], name=sr.name) for sr in srs]
|
||||
|
||||
def thing_attr(self, thing, attr):
|
||||
if attr == "srs":
|
||||
return thing.named_sr_props
|
||||
return self.sr_props(thing, thing.srs)
|
||||
else:
|
||||
return ThingJsonTemplate.thing_attr(self, thing, attr)
|
||||
|
||||
|
||||
@@ -1375,11 +1375,6 @@ class LabeledMulti(tdb_cassandra.Thing, MultiReddit):
|
||||
def sr_props(self):
|
||||
return self.columns_to_sr_props(self.sr_columns)
|
||||
|
||||
@property
|
||||
def named_sr_props(self):
|
||||
sr_props = self.sr_props
|
||||
return {sr.name: sr_props[sr._id] for sr in self._srs}
|
||||
|
||||
@property
|
||||
def path(self):
|
||||
return self._id
|
||||
|
||||
@@ -41,21 +41,6 @@ r.multi.MultiRedditList = Backbone.Collection.extend({
|
||||
return model.id
|
||||
},
|
||||
|
||||
parse: function(response) {
|
||||
return _.map(response, function(srData, srName) {
|
||||
srData['name'] = srName
|
||||
return srData
|
||||
})
|
||||
},
|
||||
|
||||
toJSON: function() {
|
||||
srProps = {}
|
||||
this.each(function(sr) {
|
||||
srProps[sr.get('name')] = sr.omit('name')
|
||||
})
|
||||
return srProps
|
||||
},
|
||||
|
||||
getByName: function(name) {
|
||||
return this.get(name.toLowerCase())
|
||||
}
|
||||
@@ -68,10 +53,10 @@ r.multi.MultiReddit = Backbone.Model.extend({
|
||||
},
|
||||
|
||||
initialize: function() {
|
||||
this.subreddits = new r.multi.MultiRedditList(this.get('subreddits'), {parse: true})
|
||||
this.subreddits = new r.multi.MultiRedditList(this.get('subreddits'))
|
||||
this.subreddits.url = this.url() + '/r/'
|
||||
this.on('change:subreddits', function(model, value) {
|
||||
this.subreddits.reset(value, {parse: true})
|
||||
this.subreddits.reset(value)
|
||||
}, this)
|
||||
this.subreddits.on('request', function(model, xhr, options) {
|
||||
this.trigger('request', model, xhr, options)
|
||||
|
||||
Reference in New Issue
Block a user