diff --git a/API/app/infrastructure/database/models/appeals.py b/API/app/infrastructure/database/models/appeals.py new file mode 100644 index 0000000..1fca48e --- /dev/null +++ b/API/app/infrastructure/database/models/appeals.py @@ -0,0 +1,32 @@ +from enum import Enum as PyEnum + +from sqlalchemy import Column, Integer, String, DateTime, Enum, ForeignKey +from sqlalchemy.orm import relationship +from sqlalchemy.sql import func + +from app.infrastructure.database.models import Base + + +class AppealStatusEnum(PyEnum): + NEW = 'новое' + IN_PROGRESS = 'в работе' + WAITING_FOR_USER_RESPONSE = 'ожидание ответа пользователя' + WAITING_FOR_SPECIALIST_RESPONSE = 'ожидание ответа специалиста' + RESOLVED = 'решено' + CLOSED = 'закрыто' + REJECTED = 'отклонено' + + +class Appeal(Base): + __tablename__ = 'appeals' + + id = Column(Integer, primary_key=True, autoincrement=True) + message = Column(String, nullable=False) + created_date = Column(DateTime, nullable=False, default=func.utcnow) + status = Column(Enum(AppealStatusEnum), nullable=False, default=AppealStatusEnum.NEW) + + topic_id = Column(Integer, ForeignKey('appeals_topics.id'), nullable=False) + user_id = Column(Integer, ForeignKey('users.id'), nullable=False) + + topic = relationship('AppealsTopic', back_populates='appeals') + user = relationship('User', back_populates='appeals') diff --git a/API/app/infrastructure/database/models/appeals_topics.py b/API/app/infrastructure/database/models/appeals_topics.py new file mode 100644 index 0000000..cf2e32e --- /dev/null +++ b/API/app/infrastructure/database/models/appeals_topics.py @@ -0,0 +1,13 @@ +from sqlalchemy import Column, Integer, VARCHAR +from sqlalchemy.orm import relationship + +from app.infrastructure.database.models import Base + + +class AppealsTopic(Base): + __tablename__ = 'appeals_topics' + + id = Column(Integer, primary_key=True, autoincrement=True) + title = Column(VARCHAR(500), nullable=False) + + appeals = relationship('Appeal', back_populates='topic') diff --git a/API/app/infrastructure/database/models/categories.py b/API/app/infrastructure/database/models/categories.py new file mode 100644 index 0000000..bca2a3f --- /dev/null +++ b/API/app/infrastructure/database/models/categories.py @@ -0,0 +1,14 @@ +from sqlalchemy import Column, Integer, VARCHAR, String +from sqlalchemy.orm import relationship + +from app.infrastructure.database.models import Base + + +class Category(Base): + __tablename__ = 'categories' + + id = Column(Integer, primary_key=True, autoincrement=True) + title = Column(VARCHAR(200), nullable=False) + description = Column(String, nullable=False) + + courses = relationship('Course', back_populates='category') diff --git a/API/app/infrastructure/database/models/course_students.py b/API/app/infrastructure/database/models/course_students.py new file mode 100644 index 0000000..c7030ff --- /dev/null +++ b/API/app/infrastructure/database/models/course_students.py @@ -0,0 +1,20 @@ +from sqlalchemy import Column, Integer, VARCHAR, String, ForeignKey, Date, Boolean +from sqlalchemy.sql import func +from sqlalchemy.orm import relationship + +from app.infrastructure.database.models import Base + + +class CourseStudent(Base): + __tablename__ = 'course_students' + + id = Column(Integer, primary_key=True, autoincrement=True) + enrollment_date = Column(Date, nullable=False, default=func.utcnow) + is_finished = Column(Boolean, nullable=False, default=False) + + course_id = Column(Integer, ForeignKey('courses.id'), nullable=False) + user_id = Column(Integer, ForeignKey('users.id'), nullable=False) + + course = relationship('Course', back_populates='students') + user = relationship('User', back_populates='enrolled_courses') + diff --git a/API/app/infrastructure/database/models/courses.py b/API/app/infrastructure/database/models/courses.py new file mode 100644 index 0000000..4a6ccd2 --- /dev/null +++ b/API/app/infrastructure/database/models/courses.py @@ -0,0 +1,20 @@ +from sqlalchemy import Column, Integer, VARCHAR, String, ForeignKey +from sqlalchemy.orm import relationship + +from app.infrastructure.database.models import Base + + +class Course(Base): + __tablename__ = 'courses' + + id = Column(Integer, primary_key=True, autoincrement=True) + title = Column(VARCHAR(200), nullable=False) + description = Column(String, nullable=False) + + category_id = Column(Integer, ForeignKey('categories.id'), nullable=False) + owner_user_id = Column(Integer, ForeignKey('users.id'), nullable=False) + + category = relationship('Category', back_populates='courses') + owner_user = relationship('User', back_populates='owned_courses') + + students = relationship('CourseStudent', back_populates='course') diff --git a/API/app/infrastructure/database/models/roles.py b/API/app/infrastructure/database/models/roles.py index fa9787b..e9435a0 100644 --- a/API/app/infrastructure/database/models/roles.py +++ b/API/app/infrastructure/database/models/roles.py @@ -9,3 +9,5 @@ class Role(Base): id = Column(Integer, primary_key=True, autoincrement=True) title = Column(VARCHAR(100), nullable=False) + + users = relationship('User', back_populates='role') diff --git a/API/app/infrastructure/database/models/users.py b/API/app/infrastructure/database/models/users.py index 1d128b1..0498078 100644 --- a/API/app/infrastructure/database/models/users.py +++ b/API/app/infrastructure/database/models/users.py @@ -1,13 +1,12 @@ -import datetime - -from sqlalchemy import Column, Integer, VARCHAR, Enum, DateTime, Date, String -from sqlalchemy.sql import func - from enum import Enum as PyEnum -from app.infrastructure.database.models import Base +from sqlalchemy import Column, Integer, VARCHAR, Enum, DateTime, Date, String, ForeignKey +from sqlalchemy.orm import relationship +from sqlalchemy.sql import func from werkzeug.security import check_password_hash, generate_password_hash +from app.infrastructure.database.models import Base + class UserGenderEnum(PyEnum): MALE = 'мужской' @@ -29,6 +28,14 @@ class User(Base): password = Column(String, nullable=False) email = Column(VARCHAR(200), nullable=False) + role_id = Column(Integer, ForeignKey('roles.id'), nullable=False) + + role = relationship('Role', back_populates='users') + + appeals = relationship('Appeal', back_populates='user') + owned_courses = relationship('Course', back_populates='owned_courses') + enrolled_courses = relationship('CourseStudent', back_populates='user') + def check_password(self, password): return check_password_hash(self.password, password)