From 283e6d8b9f09341e3b97418b79f389bfdfee6498 Mon Sep 17 00:00:00 2001 From: Jessica Tallon Date: Fri, 17 Jul 2015 17:49:18 +0200 Subject: [PATCH] Add polymorphic properties to User This adds the ability to search for any user based on the generic User case and be given back the specific LocalUser or RemoteUser. This will require any code using the model to look which attributes they are searching on and specify the specific User model they are on if they're not on the generic User model. This will also require new users to be created with LocalUser. --- mediagoblin/db/migrations.py | 12 +++++++++--- mediagoblin/db/models.py | 16 ++++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/mediagoblin/db/migrations.py b/mediagoblin/db/migrations.py index 02dc996c..6b25aebf 100644 --- a/mediagoblin/db/migrations.py +++ b/mediagoblin/db/migrations.py @@ -1460,15 +1460,15 @@ def federation_user_create_tables(db): """ Create all the tables """ + metadata = MetaData(bind=db.bind) + user_table = inspect_table(metadata, "core__users") + # Create tables needed LocalUser_V0.__table__.create(db.bind) RemoteUser_V0.__table__.create(db.bind) db.commit() # Create the fields - metadata = MetaData(bind=db.bind) - user_table = inspect_table(metadata, "core__users") - updated_column = Column( "updated", DateTime, @@ -1476,6 +1476,12 @@ def federation_user_create_tables(db): ) updated_column.create(user_table) + type_column = Column( + "type", + Unicode + ) + type_column.create(user_table) + name_column = Column( "name", Unicode diff --git a/mediagoblin/db/models.py b/mediagoblin/db/models.py index ef37aef8..41c36764 100644 --- a/mediagoblin/db/models.py +++ b/mediagoblin/db/models.py @@ -237,6 +237,9 @@ class User(Base, UserMixin): bio = Column(UnicodeText) name = Column(Unicode) + # This is required for the polymorphic inheritance + type = Column(Unicode) + created = Column(DateTime, nullable=False, default=datetime.datetime.utcnow) updated = Column(DateTime, nullable=False, default=datetime.datetime.utcnow) @@ -245,6 +248,11 @@ class User(Base, UserMixin): # Lazy getters get_location = relationship("Location", lazy="joined") + __mapper_args__ = { + 'polymorphic_identity': 'user', + 'polymorphic_on': type + } + def has_privilege(self, privilege, allow_admin=True): """ This method checks to make sure a user has all the correct privileges @@ -324,6 +332,10 @@ class LocalUser(User): uploaded = Column(Integer, default=0) upload_limit = Column(Integer) + __mapper_args__ = { + 'polymorphic_identity': 'user_local' + } + ## TODO # plugin data would be in a separate model @@ -394,6 +406,10 @@ class RemoteUser(User): id = Column(Integer, ForeignKey("core__users.id"), primary_key=True) webfinger = Column(Unicode, unique=True) + __mapper_args__ = { + 'polymorphic_identity': 'user_remote' + } + def __repr__(self): return "<{0} #{1} {2}>".format( self.__class__.__name__,