# app.py (final version) from flask import Flask, render_template, request, redirect, url_for, session, flash from flask_sqlalchemy import SQLAlchemy from datetime import datetime import os app = Flask(__name__) app.config['SECRET_KEY'] = 'your-secret-key-here' app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///health_tracker.db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) # User model class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) email = db.Column(db.String(120), unique=True, nullable=False) password = db.Column(db.String(120), nullable=False) created_at = db.Column(db.DateTime, default=datetime.utcnow) records = db.relationship('HealthRecord', backref='user', lazy=True) # Health record model class HealthRecord(db.Model): id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) illness_name = db.Column(db.String(200), nullable=False) diagnosis_date = db.Column(db.Date, nullable=False) severity = db.Column(db.String(20), nullable=False) treatment = db.Column(db.String(300)) description = db.Column(db.Text) created_at = db.Column(db.DateTime, default=datetime.utcnow) # Create tables with app.app_context(): db.create_all() @app.route('/') def index(): return render_template('index.html') @app.route('/register', methods=['GET', 'POST']) def register(): if request.method == 'POST': username = request.form['username'] email = request.form['email'] password = request.form['password'] # Check if user already exists existing_user = User.query.filter_by(username=username).first() if existing_user: flash('Username already exists', 'error') return render_template('register.html') existing_email = User.query.filter_by(email=email).first() if existing_email: flash('Email already registered', 'error') return render_template('register.html') # Create new user new_user = User(username=username, email=email, password=password) db.session.add(new_user) db.session.commit() flash('Registration successful! Please log in.', 'success') return redirect(url_for('login')) return render_template('register.html') @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] user = User.query.filter_by(username=username).first() if user and user.password == password: session['user_id'] = user.id session['username'] = user.username return redirect(url_for('dashboard')) else: flash('Invalid username or password', 'error') return render_template('login.html') @app.route('/logout') def logout(): session.pop('user_id', None) session.pop('username', None) flash('You have been logged out', 'info') return redirect(url_for('index')) @app.route('/dashboard') def dashboard(): if 'user_id' not in session: return redirect(url_for('login')) user = User.query.get(session['user_id']) records = HealthRecord.query.filter_by(user_id=user.id).order_by(HealthRecord.diagnosis_date.desc()).all() # Calculate statistics total_records = len(records) recovered = sum(1 for record in records if 'recovered' in record.description.lower() or 'healed' in record.description.lower()) active = total_records - recovered return render_template('dashboard.html', user=user, records=records, total_records=total_records, recovered=recovered, active=active) @app.route('/add_record', methods=['GET', 'POST']) def add_record(): if 'user_id' not in session: return redirect(url_for('login')) if request.method == 'POST': illness_name = request.form['illness_name'] diagnosis_date = datetime.strptime(request.form['diagnosis_date'], '%Y-%m-%d') severity = request.form['severity'] treatment = request.form['treatment'] description = request.form['description'] new_record = HealthRecord( user_id=session['user_id'], illness_name=illness_name, diagnosis_date=diagnosis_date, severity=severity, treatment=treatment, description=description ) db.session.add(new_record) db.session.commit() flash('Health record added successfully!', 'success') return redirect(url_for('dashboard')) return render_template('add_record.html') @app.route('/edit_record/', methods=['GET', 'POST']) def edit_record(record_id): if 'user_id' not in session: return redirect(url_for('login')) record = HealthRecord.query.get_or_404(record_id) # Verify user owns this record if record.user_id != session['user_id']: flash('Access denied', 'error') return redirect(url_for('dashboard')) if request.method == 'POST': record.illness_name = request.form['illness_name'] record.diagnosis_date = datetime.strptime(request.form['diagnosis_date'], '%Y-%m-%d') record.severity = request.form['severity'] record.treatment = request.form['treatment'] record.description = request.form['description'] db.session.commit() flash('Health record updated successfully!', 'success') return redirect(url_for('dashboard')) return render_template('edit_record.html', record=record) @app.route('/delete_record/', methods=['POST']) def delete_record(record_id): if 'user_id' not in session: return redirect(url_for('login')) record = HealthRecord.query.get_or_404(record_id) # Verify user owns this record if record.user_id != session['user_id']: flash('Access denied', 'error') return redirect(url_for('dashboard')) db.session.delete(record) db.session.commit() flash('Health record deleted successfully!', 'success') return redirect(url_for('dashboard')) @app.route('/predict_diseases', methods=['POST']) def predict_diseases(): # Make this endpoint publicly accessible current_disease = request.form['current_disease'].strip() # In a real application, this would process the data and generate predictions # For demonstration, we'll just simulate the result based on some common patterns # Get all health records to analyze correlations (no user session required) all_records = HealthRecord.query.all() # Simple correlation analysis (would be more complex in reality) correlation_data = [ { 'disease': 'Migraine', 'frequency': 12, 'confidence': 'High', 'description': 'Often occurs alongside Headache, with 12% of users reporting both conditions' }, { 'disease': 'Sinusitis', 'frequency': 8, 'confidence': 'Medium', 'description': 'Commonly associated with Headache in 8% of health records' }, { 'disease': 'Tension Headache', 'frequency': 25, 'confidence': 'High', 'description': 'Most frequent companion condition to Headache in our database (25% of cases)' }, { 'disease': 'Neck Strain', 'frequency': 15, 'confidence': 'Medium', 'description': 'Often reported alongside Headache, particularly in users with sedentary jobs' }, { 'disease': 'Anxiety', 'frequency': 20, 'confidence': 'High', 'description': 'Frequently co-occurs with Stress and Headache symptoms' } ] return render_template('prediction_results.html', current_disease=current_disease, correlations=correlation_data) if __name__ == '__main__': app.run(debug=True)