#format python #!/usr/bin/env python2.3 """ InterWiki server module @copyright: LinuxWiki:ThomasWaldmann @license: GPL, see COPYING for details """ import xmlrpclib, pickle sisterlist = { # name: (type, url ) 'LinuxWiki': ('MoinMoin', 'http://linuxwiki.org/', ), 'JuraWiki': ('MoinMoin', 'http://jurawiki.de/', ), } sistersets = {} def getPageList(wikiname): """ get the pagelist from a wiki """ type, url = sisterlist[wikiname] if type == 'MoinMoin': srcwiki = xmlrpclib.ServerProxy(url+"?action=xmlrpc2") pages = srcwiki.getAllPages() return pages def collectpages(): """ Iterate over sistersites, get pagelists of them and add them to the sets """ for wiki in sisterlist: pages = getPageList(wiki) for page in pages: sets = findSetByMember(wiki, page, create=True) for set in sets: addMember(set, wiki, page) def addMember(set, wiki, page, newstatus=None): """ add an interwiki link to a set of interwiki links newstatus == None means that we want to add the interwiki link as member of this set, if allowed == True means that we explicitely want the interwiki link as a member of this set (force) == False means that we explicitely exclude this page from being a member of this set (force) """ try: oldstatus = set[(wiki,page)] except KeyError: oldstatus = None if oldstatus == None or newstatus != None: set[(wiki,page)] = newstatus def delMember(set, wiki, page): """ remove an interwiki link from a set of interwiki links """ try: del set[(wiki,page)] except KeyError: pass def findSetByKey(key, create=False): """ find a set by giving the key (normally the pagename), if there is no such set, create a new, empty one. """ global sistersets try: set = sistersets[key] except KeyError: if create: set = sistersets[key] = {} else: set = None return set def findSetByMember(wiki, page, create=False): """ return the list of sets that have a specific member """ global sistersets result = [] for set in sistersets.values(): if set.has_key((wiki,page)): result.append(set) if not result and create: sistersets[page] = {} result.append(sistersets[page]) return result def getSisterPages(wiki, page): sets = findSetByMember(wiki, page) result = [] for set in sets: for interwiki in set: if set[interwiki] == None: result.append(interwiki) for set in sets: for interwiki in set: if set[interwiki] == False: result.remove(interwiki) for set in sets: for interwiki in set: if set[interwiki] == True and not interwiki in result: result.append(interwiki) return result def execute(xmlrpcobj, *args): cfg = xmlrpcobj.request.cfg fname = "%s/%s" % (cfg.data_dir, 'sistersets.pickle') f = open(fname, 'r') sistersets = pickle.load(f) return getSisterPages(*args) if 0: collectpages() f = open('sistersets.pickle','w') pickle.dump(sistersets, f) #print repr(getSisterPages('LinuxWiki','StartSeite'))