summaryrefslogtreecommitdiff
path: root/Mailman/database/model
diff options
context:
space:
mode:
authorBarry Warsaw2007-06-15 00:50:40 -0400
committerBarry Warsaw2007-06-15 00:50:40 -0400
commit067f871fdcaf51a0de8a1468006d3bad2e3a9a24 (patch)
tree8404972f48ad55b4a2353c2f33369fb51351e500 /Mailman/database/model
parent125f16ea72934e4dd18529a597b155c0aaca9ff6 (diff)
downloadmailman-067f871fdcaf51a0de8a1468006d3bad2e3a9a24.tar.gz
mailman-067f871fdcaf51a0de8a1468006d3bad2e3a9a24.tar.zst
mailman-067f871fdcaf51a0de8a1468006d3bad2e3a9a24.zip
Update the IUser interface and tests, specifically as it relates to
preferences. IAddresses, IUsers, and IMembers all get preferences by default, althoughthe attributes of these preferences are None by default. IMailingLists don't get preferences by default though; because these live in the user database, we can't cross-polinate them in the mailing lists. We'll figure something out later for these. IUser.register(): Add this method which registers and links an address to the user. Allow EnumType database columns to accept and return Nones. This is useful for when the columns are not defined NOT NULL. Update doctests. Removed teh hide_address preference. I can't think of a reason not to want to hide addresses for everyone.
Diffstat (limited to 'Mailman/database/model')
-rw-r--r--Mailman/database/model/address.py2
-rw-r--r--Mailman/database/model/mailinglist.py3
-rw-r--r--Mailman/database/model/member.py20
-rw-r--r--Mailman/database/model/profile.py11
-rw-r--r--Mailman/database/model/roster.py16
-rw-r--r--Mailman/database/model/user.py15
6 files changed, 34 insertions, 33 deletions
diff --git a/Mailman/database/model/address.py b/Mailman/database/model/address.py
index 450c40235..7500197a8 100644
--- a/Mailman/database/model/address.py
+++ b/Mailman/database/model/address.py
@@ -50,8 +50,10 @@ class Address(Entity):
def subscribe(self, mlist, role):
from Mailman.database.model import Member
+ from Mailman.database.model import Preferences
# This member has no preferences by default.
member = Member(role=role,
mailing_list=mlist.fqdn_listname,
address=self)
+ member.preferences = Preferences()
return member
diff --git a/Mailman/database/model/mailinglist.py b/Mailman/database/model/mailinglist.py
index 1e7823911..edd2eab0d 100644
--- a/Mailman/database/model/mailinglist.py
+++ b/Mailman/database/model/mailinglist.py
@@ -22,8 +22,6 @@ from Mailman.Utils import fqdn_listname, split_listname
from Mailman.configuration import config
from Mailman.interfaces import *
-PREFERENCE_KIND = 'Mailman.database.model.profile.Preferences'
-
class MailingList(Entity):
@@ -156,7 +154,6 @@ class MailingList(Entity):
has_field('unsubscribe_policy', Integer),
has_field('welcome_msg', Unicode),
# Relationships
- belongs_to('preferences', of_kind=PREFERENCE_KIND)
## has_and_belongs_to_many(
## 'available_languages',
## of_kind='Mailman.database.model.languages.Language')
diff --git a/Mailman/database/model/member.py b/Mailman/database/model/member.py
index bcf859cf4..89a98d327 100644
--- a/Mailman/database/model/member.py
+++ b/Mailman/database/model/member.py
@@ -19,7 +19,6 @@ from elixir import *
from zope.interface import implements
from Mailman.Utils import split_listname
-from Mailman.constants import SystemDefaultPreferences
from Mailman.database.types import EnumType
from Mailman.interfaces import IMember, IPreferences
@@ -36,27 +35,10 @@ class Member(Entity):
has_field('mailing_list', Unicode)
# Relationships
belongs_to('address', of_kind=ADDRESS_KIND)
- belongs_to('_preferences', of_kind=PREFERENCE_KIND)
+ belongs_to('preferences', of_kind=PREFERENCE_KIND)
# Options
using_options(shortnames=True)
def __repr__(self):
return '<Member: %s on %s as %s>' % (
self.address, self.mailing_list, self.role)
-
- @property
- def preferences(self):
- from Mailman.database.model import MailingList
- if self._preferences:
- return self._preferences
- if self.address.preferences:
- return self.address.preferences
- # It's possible this address isn't linked to a user.
- if self.address.user and self.address.user.preferences:
- return self.address.user.preferences
- list_name, host_name = split_listname(self.mailing_list)
- mlist = MailingList.get_by(list_name=list_name,
- host_name=host_name)
- if mlist.preferences:
- return mlist.preferences
- return SystemDefaultPreferences
diff --git a/Mailman/database/model/profile.py b/Mailman/database/model/profile.py
index 935ae08fb..33511f54b 100644
--- a/Mailman/database/model/profile.py
+++ b/Mailman/database/model/profile.py
@@ -19,7 +19,6 @@ from elixir import *
from email.utils import formataddr
from zope.interface import implements
-from Mailman.constants import SystemDefaultPreferences as Prefs
from Mailman.database.types import EnumType
from Mailman.interfaces import IPreferences
@@ -41,11 +40,5 @@ class Preferences(Entity):
# Options
using_options(shortnames=True)
- def __init__(self):
- super(Preferences, self).__init__()
- self.acknowledge_posts = Prefs.acknowledge_posts
- self.hide_address = Prefs.hide_address
- self.preferred_language = Prefs.preferred_language
- self.receive_list_copy = Prefs.receive_list_copy
- self.receive_own_postings = Prefs.receive_own_postings
- self.delivery_mode = Prefs.delivery_mode
+ def __repr__(self):
+ return '<Preferences object at %#x>' % id(self)
diff --git a/Mailman/database/model/roster.py b/Mailman/database/model/roster.py
index 03aa9efc3..ee50cddf0 100644
--- a/Mailman/database/model/roster.py
+++ b/Mailman/database/model/roster.py
@@ -25,6 +25,7 @@ moderator, and administrator roster filters.
from zope.interface import implements
from Mailman.constants import DeliveryMode, MemberRole
+from Mailman.constants import SystemDefaultPreferences
from Mailman.database.model import Member
from Mailman.interfaces import IRoster
@@ -137,6 +138,17 @@ class AdministratorRoster(AbstractRoster):
+def _delivery_mode(member):
+ if member.preferences.delivery_mode is not None:
+ return member.preferences.delivery_mode
+ if member.address.preferences.delivery_mode is not None:
+ return member.address.preferences.delivery_mode
+ if (member.address.user and
+ member.address.user.preferences.delivery_mode is not None):
+ return member.address.user.preferences.delivery_mode
+ return SystemDefaultPreferences.delivery_mode
+
+
class RegularMemberRoster(AbstractRoster):
"""Return all the regular delivery members of a list."""
@@ -149,7 +161,7 @@ class RegularMemberRoster(AbstractRoster):
# that have a regular delivery mode.
for member in Member.select_by(mailing_list=self._mlist.fqdn_listname,
role=MemberRole.member):
- if member.preferences.delivery_mode == DeliveryMode.regular:
+ if _delivery_mode(member) == DeliveryMode.regular:
yield member
@@ -174,5 +186,5 @@ class DigestMemberRoster(AbstractRoster):
# that have one of the digest delivery modes.
for member in Member.select_by(mailing_list=self._mlist.fqdn_listname,
role=MemberRole.member):
- if member.preferences.delivery_mode in _digest_modes:
+ if _delivery_mode(member) in _digest_modes:
yield member
diff --git a/Mailman/database/model/user.py b/Mailman/database/model/user.py
index 45fcbfdd3..9419f181d 100644
--- a/Mailman/database/model/user.py
+++ b/Mailman/database/model/user.py
@@ -21,6 +21,7 @@ from zope.interface import implements
from Mailman import Errors
from Mailman.database.model import Address
+from Mailman.database.model import Preferences
from Mailman.interfaces import IUser
ADDRESS_KIND = 'Mailman.database.model.address.Address'
@@ -57,3 +58,17 @@ class User(Entity):
def controls(self, address):
found = Address.get_by(address=address)
return bool(found and found.user is self)
+
+ def register(self, address, real_name=None):
+ # First, see if the address already exists
+ addrobj = Address.get_by(address=address)
+ if addrobj is None:
+ if real_name is None:
+ real_name = ''
+ addrobj = Address(address=address, real_name=real_name)
+ # Link the address to the user if it is not already linked.
+ if addrobj.user is not None:
+ raise Errors.AddressAlreadyLinkedError(addrobj)
+ addrobj.user = self
+ self.addresses.append(addrobj)
+ return addrobj