Spaces:
Sleeping
Sleeping
from typing import Literal | |
from typing_extensions import Annotated | |
import sqlalchemy | |
from sqlalchemy.orm import mapped_column | |
from sqlalchemy import Integer, String, ForeignKey,func, DateTime, Boolean, LargeBinary | |
from sqlalchemy.orm import DeclarativeBase, Mapped | |
import uuid | |
import datetime | |
import pytz | |
# Set Jakarta timezone | |
jakarta_tz = pytz.timezone('Asia/Jakarta') | |
def get_jakarta_time(): | |
return datetime.datetime.now(jakarta_tz) | |
# Use the timezone-aware function in SQLAlchemy annotations | |
timestamp_current = Annotated[ | |
datetime.datetime, | |
mapped_column(nullable=False, default=get_jakarta_time) # Use default instead of server_default | |
] | |
timestamp_update = Annotated[ | |
datetime.datetime, | |
mapped_column(nullable=False, default=get_jakarta_time, onupdate=get_jakarta_time) # onupdate uses the Python function | |
] | |
message_role = Literal["user", "assistant"] | |
class Base(DeclarativeBase): | |
type_annotation_map = { | |
message_role: sqlalchemy.Enum("user", "assistant", name="message_role"), | |
} | |
class User(Base): | |
__tablename__ = "user" | |
id = mapped_column(Integer, primary_key=True) | |
name = mapped_column(String(100), nullable=False) | |
username = mapped_column(String(100), unique=True, nullable=False) | |
role_id = mapped_column(Integer, ForeignKey("role.id")) | |
email = mapped_column(String(100), unique=True, nullable=False) | |
password_hash = mapped_column(String(100), nullable=False) | |
created_at: Mapped[timestamp_current] | |
updated_at : Mapped[timestamp_update] | |
class Feedback(Base): | |
__tablename__ = "feedback" | |
id = mapped_column(Integer, primary_key=True) | |
user_id = mapped_column(Integer, ForeignKey("user.id")) | |
rating = mapped_column(Integer) | |
comment = mapped_column(String(1000)) | |
created_at : Mapped[timestamp_current] | |
class Role(Base): | |
__tablename__ = "role" | |
id = mapped_column(Integer, primary_key=True) | |
role_name = mapped_column(String(200), nullable=False) | |
description = mapped_column(String(200)) | |
class User_Role(Base): | |
__tablename__ = "user_role" | |
id = mapped_column(Integer, primary_key=True) | |
user_id = mapped_column(Integer, ForeignKey("user.id")) | |
role_id = mapped_column(Integer, ForeignKey("role.id")) | |
class Bot(Base): | |
__tablename__ = "bot" | |
id = mapped_column(Integer, primary_key=True) | |
user_id = mapped_column(Integer, ForeignKey("user.id")) | |
bot_name = mapped_column(String(200), nullable=False) | |
created_at : Mapped[timestamp_current] | |
class Session(Base): | |
__tablename__ = "session" | |
id = mapped_column(String(36), primary_key=True, index=True, default=lambda: str(uuid.uuid4())) # Store as string | |
user_id = mapped_column(Integer, ForeignKey("user.id")) | |
bot_id = mapped_column(Integer, ForeignKey("bot.id")) | |
created_at : Mapped[timestamp_current] | |
updated_at : Mapped[timestamp_update] | |
class Message(Base): | |
__tablename__ = "message" | |
id = mapped_column(Integer, primary_key=True) | |
session_id = mapped_column(String(36), ForeignKey("session.id"), nullable=False) # Store as string | |
role : Mapped[message_role] | |
goal = mapped_column(String(200)) | |
created_at : Mapped[timestamp_current] | |
class Category(Base): | |
__tablename__ = "category" | |
id = mapped_column(Integer, primary_key=True) | |
category = mapped_column(String(200)) | |
created_at : Mapped[timestamp_current] | |
updated_at : Mapped[timestamp_update] | |
class Metadata(Base): | |
__tablename__ = "metadata" | |
id = mapped_column(Integer, primary_key=True) | |
title = mapped_column(String(200)) | |
# image_data = mapped_column(LargeBinary, nullable=True) | |
category_id = mapped_column(Integer, ForeignKey("category.id")) | |
author = mapped_column(String(200)) | |
year = mapped_column(Integer) | |
publisher = mapped_column(String(100)) | |
thumbnail = mapped_column(LargeBinary, nullable=True) | |
created_at : Mapped[timestamp_current] | |
updated_at : Mapped[timestamp_update] | |
class Bot_Meta(Base): | |
__tablename__ = "bot_meta" | |
id = mapped_column(Integer, primary_key=True) | |
bot_id = mapped_column(Integer, ForeignKey("bot.id")) | |
metadata_id = mapped_column(Integer, ForeignKey("metadata.id")) | |
created_at : Mapped[timestamp_current] | |
updated_at : Mapped[timestamp_update] | |
class User_Meta(Base): | |
__tablename__ = "user_meta" | |
id = mapped_column(Integer, primary_key=True) | |
user_id = mapped_column(Integer, ForeignKey("user.id")) | |
metadata_id = mapped_column(Integer, ForeignKey("metadata.id")) | |
created_at : Mapped[timestamp_current] | |
updated_at : Mapped[timestamp_update] | |
class Planning(Base): | |
__tablename__="planning" | |
id = mapped_column(Integer, primary_key=True) | |
trials_id = mapped_column(Integer, ForeignKey("trials.id")) | |
planning_name = mapped_column(String(200), nullable=False) | |
duration = mapped_column(Integer, nullable=False) # Duration in months | |
start_date = mapped_column(DateTime, nullable=False) # Start date of the planning | |
end_date = mapped_column(DateTime, nullable=False) # End date of the planning | |
is_activated = mapped_column(Boolean) | |
created_at : Mapped[timestamp_current] # Automatically sets the current timestamp | |
class Trials(Base): | |
__tablename__ = "trials" | |
id = mapped_column(Integer, primary_key=True) | |
token_used = mapped_column(Integer, nullable=False) # Adjust length as needed | |
token_planned = mapped_column(Integer, nullable=False) | |
class Session_Publisher(Base): | |
__tablename__ = "session_publisher" | |
id = mapped_column(String(36), primary_key=True, index=True, default=lambda: str(uuid.uuid4())) # Store as string | |
user_id = mapped_column(Integer, ForeignKey("user.id")) | |
metadata_id = mapped_column(Integer, ForeignKey("metadata.id")) | |
created_at : Mapped[timestamp_current] | |
updated_at : Mapped[timestamp_update] |