def wrap_items(self, items): user = c.user if c.user_is_loggedin else None #get authors #TODO pull the author stuff into add_props for links and #comments and messages? try: aids = set(l.author_id for l in items) except AttributeError: aids = None authors = Account._byID(aids, True) if aids else {} # srids = set(l.sr_id for l in items if hasattr(l, "sr_id")) subreddits = Subreddit.load_subreddits(items) if not user: can_ban_set = set() else: can_ban_set = set(id for (id, sr) in subreddits.iteritems() if sr.can_ban(user)) #get likes/dislikes #TODO Vote.likes should accept empty lists likes = Vote.likes(user, items) if user and items else {} reports = Report.fastreported(user, items) if user else {} uid = user._id if user else None # we'll be grabbing this in the spam processing below if c.user_is_admin: ban_info = admintools.ban_info([x for x in items if x._spam]) elif user and len(can_ban_set) > 0: ban_info = admintools.ban_info([ x for x in items if (x._spam and hasattr(x, 'sr_id') and x.sr_id in can_ban_set) ]) else: ban_info = dict() types = {} wrapped = [] count = 0 for item in items: w = self.wrap(item) wrapped.append(w) types.setdefault(w.render_class, []).append(w) #TODO pull the author stuff into add_props for links and #comments and messages? try: w.author = authors.get(item.author_id) w.friend = item.author_id in user.friends if user else False except AttributeError: w.author = None w.friend = False if hasattr(item, "sr_id"): w.subreddit = subreddits[item.sr_id] vote = likes.get((user, item)) if vote: w.likes = (True if vote._name == '1' else False if vote._name == '-1' else None) else: w.likes = None #definite w.timesince = utils.timesince(item._date) # update vote tallies compute_votes(w, item) w.score = [w.upvotes, w.downvotes] w.deleted = item._deleted w.rowstyle = w.rowstyle if hasattr(w, 'rowstyle') else '' w.rowstyle += ' ' + ('even' if (count % 2) else 'odd') count += 1 # would have called it "reported", but that is already # taken on the thing itself as "how many total # reports". Indicates whether this user reported this # item, and should be visible to all users w.report_made = reports.get((user, item, Report._field)) # if the user can ban things on a given subreddit, or an # admin, then allow them to see that the item is spam, and # add the other spam-related display attributes w.show_reports = False w.show_spam = False w.can_ban = False if (c.user_is_admin or (user and hasattr(item, 'sr_id') and item.sr_id in can_ban_set)): w.can_ban = True if item._spam: w.show_spam = True if not hasattr(item, 'moderator_banned'): w.moderator_banned = False w.autobanned, w.banner = ban_info.get( item._fullname, (False, None)) elif hasattr(item, 'reported') and item.reported > 0: w.show_reports = True for cls in types.keys(): cls.add_props(user, types[cls]) return wrapped
def wrap_items(self, items): user = c.user if c.user_is_loggedin else None #get authors #TODO pull the author stuff into add_props for links and #comments and messages? try: aids = set(l.author_id for l in items) except AttributeError: aids = None authors = Account._byID(aids, True) if aids else {} # srids = set(l.sr_id for l in items if hasattr(l, "sr_id")) subreddits = Subreddit.load_subreddits(items) if not user: can_ban_set = set() else: can_ban_set = set(id for (id,sr) in subreddits.iteritems() if sr.can_ban(user)) #get likes/dislikes #TODO Vote.likes should accept empty lists likes = Vote.likes(user, items) if user and items else {} reports = Report.fastreported(user, items) if user else {} uid = user._id if user else None # we'll be grabbing this in the spam processing below if c.user_is_admin: ban_info = admintools.ban_info([x for x in items if x._spam]) elif user and len(can_ban_set) > 0: ban_info = admintools.ban_info( [ x for x in items if (x._spam and hasattr(x,'sr_id') and x.sr_id in can_ban_set) ]) else: ban_info = dict() types = {} wrapped = [] count = 0 for item in items: w = self.wrap(item) wrapped.append(w) types.setdefault(w.render_class, []).append(w) #TODO pull the author stuff into add_props for links and #comments and messages? try: w.author = authors.get(item.author_id) w.friend = item.author_id in user.friends if user else False except AttributeError: w.author = None w.friend = False if hasattr(item, "sr_id"): w.subreddit = subreddits[item.sr_id] vote = likes.get((user, item)) if vote: w.likes = (True if vote._name == '1' else False if vote._name == '-1' else None) else: w.likes = None #definite w.timesince = utils.timesince(item._date) # update vote tallies compute_votes(w, item) w.score = [w.upvotes, w.downvotes] w.deleted = item._deleted w.rowstyle = w.rowstyle if hasattr(w,'rowstyle') else '' w.rowstyle += ' ' + ('even' if (count % 2) else 'odd') count += 1 # would have called it "reported", but that is already # taken on the thing itself as "how many total # reports". Indicates whether this user reported this # item, and should be visible to all users w.report_made = reports.get((user, item, Report._field)) # if the user can ban things on a given subreddit, or an # admin, then allow them to see that the item is spam, and # add the other spam-related display attributes w.show_reports = False w.show_spam = False w.can_ban = False if (c.user_is_admin or (user and hasattr(item,'sr_id') and item.sr_id in can_ban_set)): w.can_ban = True if item._spam: w.show_spam = True if not hasattr(item,'moderator_banned'): w.moderator_banned = False w.autobanned, w.banner = ban_info.get(item._fullname, (False, None)) elif hasattr(item,'reported') and item.reported > 0: w.show_reports = True for cls in types.keys(): cls.add_props(user, types[cls]) return wrapped