Files
hypochonderportal/app.py
2025-11-12 13:30:51 +01:00

230 lines
8.1 KiB
Python

# 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/<int:record_id>', 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/<int:record_id>', 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)