summaryrefslogtreecommitdiff
path: root/src/mailman/model/user.py
diff options
context:
space:
mode:
authorAurélien Bompard2015-07-29 16:46:34 +0200
committerBarry Warsaw2016-05-04 21:05:49 -0500
commit7216f6366ff51b034e420efb1206d1676dce78ef (patch)
tree4a7a3081494dae197a2a0b9e247e6373e90710ec /src/mailman/model/user.py
parent3ea95814ac6eb10445bce46f0cc33489efd122d1 (diff)
downloadmailman-7216f6366ff51b034e420efb1206d1676dce78ef.tar.gz
mailman-7216f6366ff51b034e420efb1206d1676dce78ef.tar.zst
mailman-7216f6366ff51b034e420efb1206d1676dce78ef.zip
Diffstat (limited to 'src/mailman/model/user.py')
-rw-r--r--src/mailman/model/user.py31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/mailman/model/user.py b/src/mailman/model/user.py
index 767600bdc..3d02b2777 100644
--- a/src/mailman/model/user.py
+++ b/src/mailman/model/user.py
@@ -26,10 +26,12 @@ from mailman.interfaces.address import (
from mailman.interfaces.user import (
IUser, PasswordChangeEvent, UnverifiedAddressError)
from mailman.model.address import Address
+from mailman.model.member import Member
from mailman.model.preferences import Preferences
from mailman.model.roster import Memberships
from mailman.utilities.datetime import factory as date_factory
from mailman.utilities.uid import UIDFactory
+from sqlalchemy import not_
from sqlalchemy import Boolean, Column, DateTime, ForeignKey, Integer, Unicode
from sqlalchemy.orm import backref, relationship
from zope.event import notify
@@ -174,6 +176,35 @@ class User(Model):
def memberships(self):
return Memberships(self)
+ @dbconnection
+ def absorb(self, store, user):
+ """See `IUser`."""
+ assert user is not None
+ if user.id == self.id:
+ return # Protect against absorbing oneself.
+ # Relink addresses.
+ for address in list(user.addresses):
+ # convert to list because we'll mutate the result
+ address.user = self
+ # Merge memberships.
+ other_members = store.query(Member).filter(
+ Member.user_id == user.id)
+ # (only import memberships of lists I'm not subscribed to yet)
+ subscribed_lists = [ m.list_id for m in self.memberships.members ]
+ if subscribed_lists:
+ other_members = other_members.filter(
+ not_(Member.list_id.in_(subscribed_lists)))
+ for member in other_members:
+ member.user_id = self.id
+ # Merge the user preferences
+ self.preferences.absorb(user.preferences)
+ # Merge display_name, password and is_server_owner attributes.
+ for prop in ('display_name', 'password', 'is_server_owner'):
+ if getattr(user, prop) and not getattr(self, prop):
+ setattr(self, prop, getattr(user, prop))
+ # Delete the other user.
+ store.delete(user)
+
@public
class DomainOwner(Model):