Project / init_db.py
Geoeasy's picture
Upload 7 files
6a7fb3c verified
#!/usr/bin/env python3
"""
Script de inicialização automática da base de dados
Executado automaticamente ao iniciar a aplicação no Hugging Face Spaces
"""
import sqlite3
import bcrypt
from pathlib import Path
def init_database():
"""Inicializa a base de dados se não existir"""
BASE_DIR = Path(__file__).parent
DB_PATH = BASE_DIR / "db" / "app.db"
# Se a base de dados já existe, não fazer nada
if DB_PATH.exists():
print("✅ Base de dados já existe")
return
# Criar diretório
DB_PATH.parent.mkdir(parents=True, exist_ok=True)
print("=" * 60)
print("Inicialização da Base de Dados")
print("=" * 60)
# Conectar à BD
conn = sqlite3.connect(DB_PATH)
conn.execute("PRAGMA foreign_keys = ON")
cur = conn.cursor()
# Criar tabela users
print("\n[1/4] Criando tabela 'users'...")
cur.execute("""
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE NOT NULL,
password_hash TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
""")
print("✅ Tabela 'users' criada")
# Criar tabela tasks
print("\n[2/4] Criando tabela 'tasks'...")
cur.execute("""
CREATE TABLE IF NOT EXISTS tasks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL,
task_code TEXT UNIQUE NOT NULL,
task_name TEXT NOT NULL,
task_date DATE NOT NULL,
start_time TIMESTAMP NOT NULL,
end_time TIMESTAMP NOT NULL,
planned_hours REAL NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (username) REFERENCES users(username) ON DELETE CASCADE
)
""")
print("✅ Tabela 'tasks' criada")
# Criar tabela subtasks
print("\n[3/4] Criando tabela 'subtasks'...")
cur.execute("""
CREATE TABLE IF NOT EXISTS subtasks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
task_id INTEGER NOT NULL,
subtask_code TEXT UNIQUE NOT NULL,
subtask_name TEXT NOT NULL,
start_time TIMESTAMP NOT NULL,
end_time TIMESTAMP NOT NULL,
planned_hours REAL NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (task_id) REFERENCES tasks(id) ON DELETE CASCADE
)
""")
print("✅ Tabela 'subtasks' criada")
# Criar tabela task_logs
print("\n[4/4] Criando tabela 'task_logs'...")
cur.execute("""
CREATE TABLE IF NOT EXISTS task_logs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL,
task_id INTEGER,
activity TEXT NOT NULL,
event_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (username) REFERENCES users(username) ON DELETE CASCADE,
FOREIGN KEY (task_id) REFERENCES tasks(id) ON DELETE CASCADE
)
""")
print("✅ Tabela 'task_logs' criada")
# Criar utilizador de teste
print("\n[5/5] Criando utilizador de teste...")
username = "admin"
password = "admin123"
pw_hash = bcrypt.hashpw(password.encode(), bcrypt.gensalt()).decode()
try:
cur.execute(
"INSERT INTO users (username, password_hash) VALUES (?, ?)",
(username, pw_hash)
)
print(f"✅ Utilizador de teste criado:")
print(f" Username: {username}")
print(f" Password: {password}")
except sqlite3.IntegrityError:
print(f"⚠️ Utilizador '{username}' já existe")
# Commit e fechar
conn.commit()
conn.close()
print("\n" + "=" * 60)
print("✅ BASE DE DADOS INICIALIZADA COM SUCESSO!")
print("=" * 60)
if __name__ == "__main__":
init_database()