48 lines
2.0 KiB
Python
48 lines
2.0 KiB
Python
from flask_sqlalchemy import SQLAlchemy
|
|
from flask_login import UserMixin
|
|
from datetime import datetime
|
|
|
|
db = SQLAlchemy()
|
|
|
|
class User(UserMixin, db.Model):
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
username = db.Column(db.String(150), unique=True, nullable=False)
|
|
password = db.Column(db.String(150), nullable=False)
|
|
api_key = db.Column(db.String(200), nullable=True) # Optional: User-specific Gemini Key
|
|
total_spend = db.Column(db.Float, default=0.0)
|
|
is_admin = db.Column(db.Boolean, default=False)
|
|
|
|
class Project(db.Model):
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
|
|
name = db.Column(db.String(150), nullable=False)
|
|
folder_path = db.Column(db.String(300), nullable=False)
|
|
created_at = db.Column(db.DateTime, default=datetime.utcnow)
|
|
|
|
# Relationships
|
|
runs = db.relationship('Run', backref='project', lazy=True, cascade="all, delete-orphan")
|
|
|
|
class Run(db.Model):
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
project_id = db.Column(db.Integer, db.ForeignKey('project.id'), nullable=False)
|
|
status = db.Column(db.String(50), default="queued") # queued, running, completed, failed
|
|
start_time = db.Column(db.DateTime, default=datetime.utcnow)
|
|
end_time = db.Column(db.DateTime, nullable=True)
|
|
log_file = db.Column(db.String(300), nullable=True)
|
|
cost = db.Column(db.Float, default=0.0)
|
|
progress = db.Column(db.Integer, default=0)
|
|
|
|
# Relationships
|
|
logs = db.relationship('LogEntry', backref='run', lazy=True, cascade="all, delete-orphan")
|
|
|
|
def duration(self):
|
|
if self.end_time and self.start_time:
|
|
return str(self.end_time - self.start_time).split('.')[0]
|
|
return "Running..."
|
|
|
|
class LogEntry(db.Model):
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
run_id = db.Column(db.Integer, db.ForeignKey('run.id'), nullable=False)
|
|
timestamp = db.Column(db.DateTime, default=datetime.utcnow)
|
|
phase = db.Column(db.String(50))
|
|
message = db.Column(db.Text) |