#! /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 <jhylton@users.sourceforge.net>"
MSG_TEMPLATE = """From: Jeremy Hylton <jhylton@users.sourceforge.net>
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()
