from sqlalchemy.ext.hybrid import hybrid_property from sqlalchemy.sql import functions from atlas_um import pgdb as models from .base import pgdb from .queries.application import ApplicationQuery class Application(pgdb.Model): __tablename__ = "application" query_class = ApplicationQuery id = pgdb.Column(pgdb.Integer, primary_key=True) name = pgdb.Column(pgdb.String(), nullable=False, default="") client_id = pgdb.Column(pgdb.String(), nullable=False, default="") client_secret = pgdb.Column(pgdb.String(), nullable=False, default="") audience = pgdb.Column(pgdb.String(), nullable=False, default="") resource_group_id = pgdb.Column( pgdb.Integer(), pgdb.ForeignKey("resource_group.id") ) dna_account_id = pgdb.Column( pgdb.Integer, pgdb.ForeignKey("dna_account.id") ) ttl = pgdb.Column(pgdb.Integer(), nullable=False, default=0) scope = pgdb.Column(pgdb.String(), nullable=False, default="") is_deleted = pgdb.Column(pgdb.Boolean, nullable=False, default=False) # Relations resource_group = pgdb.relationship( "ResourceGroup", back_populates="applications" ) dna_account = pgdb.relationship( "DNAAccount", back_populates="applications" ) @hybrid_property def token_audience(self): return f"{self.resource_group.namespace_url}|{self.audience}" @token_audience.expression def token_audience(cls): return functions.concat( models.ResourceGroup.namespace_url, "|", cls.audience ) def __str__(self): return self.name def serialize_claims(self): return { "sub": self.client_id, "aud": self.token_audience, "name": self.name, "scope": self.scope, }