From 3c3354c0e7c17e1db47f0ff4c9cd7af9d2ab48c3 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Wed, 21 May 1997 16:52:18 +0000 Subject: Crude but functional, except for adding new entries. --- Tools/faqwiz/faqmain.py | 218 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 172 insertions(+), 46 deletions(-) diff --git a/Tools/faqwiz/faqmain.py b/Tools/faqwiz/faqmain.py index 995cd3c..d1e6a55 100644 --- a/Tools/faqwiz/faqmain.py +++ b/Tools/faqwiz/faqmain.py @@ -21,15 +21,17 @@ class FAQServer: else: method() - KEYS = ['req', 'query', 'name', 'text', 'commit', 'title'] + KEYS = ['req', 'query', 'name', 'text', 'commit', 'title', + 'author', 'email', 'log'] def __getattr__(self, key): if key not in self.KEYS: raise AttributeError - if self.form.has_key(key): + try: item = self.form[key] return item.value - return '' + except KeyError: + return '' def do_frontpage(self): print """ @@ -38,8 +40,8 @@ class FAQServer:
@@ -62,9 +64,9 @@ class FAQServer: names.sort() n = 0 for name in names: - headers, body = self.read(name) + headers, text = self.read(name) if headers: - self.show(name, headers, body, 1) + self.show(name, headers['title'], text, 1) n = n+1 if not n: print "No FAQ entries?!?!" @@ -82,9 +84,9 @@ class FAQServer: names = os.listdir(os.curdir) while names: name = whrandom.choice(names) - headers, body = self.read(name) + headers, text = self.read(name) if headers: - self.show(name, headers, body, 1) + self.show(name, headers['title'], text, 1) print '

Show another one' break else: @@ -118,18 +120,18 @@ class FAQServer: print "


" n = 0 for name in names: - headers, body = self.read(name) + headers, text = self.read(name) if headers: title = headers['title'] - if p.search(title) >= 0 or p.search(body) >= 0: - self.show(name, headers, body, 1) + if p.search(title) >= 0 or p.search(text) >= 0: + self.show(name, title, text, 1) n = n+1 if not n: print "No hits." def do_edit(self): name = self.name - headers, body = self.read(name) + headers, text = self.read(name) if not headers: print "Invalid file name", name return @@ -137,32 +139,26 @@ class FAQServer: Python FAQ Edit Form

Python FAQ Edit Form

""" - self.showheaders(headers) title = headers['title'] + print "" + self.showedit(name, headers, text) print """ - - - -

""" % name - self.show(name, headers, body) + self.show(name, title, text) def do_review(self): + if self.commit: + self.checkin() + return name = self.name text = self.text - commit = self.commit title = self.title - if commit: - self.precheckin(name, text, title) - return - headers, body = self.read(name) + headers, oldtext = self.read(name) if not headers: print "Invalid file name", name return @@ -170,19 +166,26 @@ class FAQServer: Python FAQ Review Form

Python FAQ Review Form

""" - self.show(name, {'title': title}, text) - print """ -
- -

-


- """ - self.showheaders(headers) + self.show(name, title, text) + print "" + if self.log and self.author and '@' in self.email: + print """ + + Click this button to commit the change. +

+


+

+ """ + else: + print """ + To commit this change, please enter your name, + email and a log message in the form below. +

+


+

+ """ + self.showedit(name, headers, text) print """ - -
@@ -191,8 +194,126 @@ class FAQServer:


""" % name - def precheckin(self, name, text, title): - pass + def checkin(self): + import regsub, time, tempfile + name = self.name + + headers, oldtext = self.read(name) + if not headers: + print "Invalid file name", name + return + text = self.text + title = self.title + author = self.author + email = self.email + log = self.log + text = regsub.gsub("\r\n", "\n", text) + log = regsub.gsub("\r\n", "\n", log) + author = string.join(string.split(author)) + email = string.join(string.split(email)) + title = string.join(string.split(title)) + oldtitle = headers['title'] + oldtitle = string.join(string.split(oldtitle)) + text = string.strip(text) + oldtext = string.strip(oldtext) + if text == oldtext and title == oldtitle: + print "No changes." + # XXX Should exit more ceremoniously + return + # Check that the question number didn't change + if string.split(title)[:1] != string.split(oldtitle)[:1]: + print "Don't change the question number please." + # XXX Should exit more ceremoniously + return + remhost = os.environ["REMOTE_HOST"] + remaddr = os.environ["REMOTE_ADDR"] + try: + os.unlink(name + "~") + except os.error: + pass + try: + os.rename(name, name + "~") + except os.error: + pass + try: + os.unlink(name) + except os.error: + pass + try: + f = open(name, "w") + except IOError, msg: + print "Can't open", name, "for writing:", cgi.escape(str(msg)) + # XXX Should exit more ceremoniously + return + now = time.ctime(time.time()) + f.write("Title: %s\n" % title) + f.write("Last-Changed-Date: %s\n" % now) + f.write("Last-Changed-Author: %s\n" % author) + f.write("Last-Changed-Email: %s\n" % email) + f.write("Last-Changed-Remote-Host: %s\n" % remhost) + f.write("Last-Changed-Remote-Address: %s\n" % remaddr) + keys = headers.keys() + keys.sort() + keys.remove('title') + for key in keys: + if key[:13] != 'last-changed-': + f.write("%s: %s\n" % (string.capwords(key, '-'), + headers[key])) + f.write("\n") + f.write(text) + f.write("\n") + f.close() + + tfn = tempfile.mktemp() + f = open(tfn, "w") + f.write("Last-Changed-Date: %s\n" % now) + f.write("Last-Changed-Author: %s\n" % author) + f.write("Last-Changed-Email: %s\n" % email) + f.write("Last-Changed-Remote-Host: %s\n" % remhost) + f.write("Last-Changed-Remote-Address: %s\n" % remaddr) + f.write("\n") + f.write(log) + f.write("\n") + f.close() + + p = os.popen(""" + /depot/gnu/plat/bin/rcs -l %s &1 + /depot/gnu/plat/bin/ci -u %s <%s 2>&1 + rm -f %s + """ % (name, name, tfn, tfn)) + output = p.read() + sts = p.close() + if not sts: + print """ +

Python FAQ Entry Edited

+
+ """ + self.show(name, title, text, 1) + if output: + print "
%s
" % cgi.escape(output) + else: + print """ +

Python FAQ Entry Commit Failed

+ Exit status 0x%04x + """ % sts + if output: + print "
%s
" % cgi.escape(output) + + def showedit(self, name, headers, text): + title = headers['title'] + print """ + Title: + +
+ Please provide the following information for logging purposes: +
+ Name : + Email: + Log message (reason for the change):
+ + """ % (self.author, self.email, self.log) def showheaders(self, headers): print "