trade backref for back_populates

backref considered 'legacy', and back_populates makes it easier to specify lazy loading options
This commit is contained in:
Min RK
2023-06-26 14:55:50 +02:00
parent d38dd92415
commit f92af04e0e

View File

@@ -29,7 +29,6 @@ from sqlalchemy import (
)
from sqlalchemy.orm import (
Session,
backref,
declarative_base,
interfaces,
object_session,
@@ -139,6 +138,9 @@ class Server(Base):
base_url = Column(Unicode(255), default='/')
cookie_name = Column(Unicode(255), default='cookie')
service = relationship("Service", back_populates="server", uselist=False)
spawner = relationship("Spawner", back_populates="server", uselist=False)
def __repr__(self):
return f"<Server({self.ip}:{self.port})>"
@@ -178,9 +180,11 @@ class Role(Base):
name = Column(Unicode(255), unique=True)
description = Column(Unicode(1023))
scopes = Column(JSONList, default=[])
users = relationship('User', secondary='user_role_map', backref='roles')
services = relationship('Service', secondary='service_role_map', backref='roles')
groups = relationship('Group', secondary='group_role_map', backref='roles')
users = relationship('User', secondary='user_role_map', back_populates='roles')
services = relationship(
'Service', secondary='service_role_map', back_populates='roles'
)
groups = relationship('Group', secondary='group_role_map', back_populates='roles')
def __repr__(self):
return "<{} {} ({}) - scopes: {}>".format(
@@ -213,8 +217,9 @@ class Group(Base):
__tablename__ = 'groups'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(Unicode(255), unique=True)
users = relationship('User', secondary='user_group_map', backref='groups')
users = relationship('User', secondary='user_group_map', back_populates='groups')
properties = Column(JSONDict, default={})
roles = relationship('Role', secondary='group_role_map', back_populates='groups')
def __repr__(self):
return f"<{self.__class__.__name__} {self.name}>"
@@ -254,8 +259,10 @@ class User(Base):
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(Unicode(255), unique=True)
roles = relationship('Role', secondary='user_role_map', back_populates='users')
_orm_spawners = relationship(
"Spawner", backref="user", cascade="all, delete-orphan"
"Spawner", back_populates="user", cascade="all, delete-orphan"
)
@property
@@ -266,9 +273,16 @@ class User(Base):
created = Column(DateTime, default=datetime.utcnow)
last_activity = Column(DateTime, nullable=True)
api_tokens = relationship("APIToken", backref="user", cascade="all, delete-orphan")
api_tokens = relationship(
"APIToken", back_populates="user", cascade="all, delete-orphan"
)
groups = relationship(
"Group",
secondary='user_group_map',
back_populates="users",
)
oauth_codes = relationship(
"OAuthCode", backref="user", cascade="all, delete-orphan"
"OAuthCode", back_populates="user", cascade="all, delete-orphan"
)
cookie_id = Column(Unicode(255), default=new_token, nullable=False, unique=True)
# User.state is actually Spawner state
@@ -308,11 +322,12 @@ class Spawner(Base):
id = Column(Integer, primary_key=True, autoincrement=True)
user_id = Column(Integer, ForeignKey('users.id', ondelete='CASCADE'))
user = relationship("User", back_populates="_orm_spawners")
server_id = Column(Integer, ForeignKey('servers.id', ondelete='SET NULL'))
server = relationship(
Server,
backref=backref('spawner', uselist=False),
back_populates="spawner",
single_parent=True,
cascade="all, delete-orphan",
)
@@ -334,7 +349,7 @@ class Spawner(Base):
)
oauth_client = relationship(
'OAuthClient',
backref=backref("spawner", uselist=False),
back_populates="spawner",
cascade="all, delete-orphan",
single_parent=True,
)
@@ -375,16 +390,19 @@ class Service(Base):
# common user interface:
name = Column(Unicode(255), unique=True)
admin = Column(Boolean(create_constraint=False), default=False)
roles = relationship(
'Role', secondary='service_role_map', back_populates='services'
)
api_tokens = relationship(
"APIToken", backref="service", cascade="all, delete-orphan"
"APIToken", back_populates="service", cascade="all, delete-orphan"
)
# service-specific interface
_server_id = Column(Integer, ForeignKey('servers.id', ondelete='SET NULL'))
server = relationship(
Server,
backref=backref('service', uselist=False),
back_populates="service",
single_parent=True,
cascade="all, delete-orphan",
)
@@ -400,7 +418,7 @@ class Service(Base):
)
oauth_client = relationship(
'OAuthClient',
backref=backref("service", uselist=False),
back_populates="service",
cascade="all, delete-orphan",
single_parent=True,
)
@@ -575,6 +593,10 @@ class APIToken(Hashed, Base):
nullable=True,
)
user = relationship("User", back_populates="api_tokens")
service = relationship("Service", back_populates="api_tokens")
oauth_client = relationship("OAuthClient", back_populates="access_tokens")
id = Column(Integer, primary_key=True)
hashed = Column(Unicode(255), unique=True)
prefix = Column(Unicode(16), index=True)
@@ -780,12 +802,14 @@ class OAuthCode(Expiring, Base):
client_id = Column(
Unicode(255), ForeignKey('oauth_clients.identifier', ondelete='CASCADE')
)
client = relationship("OAuthClient", back_populates="codes")
code = Column(Unicode(36))
expires_at = Column(Integer)
redirect_uri = Column(Unicode(1023))
session_id = Column(Unicode(255))
# state = Column(Unicode(1023))
user_id = Column(Integer, ForeignKey('users.id', ondelete='CASCADE'))
user = relationship("User", back_populates="oauth_codes")
scopes = Column(JSONList, default=[])
@@ -820,10 +844,14 @@ class OAuthClient(Base):
def client_id(self):
return self.identifier
spawner = relationship("Spawner", back_populates="oauth_client", uselist=False)
service = relationship("Service", back_populates="oauth_client", uselist=False)
access_tokens = relationship(
APIToken, backref='oauth_client', cascade='all, delete-orphan'
APIToken, back_populates='oauth_client', cascade='all, delete-orphan'
)
codes = relationship(
OAuthCode, back_populates='client', cascade='all, delete-orphan'
)
codes = relationship(OAuthCode, backref='client', cascade='all, delete-orphan')
# these are the scopes an oauth client is allowed to request
# *not* the scopes of the client itself