Pomodoro / app.py
Oranblock's picture
Update app.py
1868937 verified
import os
from flask import Flask, render_template, request, jsonify, session
import sqlite3
from datetime import datetime
import random
import string
import logging
import bcrypt
app = Flask(__name__)
app.secret_key = 'your_secret_key_here' # Replace with a real secret key
logging.basicConfig(level=logging.DEBUG)
otp_code = None
otp_expiration = None
def get_db():
db = sqlite3.connect('database.db')
db.row_factory = sqlite3.Row
return db
@app.route('/')
def index():
return render_template('index.html')
@app.route('/start_session', methods=['POST'])
def start_session():
start_time = datetime.now().isoformat()
session_type = request.json.get('session_type')
duration = request.json.get('duration')
user_id = session.get('user_id')
with get_db() as conn:
cursor = conn.cursor()
cursor.execute('INSERT INTO sessions (user_id, start_time, session_type, duration) VALUES (?, ?, ?, ?)',
(user_id, start_time, session_type, duration))
conn.commit()
session_id = cursor.lastrowid
return jsonify({'session_id': session_id})
@app.route('/end_session', methods=['POST'])
def end_session():
session_id = request.json.get('session_id')
end_time = datetime.now().isoformat()
with get_db() as conn:
cursor = conn.cursor()
cursor.execute('UPDATE sessions SET end_time = ? WHERE id = ?', (end_time, session_id))
conn.commit()
return '', 204
@app.route('/save_script', methods=['POST'])
def save_script():
session_id = request.json.get('session_id')
script_code = request.json.get('script_code')
with get_db() as conn:
cursor = conn.cursor()
cursor.execute('UPDATE sessions SET script_code = ? WHERE id = ?', (script_code, session_id))
conn.commit()
return '', 204
@app.route('/scripts', methods=['GET'])
def get_scripts():
user_id = session.get('user_id')
with get_db() as conn:
cursor = conn.cursor()
cursor.execute('SELECT id, start_time, end_time, script_code, rating, comments, session_type, duration FROM sessions WHERE user_id = ?', (user_id,))
scripts = cursor.fetchall()
return jsonify([dict(row) for row in scripts])
@app.route('/rate_script', methods=['POST'])
def rate_script():
session_id = request.json.get('session_id')
rating = request.json.get('rating')
with get_db() as conn:
cursor = conn.cursor()
cursor.execute('UPDATE sessions SET rating = ? WHERE id = ?', (rating, session_id))
conn.commit()
return '', 204
@app.route('/comment_script', methods=['POST'])
def comment_script():
session_id = request.json.get('session_id')
comments = request.json.get('comments')
with get_db() as conn:
cursor = conn.cursor()
cursor.execute('UPDATE sessions SET comments = ? WHERE id = ?', (comments, session_id))
conn.commit()
return '', 204
@app.route('/generate_otp', methods=['GET'])
def generate_otp_route():
generate_otp()
return '', 204
@app.route('/reset_database', methods=['POST'])
def reset_database():
input_otp = request.json.get('otp')
if validate_otp(input_otp):
with get_db() as conn:
cursor = conn.cursor()
cursor.execute('DROP TABLE IF EXISTS sessions')
cursor.execute('DROP TABLE IF EXISTS users')
cursor.execute('DROP TABLE IF EXISTS tasks')
cursor.execute('DROP TABLE IF EXISTS settings')
cursor.execute('DROP TABLE IF EXISTS admin_settings')
conn.commit()
init_db()
return '', 204
else:
return jsonify({'error': 'Invalid OTP'}), 403
@app.route('/register', methods=['POST'])
def register():
username = request.json.get('username')
password = request.json.get('password')
hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
with get_db() as conn:
cursor = conn.cursor()
try:
cursor.execute('INSERT INTO users (username, password) VALUES (?, ?)', (username, hashed_password))
conn.commit()
return jsonify({'message': 'User registered successfully'}), 201
except sqlite3.IntegrityError:
return jsonify({'error': 'Username already exists'}), 400
@app.route('/login', methods=['POST'])
def login():
username = request.json.get('username')
password = request.json.get('password')
with get_db() as conn:
cursor = conn.cursor()
cursor.execute('SELECT id, password, is_admin FROM users WHERE username = ?', (username,))
user = cursor.fetchone()
if user and bcrypt.checkpw(password.encode('utf-8'), user['password']):
session['user_id'] = user['id']
session['is_admin'] = user['is_admin']
return jsonify({'message': 'Login successful', 'is_admin': user['is_admin']}), 200
else:
return jsonify({'error': 'Invalid username or password'}), 401
@app.route('/logout', methods=['POST'])
def logout():
session.clear()
return jsonify({'message': 'Logout successful'}), 200
@app.route('/add_task', methods=['POST'])
def add_task():
user_id = session.get('user_id')
description = request.json.get('description')
with get_db() as conn:
cursor = conn.cursor()
cursor.execute('INSERT INTO tasks (user_id, description) VALUES (?, ?)', (user_id, description))
conn.commit()
task_id = cursor.lastrowid
return jsonify({'task_id': task_id, 'message': 'Task added successfully'}), 201
@app.route('/get_tasks', methods=['GET'])
def get_tasks():
user_id = session.get('user_id')
with get_db() as conn:
cursor = conn.cursor()
cursor.execute('SELECT id, description, completed FROM tasks WHERE user_id = ?', (user_id,))
tasks = cursor.fetchall()
return jsonify([dict(row) for row in tasks])
@app.route('/update_task', methods=['POST'])
def update_task():
task_id = request.json.get('task_id')
completed = request.json.get('completed')
with get_db() as conn:
cursor = conn.cursor()
cursor.execute('UPDATE tasks SET completed = ? WHERE id = ?', (completed, task_id))
conn.commit()
return jsonify({'message': 'Task updated successfully'}), 200
@app.route('/get_settings', methods=['GET'])
def get_settings():
user_id = session.get('user_id')
with get_db() as conn:
cursor = conn.cursor()
cursor.execute('SELECT setting_name, setting_value FROM settings WHERE user_id = ?', (user_id,))
settings = dict(cursor.fetchall())
return jsonify(settings)
@app.route('/update_settings', methods=['POST'])
def update_settings():
user_id = session.get('user_id')
new_settings = request.json
with get_db() as conn:
cursor = conn.cursor()
for setting, value in new_settings.items():
cursor.execute('INSERT OR REPLACE INTO settings (user_id, setting_name, setting_value) VALUES (?, ?, ?)',
(user_id, setting, str(value)))
conn.commit()
return jsonify({'message': 'Settings updated successfully'}), 200
@app.route('/get_statistics', methods=['GET'])
def get_statistics():
user_id = session.get('user_id')
with get_db() as conn:
cursor = conn.cursor()
cursor.execute('''
SELECT
COUNT(*) as total_sessions,
SUM(CASE WHEN session_type = 'work' THEN duration ELSE 0 END) as total_work_time,
AVG(rating) as average_rating
FROM sessions
WHERE user_id = ?
''', (user_id,))
stats = cursor.fetchone()
return jsonify({
'total_sessions': stats['total_sessions'],
'total_work_time': stats['total_work_time'],
'average_rating': stats['average_rating']
})
@app.route('/update_admin_settings', methods=['POST'])
def update_admin_settings():
if not session.get('is_admin'):
return jsonify({'error': 'Unauthorized'}), 403
settings = request.json
with get_db() as conn:
cursor = conn.cursor()
for setting, value in settings.items():
cursor.execute('INSERT OR REPLACE INTO admin_settings (setting_name, setting_value) VALUES (?, ?)', (setting, int(value)))
conn.commit()
return jsonify({'success': True}), 200
@app.route('/get_admin_settings', methods=['GET'])
def get_admin_settings():
if not session.get('is_admin'):
return jsonify({'error': 'Unauthorized'}), 403
with get_db() as conn:
cursor = conn.cursor()
cursor.execute('SELECT setting_name, setting_value FROM admin_settings')
settings = dict(cursor.fetchall())
return jsonify(settings)
if __name__ == '__main__':
init_db()
app.run(debug=True)