diff --git a/r2/r2/controllers/reddit_base.py b/r2/r2/controllers/reddit_base.py index bd0eaec99..b70581849 100644 --- a/r2/r2/controllers/reddit_base.py +++ b/r2/r2/controllers/reddit_base.py @@ -359,12 +359,13 @@ def set_subreddit(): c.site = Friends else: srs = [sr for sr in srs if not isinstance(sr, FakeSubreddit)] + multi_path = '/r/' + sr_name if not srs: - c.site = MultiReddit([], sr_name) + c.site = MultiReddit(multi_path, []) elif len(srs) == 1: c.site = srs[0] else: - c.site = MultiReddit(srs, sr_name) + c.site = MultiReddit(multi_path, srs) elif '-' in sr_name: sr_names = sr_name.split('-') if not sr_names[0].lower() == All.name.lower(): diff --git a/r2/r2/models/subreddit.py b/r2/r2/models/subreddit.py index 17f316d25..644215229 100644 --- a/r2/r2/models/subreddit.py +++ b/r2/r2/models/subreddit.py @@ -58,9 +58,49 @@ from r2.models.wiki import WikiPage import os.path import random + +def get_links_sr_ids(sr_ids, sort, time): + from r2.lib.db import queries + + if not sr_ids: + return [] + else: + srs = Subreddit._byID(sr_ids, data=True, return_dict = False) + + results = [queries.get_links(sr, sort, time) + for sr in srs] + return queries.merge_results(*results) + + +class BaseSite(object): + static_path = g.static_path + stylesheet = None + stylesheet_hash = None + header = None + header_title = None + + @property + def path(self): + return "/r/%s/" % self.name + + def is_moderator_with_perms(self, user, *perms): + rel = self.is_moderator(user) + if rel: + return all(rel.has_permission(perm) for perm in perms) + + def is_limited_moderator(self, user): + rel = self.is_moderator(user) + return bool(rel and not rel.is_superuser()) + + def is_unlimited_moderator(self, user): + rel = self.is_moderator(user) + return bool(rel and rel.is_superuser()) + + class SubredditExists(Exception): pass -class Subreddit(Thing, Printable): + +class Subreddit(BaseSite, Thing, Printable): # Note: As of 2010/03/18, nothing actually overrides the static_path # attribute, even on a cname. So c.site.static_path should always be # the same as g.static_path. @@ -781,11 +821,6 @@ class Subreddit(Thing, Printable): return names - @property - def path(self): - return "/r/%s/" % self.name - - def keep_item(self, wrapped): if c.user_is_admin: return True @@ -870,19 +905,6 @@ class Subreddit(Thing, Printable): # is really slow return [rel._thing2_id for rel in list(merged)] - def is_moderator_with_perms(self, user, *perms): - rel = self.is_moderator(user) - if rel: - return all(rel.has_permission(perm) for perm in perms) - - def is_limited_moderator(self, user): - rel = self.is_moderator(user) - return bool(rel and not rel.is_superuser()) - - def is_unlimited_moderator(self, user): - rel = self.is_moderator(user) - return bool(rel and rel.is_superuser()) - def update_moderator_permissions(self, user, **kwargs): """Grants or denies permissions to this moderator. @@ -902,14 +924,19 @@ class Subreddit(Thing, Printable): rel.note = note rel._commit() -class FakeSubreddit(Subreddit): +class FakeSubreddit(BaseSite): + domain = None over_18 = False - _nodb = True + title = '' + description = '' + link_type = "any" + sponsorship_url = None + flair_enabled = True + flair_position = "right" + link_flair_position = "" def __init__(self): - Subreddit.__init__(self) - self.title = '' - self.link_flair_position = 'right' + BaseSite.__init__(self) def keep_for_rising(self, sr_id): return False @@ -1095,21 +1122,9 @@ class _DefaultSR(FakeSubreddit): def is_moderator(self, user): return False - def get_links_sr_ids(self, sr_ids, sort, time): - from r2.lib.db import queries - - if not sr_ids: - return [] - else: - srs = Subreddit._byID(sr_ids, data=True, return_dict = False) - - results = [queries.get_links(sr, sort, time) - for sr in srs] - return queries.merge_results(*results) - def get_links(self, sort, time): sr_ids = self._get_sr_ids() - return self.get_links_sr_ids(sr_ids, sort, time) + return get_links_sr_ids(sr_ids, sort, time) @property def title(self): @@ -1137,7 +1152,7 @@ class DefaultSR(_DefaultSR): @property def wikimode(self): - return self._base.wikimode + return self._base.wikimode if self._base else "disabled" @property def wiki_edit_karma(self): @@ -1193,17 +1208,31 @@ class DefaultSR(_DefaultSR): return self._base.stylesheet_hash if self._base else "" -class MultiReddit(_DefaultSR): +class MultiReddit(FakeSubreddit): name = 'multi' header = "" - def __init__(self, srs, path): - _DefaultSR.__init__(self) - self.real_path = path - self.srs = srs - self.sr_ids = [sr._id for sr in srs] - self.banned_sr_ids = [sr._id for sr in srs if sr._spam] - self.kept_sr_ids = [sr._id for sr in srs if not sr._spam] + def __init__(self, path=None, srs=None): + FakeSubreddit.__init__(self) + if path is not None: + self._path = path + self._srs = srs or [] + + @property + def srs(self): + return self._srs + + @property + def sr_ids(self): + return [sr._id for sr in self.srs] + + @property + def kept_sr_ids(self): + return [sr._id for sr in self.srs if not sr._spam] + + @property + def banned_sr_ids(self): + return [sr._id for sr in self.srs if sr._spam] def keep_for_rising(self, sr_id): return sr_id in self.kept_sr_ids @@ -1224,10 +1253,10 @@ class MultiReddit(_DefaultSR): @property def path(self): - return '/r/' + self.real_path + return self._path def get_links(self, sort, time): - return self.get_links_sr_ids(self.kept_sr_ids, sort, time) + return get_links_sr_ids(self.kept_sr_ids, sort, time) def get_all_comments(self): from r2.lib.db.queries import get_sr_comments, merge_results @@ -1256,11 +1285,10 @@ class ModContribSR(MultiReddit): name = None title = None query_param = None - real_path = None def __init__(self): # Can't lookup srs right now, c.user not set - MultiReddit.__init__(self, [], self.real_path) + MultiReddit.__init__(self) @property def sr_ids(self): @@ -1273,19 +1301,11 @@ class ModContribSR(MultiReddit): def srs(self): return Subreddit._byID(self.sr_ids, data=True, return_dict=False) - @property - def kept_sr_ids(self): - return [sr._id for sr in self.srs if not sr._spam] - - @property - def banned_sr_ids(self): - return [sr._id for sr in self.srs if sr._spam] - class ModSR(ModContribSR): name = "subreddits you moderate" title = "subreddits you moderate" query_param = "moderator" - real_path = "mod" + path = "/r/mod" def is_moderator(self, user): return FakeSRMember(ModeratorPermissionSet) @@ -1294,7 +1314,7 @@ class ContribSR(ModContribSR): name = "contrib" title = "communities you're approved on" query_param = "contributor" - real_path = "contrib" + path = "/r/contrib" class SubSR(FakeSubreddit): stylesheet = 'subreddit.css'