diff -r 9eecf0160c39 -r d8736bb80bdc VirtualMailManager/alias.py --- a/VirtualMailManager/alias.py Mon Sep 24 19:13:51 2012 +0000 +++ b/VirtualMailManager/alias.py Thu Sep 27 19:15:09 2012 +0000 @@ -73,20 +73,21 @@ 'limit': limit, 'count_new': count_new}, ALIAS_EXCEEDS_EXPANSION_LIMIT) - def _delete(self, destination=None): - """Deletes a destination from the alias, if ``destination`` is - not ``None``. If ``destination`` is None, the alias with all + def _delete(self, destinations=None): + """Deletes the *destinations* from the alias, if ``destinations`` + is not ``None``. If ``destinations`` is None, the alias with all its destination addresses will be deleted. """ dbc = self._dbh.cursor() - if not destination: + if not destinations: dbc.execute('DELETE FROM alias WHERE gid = %s AND address = %s', (self._gid, self._addr.localpart)) else: - dbc.execute('DELETE FROM alias WHERE gid = %s AND address = %s ' - 'AND destination = %s', - (self._gid, self._addr.localpart, str(destination))) + dbc.executemany("DELETE FROM alias WHERE gid = %d AND address = " + "'%s' AND destination = %%s" % (self._gid, + self._addr.localpart), + ((str(dest),) for dest in destinations)) if dbc.rowcount > 0: self._dbh.commit() dbc.close() @@ -135,18 +136,34 @@ self._dests.extend(destinations) return destinations - def del_destination(self, destination): - """Deletes the specified ``destination`` address from the alias.""" - assert isinstance(destination, EmailAddress) + def del_destinations(self, destinations, warnings=None): + """Delete the specified `EmailAddress`es of *destinations* from + the alias's destinations. + + """ + destinations = set(destinations) + assert destinations and \ + all(isinstance(dest, EmailAddress) for dest in destinations) + if not warnings is None: + assert isinstance(warnings, list) + if self._addr in destinations: + destinations.remove(self._addr) + if not warnings is None: + warnings.append(self._addr) if not self._dests: raise AErr(_(u"The alias '%s' does not exist.") % self._addr, NO_SUCH_ALIAS) - if not destination in self._dests: - raise AErr(_(u"The address '%(addr)s' is not a destination of " - u"the alias '%(alias)s'.") % {'addr': destination, - 'alias': self._addr}, NO_SUCH_ALIAS) - self._delete(destination) - self._dests.remove(destination) + unknown = destinations.difference(set(self._dests)) + if unknown: + destinations.intersection_update(set(self._dests)) + if not warnings is None: + warnings.extend(unknown) + if not destinations: + raise AErr(_(u"No suitable destinations left to remove from alias " + u"'%s'.") % self._addr, NO_SUCH_ALIAS) + self._delete(destinations) + for destination in destinations: + self._dests.remove(destination) def get_destinations(self): """Returns an iterator for all destinations of the alias."""