Feature: view user pages and domain listings
This commit is contained in:
@@ -6,7 +6,7 @@ from datetime import datetime
|
|||||||
|
|
||||||
import six
|
import six
|
||||||
import praw
|
import praw
|
||||||
from praw.errors import InvalidSubreddit
|
from praw.errors import InvalidSubreddit, NotFound
|
||||||
from kitchen.text.display import wrap
|
from kitchen.text.display import wrap
|
||||||
|
|
||||||
from . import exceptions
|
from . import exceptions
|
||||||
@@ -355,10 +355,13 @@ class SubredditContent(Content):
|
|||||||
list for repeat access.
|
list for repeat access.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, name, submissions, loader, order=None):
|
def __init__(self, name, submissions, loader, order=None, listing='r',
|
||||||
|
period=None):
|
||||||
|
|
||||||
|
self.listing = listing
|
||||||
self.name = name
|
self.name = name
|
||||||
self.order = order
|
self.order = order
|
||||||
|
self.period = period
|
||||||
self._loader = loader
|
self._loader = loader
|
||||||
self._submissions = submissions
|
self._submissions = submissions
|
||||||
self._submission_data = []
|
self._submission_data = []
|
||||||
@@ -373,52 +376,80 @@ class SubredditContent(Content):
|
|||||||
raise exceptions.SubredditError('No submissions')
|
raise exceptions.SubredditError('No submissions')
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_name(cls, reddit, name, loader, order=None, query=None):
|
def from_name(cls, reddit, name, loader, order=None, query=None,
|
||||||
|
listing='r', period=None):
|
||||||
|
|
||||||
# Strip leading and trailing backslashes
|
# Strip leading and trailing backslashes
|
||||||
name = name.strip(' /')
|
name = name.strip(' /').split('/')
|
||||||
if name.startswith('r/'):
|
if name[0] in ['r', 'u', 'user', 'domain']:
|
||||||
name = name[2:]
|
listing, *name = name
|
||||||
|
if len(name) > 1:
|
||||||
# If the order is not given explicitly, it will be searched for and
|
name, name_order = name
|
||||||
# stripped out of the subreddit name e.g. python/new.
|
|
||||||
if '/' in name:
|
|
||||||
name, name_order = name.split('/')
|
|
||||||
order = order or name_order
|
order = order or name_order
|
||||||
display_name = '/r/{0}'.format(name)
|
else:
|
||||||
|
name = name[0]
|
||||||
|
listing = 'u' if name == 'me' else listing
|
||||||
|
display_name = '/{0}/{1}'.format(listing, name)
|
||||||
|
|
||||||
if order not in ['hot', 'top', 'rising', 'new', 'controversial', None]:
|
time = {t: '_from_' + t for t in ['all', 'day', 'hour',
|
||||||
|
'month', 'week', 'year']}
|
||||||
|
time[None] = ''
|
||||||
|
|
||||||
|
if period not in time.keys():
|
||||||
|
raise exceptions.SubredditError('Unrecognized period "%s"'
|
||||||
|
% period)
|
||||||
|
|
||||||
|
elif order not in ['hot', 'top', 'rising', 'new',
|
||||||
|
'controversial', None]:
|
||||||
raise exceptions.SubredditError('Unrecognized order "%s"' % order)
|
raise exceptions.SubredditError('Unrecognized order "%s"' % order)
|
||||||
|
|
||||||
if name == 'me':
|
if query:
|
||||||
if not reddit.is_oauth_session():
|
loc = None
|
||||||
raise exceptions.AccountError('Not logged in')
|
if listing == 'r' and name != 'front':
|
||||||
elif order:
|
loc = name
|
||||||
submissions = reddit.user.get_submitted(sort=order)
|
|
||||||
else:
|
|
||||||
submissions = reddit.user.get_submitted()
|
|
||||||
|
|
||||||
elif query:
|
elif listing == 'domain':
|
||||||
if name == 'front':
|
query = 'site:{0} {1}'.format(name, query)
|
||||||
submissions = reddit.search(query, subreddit=None, sort=order)
|
|
||||||
else:
|
|
||||||
submissions = reddit.search(query, subreddit=name, sort=order)
|
|
||||||
|
|
||||||
else:
|
elif listing in ['u', 'user']:
|
||||||
|
query = 'author:{0} {1}'.format(name, query)
|
||||||
|
|
||||||
|
submissions = reddit.search(query, subreddit=loc, sort=order,
|
||||||
|
period=period)
|
||||||
|
|
||||||
|
elif listing == 'domain':
|
||||||
|
submissions = reddit.get_domain_listing(name,
|
||||||
|
sort=(order or 'hot'), period=period)
|
||||||
|
|
||||||
|
elif listing in ['u', 'user']:
|
||||||
|
if name == 'me':
|
||||||
|
if not reddit.is_oauth_session():
|
||||||
|
raise exceptions.AccountError('Not logged in')
|
||||||
|
else:
|
||||||
|
submissions = reddit.user.get_submitted( \
|
||||||
|
sort=(order or 'new'))
|
||||||
|
else:
|
||||||
|
redditor = reddit.get_redditor(name)
|
||||||
|
submissions = redditor.get_submitted(sort=(order or 'new'),
|
||||||
|
time=(period or 'all'))
|
||||||
|
|
||||||
|
elif listing == 'r':
|
||||||
if name == '':
|
if name == '':
|
||||||
# Praw does not correctly handle empty strings
|
# Praw does not correctly handle empty strings
|
||||||
# https://github.com/praw-dev/praw/issues/615
|
# https://github.com/praw-dev/praw/issues/615
|
||||||
raise InvalidSubreddit()
|
raise InvalidSubreddit()
|
||||||
|
|
||||||
if name == 'front':
|
elif name == 'front':
|
||||||
dispatch = {
|
dispatch = {
|
||||||
None: reddit.get_front_page,
|
None: reddit.get_front_page,
|
||||||
'hot': reddit.get_front_page,
|
'hot': reddit.get_front_page,
|
||||||
'top': reddit.get_top,
|
'top': eval('reddit.get_top' + time[period]),
|
||||||
'rising': reddit.get_rising,
|
'rising': reddit.get_rising,
|
||||||
'new': reddit.get_new,
|
'new': reddit.get_new,
|
||||||
'controversial': reddit.get_controversial,
|
'controversial': eval('reddit.get_controversial' \
|
||||||
|
+ time[period]),
|
||||||
}
|
}
|
||||||
|
|
||||||
else:
|
else:
|
||||||
subreddit = reddit.get_subreddit(name)
|
subreddit = reddit.get_subreddit(name)
|
||||||
# For special subreddits like /r/random we want to replace the
|
# For special subreddits like /r/random we want to replace the
|
||||||
@@ -427,14 +458,16 @@ class SubredditContent(Content):
|
|||||||
dispatch = {
|
dispatch = {
|
||||||
None: subreddit.get_hot,
|
None: subreddit.get_hot,
|
||||||
'hot': subreddit.get_hot,
|
'hot': subreddit.get_hot,
|
||||||
'top': subreddit.get_top,
|
'top': eval('subreddit.get_top' + time[period]),
|
||||||
'rising': subreddit.get_rising,
|
'rising': subreddit.get_rising,
|
||||||
'new': subreddit.get_new,
|
'new': subreddit.get_new,
|
||||||
'controversial': subreddit.get_controversial,
|
'controversial': eval('subreddit.get_controversial' \
|
||||||
|
+ time[period]),
|
||||||
}
|
}
|
||||||
submissions = dispatch[order](limit=None)
|
submissions = dispatch[order](limit=None)
|
||||||
|
|
||||||
return cls(display_name, submissions, loader, order=order)
|
return cls(display_name, submissions, loader, order=order,
|
||||||
|
listing=listing, period=period)
|
||||||
|
|
||||||
def get(self, index, n_cols=70):
|
def get(self, index, n_cols=70):
|
||||||
"""
|
"""
|
||||||
|
|||||||
Reference in New Issue
Block a user