From fb19fc689df289be3bd95f1cec58eecccd51d7ce Mon Sep 17 00:00:00 2001 From: Brian Simpson Date: Tue, 24 Dec 2013 15:22:54 -0500 Subject: [PATCH] Allow subtracting subreddits from /r/mod. --- r2/r2/controllers/reddit_base.py | 26 +++++++++++++++++++------- r2/r2/models/subreddit.py | 26 ++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 7 deletions(-) diff --git a/r2/r2/controllers/reddit_base.py b/r2/r2/controllers/reddit_base.py index cb9d65d50..672241f06 100644 --- a/r2/r2/controllers/reddit_base.py +++ b/r2/r2/controllers/reddit_base.py @@ -93,6 +93,8 @@ from r2.models import ( Frontpage, LabeledMulti, Link, + Mod, + ModMinus, MultiReddit, NotFound, Random, @@ -371,14 +373,24 @@ def set_subreddit(): c.site = MultiReddit(multi_path, srs) elif '-' in sr_name: sr_names = sr_name.split('-') - if not sr_names[0].lower() == All.name.lower(): - redirect_to("/subreddits/search?q=%s" % sr_name) - srs = Subreddit._by_name(sr_names[1:], stale=can_stale).values() - srs = [sr for sr in srs if not isinstance(sr, FakeSubreddit)] - if not srs: - c.site = All + base_sr_name, exclude_sr_names = sr_names[0], sr_names[1:] + srs = Subreddit._by_name(sr_names, stale=can_stale) + base_sr = srs.pop(base_sr_name) + exclude_srs = [sr for sr in srs.itervalues() + if not isinstance(sr, FakeSubreddit)] + + if base_sr == All: + if exclude_srs: + c.site = AllMinus(exclude_srs) + else: + c.site = All + elif base_sr == Mod: + if exclude_srs: + c.site = ModMinus(exclude_srs) + else: + c.site = Mod else: - c.site = AllMinus(srs) + redirect_to("/subreddits/search?q=%s" % sr_name) else: try: c.site = Subreddit._by_name(sr_name, stale=can_stale) diff --git a/r2/r2/models/subreddit.py b/r2/r2/models/subreddit.py index 5ffefd9a4..8db19548e 100644 --- a/r2/r2/models/subreddit.py +++ b/r2/r2/models/subreddit.py @@ -1529,6 +1529,32 @@ class ModSR(ModContribSR): def is_moderator(self, user): return FakeSRMember(ModeratorPermissionSet) + +class ModMinus(ModSR): + def __init__(self, exclude_srs): + ModSR.__init__(self) + self.exclude_srs = exclude_srs + self.exclude_sr_ids = [sr._id for sr in exclude_srs] + + @property + def sr_ids(self): + sr_ids = super(ModMinus, self).sr_ids + return [sr_id for sr_id in sr_ids if not sr_id in self.exclude_sr_ids] + + @property + def name(self): + exclude_text = ', '.join(sr.name for sr in self.exclude_srs) + return 'subreddits you moderate except ' + exclude_text + + @property + def title(self): + return self.name + + @property + def path(self): + return '/r/mod-' + '-'.join(sr.name for sr in self.srs) + + class ContribSR(ModContribSR): name = "contrib" title = "communities you're approved on"