#! /usr/bin/env python """Pest people about patches that aren't closed""" import os import pg import smtplib from patchdb import PatchDBInterface SF_MAIL_SERVER = "ns1.varesearch.com" VERBOSE = 1 QUERY = "SELECT * FROM patches_t WHERE assigned_to = %d " \ "AND status = %d" HEADER = " user open accepted\n" \ "---------------+------+-----------" ENTRY = "%-15.15s|%5d | %6d" FROM = "Jeremy Hylton " MSG_TEMPLATE = """From: Jeremy Hylton To: %(user)s Subject: Open and Accepted patches reminder This message is automatically generated using the SF Patch Manager database. The database shows that you have %(count)s patches. Open patches need to be resolved -- either accepted, rejected, or postponed. Accepted patches need to be applied and closed. The sooner this can be done the better. Open patches should be resolved by the end of August in order to meet the 2.0b1 release deadline. The specific patches assigned to you are: """ MSG_ENTRY_TEMPLATE = """Patch #%(patch_id)s: %(summary)s http://sourceforge.net/patch/?func=detailpatch&group_id=5470&patch_id=%(patch_id)s """ def send_pest_mail(user, open, accepted): user = user + "@users.sourceforge.net" n_open = len(open) n_accepted = len(accepted) if n_open: if n_accepted: count = "%d open and %d accepted" % (n_open, n_accepted) else: count = "%d open" % n_open else: if n_accepted: count = "%d accepted" % n_accepted else: raise ValueError, "both open and accepted were empty" msg = MSG_TEMPLATE % locals() status = [] for patch_info in open + accepted: patch_id, summary = patch_info[:2] status.append(MSG_ENTRY_TEMPLATE % locals()) msg = msg + "\n".join(status) s = smtplib.SMTP("smtp.concentric.net") # s.set_debuglevel(1) s.sendmail(FROM, (user,), msg) # s.sendmail(FROM, ("jhylton@users.sourceforge.net",), msg) s.close() def main(): dbname = os.environ['USER'] db = PatchDBInterface(pg.connect(dbname)) st_open = db.status.lookup('Open') st_accepted = db.status.lookup('Accepted') if VERBOSE: print HEADER for user, user_id in db.users.get_dict().items(): if user_id <= 100: # system-defined user ids continue open = db.query(QUERY % (user_id, st_open)).getresult() accepted = db.query(QUERY % (user_id, st_accepted)).getresult() if not (open or accepted): if VERBOSE: print ENTRY % (user, 0, 0) continue if VERBOSE: print ENTRY % (user, len(open), len(accepted)) send_pest_mail(user, open, accepted) if __name__ == "__main__": main()