Moved VirtualMailManager/Exceptions to VirtualMailManager/errors.
Renamed VMM*Exception classes to *Error.
No longer add the attribute 'message' to VMMError if it doesn't exist, like in
Python 2.4. It has been deprecated as of Python 2.6.
Also removed the methods code() and msg(), the values are now accessible via
the attributes 'code' and 'msg'.
# -*- coding: UTF-8 -*-# Copyright (c) 2008 - 2010, Pascal Volk# See COPYING for distribution information.""" VirtualMailManager.Relocated Virtual Mail Manager's Relocated class to handle relocated users."""fromVirtualMailManager.Domainimportget_gidfromVirtualMailManager.EmailAddressimportEmailAddressfromVirtualMailManager.errorsimportRelocatedErrorasRErrfromVirtualMailManager.constants.ERRORimport \NO_SUCH_RELOCATED,RELOCATED_ADDR_DEST_IDENTICAL,RELOCATED_EXISTS_=lambdamsg:msgclassRelocated(object):"""Class to handle e-mail addresses of relocated users."""__slots__=('_addr','_dest','_gid','_dbh')def__init__(self,dbh,address):"""Creates a new *Relocated* instance. The ``address`` is the old e-mail address of the user. Use `setDestination()` to set/update the new address, where the user has moved to. """assertisinstance(address,EmailAddress)self._addr=addressself._dbh=dbhself._gid=get_gid(self._dbh,self._addr.domainname)self._dest=Noneself.__load()def__load(self):"""Loads the destination address from the database into the `_dest` attribute. """dbc=self._dbh.cursor()dbc.execute('SELECT destination FROM relocated WHERE gid=%s AND address=%s',self._gid,self._addr.localpart)destination=dbc.fetchone()dbc.close()ifdestination:self._dest=EmailAddress(destination[0])defset_destination(self,destination):"""Sets/updates the new address of the relocated user."""update=Falseassertisinstance(destination,EmailAddress)ifself._addr==destination:raiseRErr(_(u'Address and destination are identical.'),RELOCATED_ADDR_DEST_IDENTICAL)ifself._dest:ifself._dest==destination:raiseRErr(_(u'The relocated user %r already exists.')%self._addr,RELOCATED_EXISTS)else:self._dest=destinationupdate=Trueelse:self._dest=destinationdbc=self._dbh.cursor()ifnotupdate:dbc.execute('INSERT INTO relocated VALUES (%s, %s, %s)',self._gid,self._addr.localpart,str(self._dest))else:dbc.execute('UPDATE relocated SET destination=%s\WHERE gid=%s AND address=%s',str(self._dest),self._gid,self._addr.localpart)self._dbh.commit()dbc.close()defget_info(self):"""Returns the address to which mails should be sent."""ifnotself._dest:raiseRErr(_(u"The relocated user %r doesn't exist.")%self._addr,NO_SUCH_RELOCATED)returnself._destdefdelete(self):"""Deletes the relocated entry from the database."""ifnotself._dest:raiseRErr(_(u"The relocated user %r doesn't exist.")%self._addr,NO_SUCH_RELOCATED)dbc=self._dbh.cursor()dbc.execute("DELETE FROM relocated WHERE gid = %s AND address = %s",self._gid,self._addr.localpart)ifdbc.rowcount>0:self._dbh.commit()dbc.close()self._dest=Nonedel_