summaryrefslogtreecommitdiff
path: root/Mailman/Utils.py
diff options
context:
space:
mode:
authorbwarsaw1999-09-02 20:04:20 +0000
committerbwarsaw1999-09-02 20:04:20 +0000
commite64d42636221c0a9acefc4495022a9b3fb84577d (patch)
tree3fd00f7b89ed6e8cbb51efce19835f2e78fbb72f /Mailman/Utils.py
parent09b337ed3753c42de468642cd13cfdb3e6ffe2c2 (diff)
downloadmailman-e64d42636221c0a9acefc4495022a9b3fb84577d.tar.gz
mailman-e64d42636221c0a9acefc4495022a9b3fb84577d.tar.zst
mailman-e64d42636221c0a9acefc4495022a9b3fb84577d.zip
SafeDict(): New class
maketext(): Use SafeDict class to make sure that key interpolation in the template can't raise an exception, even if someone's edited the template and included missing keys. Patch inspired by Sean Reifschneider <jafo@tummy.com>
Diffstat (limited to 'Mailman/Utils.py')
-rw-r--r--Mailman/Utils.py25
1 files changed, 23 insertions, 2 deletions
diff --git a/Mailman/Utils.py b/Mailman/Utils.py
index c8a87a7db..46b01d864 100644
--- a/Mailman/Utils.py
+++ b/Mailman/Utils.py
@@ -27,6 +27,8 @@ import sys
import os
import string
import re
+from UserDict import UserDict
+from types import StringType
# XXX: obsolete, should use re module
import regsub
import random
@@ -620,6 +622,24 @@ def chunkify(members, chunksize=None):
+class SafeDict(UserDict):
+ """Dictionary which returns a default value for unknown keys.
+
+ This is used in maketext so that editing templates is a bit more robust.
+ """
+ def __init__(self, d):
+ UserDict.__init__(self, d)
+
+ def __getitem__(self, key):
+ try:
+ return self.data[key]
+ except KeyError:
+ if type(key) == StringType:
+ return '%('+key+')s'
+ else:
+ return '<Missing key: %s>' % `key`
+
+
def maketext(templatefile, dict, raw=0):
"""Make some text from a template file.
@@ -631,9 +651,10 @@ def maketext(templatefile, dict, raw=0):
fp = open(file)
template = fp.read()
fp.close()
+ text = template % SafeDict(dict)
if raw:
- return template % dict
- return wrap(template % dict)
+ return text
+ return wrap(text)