2007-11-10 00:55:15 -05:00
|
|
|
#!/usr/bin/python2.4
|
2007-11-14 22:55:12 -05:00
|
|
|
import os, sys, urllib, libxml2, libxslt, ldap, time
|
2007-11-10 00:55:15 -05:00
|
|
|
|
|
|
|
#
|
|
|
|
# globals
|
|
|
|
#
|
|
|
|
cscUri = "http://csclub.uwaterloo.ca/xsltproc"
|
2007-11-14 22:55:12 -05:00
|
|
|
cscTerms = ["Winter", "Spring", "Fall"]
|
|
|
|
cscShortTerms = ['w', 's', 'f']
|
|
|
|
cscLdapUri = "ldap://ldap1.csclub.uwaterloo.ca ldap://ldap2.csclub.uwaterloo.ca"
|
|
|
|
cscLdap = None
|
|
|
|
cscPeopleBase = 'ou=People,dc=csclub,dc=uwaterloo,dc=ca'
|
|
|
|
|
|
|
|
#
|
|
|
|
# cscLdapConnect
|
|
|
|
#
|
|
|
|
def cscLdapConnect():
|
|
|
|
global cscLdap
|
|
|
|
cscLdap = ldap.initialize(cscLdapUri)
|
|
|
|
cscLdap.simple_bind_s("", "")
|
2007-11-10 00:55:15 -05:00
|
|
|
|
|
|
|
#
|
|
|
|
# csc:encode-for-uri
|
|
|
|
#
|
2007-11-14 22:55:12 -05:00
|
|
|
def cscEncodeForUri(ctx, arg):
|
|
|
|
if type(arg) == type([]):
|
|
|
|
arg = libxml2.xmlNode(arg[0]).getContent()
|
|
|
|
return urllib.quote(arg)
|
2007-11-10 00:55:15 -05:00
|
|
|
|
|
|
|
#
|
|
|
|
# csc:term
|
|
|
|
#
|
2007-11-14 22:55:12 -05:00
|
|
|
def cscTerm(ctx, arg):
|
|
|
|
if type(arg) == type([]):
|
|
|
|
arg = libxml2.xmlNode(arg[0]).getContent()
|
2007-11-10 00:55:15 -05:00
|
|
|
try:
|
2007-11-14 22:55:12 -05:00
|
|
|
[year, month, day] = arg.split("-")
|
2007-11-10 03:58:28 -05:00
|
|
|
term = (int(month) - 1) / 4
|
2007-11-14 22:55:12 -05:00
|
|
|
return cscTerms[term] + " " + year
|
2007-11-10 00:55:15 -05:00
|
|
|
except:
|
2007-11-14 22:55:12 -05:00
|
|
|
print "Invalid term '%s'" % arg
|
|
|
|
|
|
|
|
#
|
|
|
|
# csc:member-list
|
|
|
|
#
|
|
|
|
def cscMemberList(ctx, arg):
|
|
|
|
try:
|
|
|
|
if cscLdap == None:
|
|
|
|
cscLdapConnect()
|
|
|
|
curDate = time.strftime('%d-%m-%Y')
|
|
|
|
year = time.localtime().tm_year
|
|
|
|
term = cscShortTerms[int(time.localtime().tm_mon - 1) / 4]
|
|
|
|
members = cscLdap.search_s(cscPeopleBase, ldap.SCOPE_SUBTREE,
|
|
|
|
'(&(objectClass=member)(term=%s%d))' % (term, year))
|
|
|
|
doc = libxml2.newDoc("1.0")
|
|
|
|
root = doc.newChild(None, "memberlist", None)
|
|
|
|
for (_, member) in members:
|
|
|
|
node = root.newChild(None, "member", None)
|
|
|
|
node.setProp("userid", member['uid'][0])
|
|
|
|
node.setProp("name", member['cn'][0])
|
|
|
|
if not 'program' in member:
|
|
|
|
member['program'] = ['']
|
|
|
|
node.setProp("program", member['program'][0])
|
|
|
|
return [root]
|
|
|
|
except Exception, e:
|
|
|
|
print e
|
|
|
|
raise
|
2007-11-10 00:55:15 -05:00
|
|
|
|
|
|
|
#
|
|
|
|
# csc:email
|
|
|
|
#
|
2007-11-14 22:55:12 -05:00
|
|
|
def cscEmail(ctx, arg):
|
|
|
|
if type(arg) == type([]):
|
|
|
|
str = libxml2.xmlNode(arg[0]).getContent()
|
2007-11-10 00:55:15 -05:00
|
|
|
return "_EMAIL_TODO_"
|
|
|
|
|
|
|
|
#
|
|
|
|
# main
|
|
|
|
#
|
|
|
|
|
|
|
|
# check argv
|
|
|
|
if len(sys.argv) < 4:
|
|
|
|
print "Usage: xsltproc.py input-file style-sheet output-file [params...]"
|
|
|
|
sys.exit(1)
|
|
|
|
inFile = sys.argv[1]
|
|
|
|
xsltFile = sys.argv[2]
|
|
|
|
outFile = sys.argv[3]
|
|
|
|
rawParams = sys.argv[4:]
|
|
|
|
|
|
|
|
# check params
|
|
|
|
params = {}
|
|
|
|
for p in rawParams:
|
2007-11-10 03:58:28 -05:00
|
|
|
try:
|
|
|
|
[key, val] = p.split("=")
|
|
|
|
params[key] = "'" + val + "'"
|
|
|
|
except:
|
|
|
|
print "Missing value for parameter '%s'" % p
|
2007-11-10 00:55:15 -05:00
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
try:
|
|
|
|
# register extensions
|
|
|
|
libxslt.registerExtModuleFunction("encode-for-uri", cscUri, cscEncodeForUri)
|
|
|
|
libxslt.registerExtModuleFunction("term", cscUri, cscTerm)
|
2007-11-14 22:55:12 -05:00
|
|
|
libxslt.registerExtModuleFunction("member-list", cscUri, cscMemberList)
|
2007-11-10 00:55:15 -05:00
|
|
|
libxslt.registerExtModuleFunction("email", cscUri, cscEmail)
|
|
|
|
|
|
|
|
# parse xml/xslt and apply style-sheet
|
|
|
|
style = libxslt.parseStylesheetFile(xsltFile)
|
2007-11-21 02:05:17 -05:00
|
|
|
if style == None: sys.exit(1)
|
2007-11-10 00:55:15 -05:00
|
|
|
doc = libxml2.parseFile(inFile)
|
|
|
|
res = style.applyStylesheet(doc, params)
|
2007-11-14 22:55:12 -05:00
|
|
|
ret = style.saveResultToFilename(outFile, res, 0)
|
2007-11-10 00:55:15 -05:00
|
|
|
|
2007-11-14 22:55:12 -05:00
|
|
|
except Exception, e:
|
2007-11-10 00:55:15 -05:00
|
|
|
sys.exit(1)
|