parent
7cea1003de
commit
039e341f33
@ -0,0 +1,15 @@ |
|||||||
|
from flask import Flask |
||||||
|
from db.model import db |
||||||
|
from config import * |
||||||
|
app = Flask(__name__) |
||||||
|
app.config["SQLALCHEMY_DATABASE_URI"] = DB_URI |
||||||
|
db.init_app(app) |
||||||
|
|
||||||
|
@app.route('/', methods=['GET', 'POST']) |
||||||
|
def homepage(): |
||||||
|
return {'message': 'Cocks were sucked !'}, 200 |
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
with app.app_context(): |
||||||
|
db.create_all() |
||||||
|
app.run(host='0.0.0.0', port=9999, debug=True) |
@ -0,0 +1,19 @@ |
|||||||
|
import os |
||||||
|
|
||||||
|
DB_ENGINE: str = "postgresql" |
||||||
|
DB_USER: str = "postgres" |
||||||
|
DB_PASSWORD: str = "1234" |
||||||
|
DB_HOST: str = "localhost" |
||||||
|
DB_PORT: int = 5432 |
||||||
|
DB_NAME: str = "educonnect" |
||||||
|
|
||||||
|
|
||||||
|
DEFAULT_PROFILE_FILE: str = "defaultUserBanner.png" |
||||||
|
DEFAULT_COURSE_COVER: str = "defaultCourseCover.png" |
||||||
|
DEFAULT_BADGE_ICON: str = "defaultBadgeIcon.png" |
||||||
|
|
||||||
|
PROJECT_ROOT: os.path = os.path.dirname(os.path.abspath(__file__)) |
||||||
|
USER_UPLOADS_DIR: str = os.path.join(PROJECT_ROOT, "uploads") |
||||||
|
|
||||||
|
DB_URI: str = f"{DB_ENGINE}://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}" |
||||||
|
ACTIVATE_ACCOUNTS_ON_SIGNUP: bool = True |
@ -0,0 +1,20 @@ |
|||||||
|
from enum import Enum |
||||||
|
|
||||||
|
class UserRole(Enum): |
||||||
|
ADMIN = 0 |
||||||
|
USER = 1 |
||||||
|
|
||||||
|
class PublishedStatus(Enum): |
||||||
|
APPROVED = 0 |
||||||
|
PENDING = 1 |
||||||
|
DECLINED = 2 |
||||||
|
REVOKED = 3 |
||||||
|
BANNED = 4 |
||||||
|
DRAFT = 5 |
||||||
|
|
||||||
|
class NotificationTypes(Enum): |
||||||
|
MENTION = 0 |
||||||
|
COURSE_PUBLISH_STATUS_UPDATE = 1 |
||||||
|
NEW_BADGE = 2 |
||||||
|
TEXT_WITH_URL = 3 |
||||||
|
PLAINTEXT_NOTICE = 4 |
@ -0,0 +1,148 @@ |
|||||||
|
from flask_sqlalchemy import SQLAlchemy |
||||||
|
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship, MappedAsDataclass |
||||||
|
from sqlalchemy import types, text, String, DateTime, func, Boolean, ForeignKey, SmallInteger |
||||||
|
from datetime import datetime |
||||||
|
import uuid |
||||||
|
from typing import List |
||||||
|
from config import * |
||||||
|
from constants import UserRole, PublishedStatus |
||||||
|
|
||||||
|
class Base(MappedAsDataclass, DeclarativeBase): |
||||||
|
pass |
||||||
|
|
||||||
|
db = SQLAlchemy(model_class=Base) |
||||||
|
|
||||||
|
class User(db.Model): |
||||||
|
__tablename__ = 'user' |
||||||
|
|
||||||
|
id: Mapped[uuid.UUID] = mapped_column(types.Uuid, primary_key=True, init=False, server_default=text("gen_random_uuid()")) |
||||||
|
email: Mapped[str] = mapped_column(String(64), nullable=False, unique=True) |
||||||
|
firstName: Mapped[str] = mapped_column(String(32), nullable=False) |
||||||
|
lastName: Mapped[str] = mapped_column(String(32), nullable=False) |
||||||
|
username: Mapped[str] = mapped_column(String(32), nullable=False) |
||||||
|
sessions: Mapped[List["Session"]] = relationship(back_populates="user", cascade="all, delete-orphan") |
||||||
|
enrollments: Mapped[List["Enrollment"]] = relationship(back_populates="user", cascade="all, delete-orphan") |
||||||
|
quizzes: Mapped[List["Quiz"]] = relationship(back_populates="creatorUser", cascade="all, delete-orphan") |
||||||
|
pfpFilename: Mapped[str] = mapped_column(String(256), nullable=False, default=DEFAULT_PROFILE_FILE) |
||||||
|
joinedDate: Mapped[datetime] = mapped_column(DateTime, nullable=False, default=func.now()) |
||||||
|
lastOnline: Mapped[datetime] = mapped_column(DateTime, nullable=False, default=func.now(), onupdate=func.now()) |
||||||
|
bio: Mapped[str] = mapped_column(String(256), nullable=False, default='') |
||||||
|
role: Mapped[int] = mapped_column(SmallInteger, nullable=False, default=UserRole.USER) |
||||||
|
isActivated: Mapped[bool] = mapped_column(Boolean, nullable=False, default=ACTIVATE_ACCOUNTS_ON_SIGNUP) |
||||||
|
|
||||||
|
class Session(db.Model): |
||||||
|
__tablename__ = 'session' |
||||||
|
|
||||||
|
id: Mapped[uuid.UUID] = mapped_column(types.Uuid, primary_key=True, init=False, server_default=text("gen_random_uuid()")) |
||||||
|
userID: Mapped[uuid.UUID] = mapped_column(ForeignKey("user.id")) |
||||||
|
user: Mapped["User"] = relationship(back_populates="sessions") |
||||||
|
key: Mapped[str] = mapped_column(String(256), nullable=False, unique=True) |
||||||
|
ua: Mapped[str] = mapped_column(String(1024), nullable=False) |
||||||
|
creationDate: Mapped[datetime] = mapped_column(DateTime, nullable=False, default=func.now()) |
||||||
|
lastUsed: Mapped[datetime] = mapped_column(DateTime, nullable=False, default=func.now(), onupdate=func.now()) |
||||||
|
isValid: Mapped[bool] = mapped_column(Boolean, nullable=False, default=True) |
||||||
|
|
||||||
|
class Category(db.Model): |
||||||
|
__tablename__ = 'category' |
||||||
|
|
||||||
|
id: Mapped[uuid.UUID] = mapped_column(types.Uuid, primary_key=True, init=False, server_default=text("gen_random_uuid()")) |
||||||
|
name: Mapped[str] = mapped_column(String(32), nullable=False, unique=True) |
||||||
|
courses: Mapped[List["Course"]] = relationship(back_populates="category", cascade="all, delete-orphan") |
||||||
|
description: Mapped[str] = mapped_column(String(128), nullable=False, default='') |
||||||
|
isActive: Mapped[bool] = mapped_column(Boolean, nullable=False, default=True) |
||||||
|
creationDate: Mapped[datetime] = mapped_column(DateTime, nullable=False, default=func.now()) |
||||||
|
|
||||||
|
class Course(db.Model): |
||||||
|
__tablename__ = 'course' |
||||||
|
|
||||||
|
id: Mapped[uuid.UUID] = mapped_column(types.Uuid, primary_key=True, init=False, server_default=text("gen_random_uuid()")) |
||||||
|
name: Mapped[str] = mapped_column(String(64), nullable=False, unique=True) |
||||||
|
categoryID: Mapped[uuid.UUID] = mapped_column(ForeignKey("category.id")) |
||||||
|
category: Mapped["Category"] = relationship(back_populates="courses") |
||||||
|
enrollments: Mapped[List["Enrollment"]] = relationship(back_populates="course", cascade="all, delete-orphan") |
||||||
|
quizzes: Mapped[List['Quiz']] = relationship(back_populates="course", cascade="all, delete-orphan") |
||||||
|
description: Mapped[str] = mapped_column(String(1024), nullable=False, default='') |
||||||
|
isActive: Mapped[bool] = mapped_column(Boolean, nullable=False, default=True) |
||||||
|
publishedStatus: Mapped[int] = mapped_column(SmallInteger, nullable=False, default=PublishedStatus.DRAFT) |
||||||
|
creationDate: Mapped[datetime] = mapped_column(DateTime, nullable=False, default=func.now()) |
||||||
|
coverImage: Mapped[str] = mapped_column(String(256), nullable=False, default=DEFAULT_COURSE_COVER) |
||||||
|
serverFilename: Mapped[str] = mapped_column(String(256), nullable=False, default='') |
||||||
|
|
||||||
|
class Enrollment(db.Model): |
||||||
|
__tablename__ = 'enrollment' |
||||||
|
|
||||||
|
id: Mapped[uuid.UUID] = mapped_column(types.Uuid, primary_key=True, init=False, server_default=text("gen_random_uuid()")) |
||||||
|
userID: Mapped[uuid.UUID] = mapped_column(ForeignKey("user.id")) |
||||||
|
user: Mapped["User"] = relationship(back_populates="enrollments") |
||||||
|
courseID: Mapped[uuid.UUID] = mapped_column(ForeignKey("course.id")) |
||||||
|
course: Mapped["Course"] = relationship(back_populates="enrollments") |
||||||
|
joinedDate: Mapped[datetime] = mapped_column(DateTime, nullable=False, default=func.now()) |
||||||
|
lastActivity: Mapped[datetime] = mapped_column(DateTime, nullable=False, default=func.now(), onupdate=func.now()) |
||||||
|
currentPage: Mapped[int] = mapped_column(nullable=False, default=1) |
||||||
|
maxPage: Mapped[int] = mapped_column(nullable=False, default=1) |
||||||
|
|
||||||
|
class Quiz(db.Model): |
||||||
|
__tablename__ = 'quiz' |
||||||
|
|
||||||
|
id: Mapped[uuid.UUID] = mapped_column(types.Uuid, primary_key=True, init=False, server_default=text("gen_random_uuid()")) |
||||||
|
creatorUserID: Mapped[uuid.UUID] = mapped_column(ForeignKey("user.id")) |
||||||
|
creatorUser: Mapped["User"] = relationship(back_populates="quizzes") |
||||||
|
courseID: Mapped[uuid.UUID] = mapped_column(ForeignKey("course.id")) |
||||||
|
course: Mapped["Course"] = relationship(back_populates="quizzes") |
||||||
|
quizJson: Mapped[str] = mapped_column(String, nullable=False) |
||||||
|
creationDate: Mapped[datetime] = mapped_column(DateTime, nullable=False, default=func.now()) |
||||||
|
isActive: Mapped[bool] = mapped_column(Boolean, nullable=False, default=True) |
||||||
|
|
||||||
|
class QuizAttempt(db.Model): |
||||||
|
__tablename__ = 'quiz_attempts' |
||||||
|
|
||||||
|
id: Mapped[uuid.UUID] = mapped_column(types.Uuid, primary_key=True, init=False, server_default=text("gen_random_uuid()")) |
||||||
|
userID: Mapped[uuid.UUID] = mapped_column(ForeignKey("user.id")) |
||||||
|
user: Mapped["User"] = relationship(back_populates="quiz_attempts") |
||||||
|
quizID: Mapped[uuid.UUID] = mapped_column(ForeignKey("quiz.id")) |
||||||
|
quiz: Mapped["Quiz"] = relationship(back_populates="quiz_attempts") |
||||||
|
answerKey: Mapped[str] = mapped_column(String, nullable=False) |
||||||
|
score: Mapped[int] = mapped_column(default=0, nullable=False) |
||||||
|
attemptDate: Mapped[datetime] = mapped_column(DateTime, nullable=False, default=func.now()) |
||||||
|
|
||||||
|
class Chat(db.Model): |
||||||
|
__tablename__ = 'chat' |
||||||
|
|
||||||
|
id: Mapped[uuid.UUID] = mapped_column(types.Uuid, primary_key=True, init=False, server_default=text("gen_random_uuid()")) |
||||||
|
textContent: Mapped[str] = mapped_column(nullable=False) |
||||||
|
userID: Mapped[uuid.UUID] = mapped_column(ForeignKey("user.id")) |
||||||
|
courseID: Mapped[uuid.UUID] = mapped_column(ForeignKey("course.id")) |
||||||
|
course: Mapped["Course"] = relationship(back_populates="chats") |
||||||
|
user: Mapped["User"] = relationship(back_populates="chats") |
||||||
|
chatDate: Mapped[datetime] = mapped_column(DateTime, nullable=False, default=func.now()) |
||||||
|
|
||||||
|
class Notification(db.Model): |
||||||
|
__tablename__ = 'notification' |
||||||
|
|
||||||
|
id: Mapped[uuid.UUID] = mapped_column(types.Uuid, primary_key=True, init=False, server_default=text("gen_random_uuid()")) |
||||||
|
userID: Mapped[uuid.UUID] = mapped_column(ForeignKey("user.id")) |
||||||
|
user: Mapped["User"] = relationship(back_populates="notifications") |
||||||
|
notificationType: Mapped[int] = mapped_column(SmallInteger, nullable=False) |
||||||
|
notificationData: Mapped[str] = mapped_column(String, nullable=False) |
||||||
|
isSeen: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False) |
||||||
|
notifDate: Mapped[datetime] = mapped_column(DateTime, nullable=False, default=func.now()) |
||||||
|
|
||||||
|
class Badge(db.Model): |
||||||
|
__tablename__ = 'badge' |
||||||
|
|
||||||
|
id: Mapped[uuid.UUID] = mapped_column(types.Uuid, primary_key=True, init=False, server_default=text("gen_random_uuid()")) |
||||||
|
name: Mapped[str] = mapped_column(String(16), nullable=False) |
||||||
|
description: Mapped[str] = mapped_column(String(256), nullable=False, default='') |
||||||
|
createDate: Mapped[datetime] = mapped_column(DateTime, nullable=False, default=func.now()) |
||||||
|
icon: Mapped[str] = mapped_column(String(256), nullable=False, default='') |
||||||
|
canClaim: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False) |
||||||
|
|
||||||
|
class UserBadge(db.Model): |
||||||
|
__tablename__ = 'userbadge' |
||||||
|
id: Mapped[uuid.UUID] = mapped_column(types.Uuid, primary_key=True, init=False, server_default=text("gen_random_uuid()")) |
||||||
|
userID: Mapped[uuid.UUID] = mapped_column(ForeignKey("user.id")) |
||||||
|
badgeID: Mapped[uuid.UUID] = mapped_column(ForeignKey("badge.id")) |
||||||
|
user: Mapped["User"] = relationship(back_populates="user_badges") |
||||||
|
badge: Mapped["Badge"] = relationship(back_populates="user_badges") |
||||||
|
claimedDate: Mapped[datetime] = mapped_column(DateTime, nullable=False, default=func.now()) |
||||||
|
|
Loading…
Reference in new issue