import posixpath from atlas_um.tokens.claim_values_serializers import RegisteredSerializers from atlas_um.pgdb import pgdb from atlas_um.pgdb.queries.claim_name import ClaimNameQuery class ClaimName(pgdb.Model): __tablename__ = "claim_name" query_class = ClaimNameQuery id = pgdb.Column(pgdb.Integer, primary_key=True) resource_group_id = pgdb.Column( pgdb.Integer, pgdb.ForeignKey("resource_group.id"), nullable=False ) friendly = pgdb.Column(pgdb.String(), nullable=False) path = pgdb.Column(pgdb.String(), nullable=False) external_id = pgdb.Column(pgdb.String()) optional = pgdb.Column(pgdb.Boolean(), nullable=False, default=False) claim_values_serializer = pgdb.Column(pgdb.String(), nullable=False) is_deleted = pgdb.Column(pgdb.Boolean(), nullable=False, default=False) claim_values_source_id = pgdb.Column( pgdb.Integer, pgdb.ForeignKey("claim_name.id"), nullable=True ) images_url = pgdb.Column(pgdb.String(), nullable=False) parent_id = pgdb.Column( pgdb.Integer, pgdb.ForeignKey("claim_name.id"), nullable=True ) # Relations resource_group = pgdb.relationship( "ResourceGroup", back_populates="claim_names" ) claim_values = pgdb.relationship("ClaimValue", back_populates="claim_name") claim_values_source = pgdb.relationship( "ClaimName", remote_side=id, backref="related_claim_names", primaryjoin=(id == claim_values_source_id), ) parent = pgdb.relationship( "ClaimName", remote_side=id, backref="children", primaryjoin=(id == parent_id), ) def __str__(self): return self.friendly @property def internal_name(self): return f"claim_{self.id}" @property def url(self): """ Using posixpath here to build correct urls from components and not to deal with slashes, and allow to redefine root with a slash: Examples: ("aaa", "bbb") -> "aaa/bbb" ("aaa", "/bbb") -> "/bbb" """ if self.resource_group: url = posixpath.join(self.resource_group.namespace_url, self.path) else: url = self.path return url @property def multiple_values_allowed(self): serializer = RegisteredSerializers.of(self.claim_values_serializer) return serializer.is_multiple def represent_claim_values(self, claim_values): serializer = RegisteredSerializers.of(self.claim_values_serializer) return serializer.represent(claim_values)