from datetime import datetime from sqlalchemy import Column, Integer, SmallInteger, String, DateTime, ForeignKey from sqlalchemy.orm import relationship from app import db class User(db.Model): __tablename__ = "user" id = Column(Integer, primary_key=True) auth_id = Column(String(50), nullable=False, unique=True) profile_id = Column(Integer, ForeignKey("profile.id"), nullable=True) tokens = relationship("Token", uselist=False, back_populates="user") profile = relationship("Profile", back_populates="user") def to_dict(self): return {"id": self.id} class Profile(db.Model): __tablename__ = "profile" id = Column(Integer, primary_key=True) nickname = Column(String(25), unique=True, nullable=False) pronouns = Column(String(25), default="") volunteerwork = Column(String(4000), default="") freetext = Column(String(4000), default="") created = Column(DateTime, nullable=False, default=datetime.now) updated = Column(DateTime, onupdate=datetime.now, nullable=False, default=datetime.now) user = relationship("User", back_populates="profile", uselist=False) contacts = relationship("Contact") address = relationship("Address", uselist=False, back_populates="profile") skills = relationship("ProfileSkill", back_populates="profile") languages = relationship("ProfileLanguage", back_populates="profile") def to_dict(self): return { "nickname": self.nickname, "pronouns": self.pronouns, "volunteerwork": self.volunteerwork, "freetext": self.freetext } class Token(db.Model): __tablename__ = "token" id = Column(Integer, primary_key=True) user_id = Column(Integer, ForeignKey("user.id"), nullable=False) token = Column(String(36), nullable=False) user = relationship("User", back_populates="tokens") class Contact(db.Model): __tablename__ = "contact" id = Column(Integer, primary_key=True) profile_id = Column(Integer, ForeignKey("profile.id"), nullable=False) profile = relationship("Profile", back_populates="contacts") contacttype_id = Column(Integer, ForeignKey("contacttype.id"), nullable=False) contacttype = relationship("ContactType") content = Column(String(200), nullable=False) class ContactType(db.Model): __tablename__ = "contacttype" id = Column(Integer, primary_key=True) name = Column(String(25), nullable=False) class Address(db.Model): __tablename__ = "address" id = Column(Integer, primary_key=True) name = Column(String(25), default="") street = Column(String(25), default="") house_number = Column(String(10), default="") additional = Column(String(25), default="") postcode = Column(String(10), default="") city = Column(String(25), default="") country = Column(String(25), default="") profile_id = Column(Integer, ForeignKey("profile.id"), nullable=False) profile = relationship("Profile", back_populates="address") class Skill(db.Model): __tablename__ = "skill" id = Column(Integer, primary_key=True) name = Column(String(25), unique=True, nullable=False) profiles = relationship("ProfileSkill", back_populates="skill") def to_dict(self): return {"id": self.id, "name": self.name} class ProfileSkill(db.Model): __tablename__ = "profile_skill" profile_id = Column(Integer, ForeignKey("profile.id"), primary_key=True) skill_id = Column(Integer, ForeignKey("skill.id"), primary_key=True) level = Column(SmallInteger, nullable=False) profile = relationship("Profile", back_populates="skills") skill = relationship("Skill", back_populates="profiles") class Language(db.Model): __tablename__ = "language" id = Column(String(2), primary_key=True) name = Column(String(25), nullable=False) profiles = relationship("ProfileLanguage", back_populates="language") def to_dict(self): return {"id": self.id, "name": self.name} class ProfileLanguage(db.Model): __tablename__ = "profile_language" profile_id = Column(Integer, ForeignKey("profile.id"), primary_key=True) language_id = Column(Integer, ForeignKey("language.id"), primary_key=True) level = Column(SmallInteger, nullable=False) profile = relationship("Profile", back_populates="languages") language = relationship("Language", back_populates="profiles")