def get_giving_for_profile(self, db=None): """Given a participant id and a date, return a list and a Decimal. This function is used to populate a participant's page for their own viewing pleasure. A half-injected dependency, that's what db is. """ if db is None: from gittip import db TIPS = """\ SELECT * FROM ( SELECT DISTINCT ON (tippee) amount , tippee , t.ctime , p.claimed_time , p.username_lower FROM tips t JOIN participants p ON p.username = t.tippee WHERE tipper = %s AND p.is_suspicious IS NOT true AND p.claimed_time IS NOT NULL ORDER BY tippee , t.mtime DESC ) AS foo ORDER BY amount DESC , username_lower """ tips = db.all(TIPS, (self.username,)) UNCLAIMED_TIPS = """\ SELECT * FROM ( SELECT DISTINCT ON (tippee) amount , tippee , t.ctime , p.claimed_time , e.platform , e.user_info FROM tips t JOIN participants p ON p.username = t.tippee JOIN elsewhere e ON e.participant = t.tippee WHERE tipper = %s AND p.is_suspicious IS NOT true AND p.claimed_time IS NULL ORDER BY tippee , t.mtime DESC ) AS foo ORDER BY amount DESC , lower(user_info->'screen_name') , lower(user_info->'username') , lower(user_info->'login') """ unclaimed_tips = db.all(UNCLAIMED_TIPS, (self.username,)) # Compute the total. # ================== # For payday we only want to process payments to tippees who have # themselves opted into Gittip. For the tipper's profile page we want # to show the total amount they've pledged (so they're not surprised # when someone *does* start accepting tips and all of a sudden they're # hit with bigger charges. total = sum([t.amount for t in tips]) if not total: # If tips is an empty list, total is int 0. We want a Decimal. total = Decimal('0.00') unclaimed_total = sum([t.amount for t in unclaimed_tips]) if not unclaimed_total: unclaimed_total = Decimal('0.00') return tips, total, unclaimed_tips, unclaimed_total
def get_giving_for_profile(self, db=None): """Given a participant id and a date, return a list and a Decimal. This function is used to populate a participant's page for their own viewing pleasure. A half-injected dependency, that's what db is. """ if db is None: from gittip import db TIPS = """\ SELECT * FROM ( SELECT DISTINCT ON (tippee) amount , tippee , t.ctime , p.claimed_time , p.username_lower FROM tips t JOIN participants p ON p.username = t.tippee WHERE tipper = %s AND p.is_suspicious IS NOT true AND p.claimed_time IS NOT NULL ORDER BY tippee , t.mtime DESC ) AS foo ORDER BY amount DESC , username_lower """ tips = db.all(TIPS, (self.username, )) UNCLAIMED_TIPS = """\ SELECT * FROM ( SELECT DISTINCT ON (tippee) amount , tippee , t.ctime , p.claimed_time , e.platform , e.user_info FROM tips t JOIN participants p ON p.username = t.tippee JOIN elsewhere e ON e.participant = t.tippee WHERE tipper = %s AND p.is_suspicious IS NOT true AND p.claimed_time IS NULL ORDER BY tippee , t.mtime DESC ) AS foo ORDER BY amount DESC , lower(user_info->'screen_name') , lower(user_info->'username') , lower(user_info->'login') """ unclaimed_tips = db.all(UNCLAIMED_TIPS, (self.username, )) # Compute the total. # ================== # For payday we only want to process payments to tippees who have # themselves opted into Gittip. For the tipper's profile page we want # to show the total amount they've pledged (so they're not surprised # when someone *does* start accepting tips and all of a sudden they're # hit with bigger charges. total = sum([t.amount for t in tips]) if not total: # If tips is an empty list, total is int 0. We want a Decimal. total = Decimal('0.00') unclaimed_total = sum([t.amount for t in unclaimed_tips]) if not unclaimed_total: unclaimed_total = Decimal('0.00') return tips, total, unclaimed_tips, unclaimed_total
def get_tips_and_total(self, for_payday=False, db=None): """Given a participant id and a date, return a list and a Decimal. This function is used by the payday function. If for_payday is not False it must be a date object. Originally we also used this function to populate the profile page, but our requirements there changed while, oddly, our requirements in payday *also* changed to match the old requirements of the profile page. So this function keeps the for_payday parameter after all. A half-injected dependency, that's what db is. """ if db is None: from gittip import db if for_payday: # For payday we want the oldest relationship to be paid first. order_by = "ctime ASC" # This is where it gets crash-proof. # ================================== # We need to account for the fact that we may have crashed during # Payday and we're re-running that function. We only want to select # tips that existed before Payday started, but haven't been # processed as part of this Payday yet. # # It's a bug if the paydays subselect returns > 1 rows. # # XXX If we crash during Payday and we rerun it after a timezone # change, will we get burned? How? ts_filter = """\ AND mtime < %s AND ( SELECT id FROM transfers WHERE tipper=t.tipper AND tippee=t.tippee AND timestamp >= %s ) IS NULL """ args = (self.username, for_payday, for_payday) else: order_by = "amount DESC" ts_filter = "" args = (self.username,) TIPS = """\ SELECT * FROM ( SELECT DISTINCT ON (tippee) amount , tippee , t.ctime , p.claimed_time FROM tips t JOIN participants p ON p.username = t.tippee WHERE tipper = %%s AND p.is_suspicious IS NOT true %s ORDER BY tippee , t.mtime DESC ) AS foo ORDER BY %s , tippee """ % (ts_filter, order_by) # XXX, No injections here, right?! tips = db.all(TIPS, args) # Compute the total. # ================== # For payday we only want to process payments to tippees who have # themselves opted into Gittip. For the tipper's profile page we want # to show the total amount they've pledged (so they're not surprised # when someone *does* start accepting tips and all of a sudden they're # hit with bigger charges. if for_payday: to_total = [t for t in tips if t['claimed_time'] is not None] else: to_total = tips total = sum([t['amount'] for t in to_total]) if not total: # If to_total is an empty list, total is int 0. We want a Decimal. total = Decimal('0.00') return tips, total
def get_tips_and_total(self, for_payday=False, db=None): """Given a participant id and a date, return a list and a Decimal. This function is used by the payday function. If for_payday is not False it must be a date object. Originally we also used this function to populate the profile page, but our requirements there changed while, oddly, our requirements in payday *also* changed to match the old requirements of the profile page. So this function keeps the for_payday parameter after all. A half-injected dependency, that's what db is. """ if db is None: from gittip import db if for_payday: # For payday we want the oldest relationship to be paid first. order_by = "ctime ASC" # This is where it gets crash-proof. # ================================== # We need to account for the fact that we may have crashed during # Payday and we're re-running that function. We only want to select # tips that existed before Payday started, but haven't been # processed as part of this Payday yet. # # It's a bug if the paydays subselect returns > 1 rows. # # XXX If we crash during Payday and we rerun it after a timezone # change, will we get burned? How? ts_filter = """\ AND mtime < %s AND ( SELECT id FROM transfers WHERE tipper=t.tipper AND tippee=t.tippee AND timestamp >= %s ) IS NULL """ args = (self.username, for_payday, for_payday) else: order_by = "amount DESC" ts_filter = "" args = (self.username, ) TIPS = """\ SELECT * FROM ( SELECT DISTINCT ON (tippee) amount , tippee , t.ctime , p.claimed_time FROM tips t JOIN participants p ON p.username = t.tippee WHERE tipper = %%s AND p.is_suspicious IS NOT true %s ORDER BY tippee , t.mtime DESC ) AS foo ORDER BY %s , tippee """ % (ts_filter, order_by) # XXX, No injections here, right?! tips = db.all(TIPS, args) # Compute the total. # ================== # For payday we only want to process payments to tippees who have # themselves opted into Gittip. For the tipper's profile page we want # to show the total amount they've pledged (so they're not surprised # when someone *does* start accepting tips and all of a sudden they're # hit with bigger charges. if for_payday: to_total = [t for t in tips if t['claimed_time'] is not None] else: to_total = tips total = sum([t['amount'] for t in to_total]) if not total: # If to_total is an empty list, total is int 0. We want a Decimal. total = Decimal('0.00') return tips, total