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:
Max Goodman
2013-05-09 02:29:22 -07:00
parent adb37a1225
commit dfd97d13d5
4 changed files with 29 additions and 26 deletions

View File

@@ -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(

View File

@@ -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)

View File

@@ -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

View File

@@ -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)