diff --git a/r2/r2/controllers/multi.py b/r2/r2/controllers/multi.py index dc6734f01..c9fafcbc2 100644 --- a/r2/r2/controllers/multi.py +++ b/r2/r2/controllers/multi.py @@ -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( diff --git a/r2/r2/lib/jsontemplates.py b/r2/r2/lib/jsontemplates.py index bb608b642..34daab45f 100755 --- a/r2/r2/lib/jsontemplates.py +++ b/r2/r2/lib/jsontemplates.py @@ -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) diff --git a/r2/r2/models/subreddit.py b/r2/r2/models/subreddit.py index a873ed070..2477e88aa 100644 --- a/r2/r2/models/subreddit.py +++ b/r2/r2/models/subreddit.py @@ -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 diff --git a/r2/r2/public/static/js/multi.js b/r2/r2/public/static/js/multi.js index c78330707..6205cce0c 100644 --- a/r2/r2/public/static/js/multi.js +++ b/r2/r2/public/static/js/multi.js @@ -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)