annotate roundup/cgi/MultiMapping.py @ 4587:a2eb4fb3e6d8

New Chameleon templating engine, engine is now configurable. We now have two configurable templating engines, the old Zope TAL templates (called zopetal in the config) and the new Chameleon (called chameleon in the config). A new config-option "template_engine" under [main] can take these config-options, the default is zopetal. Thanks to Cheer Xiao for the idea of making this configurable *and* for the actual implementation! Cheer Xiao commit log: - The original TAL engine ported from Zope is thereafter referred to as "zopetal", in speech and in code - A new option "template_engine" under [main] introduced - Zopetal-specific code stripped from cgi/templating.py to form the new cgi/engine_zopetal.py - Interface to Chameleon in cgi/engine_chameleon.py - Engines are supposed to provide a Templates class that mimics the behavior of the old cgi.templating.Templates. The Templates class is preferably subclassed from cgi.templating.TemplatesBase. - New function cgi.templating.get_templates to get the appropriate engine's Templates instance according to the engine name
author Ralf Schlatterbeck <rsc@runtux.com>
date Thu, 23 Feb 2012 18:10:03 +0100
parents 53c600091f17
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1 class MultiMapping:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2 def __init__(self, *stores):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
3 self.stores = list(stores)
2162
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
4 self.stores.reverse()
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
5
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
6 def __getitem__(self, key):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
7 for store in self.stores:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
8 if store.has_key(key):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
9 return store[key]
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
10 raise KeyError, key
2162
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
11
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
12 def __setitem__(self, key, val):
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
13 self.stores[0][key] = val
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
14
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
15 _marker = []
2162
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
16
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
17 def get(self, key, default=_marker):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
18 for store in self.stores:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
19 if store.has_key(key):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
20 return store[key]
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
21 if default is self._marker:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
22 raise KeyError, key
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
23 return default
2162
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
24
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
25 def __len__(self):
2162
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
26 return len(self.items())
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
27
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
28 def has_key(self, key):
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
29 for store in self.stores:
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
30 if store.has_key(key):
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
31 return 1
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
32 return 0
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
33
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
34 def push(self, store):
2162
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
35 self.stores = [store] + self.stores
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
36
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
37 def pop(self):
2162
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
38 if not len(self.stores):
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
39 return None
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
40 store, self.stores = self.stores[0], self.stores[1:]
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
41 return store
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
42
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
43 def keys(self):
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
44 return [ _[0] for _ in self.items() ]
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
45
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
46 def values(self):
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
47 return [ _[1] for _ in self.items() ]
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
48
2162
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
49 def copy(self):
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
50 copy = MultiMapping()
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
51 copy.stores = [_.copy() for _ in self.stores]
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
52 return copy
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
53
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
54 def items(self):
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
55 l = []
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
56 seen = {}
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
57 for store in self.stores:
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
58 for k, v in store.items():
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
59 if not seen.has_key(k):
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
60 l.append((k, v))
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
61 seen[k] = 1
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
62 return l
53c600091f17 fixed MultiMapping
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
63

Roundup Issue Tracker: http://roundup-tracker.org/