q-tracker / app.py
nivin-ai's picture
Upload 3 files
fa30f8f verified
import gradio as gr
from flask import Flask, render_template, request, jsonify
from datetime import datetime
from flask_sqlalchemy import SQLAlchemy
import os
from sqlalchemy import func
import hashlib
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = os.environ.get('DATABASE_URL', 'sqlite:///scores.db')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
# Database models
class Score(db.Model):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.String(36), nullable=False)
score = db.Column(db.Integer, nullable=False)
timestamp = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
# Create tables
with app.app_context():
db.create_all()
def add_score(score):
try:
score = int(score)
if score < 0:
return None, "Score cannot be negative"
# Generate a unique user ID based on browser fingerprint
user_id = request.headers.get('User-Agent') + str(request.remote_addr)
user_id = hashlib.md5(user_id.encode()).hexdigest()
# Create new score entry
new_score = Score(
user_id=user_id,
score=score
)
db.session.add(new_score)
db.session.commit()
return None, "Score added successfully"
except ValueError:
return None, "Please enter a valid number"
except Exception as e:
return None, str(e)
def get_scores():
try:
# Get user's scores
user_id = request.headers.get('User-Agent') + str(request.remote_addr)
user_id = hashlib.md5(user_id.encode()).hexdigest()
scores = db.session.query(Score).filter_by(user_id=user_id).order_by(Score.timestamp).all()
return scores, None
except Exception as e:
return None, str(e)
def clear_scores():
try:
# Get user's scores
user_id = request.headers.get('User-Agent') + str(request.remote_addr)
user_id = hashlib.md5(user_id.encode()).hexdigest()
# Delete all scores for this user
Score.query.filter_by(user_id=user_id).delete()
db.session.commit()
return None, "Scores cleared successfully"
except Exception as e:
return None, str(e)
# Create Gradio interface
def create_interface():
with gr.Blocks() as demo:
gr.Markdown("# Question Tracker")
with gr.Row():
score_input = gr.Number(label="Number of Questions Solved", minimum=0)
add_button = gr.Button("Add Score")
with gr.Row():
clear_button = gr.Button("Clear Scores")
output_text = gr.Textbox(label="Status")
chart = gr.LinePlot()
def update_chart():
scores, error = get_scores()
if error:
return None, error
if scores:
timestamps = [score.timestamp.strftime('%Y-%m-%d') for score in scores]
values = [score.score for score in scores]
return gr.LinePlot.update(values=[values], x=timestamps), None
return None, "No scores recorded yet"
add_button.click(
fn=add_score,
inputs=[score_input],
outputs=[chart, output_text]
)
clear_button.click(
fn=clear_scores,
outputs=[chart, output_text]
)
return demo
if __name__ == "__main__":
demo = create_interface()
demo.launch(server_name="0.0.0.0")