diff --git a/wiki-lenny/local/action/fillpoll.py b/wiki-lenny/local/action/fillpoll.py new file mode 100644 index 00000000..c60e8a82 --- /dev/null +++ b/wiki-lenny/local/action/fillpoll.py @@ -0,0 +1,91 @@ +# -*- coding: iso-8859-1 -*- +""" + MoinMoin - gallery2Image Actionmacro + + PURPOSE:: + This action macro is used to update a poll + + CALLING SEQUENCE:: + called by Doodle area with POST + + PROCEDURE:: + Ask adg@crans.org to stop doing drugs + + RESTRICTIONS:: + Written in python + + AUTHOR:: + Antoine Durand-Gasselin +""" + +import re, locale, base64 +from MoinMoin import wikiutil +from MoinMoin.Page import Page +from MoinMoin.PageEditor import PageEditor + +def execute(pagename, request): + + if not request.user.may.write(pagename): + request.theme.add_msg(_('You are not allowed to edit this page.'), "error") + Page(request, pagename).send_page() + return + + raw = Page(request, pagename).body + pollname = request.form.get("pollname")[0] + doosearchre = "{{{\s*#!Doodle\s*%s.*?}}}" % re.escape(pollname) + doosearch = re.search(doosearchre, raw, re.S) + doos = doosearch.start() + dooe = doosearch.end() + if not doosearch: + request.theme.add_msg(request.getText (u"Le sondage \"%s\" n'a pas été trouvé" % pollname), "error") + Page(request, pagename).send_page() + return + + doostring= raw[doos+3:dooe-3] + doolines = [ l.strip() for l in doostring.splitlines()] + doodata = filter (lambda x: x != "", doolines) + + fields = filter (lambda x: x != "", [f.strip() for f in doodata[0].split(';')[1:]]) + + userl = request.form.get("user") + if not userl: user = request.user.name + else: + if userl[0].strip(): user = userl[0].strip() + else: user = request.user.name + + newentry = user + ";" + for f in fields: + if isinstance(f, unicode): + formfield = base64.encodestring(f.strip().decode('utf-8')).strip('\r\t \n=') # l'utf-8, c'est bien! + else: + formfield = base64.encodestring(f.strip()).strip('\r\t \n=') # mais ça peut bien chier! + disp = request.form.get(formfield) + if disp: + newentry += " %s=%s;" % (f, disp[0]) + else: + newentry += " %s=%s;" % (f, '0') + + updatepoll = False + newdoolist = doodata[0:1] + for participant in doodata[1:]: + findentry = re.search ("^\s*%s\s*;.*$" % re.escape(user), participant) + if findentry: + if updatepoll: pass + else: + updatepoll = True + newdoolist += [newentry] + else: + newdoolist += [participant] + + if not updatepoll: + newdoolist.append(newentry) + + newdoostring = "\n".join(newdoolist) + + pg = PageEditor(request, pagename) + try: + pg.saveText(raw[:doos+3]+ newdoostring + raw[dooe-3:], 0) + except: + request.theme.add_msg(request.getText(u"Aucune modification n'a été effectuée"), "error") + + Page(request, pagename).send_page() diff --git a/wiki-lenny/local/parser/Doodle.py b/wiki-lenny/local/parser/Doodle.py new file mode 100644 index 00000000..e7c8f274 --- /dev/null +++ b/wiki-lenny/local/parser/Doodle.py @@ -0,0 +1,108 @@ +# -*- coding: utf-8 -*- +""" + .. + .... ............ ........ + . ....... . .... .. + . ... .. .. .. .. ..... . .. + .. .. ....@@@. .. . ........ . + .. . .. ..@.@@..@@. .@@@@@@@ @@@@@@. .... + .@@@@. .@@@@. .@@@@..@@.@@..@@@..@@@..@@@@.... .... + @@@@... .@@@.. @@ @@ .@..@@..@@...@@@. .@@@@@. .. + .@@@.. . @@@. @@.@@..@@.@@..@@@ @@ .@@@@@@.. ..... + ...@@@.... @@@ .@@.......... ........ ..... .. + . ..@@@@.. . .@@@@. .. ....... . ............. + . .. .... .. .. . ... .... + . . .... ............. .. ... + .. .. ... ........ ... ... + ................................ + + MoinMoin - Doodle poll parser + + PURPOSE: + un joli sondage doodle sur le wiki + + AUTHOR: + Antoine Durand-Gasselin + + CALLING SEQUENCE: + {{{ + #!Doodle pollname; choix1; choix2; choix3 + participant1; choix1=1; choix2=0; choix3=1 + participant2; choix1=0; choix2=1; choix3=1 + }}} +""" + +import os, string, re, StringIO, base64 +from MoinMoin import config, wikiutil +from MoinMoin.parser.text_moin_wiki import Parser as WikiParser + +Dependencies = [] + +class Parser: + parsername = "Doodle" + Dependencies = Dependencies + + def __init__ (self, raw, request, **kw): + self.form = request.form + self.request = request + self.raw = raw + self.parseArgs(kw["format_args"]) + + def parseArgs(self, argsString): + argList = argsString.split(';') + self.poll_name=argList[0] + self.poll_choices=filter ((lambda x: x != ""), [ i.strip() for i in argList[1:]]) + + def format(self, f): + entries = self.raw.splitlines() + code = '\n\n
' % self.poll_name + code += f.table(1) + code += f.table_row(1) + code += f.table_cell(1) + code += f.table_cell(0) + for choice in self.poll_choices: + code += f.table_cell(1) + code += f.text(choice) + code += f.table_cell(0) + code += f.table_row(0) + for entry in entries: + code += f.table_row(1) + code += f.table_cell(1) + code += f.text(entry.split(";",1)[0].strip()) + code += f.table_cell(0) + for choice in self.poll_choices: + resp = re.search(re.escape(choice)+'=?', entry) + if resp: + disp = entry[resp.end()] + if '1' == disp: color= 'green' + elif '0' == disp: color= 'red' + else: color = 'grey' + code += f.table_cell(1,{'style':'background-color: %s;' % color}) + code += f.text(disp) + else: + code += f.table_cell(1,{'style':'background-color: grey;'}) + code += f.text('nsp') + code += f.table_cell(0) + code += f.table_row(0) + + code += f.table_row(1) + code += f.table_cell(1) + code += ('' % self.request.user.name) + code += f.table_cell(0) + + for choice in self.poll_choices: + if isinstance(choice, unicode): + name = base64.encodestring(choice.strip().decode('utf-8')).strip('\r\t \n=') # l'utf-8, c'est bien! + else: + name = base64.encodestring(choice.strip()).strip('\r\t \n=') # mais ça peut bien chier! + + code += f.table_cell(1) + code += '' % name + code += f.table_cell(0) + + code += f.table(0) + code += '' + code += '
' + + self.request.write(code) +