summaryrefslogtreecommitdiff
path: root/mailman/styles
diff options
context:
space:
mode:
authorBarry Warsaw2009-01-06 19:55:59 -0500
committerBarry Warsaw2009-01-06 19:55:59 -0500
commit89f5f76ed31d6ca2faf8e2a783a37e9009b03413 (patch)
treef1023f64501a49917674f5bcd78927aa5cee08ef /mailman/styles
parent37c255b7b0c1b8ea10c8d24a44c8586de86ffcc6 (diff)
downloadmailman-89f5f76ed31d6ca2faf8e2a783a37e9009b03413.tar.gz
mailman-89f5f76ed31d6ca2faf8e2a783a37e9009b03413.tar.zst
mailman-89f5f76ed31d6ca2faf8e2a783a37e9009b03413.zip
The conversion from Defaults.py to lazr.config is complete.
lazr.config 1.1 now has everything we need, so we don't need the special develop hack. make_instance is no longer necessary. Refactor the style stuff into their own directory. Finally! Move the delivery module into the mailman.mta package.
Diffstat (limited to 'mailman/styles')
-rw-r--r--mailman/styles/manager.py92
1 files changed, 92 insertions, 0 deletions
diff --git a/mailman/styles/manager.py b/mailman/styles/manager.py
new file mode 100644
index 000000000..0b84f20e0
--- /dev/null
+++ b/mailman/styles/manager.py
@@ -0,0 +1,92 @@
+# Copyright (C) 2007-2009 by the Free Software Foundation, Inc.
+#
+# This file is part of GNU Mailman.
+#
+# GNU Mailman is free software: you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation, either version 3 of the License, or (at your option)
+# any later version.
+#
+# GNU Mailman is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# GNU Mailman. If not, see <http://www.gnu.org/licenses/>.
+
+"""Style manager."""
+
+__metaclass__ = type
+__all__ = [
+ 'StyleManager',
+ ]
+
+
+import sys
+
+from operator import attrgetter
+from zope.interface import implements
+from zope.interface.verify import verifyObject
+
+from mailman.interfaces.styles import (
+ DuplicateStyleError, IStyle, IStyleManager)
+
+
+
+class StyleManager:
+ """The built-in style manager."""
+
+ implements(IStyleManager)
+
+ def __init__(self):
+ """Install all styles from the configuration files."""
+ self._styles = {}
+
+ def populate(self):
+ self._styles.clear()
+ # Avoid circular imports.
+ from mailman.config import config
+ # Install all the styles described by the configuration files.
+ for section in config.style_configs:
+ class_path = section['class']
+ module_name, class_name = class_path.rsplit('.', 1)
+ __import__(module_name)
+ style = getattr(sys.modules[module_name], class_name)()
+ assert section.name.startswith('style'), (
+ 'Bad style section name: %s' % section.name)
+ style.name = section.name[6:]
+ style.priority = int(section.priority)
+ self.register(style)
+
+ def get(self, name):
+ """See `IStyleManager`."""
+ return self._styles.get(name)
+
+ def lookup(self, mailing_list):
+ """See `IStyleManager`."""
+ matched_styles = []
+ for style in self.styles:
+ style.match(mailing_list, matched_styles)
+ for style in matched_styles:
+ yield style
+
+ @property
+ def styles(self):
+ """See `IStyleManager`."""
+ for style in sorted(self._styles.values(),
+ key=attrgetter('priority'),
+ reverse=True):
+ yield style
+
+ def register(self, style):
+ """See `IStyleManager`."""
+ verifyObject(IStyle, style)
+ if style.name in self._styles:
+ raise DuplicateStyleError(style.name)
+ self._styles[style.name] = style
+
+ def unregister(self, style):
+ """See `IStyleManager`."""
+ # Let KeyErrors percolate up.
+ del self._styles[style.name]