def add_props(cls, user, wrapped): from r2.lib.count import incr_counts from r2.lib.media import thumbnail_url from r2.lib.utils import timeago saved = Link._saved(user, wrapped) if user else {} hidden = Link._hidden(user, wrapped) if user else {} #clicked = Link._clicked(user, wrapped) if user else {} clicked = {} for item in wrapped: show_media = (c.user.pref_media == 'on' or (item.promoted and item.has_thumbnail and c.user.pref_media != 'off') or (c.user.pref_media == 'subreddit' and item.subreddit.show_media)) if not show_media: item.thumbnail = "" elif item.has_thumbnail: item.thumbnail = thumbnail_url(item) else: item.thumbnail = g.default_thumb item.score = max(0, item.score) item.domain = (domain(item.url) if not item.is_self else 'self.' + item.subreddit.name) if not hasattr(item,'top_link'): item.top_link = False item.urlprefix = '' item.saved = bool(saved.get((user, item, 'save'))) item.hidden = bool(hidden.get((user, item, 'hide'))) item.clicked = bool(clicked.get((user, item, 'click'))) item.num = None item.score_fmt = Score.number_only item.permalink = item.make_permalink(item.subreddit) if item.is_self: item.url = item.make_permalink(item.subreddit, force_domain = True) if c.user_is_admin: item.hide_score = False elif item.promoted: item.hide_score = True elif c.user == item.author: item.hide_score = False elif item._date > timeago("2 hours"): item.hide_score = True else: item.hide_score = False if c.user_is_loggedin and item.author._id == c.user._id: item.nofollow = False elif item.score <= 1 or item._spam or item.author._spam: item.nofollow = True else: item.nofollow = False if c.user_is_loggedin: incr_counts(wrapped)
def vote(cls, sub, obj, dir, ip, spam=False, organic=False): from admintools import valid_user, valid_thing, update_score from r2.lib.count import incr_counts sr = obj.subreddit_slow kind = obj.__class__.__name__.lower() karma = sub.karma(kind, sr) is_self_link = kind == "link" and hasattr(obj, "is_self") and obj.is_self # check for old vote rel = cls.rel(sub, obj) oldvote = list(rel._query(rel.c._thing1_id == sub._id, rel.c._thing2_id == obj._id, data=True)) amount = 1 if dir is True else 0 if dir is None else -1 is_new = False # old vote if len(oldvote): v = oldvote[0] oldamount = int(v._name) v._name = str(amount) # these still need to be recalculated old_valid_thing = v.valid_thing v.valid_thing = valid_thing(v, karma) and v.valid_thing and not spam v.valid_user = v.valid_user and v.valid_thing and valid_user(v, sr, karma) # new vote else: is_new = True oldamount = 0 v = rel(sub, obj, str(amount)) v.author_id = obj.author_id v.ip = ip old_valid_thing = v.valid_thing = valid_thing(v, karma) and not spam v.valid_user = v.valid_thing and valid_user(v, sr, karma) and not is_self_link if organic: v.organic = organic v._commit() up_change, down_change = score_changes(amount, oldamount) update_score(obj, up_change, down_change, v.valid_thing, old_valid_thing) if v.valid_user: author = Account._byID(obj.author_id, data=True) author.incr_karma(kind, sr, up_change - down_change) # update the sr's valid vote count if is_new and v.valid_thing and kind == "link": if sub._id != obj.author_id: incr_counts([sr]) return v
def add_props(cls, user, wrapped): from r2.lib.count import incr_counts saved = Link._saved(user, wrapped) if user else {} hidden = Link._hidden(user, wrapped) if user else {} #clicked = Link._clicked(user, wrapped) if user else {} clicked = {} for item in wrapped: item.score = max(0, item.score) item.domain = (domain(item.url) if not item.is_self else 'self.' + item.subreddit.name) item.top_link = False item.urlprefix = '' item.saved = bool(saved.get((user, item, 'save'))) item.hidden = bool(hidden.get((user, item, 'hide'))) item.clicked = bool(clicked.get((user, item, 'click'))) item.num = None item.score_fmt = Score.number_only if c.user_is_loggedin: incr_counts(wrapped)
def add_props(cls, user, wrapped): from r2.lib.count import incr_counts from r2.lib.media import thumbnail_url from r2.lib.utils import timeago from r2.lib.template_helpers import get_domain from r2.models.subreddit import FakeSubreddit from r2.lib.wrapped import CachedVariable # referencing c's getattr is cheap, but not as cheap when it # is in a loop that calls it 30 times on 25-200 things. user_is_admin = c.user_is_admin user_is_loggedin = c.user_is_loggedin pref_media = user.pref_media pref_frame = user.pref_frame pref_newwindow = user.pref_newwindow cname = c.cname site = c.site saved = Link._saved(user, wrapped) if user_is_loggedin else {} hidden = Link._hidden(user, wrapped) if user_is_loggedin else {} #clicked = Link._clicked(user, wrapped) if user else {} clicked = {} for item in wrapped: show_media = False if not hasattr(item, "score_fmt"): item.score_fmt = Score.number_only item.pref_compress = user.pref_compress if user.pref_compress and item.promoted is None: item.render_css_class = "compressed link" item.score_fmt = Score.points elif pref_media == 'on' and not user.pref_compress: show_media = True elif pref_media == 'subreddit' and item.subreddit.show_media: show_media = True elif item.promoted and item.has_thumbnail: if user_is_loggedin and item.author_id == user._id: show_media = True elif pref_media != 'off' and not user.pref_compress: show_media = True if not show_media: item.thumbnail = "" elif item.has_thumbnail: item.thumbnail = thumbnail_url(item) else: item.thumbnail = g.default_thumb item.score = max(0, item.score) item.domain = (domain(item.url) if not item.is_self else 'self.' + item.subreddit.name) if not hasattr(item,'top_link'): item.top_link = False item.urlprefix = '' item.saved = bool(saved.get((user, item, 'save'))) item.hidden = bool(hidden.get((user, item, 'hide'))) item.clicked = bool(clicked.get((user, item, 'click'))) item.num = None item.permalink = item.make_permalink(item.subreddit) if item.is_self: item.url = item.make_permalink(item.subreddit, force_domain = True) # do we hide the score? if user_is_admin: item.hide_score = False elif item.promoted: item.hide_score = True elif user == item.author: item.hide_score = False elif item._date > timeago("2 hours"): item.hide_score = True else: item.hide_score = False # store user preferences locally for caching item.pref_frame = pref_frame item.newwindow = pref_newwindow # is this link a member of a different (non-c.site) subreddit? item.different_sr = (isinstance(site, FakeSubreddit) or site.name != item.subreddit.name) if user_is_loggedin and item.author._id == user._id: item.nofollow = False elif item.score <= 1 or item._spam or item.author._spam: item.nofollow = True else: item.nofollow = False item.subreddit_path = item.subreddit.path if cname: item.subreddit_path = ("http://" + get_domain(cname = (site == item.subreddit), subreddit = False)) if site != item.subreddit: item.subreddit_path += item.subreddit.path item.domain_path = "/domain/%s" % item.domain if item.is_self: item.domain_path = item.subreddit_path #this is wrong, but won't be so wrong when we move this #whole chunk of code into pages.py from r2.lib.pages import MediaChild, SelfTextChild item.link_child = None item.editable = False if item.media_object: item.link_child = MediaChild(item, load = True) elif item.selftext: expand = getattr(item, 'expand_children', False) item.link_child = SelfTextChild(item, expand = expand, nofollow = item.nofollow) #draw the edit button if the contents are pre-expanded item.editable = expand and item.author == c.user item.tblink = "http://%s/tb/%s" % ( get_domain(cname = cname, subreddit=False), item._id36) if item.is_self: item.href_url = item.permalink else: item.href_url = item.url # show the toolbar if the preference is set and the link # is neither a promoted link nor a self post if pref_frame and not item.is_self and not item.promoted: item.mousedown_url = item.tblink else: item.mousedown_url = None item.fresh = not any((item.likes != None, item.saved, item.clicked, item.hidden, item._deleted, item._spam)) item.is_author = (user == item.author) # bits that we will render stubs (to make the cached # version more flexible) item.num = CachedVariable("num") item.numcolmargin = CachedVariable("numcolmargin") item.commentcls = CachedVariable("commentcls") item.midcolmargin = CachedVariable("midcolmargin") item.comment_label = CachedVariable("numcomments") if user_is_loggedin: incr_counts(wrapped) # Run this last Printable.add_props(user, wrapped)
def add_props(cls, user, wrapped): from r2.lib.pages import make_link_child from r2.lib.count import incr_counts from r2.lib.media import thumbnail_url from r2.lib.utils import timeago from r2.lib.template_helpers import get_domain from r2.models.subreddit import FakeSubreddit from r2.lib.wrapped import CachedVariable # referencing c's getattr is cheap, but not as cheap when it # is in a loop that calls it 30 times on 25-200 things. user_is_admin = c.user_is_admin user_is_loggedin = c.user_is_loggedin pref_media = user.pref_media pref_frame = user.pref_frame pref_newwindow = user.pref_newwindow cname = c.cname site = c.site if user_is_loggedin: saved_lu = [] for item in wrapped: if not SaveHide._can_skip_lookup(user, item): saved_lu.append(item._id36) saved = CassandraSave._fast_query(user._id36, saved_lu) hidden = CassandraHide._fast_query(user._id36, saved_lu) clicked = {} else: saved = hidden = clicked = {} trials = trial_info(wrapped) for item in wrapped: show_media = False if not hasattr(item, "score_fmt"): item.score_fmt = Score.number_only if c.render_style == 'compact': item.score_fmt = Score.points item.pref_compress = user.pref_compress if user.pref_compress and item.promoted is None: item.render_css_class = "compressed link" item.score_fmt = Score.points elif pref_media == 'on' and not user.pref_compress: show_media = True elif pref_media == 'subreddit' and item.subreddit.show_media: show_media = True elif item.promoted and item.has_thumbnail: if user_is_loggedin and item.author_id == user._id: show_media = True elif pref_media != 'off' and not user.pref_compress: show_media = True item.over_18 = bool( item.over_18 or item.subreddit.over_18 or item._nsfw.findall(item.title)) item.nsfw = item.over_18 and user.pref_label_nsfw item.is_author = (user == item.author) # always show a promo author their own thumbnail if item.promoted and (user_is_admin or item.is_author) and item.has_thumbnail: item.thumbnail = thumbnail_url(item) elif user.pref_no_profanity and item.over_18 and not c.site.over_18: if show_media: item.thumbnail = "/static/nsfw2.png" else: item.thumbnail = "" elif not show_media: item.thumbnail = "" elif item.has_thumbnail: item.thumbnail = thumbnail_url(item) elif item.is_self: item.thumbnail = g.self_thumb else: item.thumbnail = g.default_thumb item.score = max(0, item.score) if getattr(item, "domain_override", None): item.domain = item.domain_override else: item.domain = (domain(item.url) if not item.is_self else 'self.' + item.subreddit.name) item.urlprefix = '' if user_is_loggedin: item.saved = (user._id36, item._id36) in saved item.hidden = (user._id36, item._id36) in hidden item.clicked = bool(clicked.get((user, item, 'click'))) else: item.saved = item.hidden = item.clicked = False item.num = None item.permalink = item.make_permalink(item.subreddit) if item.is_self: item.url = item.make_permalink( item.subreddit, force_domain=True) if g.shortdomain: item.shortlink = g.shortdomain + '/' + item._id36 # do we hide the score? if user_is_admin: item.hide_score = False elif item.promoted and item.score <= 0: item.hide_score = True elif user == item.author: item.hide_score = False # TODO: uncomment to let gold users see the score of upcoming links # elif user.gold: # item.hide_score = False elif item._date > timeago("2 hours"): item.hide_score = True else: item.hide_score = False # store user preferences locally for caching item.pref_frame = pref_frame item.newwindow = pref_newwindow # is this link a member of a different (non-c.site) subreddit? item.different_sr = (isinstance(site, FakeSubreddit) or site.name != item.subreddit.name) if user_is_loggedin and item.author_id == user._id: item.nofollow = False elif item.score <= 1 or item._spam or item.author._spam: item.nofollow = True else: item.nofollow = False if c.user.pref_no_profanity: item.title = profanity_filter(item.title) item.subreddit_path = item.subreddit.path if cname: item.subreddit_path = ("http://" + get_domain( cname=(site == item.subreddit), subreddit=False)) if site != item.subreddit: item.subreddit_path += item.subreddit.path item.domain_path = "/domain/%s/" % item.domain if item.is_self: item.domain_path = item.subreddit_path # attach video or selftext as needed item.link_child, item.editable = make_link_child(item) item.tblink = "http://%s/tb/%s" % (get_domain( cname=cname, subreddit=False), item._id36) if item.is_self: item.href_url = item.permalink else: item.href_url = item.url # show the toolbar if the preference is set and the link # is neither a promoted link nor a self post if pref_frame and not item.is_self and not item.promoted: item.mousedown_url = item.tblink else: item.mousedown_url = None item.fresh = not any((item.likes != None, item.saved, item.clicked, item.hidden, item._deleted, item._spam)) # bits that we will render stubs (to make the cached # version more flexible) item.num = CachedVariable("num") item.numcolmargin = CachedVariable("numcolmargin") item.commentcls = CachedVariable("commentcls") item.midcolmargin = CachedVariable("midcolmargin") item.comment_label = CachedVariable("numcomments") item.as_deleted = False if item.deleted and not c.user_is_admin: item.author = DeletedUser() item.as_deleted = True item.trial_info = trials.get(item._fullname, None) item.approval_checkmark = None if item.can_ban: verdict = getattr(item, "verdict", None) if verdict in ('admin-approved', 'mod-approved'): approver = None if getattr(item, "ban_info", None): approver = item.ban_info.get("unbanner", None) if approver: item.approval_checkmark = _( "approved by %s") % approver else: item.approval_checkmark = _("approved by a moderator") if item.trial_info is not None: item.reveal_trial_info = True item.use_big_modbuttons = True if user_is_loggedin: incr_counts(wrapped) # Run this last Printable.add_props(user, wrapped)
def add_props(cls, user, wrapped): from r2.lib.pages import make_link_child from r2.lib.count import incr_counts from r2.lib.media import thumbnail_url from r2.lib.utils import timeago from r2.lib.template_helpers import get_domain from r2.models.subreddit import FakeSubreddit from r2.lib.wrapped import CachedVariable # referencing c's getattr is cheap, but not as cheap when it # is in a loop that calls it 30 times on 25-200 things. user_is_admin = c.user_is_admin user_is_loggedin = c.user_is_loggedin pref_media = user.pref_media pref_frame = user.pref_frame pref_newwindow = user.pref_newwindow cname = c.cname site = c.site saved = Link._saved(user, wrapped) if user_is_loggedin else {} hidden = Link._hidden(user, wrapped) if user_is_loggedin else {} trials = trial_info(wrapped) # clicked = Link._clicked(user, wrapped) if user else {} clicked = {} for item in wrapped: show_media = False if not hasattr(item, "score_fmt"): item.score_fmt = Score.number_only item.pref_compress = user.pref_compress if user.pref_compress and item.promoted is None: item.render_css_class = "compressed link" item.score_fmt = Score.points elif pref_media == "on" and not user.pref_compress: show_media = True elif pref_media == "subreddit" and item.subreddit.show_media: show_media = True elif item.promoted and item.has_thumbnail: if user_is_loggedin and item.author_id == user._id: show_media = True elif pref_media != "off" and not user.pref_compress: show_media = True item.over_18 = bool(item.over_18 or item.subreddit.over_18 or item._nsfw.findall(item.title)) item.nsfw = item.over_18 and user.pref_label_nsfw # if user.pref_no_profanity and item.over_18 and not c.site.over_18: # item.thumbnail = "" # elif not show_media: # item.thumbnail = "" # elif item.has_thumbnail: # item.thumbnail = thumbnail_url(item) # elif item.is_self: # item.thumbnail = g.self_thumb # else: # item.thumbnail = g.default_thumb if item.has_thumbnail: item.thumbnail = thumbnail_url(item) else: item.thumbnail = "" item.score = max(0, item.score) item.domain = domain(item.url) if not item.is_self else "self." + item.subreddit.name item.urlprefix = "" item.saved = bool(saved.get((user, item, "save"))) item.hidden = bool(hidden.get((user, item, "hide"))) item.clicked = bool(clicked.get((user, item, "click"))) item.num = None item.permalink = item.make_permalink(item.subreddit) if item.is_self: item.url = item.make_permalink(item.subreddit, force_domain=True) # do we hide the score? if user_is_admin: item.hide_score = False elif item.promoted and item.score <= 0: item.hide_score = True elif user == item.author: item.hide_score = False elif item._date > timeago("2 hours"): item.hide_score = True else: item.hide_score = False # store user preferences locally for caching item.pref_frame = pref_frame item.newwindow = pref_newwindow # is this link a member of a different (non-c.site) subreddit? item.different_sr = isinstance(site, FakeSubreddit) or site.name != item.subreddit.name if user_is_loggedin and item.author_id == user._id: item.nofollow = False elif item.score <= 1 or item._spam or item.author._spam: item.nofollow = True else: item.nofollow = False if c.user.pref_no_profanity: item.title = profanity_filter(item.title) item.subreddit_path = item.subreddit.path if cname: item.subreddit_path = "http://" + get_domain(cname=(site == item.subreddit), subreddit=False) if site != item.subreddit: item.subreddit_path += item.subreddit.path item.domain_path = "/domain/%s" % item.domain if item.is_self: item.domain_path = item.subreddit_path # attach video or selftext as needed item.link_child, item.editable = make_link_child(item) item.tblink = "http://%s/tb/%s" % (get_domain(cname=cname, subreddit=False), item._id36) if item.is_self: item.href_url = item.permalink else: item.href_url = item.url # show the toolbar if the preference is set and the link # is neither a promoted link nor a self post if pref_frame and not item.is_self and not item.promoted: item.mousedown_url = item.tblink else: item.mousedown_url = None item.fresh = not any((item.likes != None, item.saved, item.clicked, item.hidden, item._deleted, item._spam)) item.is_author = user == item.author # bits that we will render stubs (to make the cached # version more flexible) item.num = CachedVariable("num") item.numcolmargin = CachedVariable("numcolmargin") item.commentcls = CachedVariable("commentcls") item.midcolmargin = CachedVariable("midcolmargin") item.comment_label = CachedVariable("numcomments") item.as_deleted = False if item.deleted and not c.user_is_admin: item.author = DeletedUser() item.as_deleted = True item.trial_info = trials.get(item._fullname, None) item.approval_checkmark = None if item.can_ban: verdict = getattr(item, "verdict", None) if verdict in ("admin-approved", "mod-approved"): approver = None if getattr(item, "ban_info", None): approver = item.ban_info.get("unbanner", None) if approver: item.approval_checkmark = _("approved by %s") % approver else: item.approval_checkmark = _("approved by a moderator") if item.trial_info is not None: item.reveal_trial_info = True item.use_big_modbuttons = True if user_is_loggedin: incr_counts(wrapped) # Run this last Printable.add_props(user, wrapped)
def add_props(cls, user, wrapped): from r2.lib.pages import make_link_child from r2.lib.count import incr_counts from r2.lib import media from r2.lib.utils import timeago from r2.lib.template_helpers import get_domain from r2.models.subreddit import FakeSubreddit from r2.lib.wrapped import CachedVariable # referencing c's getattr is cheap, but not as cheap when it # is in a loop that calls it 30 times on 25-200 things. user_is_admin = c.user_is_admin user_is_loggedin = c.user_is_loggedin pref_media = user.pref_media pref_frame = user.pref_frame pref_newwindow = user.pref_newwindow cname = c.cname site = c.site if user_is_loggedin: saved_lu = [] for item in wrapped: if not SaveHide._can_skip_lookup(user, item): saved_lu.append(item._id36) saved = CassandraSave._fast_query(user._id36, saved_lu) hidden = CassandraHide._fast_query(user._id36, saved_lu) clicked = {} else: saved = hidden = clicked = {} trials = trial_info(wrapped) for item in wrapped: show_media = False if not hasattr(item, "score_fmt"): item.score_fmt = Score.number_only if c.render_style == 'compact': item.score_fmt = Score.points item.pref_compress = user.pref_compress if user.pref_compress and item.promoted is None: item.render_css_class = "compressed link" item.score_fmt = Score.points elif pref_media == 'on' and not user.pref_compress: show_media = True elif pref_media == 'subreddit' and item.subreddit.show_media: show_media = True elif item.promoted and item.has_thumbnail: if user_is_loggedin and item.author_id == user._id: show_media = True elif pref_media != 'off' and not user.pref_compress: show_media = True item.nsfw_str = item._nsfw.findall(item.title) item.over_18 = bool(item.over_18 or item.subreddit.over_18 or item.nsfw_str) item.nsfw = item.over_18 and user.pref_label_nsfw item.is_author = (user == item.author) item.thumbnail_sprited = False # always show a promo author their own thumbnail if item.promoted and (user_is_admin or item.is_author) and item.has_thumbnail: item.thumbnail = media.thumbnail_url(item) elif user.pref_no_profanity and item.over_18 and not c.site.over_18: if show_media: item.thumbnail = "nsfw" item.thumbnail_sprited = True else: item.thumbnail = "" elif not show_media: item.thumbnail = "" elif item.has_thumbnail: item.thumbnail = media.thumbnail_url(item) elif item.is_self: item.thumbnail = "self" item.thumbnail_sprited = True else: item.thumbnail = "default" item.thumbnail_sprited = True item.score = max(0, item.score) if getattr(item, "domain_override", None): item.domain = item.domain_override else: item.domain = (domain(item.url) if not item.is_self else 'self.' + item.subreddit.name) item.urlprefix = '' if user_is_loggedin: item.saved = (user._id36, item._id36) in saved item.hidden = (user._id36, item._id36) in hidden item.clicked = bool(clicked.get((user, item, 'click'))) else: item.saved = item.hidden = item.clicked = False item.num = None item.permalink = item.make_permalink(item.subreddit) if item.is_self: item.url = item.make_permalink(item.subreddit, force_domain=True) if g.shortdomain: item.shortlink = g.shortdomain + '/' + item._id36 # do we hide the score? if user_is_admin: item.hide_score = False elif item.promoted and item.score <= 0: item.hide_score = True elif user == item.author: item.hide_score = False # TODO: uncomment to let gold users see the score of upcoming links # elif user.gold: # item.hide_score = False elif item._date > timeago("2 hours"): item.hide_score = True else: item.hide_score = False # store user preferences locally for caching item.pref_frame = pref_frame item.newwindow = pref_newwindow # is this link a member of a different (non-c.site) subreddit? item.different_sr = (isinstance(site, FakeSubreddit) or site.name != item.subreddit.name) if user_is_loggedin and item.author_id == user._id: item.nofollow = False elif item.score <= 1 or item._spam or item.author._spam: item.nofollow = True else: item.nofollow = False item.subreddit_path = item.subreddit.path if cname: item.subreddit_path = ("http://" + get_domain( cname=(site == item.subreddit), subreddit=False)) if site != item.subreddit: item.subreddit_path += item.subreddit.path item.domain_path = "/domain/%s/" % item.domain if item.is_self: item.domain_path = item.subreddit_path # attach video or selftext as needed item.link_child, item.editable = make_link_child(item) item.tblink = "http://%s/tb/%s" % (get_domain( cname=cname, subreddit=False), item._id36) if item.is_self: item.href_url = item.permalink else: item.href_url = item.url # show the toolbar if the preference is set and the link # is neither a promoted link nor a self post if pref_frame and not item.is_self and not item.promoted: item.mousedown_url = item.tblink else: item.mousedown_url = None item.fresh = not any((item.likes != None, item.saved, item.clicked, item.hidden, item._deleted, item._spam)) # bits that we will render stubs (to make the cached # version more flexible) item.num = CachedVariable("num") item.numcolmargin = CachedVariable("numcolmargin") item.commentcls = CachedVariable("commentcls") item.midcolmargin = CachedVariable("midcolmargin") item.comment_label = CachedVariable("numcomments") item.as_deleted = False if item.deleted and not c.user_is_admin: item.author = DeletedUser() item.as_deleted = True item.trial_info = trials.get(item._fullname, None) item.approval_checkmark = None item_age = datetime.now(g.tz) - item._date if item_age.days > g.VOTE_AGE_LIMIT and item.promoted is None: item.votable = False else: item.votable = True if item.can_ban: verdict = getattr(item, "verdict", None) if verdict in ('admin-approved', 'mod-approved'): approver = None if getattr(item, "ban_info", None): approver = item.ban_info.get("unbanner", None) if approver: item.approval_checkmark = _( "approved by %s") % approver else: item.approval_checkmark = _("approved by a moderator") if item.trial_info is not None: item.reveal_trial_info = True item.use_big_modbuttons = True item.expunged = False if item.is_self: item.expunged = Link._should_expunge_selftext(item) if user_is_loggedin: incr_counts(wrapped) # Run this last Printable.add_props(user, wrapped)
def add_props(cls, user, wrapped): from r2.lib.count import incr_counts from r2.lib.media import thumbnail_url from r2.lib.utils import timeago saved = Link._saved(user, wrapped) if user else {} hidden = Link._hidden(user, wrapped) if user else {} clicked = Link._clicked(user, wrapped) if user else {} #clicked = {} for item in wrapped: show_media = False if c.user.pref_compress: pass elif c.user.pref_media == 'on': show_media = True elif c.user.pref_media == 'subreddit' and item.subreddit.show_media: show_media = True elif (item.promoted and item.has_thumbnail and c.user.pref_media != 'off'): show_media = True if not show_media: item.thumbnail = "" elif item.has_thumbnail: item.thumbnail = thumbnail_url(item) else: item.thumbnail = g.default_thumb item.domain = (domain(item.url) if not item.is_self else 'self.' + item.subreddit.name) if not hasattr(item, 'top_link'): item.top_link = False item.urlprefix = '' item.saved = bool(saved.get((user, item, 'save'))) item.hidden = bool(hidden.get((user, item, 'hide'))) item.clicked = clicked.get((user, item, 'click')) item.num = None item.score_fmt = Score.signed_number item.permalink = item.make_permalink(item.subreddit) if item.is_self: item.url = item.make_permalink(item.subreddit, force_domain=True) if c.user_is_admin: item.hide_score = False elif item.promoted: item.hide_score = True elif c.user == item.author: item.hide_score = False elif item._date > timeago("2 hours"): item.hide_score = True else: item.hide_score = False # Don't allow users to vote on their own posts and don't # allow users to vote on collapsed posts shown when # viewing comment permalinks. item.votable = bool( c.user != item.author and not getattr(item, 'for_comment_permalink', False)) if c.user_is_loggedin and item.author._id == c.user._id: item.nofollow = False elif item.score <= 1 or item._spam or item.author._spam: item.nofollow = True else: item.nofollow = False if c.user_is_loggedin and item.subreddit.name == c.user.draft_sr_name: item.draft = True else: item.draft = False if c.user_is_loggedin: incr_counts(wrapped)
def add_props(cls, user, wrapped): from r2.lib.count import incr_counts from r2.lib.media import thumbnail_url from r2.lib.utils import timeago saved = Link._saved(user, wrapped) if user else {} hidden = Link._hidden(user, wrapped) if user else {} for item in wrapped: show_media = False if c.user.pref_compress: pass elif c.user.pref_media == 'on': show_media = True elif c.user.pref_media == 'subreddit' and item.subreddit.show_media: show_media = True elif (item.promoted and item.has_thumbnail and c.user.pref_media != 'off'): show_media = True if not show_media: item.thumbnail = "" elif item.has_thumbnail: item.thumbnail = thumbnail_url(item) else: item.thumbnail = g.default_thumb item.domain = (domain(item.url) if not item.is_self else 'self.' + item.subreddit.name) if not hasattr(item, 'top_link'): item.top_link = False item.urlprefix = '' item.saved = bool(saved.get((user, item, 'save'))) item.hidden = bool(hidden.get((user, item, 'hide'))) # Only check "last clicked time" on demand. Otherwise it is expensive in big listings. TODO - refactor to use "_getLastClickedTime" def clicked(): c = Link._clicked(user, wrapped) if user else {} return c.get((user, item, 'click')) item.clicked = clicked item.num = None item.score_fmt = Score.signed_number item.permalink = item.make_permalink(item.subreddit) if item.is_self: item.url = item.make_permalink(item.subreddit, force_domain=True) if c.user_is_admin: item.hide_score = False elif item.promoted: item.hide_score = True elif c.user == item.author: item.hide_score = False elif item._date > timeago("2 hours"): item.hide_score = True else: item.hide_score = False # Don't allow users to vote on their own posts and don't # allow users to vote on collapsed posts shown when # viewing comment permalinks. # Also require user karma to be >= global threshold as anti-sockpuppet measure item.votable = bool( c.user_is_loggedin and c.user != item.author and not getattr(item, 'for_comment_permalink', False) and c.user.safe_karma >= g.karma_to_vote) if c.user_is_loggedin and item.author._id == c.user._id: item.nofollow = False elif item.score <= 1 or item._spam or item.author._spam: item.nofollow = True else: item.nofollow = False if c.user_is_loggedin and item.subreddit.name == c.user.draft_sr_name: item.draft = True else: item.draft = False if c.user_is_loggedin: incr_counts(wrapped)
def vote(cls, sub, obj, dir, ip, organic=False, cheater=False): from admintools import valid_user, valid_thing, update_score from r2.lib.count import incr_counts from r2.lib.db import queries sr = obj.subreddit_slow kind = obj.__class__.__name__.lower() karma = sub.karma(kind, sr) is_self_link = (kind == 'link' and hasattr(obj, 'is_self') and obj.is_self) #check for old vote rel = cls.rel(sub, obj) oldvote = rel._fast_query(sub, obj, ['-1', '0', '1']).values() oldvote = filter(None, oldvote) amount = 1 if dir is True else 0 if dir is None else -1 is_new = False #old vote if len(oldvote): v = oldvote[0] oldamount = int(v._name) v._name = str(amount) #these still need to be recalculated old_valid_thing = v.valid_thing v.valid_thing = (valid_thing(v, karma, cheater=cheater) and v.valid_thing) v.valid_user = (v.valid_user and v.valid_thing and valid_user(v, sr, karma)) #new vote else: is_new = True oldamount = 0 v = rel(sub, obj, str(amount)) v.author_id = obj.author_id v.sr_id = sr._id v.ip = ip old_valid_thing = v.valid_thing = \ valid_thing(v, karma, cheater = cheater) v.valid_user = (v.valid_thing and valid_user(v, sr, karma) and not is_self_link) if organic: v.organic = organic v._commit() v._fast_query_timestamp_touch(sub) up_change, down_change = score_changes(amount, oldamount) if not (is_new and obj.author_id == sub._id and amount == 1): # we don't do this if it's the author's initial automatic # vote, because we checked it in with _ups == 1 update_score(obj, up_change, down_change, v.valid_thing, old_valid_thing) if v.valid_user: author = Account._byID(obj.author_id, data=True) author.incr_karma(kind, sr, up_change - down_change) #update the sr's valid vote count if is_new and v.valid_thing and kind == 'link': if sub._id != obj.author_id: incr_counts([sr]) # now write it out to Cassandra. We'll write it out to both # this way for a while voter = v._thing1 votee = v._thing2 cvc = CassandraVote._rel(Account, votee.__class__) try: cv = cvc._fast_query(voter._id36, votee._id36) except tdb_cassandra.NotFound: cv = cvc(thing1_id=voter._id36, thing2_id=votee._id36) cv.name = v._name cv.valid_user, cv.valid_thing = v.valid_user, v.valid_thing cv.ip = v.ip if getattr(v, 'organic', False) or hasattr(cv, 'organic'): cv.organic = getattr(v, 'organic', False) cv._commit() queries.changed(votee, True) return v
def vote(cls, sub, obj, dir, ip, organic = False, cheater = False): from admintools import valid_user, valid_thing, update_score from r2.lib.count import incr_counts from r2.lib.db import queries sr = obj.subreddit_slow kind = obj.__class__.__name__.lower() karma = sub.karma(kind, sr) is_self_link = (kind == 'link' and hasattr(obj,'is_self') and obj.is_self) #check for old vote rel = cls.rel(sub, obj) oldvote = rel._fast_query(sub, obj, ['-1', '0', '1']).values() oldvote = filter(None, oldvote) amount = 1 if dir is True else 0 if dir is None else -1 is_new = False #old vote if len(oldvote): v = oldvote[0] oldamount = int(v._name) v._name = str(amount) #these still need to be recalculated old_valid_thing = v.valid_thing v.valid_thing = (valid_thing(v, karma, cheater = cheater) and v.valid_thing) v.valid_user = (v.valid_user and v.valid_thing and valid_user(v, sr, karma)) #new vote else: is_new = True oldamount = 0 v = rel(sub, obj, str(amount)) v.author_id = obj.author_id v.sr_id = sr._id v.ip = ip old_valid_thing = v.valid_thing = \ valid_thing(v, karma, cheater = cheater) v.valid_user = (v.valid_thing and valid_user(v, sr, karma) and not is_self_link) if organic: v.organic = organic v._commit() v._fast_query_timestamp_touch(sub) up_change, down_change = score_changes(amount, oldamount) if not (is_new and obj.author_id == sub._id and amount == 1): # we don't do this if it's the author's initial automatic # vote, because we checked it in with _ups == 1 update_score(obj, up_change, down_change, v.valid_thing, old_valid_thing) if v.valid_user: author = Account._byID(obj.author_id, data=True) author.incr_karma(kind, sr, up_change - down_change) #update the sr's valid vote count if is_new and v.valid_thing and kind == 'link': if sub._id != obj.author_id: incr_counts([sr]) # now write it out to Cassandra. We'll write it out to both # this way for a while voter = v._thing1 votee = v._thing2 cvc = CassandraVote._rel(Account, votee.__class__) try: cv = cvc._fast_query(voter._id36, votee._id36) except tdb_cassandra.NotFound: cv = cvc(thing1_id = voter._id36, thing2_id = votee._id36) cv.name = v._name cv.valid_user, cv.valid_thing = v.valid_user, v.valid_thing cv.ip = v.ip if getattr(v, 'organic', False) or hasattr(cv, 'organic'): cv.organic = getattr(v, 'organic', False) cv._commit() queries.changed(votee, True) return v
def add_props(cls, user, wrapped): from r2.lib.count import incr_counts from r2.lib.media import thumbnail_url from r2.lib.utils import timeago saved = Link._saved(user, wrapped) if user else {} hidden = Link._hidden(user, wrapped) if user else {} clicked = Link._clicked(user, wrapped) if user else {} #clicked = {} for item in wrapped: show_media = False if c.user.pref_compress: pass elif c.user.pref_media == 'on': show_media = True elif c.user.pref_media == 'subreddit' and item.subreddit.show_media: show_media = True elif (item.promoted and item.has_thumbnail and c.user.pref_media != 'off'): show_media = True if not show_media: item.thumbnail = "" elif item.has_thumbnail: item.thumbnail = thumbnail_url(item) else: item.thumbnail = g.default_thumb item.domain = (domain(item.url) if not item.is_self else 'self.' + item.subreddit.name) if not hasattr(item,'top_link'): item.top_link = False item.urlprefix = '' item.saved = bool(saved.get((user, item, 'save'))) item.hidden = bool(hidden.get((user, item, 'hide'))) item.clicked = clicked.get((user, item, 'click')) item.num = None item.score_fmt = Score.signed_number item.permalink = item.make_permalink(item.subreddit) if item.is_self: item.url = item.make_permalink(item.subreddit, force_domain = True) if c.user_is_admin: item.hide_score = False elif item.promoted: item.hide_score = True elif c.user == item.author: item.hide_score = False elif item._date > timeago("2 hours"): item.hide_score = True else: item.hide_score = False # Don't allow users to vote on their own posts and don't # allow users to vote on collapsed posts shown when # viewing comment permalinks. item.votable = bool(c.user != item.author and not getattr(item, 'for_comment_permalink', False)) if c.user_is_loggedin and item.author._id == c.user._id: item.nofollow = False elif item.score <= 1 or item._spam or item.author._spam: item.nofollow = True else: item.nofollow = False if c.user_is_loggedin and item.subreddit.name == c.user.draft_sr_name: item.draft = True else: item.draft = False if c.user_is_loggedin: incr_counts(wrapped)
def vote(cls, sub, obj, dir, ip, organic = False, cheater = False): from admintools import valid_user, valid_thing, update_score from r2.lib.count import incr_counts from r2.lib.db import queries sr = obj.subreddit_slow kind = obj.__class__.__name__.lower() karma = sub.karma(kind, sr) is_self_link = (kind == 'link' and hasattr(obj,'is_self') and obj.is_self) #check for old vote rel = cls.rel(sub, obj) oldvote = rel._fast_query(sub, obj, ['-1', '0', '1']).values() oldvote = filter(None, oldvote) amount = 1 if dir is True else 0 if dir is None else -1 is_new = False #old vote if len(oldvote): v = oldvote[0] oldamount = int(v._name) v._name = str(amount) #these still need to be recalculated old_valid_thing = v.valid_thing v.valid_thing = (valid_thing(v, karma, cheater = cheater) and v.valid_thing) v.valid_user = (v.valid_user and v.valid_thing and valid_user(v, sr, karma)) #new vote else: is_new = True oldamount = 0 v = rel(sub, obj, str(amount)) v.author_id = obj.author_id v.sr_id = sr._id v.ip = ip old_valid_thing = v.valid_thing = \ valid_thing(v, karma, cheater = cheater) v.valid_user = (v.valid_thing and valid_user(v, sr, karma) and not is_self_link) if organic: v.organic = organic v._commit() g.cache.delete(queries.prequeued_vote_key(sub, obj)) v._fast_query_timestamp_touch(sub) up_change, down_change = score_changes(amount, oldamount) if not (is_new and obj.author_id == sub._id and amount == 1): # we don't do this if it's the author's initial automatic # vote, because we checked it in with _ups == 1 update_score(obj, up_change, down_change, v.valid_thing, old_valid_thing) if v.valid_user: author = Account._byID(obj.author_id, data=True) author.incr_karma(kind, sr, up_change - down_change) #update the sr's valid vote count if is_new and v.valid_thing and kind == 'link': if sub._id != obj.author_id: incr_counts([sr]) return v
def add_props(cls, user, wrapped): from r2.lib.pages import make_link_child from r2.lib.count import incr_counts from r2.lib import media from r2.lib.utils import timeago from r2.lib.template_helpers import get_domain from r2.models.subreddit import FakeSubreddit from r2.lib.wrapped import CachedVariable # referencing c's getattr is cheap, but not as cheap when it # is in a loop that calls it 30 times on 25-200 things. user_is_admin = c.user_is_admin user_is_loggedin = c.user_is_loggedin pref_media = user.pref_media pref_frame = user.pref_frame pref_newwindow = user.pref_newwindow cname = c.cname site = c.site if user_is_loggedin: try: saved = CassandraSave._fast_query(user, wrapped) hidden = CassandraHide._fast_query(user, wrapped) except tdb_cassandra.TRANSIENT_EXCEPTIONS as e: g.log.warning("Cassandra save/hide lookup failed: %r", e) saved = hidden = {} clicked = {} else: saved = hidden = clicked = {} for item in wrapped: show_media = False if not hasattr(item, "score_fmt"): item.score_fmt = Score.number_only if c.render_style == 'compact': item.score_fmt = Score.points item.pref_compress = user.pref_compress if user.pref_compress and item.promoted is None: item.render_css_class = "compressed link" item.score_fmt = Score.points elif pref_media == 'on' and not user.pref_compress: show_media = True elif pref_media == 'subreddit' and item.subreddit.show_media: show_media = True elif item.promoted and item.has_thumbnail: if user_is_loggedin and item.author_id == user._id: show_media = True elif pref_media != 'off' and not user.pref_compress: show_media = True item.nsfw_str = item._nsfw.findall(item.title) item.over_18 = bool(item.over_18 or item.subreddit.over_18 or item.nsfw_str) item.nsfw = item.over_18 and user.pref_label_nsfw item.is_author = (user == item.author) item.thumbnail_sprited = False # always show a promo author their own thumbnail if item.promoted and (user_is_admin or item.is_author) and item.has_thumbnail: item.thumbnail = media.thumbnail_url(item) elif user.pref_no_profanity and item.over_18 and not c.site.over_18: if show_media: item.thumbnail = "nsfw" item.thumbnail_sprited = True else: item.thumbnail = "" elif not show_media: item.thumbnail = "" elif item.has_thumbnail: item.thumbnail = media.thumbnail_url(item) elif item.is_self: item.thumbnail = "self" item.thumbnail_sprited = True else: item.thumbnail = "default" item.thumbnail_sprited = True item.score = max(0, item.score) if getattr(item, "domain_override", None): item.domain = item.domain_override else: item.domain = (domain(item.url) if not item.is_self else 'self.' + item.subreddit.name) item.urlprefix = '' if user_is_loggedin: item.saved = (user, item) in saved item.hidden = (user, item) in hidden item.clicked = bool(clicked.get((user, item, 'click'))) else: item.saved = item.hidden = item.clicked = False item.num = None item.permalink = item.make_permalink(item.subreddit) if item.is_self: item.url = item.make_permalink(item.subreddit, force_domain=True) if g.shortdomain: item.shortlink = g.shortdomain + '/' + item._id36 # do we hide the score? if user_is_admin: item.hide_score = False elif item.promoted and item.score <= 0: item.hide_score = True elif user == item.author: item.hide_score = False # TODO: uncomment to let gold users see the score of upcoming links # elif user.gold: # item.hide_score = False elif item._date > timeago("2 hours"): item.hide_score = True else: item.hide_score = False # store user preferences locally for caching item.pref_frame = pref_frame item.newwindow = pref_newwindow # is this link a member of a different (non-c.site) subreddit? item.different_sr = (isinstance(site, FakeSubreddit) or site.name != item.subreddit.name) if user_is_loggedin and item.author_id == user._id: item.nofollow = False elif item.score <= 1 or item._spam or item.author._spam: item.nofollow = True else: item.nofollow = False item.subreddit_path = item.subreddit.path if cname: item.subreddit_path = ("http://" + get_domain(cname=(site == item.subreddit), subreddit=False)) if site != item.subreddit: item.subreddit_path += item.subreddit.path item.domain_path = "/domain/%s/" % item.domain if item.is_self: item.domain_path = item.subreddit_path # attach video or selftext as needed item.link_child, item.editable = make_link_child(item) item.tblink = "http://%s/tb/%s" % ( get_domain(cname=cname, subreddit=False), item._id36) if item.is_self: item.href_url = item.permalink else: item.href_url = item.url # show the toolbar if the preference is set and the link # is neither a promoted link nor a self post if pref_frame and not item.is_self and not item.promoted: item.mousedown_url = item.tblink else: item.mousedown_url = None item.fresh = not any((item.likes != None, item.saved, item.clicked, item.hidden, item._deleted, item._spam)) # bits that we will render stubs (to make the cached # version more flexible) item.num = CachedVariable("num") item.numcolmargin = CachedVariable("numcolmargin") item.commentcls = CachedVariable("commentcls") item.midcolmargin = CachedVariable("midcolmargin") item.comment_label = CachedVariable("numcomments") item.lastedited = CachedVariable("lastedited") item.as_deleted = False if item.deleted and not c.user_is_admin: item.author = DeletedUser() item.as_deleted = True item.approval_checkmark = None item_age = datetime.now(g.tz) - item._date if item_age.days > g.VOTE_AGE_LIMIT and item.promoted is None: item.votable = False else: item.votable = True if item.can_ban: verdict = getattr(item, "verdict", None) if verdict in ('admin-approved', 'mod-approved'): approver = None if getattr(item, "ban_info", None): approver = item.ban_info.get("unbanner", None) if approver: item.approval_checkmark = _("approved by %s") % approver else: item.approval_checkmark = _("approved by a moderator") item.expunged = False if item.is_self: item.expunged = Link._should_expunge_selftext(item) item.editted = getattr(item, "editted", False) taglinetext = '' if item.different_sr: author_text = (" <span>" + _("by %(author)s to %(reddit)s") + "</span>") else: author_text = " <span>" + _("by %(author)s") + "</span>" if item.editted: if item.score_fmt == Score.points: taglinetext = ("<span>" + _("%(score)s submitted %(when)s " "ago%(lastedited)s") + "</span>") taglinetext += author_text elif item.different_sr: taglinetext = _("submitted %(when)s ago%(lastedited)s " "by %(author)s to %(reddit)s") else: taglinetext = _("submitted %(when)s ago%(lastedited)s " "by %(author)s") else: if item.score_fmt == Score.points: taglinetext = ("<span>" + _("%(score)s submitted %(when)s ago") + "</span>") taglinetext += author_text elif item.different_sr: taglinetext = _("submitted %(when)s ago by %(author)s " "to %(reddit)s") else: taglinetext = _("submitted %(when)s ago by %(author)s") item.taglinetext = taglinetext if user_is_loggedin: incr_counts(wrapped) # Run this last Printable.add_props(user, wrapped)
def vote(cls, sub, obj, dir, ip, organic = False): from admintools import valid_user, valid_thing, update_score from r2.lib.count import incr_counts sr = obj.subdigg_slow kind = obj.__class__.__name__.lower() karma = sub.karma(kind, sr) is_self_link = (kind == 'link' and hasattr(obj,'is_self') and obj.is_self) #check for old vote rel = cls.rel(sub, obj) oldvote = rel._fast_query(sub, obj, ['-1', '0', '1']).values() oldvote = filter(None, oldvote) amount = 1 if dir is True else 0 if dir is None else -1 is_new = False #old vote if len(oldvote): v = oldvote[0] oldamount = int(v._name) v._name = str(amount) #these still need to be recalculated old_valid_thing = v.valid_thing v.valid_thing = (valid_thing(v, karma) and v.valid_thing) v.valid_user = (v.valid_user and v.valid_thing and valid_user(v, sr, karma)) #new vote else: is_new = True oldamount = 0 v = rel(sub, obj, str(amount)) v.author_id = obj.author_id v.sr_id = sr._id v.ip = ip old_valid_thing = v.valid_thing = (valid_thing(v, karma)) v.valid_user = (v.valid_thing and valid_user(v, sr, karma) and not is_self_link) if organic: v.organic = organic v._commit() up_change, down_change = score_changes(amount, oldamount) update_score(obj, up_change, down_change, v.valid_thing, old_valid_thing) if v.valid_user: author = Account._byID(obj.author_id, data=True) author.incr_karma(kind, sr, up_change - down_change) #update the sr's valid vote count if is_new and v.valid_thing and kind == 'link': if sub._id != obj.author_id: incr_counts([sr]) return v
def add_props(cls, user, wrapped): from r2.lib.count import incr_counts from r2.lib.media import thumbnail_url from r2.lib.utils import timeago saved = Link._saved(user, wrapped) if user else {} hidden = Link._hidden(user, wrapped) if user else {} for item in wrapped: show_media = False if c.user.pref_compress: pass elif c.user.pref_media == 'on': show_media = True elif c.user.pref_media == 'subreddit' and item.subreddit.show_media: show_media = True elif (item.promoted and item.has_thumbnail and c.user.pref_media != 'off'): show_media = True if not show_media: item.thumbnail = "" elif item.has_thumbnail: item.thumbnail = thumbnail_url(item) else: item.thumbnail = g.default_thumb item.domain = (domain(item.url) if not item.is_self else 'self.' + item.subreddit.name) if not hasattr(item,'top_link'): item.top_link = False item.urlprefix = '' item.saved = bool(saved.get((user, item, 'save'))) item.hidden = bool(hidden.get((user, item, 'hide'))) # Only check "last clicked time" on demand. Otherwise it is expensive in big listings. TODO - refactor to use "_getLastClickedTime" def clicked(): c = Link._clicked(user, wrapped) if user else {} return c.get((user, item, 'click')) item.clicked = clicked item.num = None item.score_fmt = Score.signed_number item.permalink = item.make_permalink(item.subreddit) if item.is_self: item.url = item.make_permalink(item.subreddit, force_domain = True) if c.user_is_admin: item.hide_score = False elif item.promoted: item.hide_score = True elif c.user == item.author: item.hide_score = False elif item._date > timeago("2 hours"): item.hide_score = True else: item.hide_score = False # Don't allow users to vote on their own posts and don't # allow users to vote on collapsed posts shown when # viewing comment permalinks. # Also require user karma to be >= global threshold as anti-sockpuppet measure item.votable = bool(c.user_is_loggedin and c.user != item.author and not getattr(item, 'for_comment_permalink', False) and c.user.safe_karma >= g.karma_to_vote) if c.user_is_loggedin and item.author._id == c.user._id: item.nofollow = False elif item.score <= 1 or item._spam or item.author._spam: item.nofollow = True else: item.nofollow = False if c.user_is_loggedin and item.subreddit.name == c.user.draft_sr_name: item.draft = True else: item.draft = False if c.user_is_loggedin: incr_counts(wrapped)
def add_props(cls, user, wrapped): from r2.lib.pages import make_link_child from r2.lib.count import incr_counts from r2.lib.media import thumbnail_url from r2.lib.utils import timeago from r2.lib.template_helpers import get_domain from r2.models.subreddit import FakeSubreddit from r2.lib.wrapped import CachedVariable # referencing c's getattr is cheap, but not as cheap when it # is in a loop that calls it 30 times on 25-200 things. user_is_admin = c.user_is_admin user_is_loggedin = c.user_is_loggedin pref_media = user.pref_media pref_frame = user.pref_frame pref_newwindow = user.pref_newwindow cname = c.cname site = c.site saved = Link._saved(user, wrapped) if user_is_loggedin else {} hidden = Link._hidden(user, wrapped) if user_is_loggedin else {} trials = trial_info(wrapped) #clicked = Link._clicked(user, wrapped) if user else {} clicked = {} for item in wrapped: show_media = False if not hasattr(item, "score_fmt"): item.score_fmt = Score.number_only item.pref_compress = user.pref_compress if user.pref_compress and item.promoted is None: item.render_css_class = "compressed link" item.score_fmt = Score.points elif pref_media == 'on' and not user.pref_compress: show_media = True elif pref_media == 'subreddit' and item.subreddit.show_media: show_media = True elif item.promoted and item.has_thumbnail: if user_is_loggedin and item.author_id == user._id: show_media = True elif pref_media != 'off' and not user.pref_compress: show_media = True item.over_18 = bool(item.over_18 or item.subreddit.over_18 or item._nsfw.findall(item.title)) item.nsfw = item.over_18 and user.pref_label_nsfw if user.pref_no_profanity and item.over_18 and not c.site.over_18: item.thumbnail = "" elif not show_media: item.thumbnail = "" elif item.has_thumbnail: item.thumbnail = thumbnail_url(item) elif item.is_self: item.thumbnail = g.self_thumb else: item.thumbnail = g.default_thumb item.score = max(0, item.score) item.domain = (domain(item.url) if not item.is_self else 'self.' + item.subreddit.name) item.urlprefix = '' item.saved = bool(saved.get((user, item, 'save'))) item.hidden = bool(hidden.get((user, item, 'hide'))) item.clicked = bool(clicked.get((user, item, 'click'))) item.num = None item.permalink = item.make_permalink(item.subreddit) if item.is_self: item.url = item.make_permalink(item.subreddit, force_domain=True) # do we hide the score? if user_is_admin: item.hide_score = False elif item.promoted and item.score <= 0: item.hide_score = True elif user == item.author: item.hide_score = False elif item._date > timeago("2 hours"): item.hide_score = True else: item.hide_score = False # store user preferences locally for caching item.pref_frame = pref_frame item.newwindow = pref_newwindow # is this link a member of a different (non-c.site) subreddit? item.different_sr = (isinstance(site, FakeSubreddit) or site.name != item.subreddit.name) if user_is_loggedin and item.author_id == user._id: item.nofollow = False elif item.score <= 1 or item._spam or item.author._spam: item.nofollow = True else: item.nofollow = False if c.user.pref_no_profanity: item.title = profanity_filter(item.title) item.subreddit_path = item.subreddit.path if cname: item.subreddit_path = ("http://" + get_domain( cname=(site == item.subreddit), subreddit=False)) if site != item.subreddit: item.subreddit_path += item.subreddit.path item.domain_path = "/domain/%s" % item.domain if item.is_self: item.domain_path = item.subreddit_path # attach video or selftext as needed item.link_child, item.editable = make_link_child(item) item.tblink = "http://%s/tb/%s" % (get_domain( cname=cname, subreddit=False), item._id36) if item.is_self: item.href_url = item.permalink else: item.href_url = item.url # show the toolbar if the preference is set and the link # is neither a promoted link nor a self post if pref_frame and not item.is_self and not item.promoted: item.mousedown_url = item.tblink else: item.mousedown_url = None item.fresh = not any((item.likes != None, item.saved, item.clicked, item.hidden, item._deleted, item._spam)) item.is_author = (user == item.author) # bits that we will render stubs (to make the cached # version more flexible) item.num = CachedVariable("num") item.numcolmargin = CachedVariable("numcolmargin") item.commentcls = CachedVariable("commentcls") item.midcolmargin = CachedVariable("midcolmargin") item.comment_label = CachedVariable("numcomments") item.as_deleted = False if item.deleted and not c.user_is_admin: item.author = DeletedUser() item.as_deleted = True item.trial_info = trials.get(item._fullname, None) item.approval_checkmark = None if item.can_ban: verdict = getattr(item, "verdict", None) if verdict in ('admin-approved', 'mod-approved'): approver = None if getattr(item, "ban_info", None): approver = item.ban_info.get("unbanner", None) if approver: item.approval_checkmark = _( "approved by %s") % approver else: item.approval_checkmark = _("approved by a moderator") if item.trial_info is not None: item.reveal_trial_info = True item.use_big_modbuttons = True if user_is_loggedin: incr_counts(wrapped) # Run this last Printable.add_props(user, wrapped)
def vote(cls, sub, obj, dir, ip, spam = False, organic = False): from admintools import valid_user, valid_thing, update_score from r2.lib.count import incr_counts # An account can only perform 1 voting operation at a time. with g.make_lock('account_%s_voting' % sub._id): # If downvoting ensure that the user has enough karma, it # will raise an exception if not. if dir == False: sub.check_downvote() # Do the voting. sr = obj.subreddit_slow kind = obj.__class__.__name__.lower() karma = sub.karma(kind, sr) #check for old vote rel = cls.rel(sub, obj) oldvote = list(rel._query(rel.c._thing1_id == sub._id, rel.c._thing2_id == obj._id, data = True)) amount = 1 if dir is True else 0 if dir is None else -1 is_new = False #old vote if len(oldvote): v = oldvote[0] oldamount = int(v._name) v._name = str(amount) #these still need to be recalculated old_valid_thing = getattr(v, 'valid_thing', True) v.valid_thing = (valid_thing(v, karma) and v.valid_thing and not spam) v.valid_user = (v.valid_user and v.valid_thing and valid_user(v, sr, karma)) #new vote else: is_new = True oldamount = 0 v = rel(sub, obj, str(amount)) v.author_id = obj.author_id v.ip = ip old_valid_thing = v.valid_thing = (valid_thing(v, karma) and not spam) v.valid_user = v.valid_thing and valid_user(v, sr, karma) if organic: v.organic = organic v._commit() # Record that this account has made a downvote and # immediately release the lock since both the downvote # count and the vote have been updated. up_change, down_change = score_changes(amount, oldamount) if down_change: sub.incr_downvote(down_change) # Continue by updating karmas. update_score(obj, up_change, down_change, v.valid_thing, old_valid_thing) if v.valid_user: author = Account._byID(obj.author_id, data=True) author.incr_karma(kind, sr, up_change - down_change) #update the sr's valid vote count if is_new and v.valid_thing and kind == 'link': if sub._id != obj.author_id: incr_counts([sr]) return v
def vote(cls, sub, obj, dir, ip, spam=False, organic=False): from admintools import valid_user, valid_thing, update_score from r2.lib.count import incr_counts # An account can only perform 1 voting operation at a time. with g.make_lock('account_%s_voting' % sub._id) as lock: kind = obj.__class__.__name__.lower() lock.log('voting checkpoint A') # If downvoting ensure that the user has enough karma, it # will raise an exception if not. if dir == False: sub.check_downvote(kind) lock.log('voting checkpoint B') # Do the voting. sr = obj.subreddit_slow karma = sub.karma(kind, sr) lock.log('voting checkpoint C') #check for old vote rel = cls.rel(sub, obj) oldvote = list( rel._query(rel.c._thing1_id == sub._id, rel.c._thing2_id == obj._id, data=True)) amount = 1 if dir is True else 0 if dir is None else -1 # Users have a vote_multiplier which effects how much their votes are worth if isinstance(sub, Account): amount *= sub.vote_multiplier lock.log('voting checkpoint D') is_new = False #old vote if len(oldvote): v = oldvote[0] oldamount = int(v._name) v._name = str(amount) #these still need to be recalculated old_valid_thing = getattr(v, 'valid_thing', True) v.valid_thing = (valid_thing(v, karma) and v.valid_thing and not spam) v.valid_user = (v.valid_user and v.valid_thing and valid_user(v, sr, karma)) #new vote else: is_new = True oldamount = 0 v = rel(sub, obj, str(amount)) v.author_id = obj.author_id v.ip = ip old_valid_thing = v.valid_thing = (valid_thing(v, karma) and not spam) v.valid_user = v.valid_thing and valid_user(v, sr, karma) if organic: v.organic = organic lock.log('voting checkpoint E') v._commit() lock.log('voting checkpoint F') # Record that this account has made a downvote. up_change, down_change = score_changes(amount, oldamount) if down_change: sub.incr_downvote(down_change, kind) lock.log('voting checkpoint G') # Release the lock since both the downvote count and the vote count # have been updated, and then continue by updating karmas. update_score(obj, up_change, down_change, v.valid_thing, old_valid_thing) if v.valid_user: author = Account._byID(obj.author_id, data=True) author.incr_karma(kind, sr, up_change, down_change) #update the sr's valid vote count if is_new and v.valid_thing and kind == 'link': if sub._id != obj.author_id: incr_counts([sr]) return v