diff options
| author | Barry Warsaw | 2014-09-23 09:30:43 -0400 |
|---|---|---|
| committer | Barry Warsaw | 2014-09-23 09:30:43 -0400 |
| commit | ad7a26a4383fd9f0034e1e50d8f4207adb5aa9f3 (patch) | |
| tree | 449649a6802e9f35f51f3dc1f34da53ecf23fecf | |
| parent | ea124d4fba3e94d0d8885d898500c9a06d7daad0 (diff) | |
| download | mailman-ad7a26a4383fd9f0034e1e50d8f4207adb5aa9f3.tar.gz mailman-ad7a26a4383fd9f0034e1e50d8f4207adb5aa9f3.tar.zst mailman-ad7a26a4383fd9f0034e1e50d8f4207adb5aa9f3.zip | |
| -rw-r--r-- | src/mailman/database/types.py | 46 | ||||
| -rw-r--r-- | src/mailman/model/address.py | 2 |
2 files changed, 18 insertions, 30 deletions
diff --git a/src/mailman/database/types.py b/src/mailman/database/types.py index 380ce37dc..641e065ba 100644 --- a/src/mailman/database/types.py +++ b/src/mailman/database/types.py @@ -29,8 +29,7 @@ __all__ = [ import uuid from sqlalchemy import Integer -from sqlalchemy.dialects import postgresql -from sqlalchemy.types import TypeDecorator, BINARY, CHAR +from sqlalchemy.types import TypeDecorator, CHAR @@ -59,45 +58,34 @@ class Enum(TypeDecorator): class UUID(TypeDecorator): - """Handle UUIds.""" + """Platform-independent GUID type. - impl = BINARY(16) - python_type = uuid.UUID + Uses Postgresql's UUID type, otherwise uses + CHAR(32), storing as stringified hex values. - def __init__(self, binary=True, native=True): - self.binary = binary - self.native = native + """ + impl = CHAR def load_dialect_impl(self, dialect): - if dialect.name == 'postgresql' and self.native: - # Use the native UUID type. - return dialect.type_descriptor(postgresql.UUID()) + if dialect.name == 'postgresql': + return dialect.type_descriptor(UUID()) else: - # Fallback to either a BINARY or a CHAR. - kind = self.impl if self.binary else CHAR(32) - return dialect.type_descriptor(kind) - - @staticmethod - def _coerce(value): - if value and not isinstance(value, uuid.UUID): - try: - value = uuid.UUID(value) - except (TypeError, ValueError): - value = uuid.UUID(bytes=value) - return value + return dialect.type_descriptor(CHAR(32)) def process_bind_param(self, value, dialect): if value is None: return value - if not isinstance(value, uuid.UUID): - value = self._coerce(value) - if self.native and dialect.name == 'postgresql': + elif dialect.name == 'postgresql': return str(value) - return value.bytes if self.binary else value.hex + else: + if not isinstance(value, uuid.UUID): + return "%.32x" % uuid.UUID(value) + else: + # hexstring + return "%.32x" % value def process_result_value(self, value, dialect): if value is None: return value - if self.native and dialect.name == 'postgresql': + else: return uuid.UUID(value) - return uuid.UUID(bytes=value) if self.binary else uuid.UUID(value) diff --git a/src/mailman/model/address.py b/src/mailman/model/address.py index d078f28d5..20bd631f5 100644 --- a/src/mailman/model/address.py +++ b/src/mailman/model/address.py @@ -57,7 +57,7 @@ class Address(Model): preferences_id = Column(Integer, ForeignKey('preferences.id')) preferences = relationship( - 'Preferences', backref=backref('Address', uselist=False)) + 'Preferences', backref=backref('address', uselist=False)) def __init__(self, email, display_name): super(Address, self).__init__() |
