diff options
| author | Barry Warsaw | 2011-04-22 19:26:43 -0400 |
|---|---|---|
| committer | Barry Warsaw | 2011-04-22 19:26:43 -0400 |
| commit | b5b015ce524157cfef4b795e4b0c7ff17b4d0fe2 (patch) | |
| tree | 260169450ab382cf59143f0fe8bae0fc0507452f /src/mailman/model/uid.py | |
| parent | 6959e6adcb582172aeec01ef6b6a75b9ba85017b (diff) | |
| download | mailman-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.py | 72 |
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) |
