diff options
| author | bwarsaw | 1999-09-02 20:04:20 +0000 |
|---|---|---|
| committer | bwarsaw | 1999-09-02 20:04:20 +0000 |
| commit | e64d42636221c0a9acefc4495022a9b3fb84577d (patch) | |
| tree | 3fd00f7b89ed6e8cbb51efce19835f2e78fbb72f /Mailman/Utils.py | |
| parent | 09b337ed3753c42de468642cd13cfdb3e6ffe2c2 (diff) | |
| download | mailman-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.py | 25 |
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) |
