|
|
|
@ -1,39 +1,77 @@ |
|
|
|
|
#!/usr/bin/python2.4 |
|
|
|
|
import os, sys, urllib, libxml2, libxslt |
|
|
|
|
import os, sys, urllib, libxml2, libxslt, ldap, time |
|
|
|
|
|
|
|
|
|
# |
|
|
|
|
# globals |
|
|
|
|
# |
|
|
|
|
cscUri = "http://csclub.uwaterloo.ca/xsltproc" |
|
|
|
|
terms = ["Winter", "Spring", "Fall"] |
|
|
|
|
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("", "") |
|
|
|
|
|
|
|
|
|
# |
|
|
|
|
# csc:encode-for-uri |
|
|
|
|
# |
|
|
|
|
def cscEncodeForUri(ctx, str): |
|
|
|
|
if type(str) == type([]): |
|
|
|
|
str = libxml2.xmlNode(str[0]).getContent() |
|
|
|
|
return urllib.quote(str) |
|
|
|
|
def cscEncodeForUri(ctx, arg): |
|
|
|
|
if type(arg) == type([]): |
|
|
|
|
arg = libxml2.xmlNode(arg[0]).getContent() |
|
|
|
|
return urllib.quote(arg) |
|
|
|
|
|
|
|
|
|
# |
|
|
|
|
# csc:term |
|
|
|
|
# |
|
|
|
|
def cscTerm(ctx, str): |
|
|
|
|
if type(str) == type([]): |
|
|
|
|
str = libxml2.xmlNode(str[0]).getContent() |
|
|
|
|
def cscTerm(ctx, arg): |
|
|
|
|
if type(arg) == type([]): |
|
|
|
|
arg = libxml2.xmlNode(arg[0]).getContent() |
|
|
|
|
try: |
|
|
|
|
[year, month, day] = str.split("-") |
|
|
|
|
[year, month, day] = arg.split("-") |
|
|
|
|
term = (int(month) - 1) / 4 |
|
|
|
|
return terms[term] + " " + year |
|
|
|
|
return cscTerms[term] + " " + year |
|
|
|
|
except: |
|
|
|
|
print "Invalid term '%s'" % str |
|
|
|
|
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 |
|
|
|
|
|
|
|
|
|
# |
|
|
|
|
# csc:email |
|
|
|
|
# |
|
|
|
|
def cscEmail(ctx, str): |
|
|
|
|
if type(str) == type([]): |
|
|
|
|
str = libxml2.xmlNode(str[0]).getContent() |
|
|
|
|
def cscEmail(ctx, arg): |
|
|
|
|
if type(arg) == type([]): |
|
|
|
|
str = libxml2.xmlNode(arg[0]).getContent() |
|
|
|
|
return "_EMAIL_TODO_" |
|
|
|
|
|
|
|
|
|
# |
|
|
|
@ -63,14 +101,15 @@ try: |
|
|
|
|
# register extensions |
|
|
|
|
libxslt.registerExtModuleFunction("encode-for-uri", cscUri, cscEncodeForUri) |
|
|
|
|
libxslt.registerExtModuleFunction("term", cscUri, cscTerm) |
|
|
|
|
libxslt.registerExtModuleFunction("member-list", cscUri, cscMemberList) |
|
|
|
|
libxslt.registerExtModuleFunction("email", cscUri, cscEmail) |
|
|
|
|
|
|
|
|
|
# parse xml/xslt and apply style-sheet |
|
|
|
|
style = libxslt.parseStylesheetFile(xsltFile) |
|
|
|
|
doc = libxml2.parseFile(inFile) |
|
|
|
|
res = style.applyStylesheet(doc, params) |
|
|
|
|
style.saveResultToFilename(outFile, res, 0) |
|
|
|
|
ret = style.saveResultToFilename(outFile, res, 0) |
|
|
|
|
|
|
|
|
|
except: |
|
|
|
|
print "Unexpected error: '%s'" % sys.exc_info()[0] |
|
|
|
|
except Exception, e: |
|
|
|
|
print e |
|
|
|
|
sys.exit(1) |
|
|
|
|