Show
Ignore:
Timestamp:
10/22/07 01:55:26 (1 year ago)
Author:
amcgregor
Message:

Rewrite of the AddressList? class and its integration into the Message class.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • branches/3.0/turbomail/util.py

    r36 r41  
    33"""MIME-encoded electronic mail message classes.""" 
    44 
     5import re, turbomail 
     6from turbomail.exceptions import MailNotEnabledError 
    57from email.Header import Header 
    6 from email.utils import formataddr 
     8from email.utils import parseaddr, formataddr 
    79 
    8 __all__ = ['AddressList'] 
     10__all__ = ['Address', 'AddressList', 'protected', 'send'] 
     11 
     12 
     13class Address(object): 
     14        validator = re.compile(r'^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(\+([0-9a-zA-Z])+)?@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$') 
     15         
     16        def __init__(self, *args): 
     17                assert len(args) < 3 and len(args) > 0, "You must specify an address or a name and address." 
     18                 
     19                if len(args) == 1 and isinstance(args[0], basestring): 
     20                        self.name, self.address = parseaddr(args[0]) 
     21                         
     22                elif not isinstance(args[0], basestring): 
     23                        self.name, self.address = args[0] 
     24                         
     25                else: 
     26                        self.name, self.address = args 
     27                 
     28                if not self.validator.match(self.address): 
     29                        raise ValueError, 'Invalid e-mail address.' 
     30                 
     31                super(Address, self).__init__() 
     32         
     33        def __cmp__(self, other): 
     34                if isinstance(other, (Address, basestring)): 
     35                        return cmp(str(self), str(other)) 
     36                elif isinstance(other, tuple): 
     37                        return cmp((self.name, self.address), other) 
     38                return cmp(self, other) 
     39         
     40        def __repr__(self): 
     41                return "Address(\"%s\")" % str(self) 
     42         
     43        def __str__(self): 
     44                assert self.address, "You must specify an address." 
     45                 
     46                return formataddr((self.name, self.address)).replace("\n", "") 
     47         
    948 
    1049 
    1150class AddressList(list): 
    12         """docstring for AddressList""" 
    13          
    1451        def __init__(self, addresses=[]): 
    1552                super(AddressList, self).__init__() 
    16                 self.replace(addresses) 
     53                 
     54                if isinstance(addresses, (basestring, tuple)): 
     55                        addresses = [addresses] 
     56                 
     57                if addresses is not None: 
     58                        self.extend(addresses) 
    1759         
    18         def replace(self, addresses=[]): 
    19                 del self[:] 
    20                 if not addresses: return 
    21                 self.extend(isinstance(addresses, list) and addresses or [addresses]) 
     60        def __repr__(self): 
     61                if not self: return "AddressList()" 
     62                return "AddressList(\"" + "\", \"".join([str(i) for i in self]) + "\")" 
    2263         
    2364        def __str__(self): 
    24                 addresses = [] 
     65                return ",\n ".join([str(i) for i in self]) 
     66         
     67        def __setitem__(self, k, value): 
     68                if not isinstance(value, Address): 
     69                        value = Address(value) 
    2570                 
    26                 for address in self: 
    27                         if type(address) == type(()): 
    28                                 addresses.append(formataddr(address)) # Header(address[0]) was to encode names.  Still nessicary? 
    29                         else: addresses.append(address) 
     71                super(AddressList, self).__setitem__(k, value) 
     72         
     73        def extend(self, value): 
     74                values = [] 
    3075                 
    31                 return ",\n ".join(addresses) 
     76                for i in value: 
     77                        if not isinstance(i, Address): 
     78                                i = Address(i) 
     79                        values.append(i) 
     80                 
     81                super(AddressList, self).extend(values) 
     82         
     83        def append(self, value): 
     84                self.extend([value]) 
     85         
     86        def addresses(self): 
     87                return AddressList([i.address for i in self]) 
     88         
     89        addresses = property(addresses) 
     90         
     91        def protected(cls, field): 
     92                def fget(self): 
     93                        return getattr(self, field) 
     94 
     95                def fset(self, value): 
     96                        if not isinstance(value, AddressList): 
     97                                value = AddressList(value) 
     98 
     99                        setattr(self, field, AddressList(value)) 
     100 
     101                def fdel(self): 
     102                        setattr(self, field, AddressList()) 
     103 
     104                return property(fget, fset, fdel) 
     105         
     106        protected = classmethod(protected) 
     107 
     108 
     109def send(message): 
     110        if not turbomail.manager: 
     111                raise MailNotEnabledError 
     112         
     113        return turbomail.manager.deliver(message)