Cleaned up SubmissionContent.from_name()

This commit is contained in:
Michael Lazar
2015-04-04 14:12:25 -07:00
parent 48f1907920
commit 6c5c155311
2 changed files with 45 additions and 51 deletions

View File

@@ -246,11 +246,23 @@ class SubredditContent(BaseContent):
self._submissions = submissions self._submissions = submissions
self._submission_data = [] self._submission_data = []
@classmethod # Verify that content exists for the given submission generator.
def from_name(cls, reddit, name, loader, order='hot', search=None): # This is necessary because PRAW loads submissions lazily, and
# there is is no other way to check things like multireddits that
# don't have a real corresponding subreddit object.
try:
content.get(0)
except (praw.errors.APIException, requests.HTTPError,
praw.errors.RedirectException):
raise SubredditError(display_name)
if name is None: @classmethod
name = 'front' def from_name(cls, reddit, name, loader, order='hot', query=None):
name = name if name else 'front'
if order not in ['hot', 'top', 'rising', 'new', 'controversial']:
raise SubredditError(display_name)
name = name.strip(' /') # Strip leading and trailing backslashes name = name.strip(' /') # Strip leading and trailing backslashes
if name.startswith('r/'): if name.startswith('r/'):
@@ -260,55 +272,37 @@ class SubredditContent(BaseContent):
if '/' in name: if '/' in name:
name, order = name.split('/') name, order = name.split('/')
if order == 'hot': display_name = display_name = '/r/{}'.format(name)
display_name = '/r/{}'.format(name) if order != 'hot':
else: display_name += '/{}'.format(order)
display_name = '/r/{}/{}'.format(name, order)
if name == 'front': if name == 'front':
if search: dispatch = {
submissions = reddit.search(search, None, order) 'hot': reddit.get_front_page,
elif order == 'hot': 'top': reddit.get_top,
submissions = reddit.get_front_page(limit=None) 'rising': reddit.get_rising,
elif order == 'top': 'new': reddit.get_new,
submissions = reddit.get_top(limit=None) 'controversial': reddit.get_controversial
elif order == 'rising': }
submissions = reddit.get_rising(limit=None)
elif order == 'new':
submissions = reddit.get_new(limit=None)
elif order == 'controversial':
submissions = reddit.get_controversial(limit=None)
else:
raise SubredditError(display_name)
else: else:
subreddit = reddit.get_subreddit(name) subreddit = reddit.get_subreddit(name)
if search: dispatch = {
submissions = reddit.search(search, name, order) 'hot': subreddit.get_hot,
elif order == 'hot': 'top': subreddit.get_top,
submissions = subreddit.get_hot(limit=None) 'rising': subreddit.get_rising,
elif order == 'top': 'new': subreddit.get_new,
submissions = subreddit.get_top(limit=None) 'controversial': subreddit.get_controversial
elif order == 'rising': }
submissions = subreddit.get_rising(limit=None)
elif order == 'new': if query:
submissions = subreddit.get_new(limit=None) if name == 'front':
elif order == 'controversial': submissions = reddit.search(query, subreddit=None, sort=order)
submissions = subreddit.get_controversial(limit=None)
else: else:
raise SubredditError(display_name) submissions = reddit.search(query, subreddit=name, sort=order)
else:
submissions = dispatch[order](limit=None)
# Verify that content exists for the given submission generator. return cls(display_name, submissions, loader)
# This is necessary because PRAW loads submissions lazily, and
# there is is no other way to check things like multireddits that
# don't have a real corresponding subreddit object.
content = cls(display_name, submissions, loader)
try:
content.get(0)
except (praw.errors.APIException, requests.HTTPError,
praw.errors.RedirectException):
raise SubredditError(display_name)
return content
def get(self, index, n_cols=70): def get(self, index, n_cols=70):
""" """

View File

@@ -57,12 +57,12 @@ class SubredditPage(BasePage):
"""Open a prompt to search the subreddit""" """Open a prompt to search the subreddit"""
name = name or self.content.name name = name or self.content.name
prompt = 'Search this Subreddit: ' prompt = 'Search this Subreddit: '
search = self.prompt_input(prompt) query = self.prompt_input(prompt)
if search is not None: if query is not None:
try: try:
self.nav.cursor_index = 0 self.nav.cursor_index = 0
self.content = SubredditContent.from_name(self.reddit, name, self.content = SubredditContent.from_name(self.reddit, name,
self.loader, search=search) self.loader, query=query)
except IndexError: # if there are no submissions except IndexError: # if there are no submissions
show_notification(self.stdscr, ['No results found']) show_notification(self.stdscr, ['No results found'])