From d923cdfca05268be149afc02bd6ea5dff53aa105 Mon Sep 17 00:00:00 2001 From: Max Goodman Date: Fri, 3 May 2013 02:55:47 -0700 Subject: [PATCH] Use similar sr_props data structure across client and API. --- r2/r2/lib/jsontemplates.py | 2 +- r2/r2/models/subreddit.py | 5 +++++ r2/r2/public/static/js/multi.js | 26 ++++++++++++++++++++++++-- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/r2/r2/lib/jsontemplates.py b/r2/r2/lib/jsontemplates.py index 8ef0fea43..bb608b642 100755 --- a/r2/r2/lib/jsontemplates.py +++ b/r2/r2/lib/jsontemplates.py @@ -264,7 +264,7 @@ class LabeledMultiJsonTemplate(ThingJsonTemplate): def thing_attr(self, thing, attr): if attr == "srs": - return [{"name": sr.name} for sr in thing.srs] + return thing.named_sr_props else: return ThingJsonTemplate.thing_attr(self, thing, attr) diff --git a/r2/r2/models/subreddit.py b/r2/r2/models/subreddit.py index b00edd0fa..f08909f98 100644 --- a/r2/r2/models/subreddit.py +++ b/r2/r2/models/subreddit.py @@ -1375,6 +1375,11 @@ 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 b05d85046..b9a656fa4 100644 --- a/r2/r2/public/static/js/multi.js +++ b/r2/r2/public/static/js/multi.js @@ -36,10 +36,26 @@ r.multi.MultiRedditList = Backbone.Collection.extend({ this.id = this.get('name').toLowerCase() } }), + comparator: function(model) { 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()) } @@ -52,10 +68,10 @@ r.multi.MultiReddit = Backbone.Model.extend({ }, initialize: function() { - this.subreddits = new r.multi.MultiRedditList(this.get('subreddits')) + this.subreddits = new r.multi.MultiRedditList(this.get('subreddits'), {parse: true}) this.subreddits.url = this.url() + '/r/' this.on('change:subreddits', function(model, value) { - this.subreddits.reset(value) + this.subreddits.reset(value, {parse: true}) }, this) this.subreddits.on('request', function(model, xhr, options) { this.trigger('request', model, xhr, options) @@ -66,6 +82,12 @@ r.multi.MultiReddit = Backbone.Model.extend({ return response.data }, + toJSON: function() { + data = Backbone.Model.prototype.toJSON.apply(this) + data.subreddits = this.subreddits.toJSON() + return data + }, + addSubreddit: function(name, options) { this.subreddits.create({name: name}, options) },