Skip to content
Extraits de code Groupes Projets
models.py 8,95 ko
Newer Older
  • Learn to ignore specific revisions
  • Brieuc Dubois's avatar
    Brieuc Dubois a validé
    from sqlalchemy import (
        Column,
    
        Float,
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
        Integer,
        String,
        Boolean,
        ForeignKey,
        DateTime,
        UniqueConstraint,
    )
    from sqlalchemy.orm import relationship
    
    from enum import Enum
    
    from database import Base
    
    import datetime
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
    from utils import datetime_aware
    
    
    
    class UserType(Enum):
        ADMIN = 0
        TUTOR = 1
        STUDENT = 2
    
    
    
    class Contact(Base):
        __tablename__ = "contacts"
    
        user_id = Column(Integer, ForeignKey("users.id"), primary_key=True, index=True)
        contact_id = Column(Integer, ForeignKey("users.id"), primary_key=True, index=True)
    
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
        UniqueConstraint("user_id", "contact_id", name="unique_contact")
    
    
    class User(Base):
    
        __tablename__ = "users"
    
    
        id = Column(Integer, primary_key=True, index=True)
    
        email = Column(String, unique=True, index=True)
        nickname = Column(String, index=True)
    
        password = Column(String)
        type = Column(Integer, default=UserType.STUDENT.value)
        is_active = Column(Boolean, default=True)
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
        availability = Column(String, default=0)
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
        ui_language = Column(String, default="fr")
        home_language = Column(String, default="en")
        target_language = Column(String, default="fr")
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
        birthdate = Column(DateTime, default=None)
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
        gender = Column(String, default=None)
    
        calcom_link = Column(String, default="")
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
        last_survey = Column(DateTime, default=None)
    
    
        sessions = relationship(
            "Session", secondary="user_sessions", back_populates="users"
        )
    
        contacts = relationship(
            "User",
            secondary="contacts",
            primaryjoin=(id == Contact.user_id),
            secondaryjoin=(id == Contact.contact_id),
            back_populates="contacts",
        )
    
        contact_of = relationship(
            "User",
            secondary="contacts",
            primaryjoin=(id == Contact.contact_id),
            secondaryjoin=(id == Contact.user_id),
            back_populates="contacts",
        )
    
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
        studies = relationship("Study", secondary="study_users", back_populates="users")
    
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
    class UserSurveyWeekly(Base):
        __tablename__ = "users_survey_weekly"
    
        id = Column(Integer, primary_key=True, index=True)
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
        created_at = Column(DateTime, default=datetime_aware)
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
        user_id = Column(Integer, ForeignKey("users.id"))
        q1 = Column(Float)
        q2 = Column(Float)
        q3 = Column(Float)
        q4 = Column(Float)
    
    
    
    class Session(Base):
    
        __tablename__ = "sessions"
    
    
        id = Column(Integer, primary_key=True, index=True)
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
        created_at = Column(DateTime, default=datetime_aware)
    
        is_active = Column(Boolean, default=True)
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
        start_time = Column(DateTime, default=datetime_aware)
    
        end_time = Column(
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
            DateTime,
            default=lambda: datetime_aware() + datetime.timedelta(hours=12),
    
        language = Column(String, default="fr")
    
        users = relationship("User", secondary="user_sessions", back_populates="sessions")
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
    class SessionSatisfy(Base):
        __tablename__ = "session_satisfy"
    
        id = Column(Integer, primary_key=True, index=True)
        user_id = Column(Integer, ForeignKey("users.id"))
        session_id = Column(Integer, ForeignKey("sessions.id"))
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
        created_at = Column(DateTime, default=datetime_aware)
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
        usefullness = Column(Integer)
        easiness = Column(Integer)
        remarks = Column(String)
    
    
    
    class UserSession(Base):
        __tablename__ = "user_sessions"
    
    
        user_id = Column(Integer, ForeignKey("users.id"), primary_key=True, index=True)
        session_id = Column(String, ForeignKey("sessions.id"), primary_key=True, index=True)
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
    
    
    class Message(Base):
    
        __tablename__ = "messages"
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
    
        id = Column(Integer, primary_key=True, index=True)
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
        message_id = Column(String)
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
        content = Column(String)
    
        user_id = Column(Integer, ForeignKey("users.id"))
        session_id = Column(Integer, ForeignKey("sessions.id"))
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
        created_at = Column(DateTime, default=datetime_aware)
    
        reply_to_message_id = Column(
            Integer, ForeignKey("messages.message_id"), nullable=True
        )
    
        feedbacks = relationship("MessageFeedback", backref="message")
    
        replies = relationship(
            "Message", backref="parent_message", remote_side=[message_id]
        )
    
        def raw(self):
            return [
                self.id,
                self.message_id,
                self.content,
                self.user_id,
                self.session_id,
    
                self.reply_to_message_id,
    
        feedbacks = relationship("MessageFeedback", backref="message")
    
    
    class MessageMetadata(Base):
    
        __tablename__ = "message_metadata"
    
    
        id = Column(Integer, primary_key=True, index=True)
    
        message_id = Column(Integer, ForeignKey("messages.id"))
    
        message = Column(String)
    
        date = Column(Integer)
    
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
        def raw(self):
            return [self.id, self.message_id, self.message, self.date]
    
    
    class MessageFeedback(Base):
        __tablename__ = "message_feedbacks"
    
        id = Column(Integer, primary_key=True, index=True)
        message_id = Column(Integer, ForeignKey("messages.id"))
        start = Column(Integer)
        end = Column(Integer)
        content = Column(String, default="")
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
        date = Column(DateTime, default=datetime_aware)
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
        def raw(self):
            return [self.id, self.message_id, self.start, self.end, self.content, self.date]
    
    
    class TestTyping(Base):
    
        __tablename__ = "test_typing"
    
    
        id = Column(Integer, primary_key=True, index=True)
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
        created_at = Column(DateTime, default=datetime_aware)
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
        code = Column(String)
    
        entries = relationship("TestTypingEntry", backref="typing")
    
    
    class TestTypingEntry(Base):
        __tablename__ = "test_typing_entry"
    
        id = Column(Integer, primary_key=True, index=True)
        typing_id = Column(Integer, ForeignKey("test_typing.id"), index=True)
        exerciceId = Column(Integer)
        position = Column(Integer)
        downtime = Column(Integer)
        uptime = Column(Integer)
        keyCode = Column(Integer)
        keyValue = Column(String)
    
    class SurveyGroupQuestion(Base):
        __tablename__ = "survey_group_questions"
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
    
    
        group_id = Column(Integer, ForeignKey("survey_groups.id"), primary_key=True)
        question_id = Column(Integer, ForeignKey("survey_questions.id"), primary_key=True)
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
    
    
    class SurveyQuestion(Base):
        __tablename__ = "survey_questions"
    
        id = Column(Integer, primary_key=True, index=True)
    
        question = Column(String)
        correct = Column(Integer)
        option1 = Column(String)
        option2 = Column(String)
        option3 = Column(String)
        option4 = Column(String)
        option5 = Column(String)
        option6 = Column(String)
        option7 = Column(String)
        option8 = Column(String)
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
    
    
    class SurveyGroup(Base):
        __tablename__ = "survey_groups"
    
        id = Column(Integer, primary_key=True, index=True)
        title = Column(String)
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
        demo = Column(String, default=False)
    
        questions = relationship(
            "SurveyQuestion", secondary="survey_group_questions", backref="group"
        )
    
    class SurveySurvey(Base):
        __tablename__ = "survey_surveys"
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
    
        id = Column(Integer, primary_key=True, index=True)
        title = Column(String)
    
        groups = relationship(
            "SurveyGroup", secondary="survey_survey_groups", backref="survey"
        )
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
        studies = relationship("Study", secondary="study_surveys", back_populates="surveys")
    
    
    
    class SurveySurveyGroup(Base):
        __tablename__ = "survey_survey_groups"
    
        survey_id = Column(Integer, ForeignKey("survey_surveys.id"), primary_key=True)
        group_id = Column(Integer, ForeignKey("survey_groups.id"), primary_key=True)
    
    
    
    class SurveyResponse(Base):
        __tablename__ = "survey_responses"
    
        id = Column(Integer, primary_key=True, index=True)
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
        sid = Column(String)
    
        uid = Column(Integer, ForeignKey("users.id"), default=None)
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
        created_at = Column(DateTime, default=datetime_aware)
    
        survey_id = Column(Integer, ForeignKey("survey_surveys.id"))
        group_id = Column(Integer, ForeignKey("survey_groups.id"))
    
        question_id = Column(Integer, ForeignKey("survey_questions.id"))
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
        selected_id = Column(Integer)
    
        response_time = Column(Float)
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
        text = Column(String)
    
    class SurveyResponseInfo(Base):
        __tablename__ = "survey_response_info"
    
        id = Column(Integer, primary_key=True, index=True)
        sid = Column(String)
        birthyear = Column(Integer)
        gender = Column(String)
        primary_language = Column(String)
    
    class Study(Base):
        __tablename__ = "studies"
        id = Column(Integer, primary_key=True, index=True)
        title = Column(String)
        description = Column(String)
        start_date = Column(DateTime)
        end_date = Column(DateTime)
        chat_duration = Column(Integer)
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
    
        users = relationship("User", secondary="study_users", back_populates="studies")
        surveys = relationship(
            "SurveySurvey", secondary="study_surveys", back_populates="studies"
        )
    
    
    class StudyUser(Base):
        __tablename__ = "study_users"
    
        study_id = Column(Integer, ForeignKey("studies.id"), primary_key=True)
        user_id = Column(Integer, ForeignKey("users.id"), primary_key=True)
    
    
    class StudySurvey(Base):
        __tablename__ = "study_surveys"
    
        study_id = Column(Integer, ForeignKey("studies.id"), primary_key=True)
        survey_id = Column(Integer, ForeignKey("survey_surveys.id"), primary_key=True)