class CollaborationMembership(Base, db.Model): __tablename__ = "collaboration_memberships" __table_args__ = ( db.UniqueConstraint('user_id', 'collaboration_id', name='unique_members'), ) id = db.Column("id", db.Integer(), primary_key=True, nullable=False, autoincrement=True) role = db.Column("role", db.String(length=255), nullable=False) status = db.Column("status", db.String(length=255), nullable=False, default=STATUS_ACTIVE) expiry_date = db.Column("expiry_date", db.DateTime(timezone=True), nullable=True) user_id = db.Column(db.Integer(), db.ForeignKey("users.id")) user = db.relationship("User", back_populates="collaboration_memberships") invitation_id = db.Column(db.Integer(), db.ForeignKey("invitations.id")) invitation = db.relationship("Invitation") collaboration_id = db.Column(db.Integer(), db.ForeignKey("collaborations.id")) collaboration = db.relationship("Collaboration", back_populates="collaboration_memberships") groups = db.relationship("Group", secondary=collaboration_memberships_groups_association, back_populates="collaboration_memberships", lazy="select") created_by = db.Column("created_by", db.String(length=512), nullable=False) updated_by = db.Column("updated_by", db.String(length=512), nullable=False) created_at = db.Column("created_at", db.DateTime(timezone=True), server_default=db.text("CURRENT_TIMESTAMP"), nullable=False) def is_expired(self): return self.expiry_date and datetime.datetime.utcnow() > self.expiry_date
class IpNetwork(Base, db.Model): __tablename__ = "ip_networks" id = db.Column("id", db.Integer(), primary_key=True, nullable=False, autoincrement=True) network_value = db.Column("network_value", db.Text(), nullable=False) service_id = db.Column(db.Integer(), db.ForeignKey("services.id")) created_by = db.Column("created_by", db.String(length=512), nullable=False) created_at = db.Column("created_at", db.DateTime(timezone=True), server_default=db.text("CURRENT_TIMESTAMP"), nullable=False) updated_by = db.Column("updated_by", db.String(length=512), nullable=False)
class UserMail(Base, db.Model): __tablename__ = "user_mails" id = db.Column("id", db.Integer(), primary_key=True, nullable=False, autoincrement=True) name = db.Column("name", db.String(length=255), nullable=True) recipient = db.Column("recipient", db.String(length=255), nullable=True) user_id = db.Column(db.Integer(), db.ForeignKey("users.id")) user = db.relationship("User", back_populates="user_mails") created_at = db.Column("created_at", db.DateTime(timezone=True), server_default=db.text("CURRENT_TIMESTAMP"), nullable=False)
class SchacHomeOrganisation(Base, db.Model): __tablename__ = "schac_home_organisations" id = db.Column("id", db.Integer(), primary_key=True, nullable=False, autoincrement=True) name = db.Column("name", db.String(length=255), nullable=False) organisation_id = db.Column(db.Integer(), db.ForeignKey("organisations.id")) organisation = db.relationship("Organisation", back_populates="schac_home_organisations") created_by = db.Column("created_by", db.String(length=512), nullable=False) created_at = db.Column("created_at", db.DateTime(timezone=True), server_default=db.text("CURRENT_TIMESTAMP"), nullable=False) updated_by = db.Column("updated_by", db.String(length=512), nullable=False)
class ApiKey(Base, db.Model): __tablename__ = "api_keys" id = db.Column("id", db.Integer(), primary_key=True, nullable=False, autoincrement=True) hashed_secret = db.Column("hashed_secret", db.String(length=512), nullable=False) description = db.Column("description", db.Text(), nullable=True) organisation_id = db.Column(db.Integer(), db.ForeignKey("organisations.id")) organisation = db.relationship("Organisation", back_populates="api_keys") created_by = db.Column("created_by", db.String(length=512), nullable=False) created_at = db.Column("created_at", db.DateTime(timezone=True), server_default=db.text("CURRENT_TIMESTAMP"), nullable=False) updated_by = db.Column("updated_by", db.String(length=512), nullable=False)
class ServiceMembership(Base, db.Model): __tablename__ = "service_memberships" id = db.Column("id", db.Integer(), primary_key=True, nullable=False, autoincrement=True) role = db.Column("role", db.String(length=255), nullable=False) user_id = db.Column(db.Integer(), db.ForeignKey("users.id"), primary_key=True) user = db.relationship("User", back_populates="service_memberships") service_id = db.Column(db.Integer(), db.ForeignKey("services.id"), primary_key=True) service = db.relationship("Service", back_populates="service_memberships") created_by = db.Column("created_by", db.String(length=512), nullable=False) updated_by = db.Column("updated_by", db.String(length=512), nullable=False) created_at = db.Column("created_at", db.DateTime(timezone=True), server_default=db.text("CURRENT_TIMESTAMP"), nullable=False)
class ServiceGroup(Base, db.Model): __tablename__ = "service_groups" id = db.Column("id", db.Integer(), primary_key=True, nullable=False, autoincrement=True) name = db.Column("name", db.String(length=255), nullable=False) short_name = db.Column("short_name", db.String(length=255), nullable=True) description = db.Column("description", db.Text(), nullable=True) auto_provision_members = db.Column("auto_provision_members", db.Boolean(), nullable=True, default=False) service_id = db.Column(db.Integer(), db.ForeignKey("services.id")) service = db.relationship("Service", back_populates="service_groups") created_by = db.Column("created_by", db.String(length=512), nullable=False) updated_by = db.Column("updated_by", db.String(length=512), nullable=False) created_at = db.Column("created_at", db.DateTime(timezone=True), server_default=db.text("CURRENT_TIMESTAMP"), nullable=False)
class UserToken(Base, db.Model): __tablename__ = "user_tokens" id = db.Column("id", db.Integer(), primary_key=True, nullable=False, autoincrement=True) name = db.Column("name", db.String(length=255), nullable=False) description = db.Column("description", db.Text(), nullable=True) hashed_token = db.Column("hashed_token", db.String(length=255), nullable=False) user_id = db.Column(db.Integer(), db.ForeignKey("users.id")) user = db.relationship("User", back_populates="user_tokens") service_id = db.Column(db.Integer(), db.ForeignKey("services.id")) service = db.relationship("Service", back_populates="user_tokens") last_used_date = db.Column("last_used_date", db.DateTime(timezone=True), nullable=True) created_at = db.Column("created_at", db.DateTime(timezone=True), server_default=db.text("CURRENT_TIMESTAMP"), nullable=False)
class JoinRequest(Base, db.Model): __tablename__ = "join_requests" id = db.Column("id", db.Integer(), primary_key=True, nullable=False, autoincrement=True) message = db.Column("message", db.Text(), nullable=True) reference = db.Column("reference", db.Text(), nullable=True) rejection_reason = db.Column("rejection_reason", db.Text(), nullable=True) status = db.Column("status", db.String(length=255), nullable=False) user_id = db.Column(db.Integer(), db.ForeignKey("users.id")) user = db.relationship("User", back_populates="join_requests") collaboration_id = db.Column(db.Integer(), db.ForeignKey("collaborations.id")) collaboration = db.relationship("Collaboration", back_populates="join_requests") hash = db.Column("hash", db.String(length=512), nullable=False) created_at = db.Column("created_at", db.DateTime(timezone=True), server_default=db.text("CURRENT_TIMESTAMP"), nullable=False)
class ServiceInvitation(Base, db.Model): __tablename__ = "service_invitations" id = db.Column("id", db.Integer(), primary_key=True, nullable=False, autoincrement=True) hash = db.Column("hash", db.String(length=512), nullable=False) message = db.Column("message", db.Text(), nullable=True) invitee_email = db.Column("invitee_email", db.String(length=255), nullable=False) service_id = db.Column(db.Integer(), db.ForeignKey("services.id")) service = db.relationship("Service", back_populates="service_invitations") user_id = db.Column(db.Integer(), db.ForeignKey("users.id")) user = db.relationship("User") intended_role = db.Column("intended_role", db.String(length=255), nullable=True) expiry_date = db.Column("expiry_date", db.DateTime(timezone=True), nullable=True) created_by = db.Column("created_by", db.String(length=512), nullable=False) created_at = db.Column("created_at", db.DateTime(timezone=True), server_default=db.text("CURRENT_TIMESTAMP"), nullable=False)
class ServiceConnectionRequest(Base, db.Model): __tablename__ = "service_connection_requests" id = db.Column("id", db.Integer(), primary_key=True, nullable=False, autoincrement=True) message = db.Column("message", db.Text(), nullable=True) hash = db.Column("hash", db.String(length=512), nullable=False) is_member_request = db.Column("is_member_request", db.Boolean(), nullable=True, default=False) requester_id = db.Column(db.Integer(), db.ForeignKey("users.id")) requester = db.relationship("User") service_id = db.Column(db.Integer(), db.ForeignKey("services.id")) service = db.relationship("Service", back_populates="service_connection_requests") collaboration_id = db.Column(db.Integer(), db.ForeignKey("collaborations.id")) collaboration = db.relationship("Collaboration", back_populates="service_connection_requests") created_by = db.Column("created_by", db.String(length=512), nullable=False) updated_by = db.Column("updated_by", db.String(length=512), nullable=False) created_at = db.Column("created_at", db.DateTime(timezone=True), server_default=db.text("CURRENT_TIMESTAMP"), nullable=False)
class Aup(Base, db.Model): __tablename__ = "aups" id = db.Column("id", db.Integer(), primary_key=True, nullable=False, autoincrement=True) au_version = db.Column("au_version", db.String(length=255), nullable=False) user_id = db.Column(db.Integer(), db.ForeignKey("users.id")) user = db.relationship("User", back_populates="aups") agreed_at = db.Column("agreed_at", db.DateTime(timezone=True), server_default=db.text("CURRENT_TIMESTAMP"), nullable=False)
class AuditLog(JsonSerializableBase, db.Model): __tablename__ = "audit_logs" id = db.Column("id", db.Integer(), primary_key=True, nullable=False, autoincrement=True) user_id = db.Column("user_id", db.Integer()) subject_id = db.Column("subject_id", db.Integer()) target_type = db.Column("target_type", db.String(length=100), nullable=False) target_id = db.Column("target_id", db.Integer()) target_name = db.Column("target_name", db.String(length=255), nullable=True) parent_id = db.Column("parent_id", db.Integer()) parent_name = db.Column("parent_name", db.String(length=100), nullable=True) action = db.Column("action", db.Integer()) state_before = db.Column("state_before", db.Text()) state_after = db.Column("state_after", db.Text()) created_at = db.Column("created_at", db.DateTime(timezone=True), server_default=db.text("CURRENT_TIMESTAMP"), nullable=False) def __init__(self, current_user_id, subject_id, target_type, target_id, target_name, parent_id, parent_name, action, state_before, state_after): self.user_id = current_user_id self.subject_id = subject_id self.target_type = target_type self.target_id = target_id self.target_name = target_name self.parent_id = parent_id self.parent_name = parent_name self.action = action self.state_before = state_before self.state_after = state_after def save(self, connection): connection.execute( self.__table__.insert(), user_id=self.user_id, subject_id=self.subject_id, target_type=self.target_type, target_id=self.target_id, target_name=self.target_name, parent_id=self.parent_id, parent_name=self.parent_name, action=self.action, state_before=self.state_before, state_after=self.state_after )
class OrganisationInvitation(Base, db.Model): __tablename__ = "organisation_invitations" id = db.Column("id", db.Integer(), primary_key=True, nullable=False, autoincrement=True) hash = db.Column("hash", db.String(length=512), nullable=False) message = db.Column("message", db.Text(), nullable=True) invitee_email = db.Column("invitee_email", db.String(length=255), nullable=False) organisation_id = db.Column(db.Integer(), db.ForeignKey("organisations.id")) organisation = db.relationship("Organisation", back_populates="organisation_invitations") user_id = db.Column(db.Integer(), db.ForeignKey("users.id")) user = db.relationship("User") intended_role = db.Column("intended_role", db.String(length=255), nullable=True) expiry_date = db.Column("expiry_date", db.DateTime(timezone=True), nullable=True) created_by = db.Column("created_by", db.String(length=512), nullable=False) created_at = db.Column("created_at", db.DateTime(timezone=True), server_default=db.text("CURRENT_TIMESTAMP"), nullable=False) @staticmethod def validate_role(role): if role not in ["admin", "manager"]: raise ValueError(f"{role} is not valid. Valid roles are admin and manager")
class Invitation(Base, db.Model): __tablename__ = "invitations" id = db.Column("id", db.Integer(), primary_key=True, nullable=False, autoincrement=True) hash = db.Column("hash", db.String(length=512), nullable=False) message = db.Column("message", db.Text(), nullable=True) invitee_email = db.Column("invitee_email", db.String(length=255), nullable=False) status = db.Column("status", db.String(length=255), nullable=False) collaboration_id = db.Column(db.Integer(), db.ForeignKey("collaborations.id")) collaboration = db.relationship("Collaboration", back_populates="invitations") user_id = db.Column(db.Integer(), db.ForeignKey("users.id")) user = db.relationship("User") groups = db.relationship("Group", secondary=groups_invitations_association, lazy="select", back_populates="invitations") intended_role = db.Column("intended_role", db.String(length=255), nullable=True) external_identifier = db.Column("external_identifier", db.String(length=255), nullable=True) expiry_date = db.Column("expiry_date", db.DateTime(timezone=True), nullable=True) membership_expiry_date = db.Column("membership_expiry_date", db.DateTime(timezone=True), nullable=True) created_by = db.Column("created_by", db.String(length=512), nullable=False) created_at = db.Column("created_at", db.DateTime(timezone=True), server_default=db.text("CURRENT_TIMESTAMP"), nullable=False) @staticmethod def validate_role(role): if role not in ["admin", "member"]: raise ValueError(f"{role} is not valid. Valid roles are admin and member")
class Group(Base, db.Model): __tablename__ = "groups" id = db.Column("id", db.Integer(), primary_key=True, nullable=False, autoincrement=True) name = db.Column("name", db.String(length=255), nullable=False) identifier = db.Column("identifier", db.String(length=255), nullable=False) short_name = db.Column("short_name", db.String(length=255), nullable=True) global_urn = db.Column("global_urn", db.Text, nullable=True) description = db.Column("description", db.Text(), nullable=True) auto_provision_members = db.Column("auto_provision_members", db.Boolean(), nullable=True, default=False) collaboration_id = db.Column(db.Integer(), db.ForeignKey("collaborations.id")) collaboration = db.relationship("Collaboration", back_populates="groups") collaboration_memberships = db.relationship("CollaborationMembership", secondary=collaboration_memberships_groups_association, back_populates="groups", lazy="select") invitations = db.relationship("Invitation", secondary=groups_invitations_association, lazy="select", back_populates="groups") created_by = db.Column("created_by", db.String(length=512), nullable=False) updated_by = db.Column("updated_by", db.String(length=512), nullable=False) created_at = db.Column("created_at", db.DateTime(timezone=True), server_default=db.text("CURRENT_TIMESTAMP"), nullable=False) def is_member(self, user_id): return len(list(filter(lambda membership: membership.user_id == user_id, self.collaboration_memberships))) > 0
class Organisation(Base, db.Model, LogoMixin): __tablename__ = "organisations" id = db.Column("id", db.Integer(), primary_key=True, nullable=False, autoincrement=True) name = db.Column("name", db.String(length=255), nullable=False) identifier = db.Column("identifier", db.String(length=255), nullable=False) short_name = db.Column("short_name", db.String(length=255), nullable=True) category = db.Column("category", db.String(length=255), nullable=True) description = db.Column("description", db.Text(), nullable=True) logo = db.Column("logo", db.Text(), nullable=True) uuid4 = db.Column("uuid4", db.String(length=255), nullable=False, default=gen_uuid4) on_boarding_msg = db.Column("on_boarding_msg", db.Text(), nullable=True) schac_home_organisations = db.relationship("SchacHomeOrganisation", cascade="all, delete-orphan", passive_deletes=True, lazy="selectin") services_restricted = db.Column("services_restricted", db.Boolean(), nullable=True, default=False) created_by = db.Column("created_by", db.String(length=512), nullable=False) created_at = db.Column("created_at", db.DateTime(timezone=True), server_default=db.text("CURRENT_TIMESTAMP"), nullable=False) updated_by = db.Column("updated_by", db.String(length=512), nullable=False) collaboration_creation_allowed = db.Column("collaboration_creation_allowed", db.Boolean(), nullable=True, default=False) collaborations = db.relationship("Collaboration", back_populates="organisation", cascade="all, delete-orphan", passive_deletes=True) services = db.relationship("Service", secondary=services_organisations_association, lazy="select", back_populates="organisations") collaboration_requests = db.relationship("CollaborationRequest", back_populates="organisation", cascade="all, delete-orphan", passive_deletes=True) organisation_memberships = db.relationship("OrganisationMembership", back_populates="organisation", cascade="all, delete-orphan", passive_deletes=True) organisation_invitations = db.relationship("OrganisationInvitation", back_populates="organisation", cascade="all, delete-orphan", passive_deletes=True) api_keys = db.relationship("ApiKey", back_populates="organisation", cascade="delete, delete-orphan", passive_deletes=True) collaborations_count = column_property(select([func.count(Collaboration.id)]) .where(Collaboration.organisation_id == id) .correlate_except(Collaboration) .scalar_subquery()) organisation_memberships_count = column_property(select([func.count(OrganisationMembership.id)]) .where(OrganisationMembership.organisation_id == id) .correlate_except(OrganisationMembership) .scalar_subquery()) def is_member(self, user_id): return len(list(filter(lambda membership: membership.user_id == user_id, self.organisation_memberships))) > 0
class CollaborationRequest(Base, db.Model, LogoMixin): __tablename__ = "collaboration_requests" id = db.Column("id", db.Integer(), primary_key=True, nullable=False, autoincrement=True) name = db.Column("name", db.String(length=255), nullable=False) short_name = db.Column("short_name", db.String(length=255), nullable=True) description = db.Column("description", db.Text(), nullable=True) message = db.Column("message", db.Text(), nullable=True) rejection_reason = db.Column("rejection_reason", db.Text(), nullable=True) accepted_user_policy = db.Column("accepted_user_policy", db.String(length=255), nullable=True) status = db.Column("status", db.String(length=255), nullable=False) organisation_id = db.Column(db.Integer(), db.ForeignKey("organisations.id")) organisation = db.relationship("Organisation", back_populates="collaboration_requests") requester_id = db.Column(db.Integer(), db.ForeignKey("users.id")) requester = db.relationship("User", back_populates="collaboration_requests") logo = db.Column("logo", db.Text(), nullable=True) uuid4 = db.Column("uuid4", db.String(length=255), nullable=False, default=gen_uuid4) website_url = db.Column("website_url", db.String(length=512), nullable=True) created_by = db.Column("created_by", db.String(length=512), nullable=False) updated_by = db.Column("updated_by", db.String(length=512), nullable=False) created_at = db.Column("created_at", db.DateTime(timezone=True), server_default=db.text("CURRENT_TIMESTAMP"), nullable=False)
class User(Base, db.Model): __tablename__ = "users" id = db.Column("id", db.Integer(), primary_key=True, nullable=False, autoincrement=True) uid = db.Column("uid", db.String(length=512), nullable=False) name = db.Column("name", db.String(length=255), nullable=True) username = db.Column("username", db.String(length=255), nullable=True) nick_name = db.Column("nick_name", db.String(length=255), nullable=True) edu_members = db.Column("edu_members", db.Text(), nullable=True) address = db.Column("address", db.String(length=255), nullable=True) affiliation = db.Column("affiliation", db.Text(), nullable=True) scoped_affiliation = db.Column("scoped_affiliation", db.Text(), nullable=True) entitlement = db.Column("entitlement", db.Text(), nullable=True) schac_home_organisation = db.Column("schac_home_organisation", db.String(length=255), nullable=True) family_name = db.Column("family_name", db.String(length=255), nullable=True) given_name = db.Column("given_name", db.String(length=255), nullable=True) email = db.Column("email", db.String(length=255), nullable=True) second_factor_auth = db.Column("second_factor_auth", db.String(length=255), nullable=True) ssh_keys = db.relationship("SshKey", back_populates="user", cascade="all, delete-orphan", passive_deletes=True, lazy="selectin") user_ip_networks = db.relationship("UserIpNetwork", cascade="all, delete-orphan", passive_deletes=True, lazy="selectin") created_by = db.Column("created_by", db.String(length=512), nullable=False) created_at = db.Column("created_at", db.DateTime(timezone=True), server_default=db.text("CURRENT_TIMESTAMP"), nullable=False) updated_by = db.Column("updated_by", db.String(length=512), nullable=False) organisation_memberships = db.relationship("OrganisationMembership", back_populates="user", cascade_backrefs=False, passive_deletes=True) collaboration_memberships = db.relationship("CollaborationMembership", back_populates="user", cascade_backrefs=False, passive_deletes=True) collaboration_requests = db.relationship("CollaborationRequest", back_populates="requester", cascade_backrefs=False, passive_deletes=True) service_memberships = db.relationship("ServiceMembership", back_populates="user", cascade_backrefs=False, passive_deletes=True) join_requests = db.relationship("JoinRequest", back_populates="user", cascade_backrefs=False, passive_deletes=True) aups = db.relationship("Aup", back_populates="user", cascade="all, delete-orphan", passive_deletes=True) service_aups = db.relationship("ServiceAup", back_populates="user", cascade="all, delete-orphan", passive_deletes=True) user_tokens = db.relationship("UserToken", back_populates="user", cascade="all, delete-orphan", passive_deletes=True) confirmed_super_user = db.Column("confirmed_super_user", db.Boolean(), nullable=True, default=False) eduperson_principal_name = db.Column("eduperson_principal_name", db.String(length=255), nullable=True) application_uid = db.Column("application_uid", db.String(length=255), nullable=True) last_accessed_date = db.Column("last_accessed_date", db.DateTime(timezone=True), nullable=False) last_login_date = db.Column("last_login_date", db.DateTime(timezone=True), nullable=False) suspended = db.Column("suspended", db.Boolean(), nullable=True, default=False) suspend_notifications = db.relationship("SuspendNotification", back_populates="user", cascade="all, delete-orphan", passive_deletes=True) mfa_reset_token = db.Column("mfa_reset_token", db.String(length=512), nullable=True) second_fa_uuid = db.Column("second_fa_uuid", db.String(length=512), nullable=True) user_mails = db.relationship("UserMail", back_populates="user", cascade="all, delete-orphan", passive_deletes=True) def has_agreed_with_aup(self): return len([aup for aup in self.aups if aup.au_version == str(current_app.app_config.aup.version)]) > 0
class Service(Base, db.Model, LogoMixin): __tablename__ = "services" id = db.Column("id", db.Integer(), primary_key=True, nullable=False, autoincrement=True) entity_id = db.Column("entity_id", db.String(length=255), nullable=False) name = db.Column("name", db.String(length=255), nullable=False) description = db.Column("description", db.Text(), nullable=True) logo = db.Column("logo", db.Text(), nullable=True) uuid4 = db.Column("uuid4", db.String(length=255), nullable=False, default=gen_uuid4) address = db.Column("address", db.Text(), nullable=True) identity_type = db.Column("identity_type", db.String(length=255), nullable=True) abbreviation = db.Column("abbreviation", db.String(length=255), nullable=False) uri = db.Column("uri", db.String(length=255), nullable=True) privacy_policy = db.Column("privacy_policy", db.String(length=255), nullable=False) accepted_user_policy = db.Column("accepted_user_policy", db.Text(), nullable=True) ldap_password = db.Column("ldap_password", db.String(length=255), nullable=True) contact_email = db.Column("contact_email", db.String(length=255), nullable=True) support_email = db.Column("support_email", db.String(length=255), nullable=True) security_email = db.Column("security_email", db.String(length=255), nullable=True) public_visible = db.Column("public_visible", db.Boolean(), nullable=True, default=True) automatic_connection_allowed = db.Column("automatic_connection_allowed", db.Boolean(), nullable=True, default=True) access_allowed_for_all = db.Column("access_allowed_for_all", db.Boolean(), nullable=True, default=False) white_listed = db.Column("white_listed", db.Boolean(), nullable=True, default=False) non_member_users_access_allowed = db.Column("non_member_users_access_allowed", db.Boolean(), nullable=True, default=False) research_scholarship_compliant = db.Column("research_scholarship_compliant", db.Boolean(), nullable=True, default=False) code_of_conduct_compliant = db.Column("code_of_conduct_compliant", db.Boolean(), nullable=True, default=False) sirtfi_compliant = db.Column("sirtfi_compliant", db.Boolean(), nullable=True, default=False) token_enabled = db.Column("token_enabled", db.Boolean(), nullable=True, default=False) hashed_token = db.Column("hashed_token", db.String(length=255), nullable=True, default=None) token_validity_days = db.Column("token_validity_days", db.Integer(), nullable=True, default=0) collaborations = db.relationship("Collaboration", secondary=services_collaborations_association, lazy="select", back_populates="services") allowed_organisations = db.relationship("Organisation", secondary=organisations_services_association, lazy="select") organisations = db.relationship("Organisation", secondary=services_organisations_association, lazy="select", back_populates="services") ip_networks = db.relationship("IpNetwork", cascade="all, delete-orphan", passive_deletes=True) service_connection_requests = db.relationship("ServiceConnectionRequest", back_populates="service", cascade="all, delete-orphan", passive_deletes=True) service_groups = db.relationship("ServiceGroup", back_populates="service", cascade="all, delete-orphan", passive_deletes=True) service_memberships = db.relationship("ServiceMembership", back_populates="service", cascade="all, delete-orphan", passive_deletes=True) service_invitations = db.relationship("ServiceInvitation", back_populates="service", cascade="all, delete-orphan", passive_deletes=True) service_aups = db.relationship("ServiceAup", back_populates="service", cascade="all, delete-orphan", passive_deletes=True) user_tokens = db.relationship("UserToken", back_populates="service", cascade="all, delete-orphan", passive_deletes=True) created_by = db.Column("created_by", db.String(length=512), nullable=True) updated_by = db.Column("updated_by", db.String(length=512), nullable=True) created_at = db.Column("created_at", db.DateTime(timezone=True), server_default=db.text("CURRENT_TIMESTAMP"), nullable=False) def is_member(self, user_id): return len(list(filter(lambda membership: membership.user_id == user_id, self.service_memberships))) > 0
class UserNameHistory(Base, db.Model): __tablename__ = "user_names_history" id = db.Column("id", db.Integer(), primary_key=True, nullable=False, autoincrement=True) username = db.Column("username", db.String(length=255), nullable=True) created_at = db.Column("created_at", db.DateTime(timezone=True), server_default=db.text("CURRENT_TIMESTAMP"), nullable=False)
class Collaboration(Base, db.Model, LogoMixin): __tablename__ = "collaborations" id = db.Column("id", db.Integer(), primary_key=True, nullable=False, autoincrement=True) identifier = db.Column("identifier", db.String(length=255), nullable=False) name = db.Column("name", db.String(length=255), nullable=False) description = db.Column("description", db.Text(), nullable=True) logo = db.Column("logo", db.Text(), nullable=True) uuid4 = db.Column("uuid4", db.String(length=255), nullable=False, default=gen_uuid4) short_name = db.Column("short_name", db.String(length=255), nullable=True) global_urn = db.Column("global_urn", db.Text, nullable=True) accepted_user_policy = db.Column("accepted_user_policy", db.Text(), nullable=True) status = db.Column("status", db.String(length=255), nullable=False, default=STATUS_ACTIVE) last_activity_date = db.Column("last_activity_date", db.DateTime(timezone=True), nullable=False, server_default=db.text("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")) expiry_date = db.Column("expiry_date", db.DateTime(timezone=True), nullable=True) organisation_id = db.Column(db.Integer(), db.ForeignKey("organisations.id")) organisation = db.relationship("Organisation", back_populates="collaborations") created_by = db.Column("created_by", db.String(length=512), nullable=False) updated_by = db.Column("updated_by", db.String(length=512), nullable=False) created_at = db.Column("created_at", db.DateTime(timezone=True), server_default=db.text("CURRENT_TIMESTAMP"), nullable=False) services = db.relationship("Service", secondary=services_collaborations_association, lazy="select", back_populates="collaborations") collaboration_memberships = db.relationship("CollaborationMembership", back_populates="collaboration", cascade="all, delete-orphan", passive_deletes=True) groups = db.relationship("Group", back_populates="collaboration", cascade="all, delete-orphan", passive_deletes=True) join_requests = db.relationship("JoinRequest", back_populates="collaboration", cascade="all, delete-orphan", passive_deletes=True) invitations = db.relationship("Invitation", back_populates="collaboration", cascade="all, delete-orphan", passive_deletes=True) service_connection_requests = db.relationship("ServiceConnectionRequest", back_populates="collaboration", cascade="all, delete-orphan", passive_deletes=True) disable_join_requests = db.Column("disable_join_requests", db.Boolean(), nullable=True, default=False) disclose_member_information = db.Column("disclose_member_information", db.Boolean(), nullable=True, default=False) disclose_email_information = db.Column("disclose_email_information", db.Boolean(), nullable=True, default=False) website_url = db.Column("website_url", db.String(length=512), nullable=True) invitations_count = column_property(select([func.count(Invitation.id)]) .where(Invitation.collaboration_id == id) .correlate_except(Invitation) .scalar_subquery()) collaboration_memberships_count = column_property(select([func.count(CollaborationMembership.id)]) .where(CollaborationMembership.collaboration_id == id) .correlate_except(CollaborationMembership) .scalar_subquery()) def is_member(self, user_id): return len(list(filter(lambda membership: membership.user_id == user_id, self.collaboration_memberships))) > 0 def is_admin(self, user_id): for membership in self.collaboration_memberships: if membership.user_id == user_id and membership.role == "admin": return True return False def service_emails(self): services = self.services + self.organisation.services res = {} for service in services: if service.contact_email: res[service.id] = [service.contact_email] else: res[service.id] = [membership.user.email for membership in service.service_memberships] return res