VirtualMailManager/Handler.py
branchv0.6.x
changeset 283 ea6d052de24a
parent 282 28871c1be260
child 285 d30a94f5aef5
--- a/VirtualMailManager/Handler.py	Fri Apr 30 04:42:08 2010 +0000
+++ b/VirtualMailManager/Handler.py	Fri Apr 30 08:02:03 2010 +0000
@@ -28,18 +28,23 @@
 from VirtualMailManager.Config import Config as Cfg
 from VirtualMailManager.Domain import Domain, ace2idna, get_gid
 from VirtualMailManager.EmailAddress import EmailAddress
-from VirtualMailManager.errors import VMMError, AliasError, DomainError, \
-     RelocatedError
+from VirtualMailManager.errors import VMMError, DomainError
 from VirtualMailManager.Relocated import Relocated
 from VirtualMailManager.Transport import Transport
 
 
+_ = lambda msg: msg
+
 RE_DOMAIN_SEARCH = """^[a-z0-9-\.]+$"""
 RE_MBOX_NAMES = """^[\x20-\x25\x27-\x7E]*$"""
 TYPE_ACCOUNT = 0x1
 TYPE_ALIAS = 0x2
 TYPE_RELOCATED = 0x4
-_ = lambda msg: msg
+OTHER_TYPES = {
+    TYPE_ACCOUNT: (_(u'an account'), ERR.ACCOUNT_EXISTS),
+    TYPE_ALIAS: (_(u'an alias'), ERR.ALIAS_EXISTS),
+    TYPE_RELOCATED: (_(u'a relocated user'), ERR.RELOCATED_EXISTS),
+}
 
 
 class Handler(object):
@@ -153,7 +158,7 @@
                 isinstance(address, EmailAddress)
         if exclude is not TYPE_ACCOUNT:
             account = Account(self._dbh, address)
-            if account.uid > 0:
+            if account:
                 return TYPE_ACCOUNT
         if exclude is not TYPE_ALIAS:
             alias = Alias(self._dbh, address)
@@ -165,6 +170,21 @@
                 return TYPE_RELOCATED
         return 0
 
+    def _is_other_address(self, address, exclude):
+        """Checks if *address* is known for an Account (TYPE_ACCOUNT),
+        Alias (TYPE_ALIAS) or Relocated (TYPE_RELOCATED), except for
+        *exclude*.  Returns `False` if the address is not known for other
+        types.
+
+        Raises a `VMMError` if the address is known.
+        """
+        other = self._chk_other_address_types(address, exclude)
+        if not other:
+            return False
+        msg = _(u"There is already %(a_type)s with the address '%(address)s'.")
+        raise VMMError(msg % {'a_type': OTHER_TYPES[other][0],
+                              'address': address}, OTHER_TYPES[other][1])
+
     def __getAccount(self, address):
         address = EmailAddress(address)
         self.__dbConnect()
@@ -532,24 +552,11 @@
         """Returns an iterator object for all destinations (`EmailAddress`
         instances) for the `Alias` with the given *aliasaddress*."""
         alias = self.__getAlias(aliasaddress)
-        try:
+        if alias:
             return alias.get_destinations()
-        except AliasError, err:
-            if err.code == ERR.NO_SUCH_ALIAS:
-                other = self._chk_other_address_types(alias.address,
-                                                      TYPE_ALIAS)
-                if other is TYPE_ACCOUNT:
-                    raise VMMError(_(u"There is already an account with the \
-address '%s'.") %
-                                   alias.address, ERR.ACCOUNT_EXISTS)
-                elif other is TYPE_RELOCATED:
-                    raise VMMError(_(u"There is already a relocated user \
-with the address '%s'.") %
-                                   alias.address, ERR.RELOCATED_EXISTS)
-                else:  # unknown address
-                    raise
-            else:  # something other went wrong
-                raise
+        if not self._is_other_address(alias.address, TYPE_ALIAS):
+            raise VMMError(_(u"The alias '%s' doesn't exist.") %
+                           alias.address, ERR.NO_SUCH_ALIAS)
 
     def aliasDelete(self, aliasaddress, targetaddress=None):
         """Deletes the `Alias` *aliasaddress* with all its destinations from
@@ -568,8 +575,9 @@
                            ERR.INVALID_AGUMENT)
         acc = self.__getAccount(emailaddress)
         if not acc:
-            raise VMMError(_(u"The account '%s' doesn't exist.") %
-                           acc.address, ERR.NO_SUCH_ACCOUNT)
+            if not self._is_other_address(acc.address, TYPE_ACCOUNT):
+                raise VMMError(_(u"The account '%s' doesn't exist.") %
+                               acc.address, ERR.NO_SUCH_ACCOUNT)
         info = acc.get_info()
         if self._Cfg.dget('account.disk_usage') or details in ('du', 'full'):
             path = os.path.join(acc.home, info['mail_location'].split('/')[-1])
@@ -653,24 +661,11 @@
         """Returns the target address of the relocated user with the given
         *emailaddress*."""
         relocated = self.__getRelocated(emailaddress)
-        try:
+        if relocated:
             return relocated.get_info()
-        except RelocatedError, err:
-            if err.code == ERR.NO_SUCH_RELOCATED:
-                other = self._chk_other_address_types(relocated.address,
-                                                      TYPE_RELOCATED)
-                if other is TYPE_ACCOUNT:
-                    raise VMMError(_(u"There is already an account with the \
-address '%s'.") %
-                                   relocated.address, ERR.ACCOUNT_EXISTS)
-                elif other is TYPE_ALIAS:
-                    raise VMMError(_(u"There is already an alias with the \
-address '%s'.") %
-                                   relocated.address, ERR.ALIAS_EXISTS)
-                else:  # unknown address
-                    raise
-            else:  # something other went wrong
-                raise
+        if not self._is_other_address(relocated.address, TYPE_RELOCATED):
+            raise VMMError(_(u"The relocated user '%s' doesn't exist.") %
+                           relocated.address, ERR.NO_SUCH_RELOCATED)
 
     def relocatedDelete(self, emailaddress):
         """Deletes the relocated user with the given *emailaddress* from