| 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) |
|
|
| |
| 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) |
|
|
| |
| with app.app_context(): |
| db.create_all() |
|
|
| def add_score(score): |
| try: |
| score = int(score) |
| if score < 0: |
| return None, "Score cannot be negative" |
|
|
| |
| user_id = request.headers.get('User-Agent') + str(request.remote_addr) |
| user_id = hashlib.md5(user_id.encode()).hexdigest() |
|
|
| |
| 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: |
| |
| 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: |
| |
| user_id = request.headers.get('User-Agent') + str(request.remote_addr) |
| user_id = hashlib.md5(user_id.encode()).hexdigest() |
| |
| |
| 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) |
|
|
| |
| 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") |
|
|