From 24f8c4f6171d86310b15b19ac8cbdae63d9b4e01 Mon Sep 17 00:00:00 2001 From: ketralnis Date: Thu, 4 Dec 2008 10:34:20 -0800 Subject: [PATCH] Fix miscellaneous bugs with promoted links, and reduce app-server load by reducing calls to apy.py:POST_onload --- r2/r2/controllers/api.py | 24 ++++++++--------- r2/r2/controllers/listingcontroller.py | 2 +- r2/r2/controllers/validator/validator.py | 8 +++--- r2/r2/lib/media.py | 5 ++-- r2/r2/lib/pages/pages.py | 4 +-- r2/r2/public/static/link.js | 10 +++++++ r2/r2/public/static/organic.js | 2 +- r2/r2/public/static/reddit.css | 5 ++++ r2/r2/public/static/reddit_piece.js | 19 +++++++------- r2/r2/templates/linkpromoteinfobar.html | 2 +- r2/r2/templates/promotedlinks.html | 2 +- r2/r2/templates/promotelinkform.html | 33 ++++++++++++------------ 12 files changed, 66 insertions(+), 50 deletions(-) diff --git a/r2/r2/controllers/api.py b/r2/r2/controllers/api.py index 03d96dd72..94ee98e5a 100644 --- a/r2/r2/controllers/api.py +++ b/r2/r2/controllers/api.py @@ -30,6 +30,8 @@ from r2.models import * from r2.models.subreddit import Default as DefaultSR import r2.models.thing_changes as tc +from r2.controllers import ListingController + from r2.lib.utils import get_title, sanitize_url, timeuntil, set_last_modified from r2.lib.utils import query_string, to36, timefromnow from r2.lib.wrapped import Wrapped @@ -59,6 +61,7 @@ from datetime import datetime, timedelta from md5 import md5 from r2.lib.promote import promote, unpromote, get_promoted +from r2.lib.promote import promote_builder_wrapper def link_listing_by_url(url, count = None): try: @@ -1283,15 +1286,8 @@ class ApiController(RedditController): mid_margin = VCssMeasure('mid_margin'), links = VFullNames('links')) def POST_fetch_links(self, res, num_margin, mid_margin, links): - # TODO: redundant with listingcontroller. Perhaps part of reddit_base or utils - def builder_wrapper(thing): - if c.user.pref_compress and isinstance(thing, Link): - thing.__class__ = LinkCompressed - thing.score_fmt = Score.points - return Wrapped(thing) - b = IDBuilder([l._fullname for l in links], - wrap = builder_wrapper) + wrap = promote_builder_wrapper(ListingController.builder_wrapper)) l = OrganicListing(b) l.num_margin = num_margin l.mid_margin = mid_margin @@ -1322,6 +1318,7 @@ class ApiController(RedditController): @Json @validate(VSponsor(), ValidDomain('url'), + ip = ValidIP(), l = VLink('link_id'), title = VTitle('title'), url = VUrl(['url', 'sr']), @@ -1332,7 +1329,8 @@ class ApiController(RedditController): timelimit = VBoolean('timelimit'), timelimitlength = VInt('timelimitlength',1,1000), timelimittype = VOneOf('timelimittype',['hours','days','weeks'])) - def POST_edit_promo(self, res, title, url, sr, subscribers_only, + def POST_edit_promo(self, res, ip, + title, url, sr, subscribers_only, disable_comments, timelimit = None, timelimitlength = None, timelimittype = None, disable_expire = None, @@ -1375,7 +1373,9 @@ class ApiController(RedditController): l = Link(title = title, url = url, author_id = c.user._id, - sr_id = sr._id) + sr_id = sr._id, + lang = sr.lang, + ip = ip) if timelimit and timelimitlength and timelimittype: promote_until = timefromnow("%d %s" % (timelimitlength, timelimittype)) @@ -1416,10 +1416,8 @@ class ApiController(RedditController): @Json - @validate(ids = nop("ids")) + @validate(ids = VLinkFullnames('ids')) def POST_onload(self, res, ids, *a, **kw): - ids = set(ids.split(',')) - if not ids: res.object = {} return diff --git a/r2/r2/controllers/listingcontroller.py b/r2/r2/controllers/listingcontroller.py index b1b567d71..c46aa5caa 100644 --- a/r2/r2/controllers/listingcontroller.py +++ b/r2/r2/controllers/listingcontroller.py @@ -335,7 +335,7 @@ class ByIDController(ListingController): def GET_listing(self, names, **env): if not names: return self.abort404() - self.names = names.split(' ') + self.names = names return ListingController.GET_listing(self, **env) diff --git a/r2/r2/controllers/validator/validator.py b/r2/r2/controllers/validator/validator.py index 0e000eaa9..4ee571a51 100644 --- a/r2/r2/controllers/validator/validator.py +++ b/r2/r2/controllers/validator/validator.py @@ -182,16 +182,18 @@ def chksrname(x): class VLinkFullnames(Validator): + "A space- or comma-separated list of fullnames for Links" valid_re = re.compile(r'^(' + Link._type_prefix + str(Link._type_id) + - '_[0-9a-z]+ ?)+$') - + r'_[0-9a-z]+[ ,]?)+$') + splitter = re.compile('[ ,]+') + def __init__(self, item, *a, **kw): self.item = item Validator.__init__(self, item, *a, **kw) def run(self, val): if val and self.valid_re.match(val): - return val + return self.splitter.split(val) class VLength(Validator): def __init__(self, item, length = 10000, diff --git a/r2/r2/lib/media.py b/r2/r2/lib/media.py index 68462866e..dad67f966 100644 --- a/r2/r2/lib/media.py +++ b/r2/r2/lib/media.py @@ -93,10 +93,9 @@ def process_new_links(period = media_period, force = False): results = {} jobs = [] for link in fetch_things2(links): - if link.is_self: + if link.is_self or link.promoted: continue - - if not force and (link.has_thumbnail or link.media_object): + elif not force and (link.has_thumbnail or link.media_object): continue jobs.append(make_link_info_job(results, link, g.useragent)) diff --git a/r2/r2/lib/pages/pages.py b/r2/r2/lib/pages/pages.py index 543a72bad..90f29fbe9 100644 --- a/r2/r2/lib/pages/pages.py +++ b/r2/r2/lib/pages/pages.py @@ -1178,11 +1178,11 @@ class PromotePage(Reddit): extension_handling = False def __init__(self, title, nav_menus = None, *a, **kw): - buttons = [NamedButton('current_promos'), + buttons = [NamedButton('current_promos', dest = ''), NamedButton('new_promo')] menu = NavMenu(buttons, title='show', base_path = '/promote', - type='flatlist', default = 'current_promos') + type='flatlist') if nav_menus: nav_menus.insert(0, menu) diff --git a/r2/r2/public/static/link.js b/r2/r2/public/static/link.js index d2b88fda6..f13dbb312 100644 --- a/r2/r2/public/static/link.js +++ b/r2/r2/public/static/link.js @@ -104,6 +104,16 @@ Thing.prototype = { show(this.row); } /* promoted magic */ + if(reddit_thing_info.fetch && reddit_thing_info.fetch.length != 0) { + var f = reddit_thing_info.fetch; + for(var i = 0; i < f.length; i++) { + if (f[i] == this._id) { + redditRequest("onload", {ids: f.join(",")}, + handleOnLoad, true); + break; + } + } + } if(reddit_thing_info && reddit_thing_info[this._id]) { var img = this.$("promote_img"); var img_src = unsafe(reddit_thing_info[this._id][0]); diff --git a/r2/r2/public/static/organic.js b/r2/r2/public/static/organic.js index 064ffbba7..175c33e2c 100644 --- a/r2/r2/public/static/organic.js +++ b/r2/r2/public/static/organic.js @@ -95,7 +95,7 @@ OrganicListing.populate = function(links) { var o = new OrganicListing(); for(var i = 0; i < links.length; i++) { d = links[i].data; - var t = o.append(unsafe(d.content)); + var t = o.insert(unsafe(d.content), o.listing.firstChild); if(t && t[0]) { vl[d.id] = d.vl; o.listing._loaded[d.id] = t[0]; diff --git a/r2/r2/public/static/reddit.css b/r2/r2/public/static/reddit.css index 1961ec8bd..a1f8e09f3 100644 --- a/r2/r2/public/static/reddit.css +++ b/r2/r2/public/static/reddit.css @@ -583,6 +583,11 @@ before enabling */ border: solid 1px; padding: 5px 0 5px 0; overflow: hidden; + position: relative; +} + +.promoted-list { + font-size: larger; } .organic-listing .promoted { diff --git a/r2/r2/public/static/reddit_piece.js b/r2/r2/public/static/reddit_piece.js index f6895edc5..8841d709f 100644 --- a/r2/r2/public/static/reddit_piece.js +++ b/r2/r2/public/static/reddit_piece.js @@ -70,24 +70,25 @@ function init() { /* onload populates reddit_link_info, so checking its contents * ensures it doesn't get called on reload/refresh */ if ( reddit_thing_info.fetch && reddit_thing_info.fetch.length != 0 ) - redditRequest("onload", {ids: reddit_thing_info.fetch.join(",")}, - handleOnLoad); + updateLinks(reddit_thing_info.fetch); update_reddit_count(); } -function handleOnLoad(r) { - r = parse_response(r); - - var f = reddit_thing_info.fetch; - - reddit_thing_info = (r && r.response) ? r.response.object : {}; - +function updateLinks(f) { for (var i = 0; i < f.length; i++) { var l = new Link(f[i]); if (l.row && l.row.style.display != "none") l.show(); } +} + +function handleOnLoad(r) { + r = parse_response(r); + var f = reddit_thing_info.fetch; reddit_thing_info.fetch = []; + + reddit_thing_info = (r && r.response) ? r.response.object : {}; + updateLinks(f); } function deletetoggle(link, type) { diff --git a/r2/r2/templates/linkpromoteinfobar.html b/r2/r2/templates/linkpromoteinfobar.html index 9e22baeba..27111aa98 100644 --- a/r2/r2/templates/linkpromoteinfobar.html +++ b/r2/r2/templates/linkpromoteinfobar.html @@ -24,7 +24,7 @@ from datetime import datetime %> -<%namespace file="printable.html" import="state_button, yes_no_button" /> +<%namespace file="printable.html" import="yes_no_button" /> <%namespace file="utils.html" import="plain_link" /> %if thing.a.promoted: diff --git a/r2/r2/templates/promotedlinks.html b/r2/r2/templates/promotedlinks.html index fb4dcc5a4..18efd9b3f 100644 --- a/r2/r2/templates/promotedlinks.html +++ b/r2/r2/templates/promotedlinks.html @@ -29,7 +29,7 @@

${_('current promotions')}

-