root / trunk / turbomail / control.py

Revision 117, 4.7 kB (checked in by fs, 2 months ago)

renamed providers to transports which reflects the real purpose better

  • Property svn:executable set to *
  • Property svn:keywords set to Revision
Line 
1# encoding: utf-8
2
3"""TurboGears extension startup and shutdown interface.
4
5TurboGears will automatically start and stop TurboMail if you configure
6your application with `mail.on = True`.  To start and stop TurboMail
7in your own applications::
8
9  import turbomail
10 
11  turbomail.interface.config = {'mail.on': True, ...}
12  turbomail.interface.start()
13 
14  message = turbomail.Message(...)
15  turbomail.interface.send(message)
16 
17  turbomail.interface.stop()
18
19Remember to configure your outbound settings in the config dictionary.
20
21TurboMail will, by default, immediately delete any messages remaining in
22the queue and wait on any in-progress deliveries.
23"""
24
25__version__ = "$Revision$"
26
27import logging
28log = logging.getLogger("turbomail.control")
29
30import pkg_resources
31
32__all__ = ['extension']
33
34
35from turbomail.exceptions import MailNotEnabledException
36
37class ControlClass(object):
38    """Control TurboMail startup and shutdown.
39   
40    Dynamically discovers the presence of TurboGears, creating appropriate aliases for
41    TurboGears extension startup and shutdown."""
42   
43    def __init__(self):
44        self.running = False
45        self.extensions = dict()
46        self.config = dict()
47        self.manager = None
48        self.transport = None
49   
50    def __load_single_entry(self, group, name):
51        for entrypoint in pkg_resources.iter_entry_points(group, name):
52            return entrypoint.load()
53        return None
54   
55    def start(self, extra_classes=None):
56        if not self.config.get("mail.on", False):
57            return
58       
59        log.info("TurboMail extension starting up.")
60       
61        def load(t, default, extra_classes):
62            extension = self.config.get("mail.%s" % t, default)
63            if extra_classes != None and extension in extra_classes:
64                controller = extra_classes[extension]
65                if isinstance(controller, type):
66                    controller = controller()
67            else:
68                entry_point = "turbomail.%ss" % t
69                controller = self.__load_single_entry(entry_point, extension)
70            if not controller:
71                self.config.update({"mail.on": False})
72                log.error("Unable to locate %s %s, TurboMail disabled." % (extension, t))
73                self.stop(force=True)
74                return
75            setattr(self, t, controller)
76            if hasattr(getattr(self, t), 'load'):
77                setattr(self, t, getattr(self, t).load())
78            if hasattr(getattr(self, t), 'start'):
79                getattr(self, t).start()
80       
81        # Load the requested manager and transport.
82        load('manager', 'immediate', extra_classes)
83        load('transport', 'debug', extra_classes)
84       
85        # Load and initialize the various extensions.
86        extensions = pkg_resources.iter_entry_points("turbomail.extensions")
87        for entrypoint in extensions:
88            log.debug("Found extension '%s'." % entrypoint.name)
89           
90            if self.config.get("mail.%s.on" % entrypoint.name, False):
91                log.info("Loading extension '%s'." % entrypoint.name)
92               
93                self.extensions[entrypoint.name] = entrypoint.load()
94               
95                if hasattr(self.extensions[entrypoint.name], 'interface'):
96                    self.extensions[entrypoint.name] = self.extensions[entrypoint.name].interface
97               
98                elif hasattr(self.extensions[entrypoint.name], 'load'):
99                    self.extensions[entrypoint.name] = self.extensions[entrypoint.name].load()
100               
101                if hasattr(self.extensions[entrypoint.name], 'start'):
102                    self.extensions[entrypoint.name].start()
103       
104        self.running = True
105   
106    def stop(self, force=False):
107        if not self.running and not force: return
108       
109        log.info("TurboMail extension shutting down.")
110       
111        # Unload the various extensions.
112        extensions = pkg_resources.iter_entry_points("turbomail.extensions")
113        for entrypoint in extensions:
114            if self.config.get("mail." + entrypoint.name + ".on", False):
115                ext = entrypoint.load()
116                if hasattr(ext, "stop"): ext.stop()
117       
118        # Unload the transport and manager.
119        if self.transport and hasattr(self.transport, "stop"): self.transport.stop()
120        if self.manager and hasattr(self.manager, "stop"): self.manager.stop()
121       
122        self.transport = None
123        self.manager = None
124       
125        self.running = False
126   
127    def send(self, message):
128        if not self.manager:
129            raise MailNotEnabledException
130       
131        return self.manager.deliver(message)
132
133
134
135interface = ControlClass()
Note: See TracBrowser for help on using the browser.