def scheduled_campaigns_by_link(l, date=None): # A promotion/campaign is scheduled/live if it's in # PromotionWeights.get_campaigns(now) and # charged_or_not_needed date = date or promo_datetime_now() if not is_accepted(l): return [] scheduled = PromotionWeights.get_campaigns(date) campaigns = [c.promo_idx for c in scheduled if c.thing_name == l._fullname] # Check authorize accepted = [] for campaign_id in campaigns: try: campaign = PromoCampaign._byID(campaign_id, data=True) if charged_or_not_needed(campaign): accepted.append(campaign_id) except NotFound: g.log.error("PromoCampaign %d scheduled to run on %s not found." % (campaign_id, date.strftime("%Y-%m-%d"))) return accepted
def accept_promotion(link): """ Accepting is campaign agnostic. Accepting the ad just means that it is allowed to run if payment has been processed. If a campagn is able to run, this also requeues it. """ # update the query queue set_promote_status(link, PROMOTE_STATUS.accepted) # campaigns that should be live now must be updated now = promo_datetime_now(0) promotion_weights = PromotionWeights.get_campaigns(now) live_campaigns = {pw.promo_idx for pw in promotion_weights if pw.thing_name == link._fullname} if live_campaigns: campaigns = PromoCampaign._byID(live_campaigns, data=True, return_dict=False) PromotionLog.add(link, "has live campaigns, forcing live") charge_pending(0) # campaign must be charged before it will go live for campaign in campaigns: hooks.get_hook("campaign.edit").call(link=link, campaign=campaign) queue_changed_promo(link, "accepted") # campaigns that were charged and will go live in the future must be updated future_campaigns = [camp for camp in PromoCampaign._by_link(link._id) if camp.start_date > now] transactions = get_transactions(link, future_campaigns) charged_campaigns = [ camp for camp in future_campaigns if (transactions.get(camp._id) and transactions.get(camp._id).is_charged()) ] for campaign in charged_campaigns: hooks.get_hook("campaign.edit").call(link=link, campaign=campaign) if link._spam: link._spam = False link._commit() emailer.accept_promo(link)
def GET_report(self, start, end, link_text=None, owner=None): now = datetime.now(g.tz).replace(hour=0, minute=0, second=0, microsecond=0) end = end or now - timedelta(days=1) start = start or end - timedelta(days=7) links = [] bad_links = [] owner_name = owner.name if owner else '' if owner: promo_weights = PromotionWeights.get_campaigns(start, end, author_id=owner._id) campaign_ids = [pw.promo_idx for pw in promo_weights] campaigns = PromoCampaign._byID(campaign_ids, data=True) link_ids = {camp.link_id for camp in campaigns.itervalues()} links.extend(Link._byID(link_ids, data=True, return_dict=False)) if link_text is not None: id36s = link_text.replace(',', ' ').split() try: links_from_text = Link._byID36(id36s, data=True) except NotFound: links_from_text = {} bad_links = [id36 for id36 in id36s if id36 not in links_from_text] links.extend(links_from_text.values()) content = PromoteReport(links, link_text, owner_name, bad_links, start, end) if c.render_style == 'csv': return content.as_csv() else: return PromotePage(title=_("sponsored link report"), content=content).render()
def GET_report(self, start, end, link_text=None, owner=None): now = datetime.now(g.tz).replace(hour=0, minute=0, second=0, microsecond=0) end = end or now - timedelta(days=1) start = start or end - timedelta(days=7) links = [] bad_links = [] owner_name = owner.name if owner else '' if owner: promo_weights = PromotionWeights.get_campaigns(start, end, author_id=owner._id) campaign_ids = [pw.promo_idx for pw in promo_weights] campaigns = PromoCampaign._byID(campaign_ids, data=True) link_ids = {camp.link_id for camp in campaigns.itervalues()} links.extend(Link._byID(link_ids, data=True, return_dict=False)) if link_text is not None: id36s = link_text.replace(',', ' ').split() try: links_from_text = Link._byID36(id36s, data=True) except NotFound: links_from_text = {} bad_links = [id36 for id36 in id36s if id36 not in links_from_text] links.extend(links_from_text.values()) content = PromoteReport(links, link_text, owner_name, bad_links, start, end) if c.render_style == 'csv': return content.as_csv() else: return PromotePage(title=_("sponsored link report"), content=content).render()
def scheduled_campaigns_by_link(l, date=None): # A promotion/campaign is scheduled/live if it's in # PromotionWeights.get_campaigns(now) and # authorize.is_charged_transaction() date = date or promo_datetime_now() if not is_accepted(l): return [] scheduled = PromotionWeights.get_campaigns(date) campaigns = [c.promo_idx for c in scheduled if c.thing_name == l._fullname] # Check authorize accepted = [] for campaign_id in campaigns: try: campaign = PromoCampaign._byID(campaign_id, data=True) if authorize.is_charged_transaction(campaign.trans_id, campaign_id): accepted.append(campaign_id) except NotFound: g.log.error("PromoCampaign %d scheduled to run on %s not found." % (campaign_id, date.strftime("%Y-%m-%d"))) return accepted
def accept_promotion(link): """ Accepting is campaign agnostic. Accepting the ad just means that it is allowed to run if payment has been processed. If a campagn is able to run, this also requeues it. """ PromotionLog.add(link, 'status update: accepted') # update the query queue set_promote_status(link, PROMOTE_STATUS.accepted) # campaigns that should be live now must be updated now = promo_datetime_now(0) if link._fullname in set(l.thing_name for l in PromotionWeights.get_campaigns(now)): PromotionLog.add(link, 'Marked promotion for acceptance') charge_pending(0) # campaign must be charged before it will go live queue_changed_promo(link, "accepted") # campaigns that were charged and will go live in the future must be updated future_campaigns = [camp for camp in PromoCampaign._by_link(link._id) if camp.start_date > now] transactions = get_transactions(link, future_campaigns) charged_campaigns = [camp for camp in future_campaigns if (transactions.get(camp._id) and transactions.get(camp._id).is_charged())] for campaign in charged_campaigns: hooks.get_hook('campaign.edit').call(link=link, campaign=campaign) if link._spam: link._spam = False link._commit() emailer.accept_promo(link)
def get_house_link_names(cls): now = promote.promo_datetime_now() pws = PromotionWeights.get_campaigns(now) campaign_ids = {pw.promo_idx for pw in pws} q = PromoCampaign._query(PromoCampaign.c._id.in_(campaign_ids), PromoCampaign.c.priority_name == 'house', data=True) return [Link._fullname_from_id36(to36(camp.link_id)) for camp in q]
def get_house_campaigns(cls): now = promote.promo_datetime_now() pws = PromotionWeights.get_campaigns(now) campaign_ids = {pw.promo_idx for pw in pws} campaigns = PromoCampaign._byID(campaign_ids, data=True, return_dict=False) campaigns = [camp for camp in campaigns if not camp.priority.cpm] return campaigns
def get_promos(date, sr_names=None, link=None): pws = PromotionWeights.get_campaigns(date, sr_names=sr_names, link=link) campaign_ids = {pw.promo_idx for pw in pws} campaigns = PromoCampaign._byID(campaign_ids, data=True, return_dict=False) link_ids = {camp.link_id for camp in campaigns} links = Link._byID(link_ids, data=True) for camp in campaigns: yield camp, links[camp.link_id]
def get_promos(date, sr_names=None, link=None): pws = PromotionWeights.get_campaigns(date, sr_names=sr_names, link=link) campaign_ids = {pw.promo_idx for pw in pws} campaigns = PromoCampaign._byID(campaign_ids, data=True, return_dict=False) link_ids = {camp.link_id for camp in campaigns} links = Link._byID(link_ids, data=True) for camp in campaigns: yield camp, links[camp.link_id]
def get_house_link_names(cls): now = promote.promo_datetime_now() pws = PromotionWeights.get_campaigns(now) campaign_ids = {pw.promo_idx for pw in pws} q = PromoCampaign._query(PromoCampaign.c._id.in_(campaign_ids), PromoCampaign.c.priority_name == 'house', data=True) return [Link._fullname_from_id36(to36(camp.link_id)) for camp in q]
def get_house_campaigns(cls): now = promote.promo_datetime_now() pws = PromotionWeights.get_campaigns(now) campaign_ids = {pw.promo_idx for pw in pws} campaigns = PromoCampaign._byID(campaign_ids, data=True, return_dict=False) campaigns = [camp for camp in campaigns if not camp.priority.cpm] return campaigns
def accept_promotion(link): """ Accepting is campaign agnostic. Accepting the ad just means that it is allowed to run if payment has been processed. If a campagn is able to run, this also requeues it. """ # update the query queue set_promote_status(link, PROMOTE_STATUS.accepted) # campaigns that should be live now must be updated now = promo_datetime_now(0) promotion_weights = PromotionWeights.get_campaigns(now) live_campaigns = { pw.promo_idx for pw in promotion_weights if pw.thing_name == link._fullname } if live_campaigns: campaigns = PromoCampaign._byID(live_campaigns, data=True, return_dict=False) PromotionLog.add(link, 'has live campaigns, forcing live') charge_pending(0) # campaign must be charged before it will go live for campaign in campaigns: hooks.get_hook('campaign.edit').call(link=link, campaign=campaign) queue_changed_promo(link, "accepted") # campaigns that were charged and will go live in the future must be updated future_campaigns = [ camp for camp in PromoCampaign._by_link(link._id) if camp.start_date > now ] transactions = get_transactions(link, future_campaigns) charged_campaigns = [ camp for camp in future_campaigns if (transactions.get(camp._id) and transactions.get(camp._id).is_charged()) ] for campaign in charged_campaigns: hooks.get_hook('campaign.edit').call(link=link, campaign=campaign) if link._spam: link._spam = False link._commit() emailer.accept_promo(link)
def accept_promotion(link): """ Accepting is campaign agnostic. Accepting the ad just means that it is allowed to run if payment has been processed. If a campagn is able to run, this also requeues it. """ PromotionLog.add(link, "status update: accepted") # update the query queue set_promote_status(link, PROMOTE_STATUS.accepted) now = promo_datetime_now(0) if link._fullname in set(l.thing_name for l in PromotionWeights.get_campaigns(now)): PromotionLog.add(link, "Marked promotion for acceptance") charge_pending(0) # campaign must be charged before it will go live queue_changed_promo(link, "accepted") if link._spam: link._spam = False link._commit() emailer.accept_promo(link)
def set_live_promotions(weights): start = time.time() # First, figure out which subreddits have had ads recently today = promo_datetime_now() yesterday = today - timedelta(days=1) tomorrow = today + timedelta(days=1) promo_weights = PromotionWeights.get_campaigns(yesterday, tomorrow) subreddit_names = set(p.sr_name for p in promo_weights) subreddits = Subreddit._by_name(subreddit_names).values() # Set the default for those subreddits to no ads all_weights = {sr._id: [] for sr in subreddits} # Mix in the currently live ads all_weights.update(weights) if "" in all_weights: all_weights[LiveAdWeights.FRONT_PAGE] = all_weights.pop("") LiveAdWeights.set_all_from_weights(all_weights) end = time.time() g.log.info("promote.set_live_promotions completed in %s seconds", end - start)
def set_live_promotions(weights): start = time.time() # First, figure out which subreddits have had ads recently today = promo_datetime_now() yesterday = today - timedelta(days=1) tomorrow = today + timedelta(days=1) promo_weights = PromotionWeights.get_campaigns(yesterday, tomorrow) subreddit_names = set(p.sr_name for p in promo_weights) subreddits = Subreddit._by_name(subreddit_names).values() # Set the default for those subreddits to no ads all_weights = {sr._id: [] for sr in subreddits} # Mix in the currently live ads all_weights.update(weights) if '' in all_weights: all_weights[LiveAdWeights.FRONT_PAGE] = all_weights.pop('') LiveAdWeights.set_all_from_weights(all_weights) end = time.time() g.log.info("promote.set_live_promotions completed in %s seconds", end - start)
def accept_promotion(link): """ Accepting is campaign agnostic. Accepting the ad just means that it is allowed to run if payment has been processed. If a campagn is able to run, this also requeues it. """ PromotionLog.add(link, 'status update: accepted') # update the query queue set_promote_status(link, PROMOTE_STATUS.accepted) now = promo_datetime_now(0) if link._fullname in set(l.thing_name for l in PromotionWeights.get_campaigns(now)): PromotionLog.add(link, 'Marked promotion for acceptance') charge_pending(0) # campaign must be charged before it will go live queue_changed_promo(link, "accepted") if link._spam: link._spam = False link._commit() emailer.accept_promo(link)
def accepted_campaigns(offset=0): now = promo_datetime_now(offset=offset) promo_weights = PromotionWeights.get_campaigns(now) all_links = Link._by_fullname(set(x.thing_name for x in promo_weights), data=True, return_dict=True) accepted_links = {} for link_fullname, link in all_links.iteritems(): if is_accepted(link): accepted_links[link._id] = link accepted_link_ids = accepted_links.keys() campaign_query = PromoCampaign._query(PromoCampaign.c.link_id == accepted_link_ids, data=True) campaigns = dict((camp._id, camp) for camp in campaign_query) for pw in promo_weights: campaign = campaigns.get(pw.promo_idx) if not campaign or (not campaign.trans_id and campaign.priority.cpm): continue link = accepted_links.get(campaign.link_id) if not link: continue yield (link, campaign, pw.weight)
def get_campaigns_by_date(srs, start, end, ignore=None): srs = tup(srs) sr_names = [sr.name for sr in srs] q = PromotionWeights.get_campaigns(start, end=end, sr_names=sr_names) campaign_ids = {pw.promo_idx for pw in q} if ignore: campaign_ids.discard(ignore._id) campaigns = PromoCampaign._byID(campaign_ids, data=True, return_dict=False) # filter out deleted campaigns that didn't have their PromotionWeights # deleted campaigns = filter(lambda camp: not camp._deleted, campaigns) transaction_ids = {camp.trans_id for camp in campaigns if camp.trans_id != NO_TRANSACTION} if transaction_ids: transactions = Bid.query().filter(Bid.transaction.in_(transaction_ids)) transaction_by_id = {bid.transaction: bid for bid in transactions} else: transaction_by_id = {} dates = set(get_date_range(start, end)) ret = {date: set() for date in dates} for camp in campaigns: if camp.trans_id == NO_TRANSACTION: continue if camp.impressions <= 0: # pre-CPM campaign continue transaction = transaction_by_id[camp.trans_id] if not (transaction.is_auth() or transaction.is_charged()): continue camp_dates = set(get_date_range(camp.start_date, camp.end_date)) for date in camp_dates.intersection(dates): ret[date].add(camp) return ret
def accepted_campaigns(offset=0): now = promo_datetime_now(offset=offset) promo_weights = PromotionWeights.get_campaigns(now) all_links = Link._by_fullname(set(x.thing_name for x in promo_weights), data=True, return_dict=True) accepted_links = {} for link_fullname, link in all_links.iteritems(): if is_accepted(link): accepted_links[link._id] = link accepted_link_ids = accepted_links.keys() campaign_query = PromoCampaign._query(PromoCampaign.c.link_id == accepted_link_ids, data=True) campaigns = dict((camp._id, camp) for camp in campaign_query) for pw in promo_weights: campaign = campaigns.get(pw.promo_idx) if not campaign or not campaign.trans_id: continue link = accepted_links.get(campaign.link_id) if not link: continue yield (link, campaign, pw.weight)