summaryrefslogtreecommitdiff
path: root/src/mailman/model/uid.py
diff options
context:
space:
mode:
authorBarry Warsaw2011-04-22 19:26:43 -0400
committerBarry Warsaw2011-04-22 19:26:43 -0400
commitb5b015ce524157cfef4b795e4b0c7ff17b4d0fe2 (patch)
tree260169450ab382cf59143f0fe8bae0fc0507452f /src/mailman/model/uid.py
parent6959e6adcb582172aeec01ef6b6a75b9ba85017b (diff)
downloadmailman-b5b015ce524157cfef4b795e4b0c7ff17b4d0fe2.tar.gz
mailman-b5b015ce524157cfef4b795e4b0c7ff17b4d0fe2.tar.zst
mailman-b5b015ce524157cfef4b795e4b0c7ff17b4d0fe2.zip
Diffstat (limited to 'src/mailman/model/uid.py')
-rw-r--r--src/mailman/model/uid.py72
1 files changed, 72 insertions, 0 deletions
diff --git a/src/mailman/model/uid.py b/src/mailman/model/uid.py
new file mode 100644
index 000000000..5b8f027d6
--- /dev/null
+++ b/src/mailman/model/uid.py
@@ -0,0 +1,72 @@
+# Copyright (C) 2011 by the Free Software Foundation, Inc.
+#
+# This file is part of GNU Mailman.
+#
+# GNU Mailman is free software: you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation, either version 3 of the License, or (at your option)
+# any later version.
+#
+# GNU Mailman is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# GNU Mailman. If not, see <http://www.gnu.org/licenses/>.
+
+"""Unique IDs."""
+
+from __future__ import absolute_import, unicode_literals
+
+__metaclass__ = type
+__all__ = [
+ 'UID',
+ ]
+
+
+from storm.locals import Int, Unicode
+
+from mailman.config import config
+from mailman.database.model import Model
+
+
+
+class UID(Model):
+ """Enforce uniqueness of uids through a database table.
+
+ This is used so that unique ids don't have to be tracked by each
+ individual model object that uses them. So for example, when a user is
+ deleted, we don't have to keep separate track of its uid to prevent it
+ from ever being used again. This class, hooked up to the
+ `UniqueIDFactory` serves that purpose.
+
+ There is no interface for this class, because it's purely an internal
+ implementation detail.
+
+ Since it's a hash, it's overwhelmingly more common for a uid to be
+ unique.
+ """
+ id = Int(primary=True)
+ uid = Unicode()
+
+ def __init__(self, uid):
+ super(UID, self).__init__()
+ self.uid = uid
+ config.db.store.add(self)
+
+ def __repr__(self):
+ return '<UID {0} at {1}>'.format(self.uid, id(self))
+
+ @staticmethod
+ def record(uid):
+ """Record the uid in the database.
+
+ :param uid: The unique id.
+ :type uid: unicode
+ :raises ValueError: if the id is not unique.
+ """
+ existing = config.db.store.find(UID, uid=uid)
+ if existing.count() != 0:
+ raise ValueError(uid)
+ return UID(uid)