From 20dc16a21764a54bac53547154309c0244ef63b9 Mon Sep 17 00:00:00 2001 From: deole2 Date: Tue, 7 Apr 2026 00:39:38 +0100 Subject: [PATCH] made settings page, can chnage account type and username and email --- database/db_commands.py | 35 ++++++++++++++++++++- routes/accounts/settings/settings.py | 46 ++++++++++++++++++++++++++++ templates/settings/settings.jinja | 28 +++++++++++++++++ 3 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 routes/accounts/settings/settings.py create mode 100644 templates/settings/settings.jinja diff --git a/database/db_commands.py b/database/db_commands.py index a2b66ba..b16471e 100644 --- a/database/db_commands.py +++ b/database/db_commands.py @@ -476,4 +476,37 @@ def search_programs(query): WHERE instr(LOWER(COALESCE(CAST(title AS TEXT), '')), ?1) > 0 OR instr(LOWER(COALESCE(CAST(description AS TEXT), '')), ?1) > 0 """, (query.lower(),)).fetchall() - return [dict(r) for r in rows] \ No newline at end of file + return [dict(r) for r in rows] + + +def update_user_settings(user_id, username, email, account_type=None): + email = email.strip().lower() + with get_db() as conn: + # Check if username is taken by someone else + existing_username = conn.execute( + "SELECT user_id FROM users WHERE username = ? AND user_id != ?", + (username, user_id) + ).fetchone() + if existing_username: + return False, "Username already taken" + + # Check if email is taken by someone else + existing_email = conn.execute( + "SELECT user_id FROM users WHERE LOWER(email) = LOWER(?) AND user_id != ?", + (email, user_id) + ).fetchone() + if existing_email: + return False, "Email already taken" + + # Update the user + if account_type is not None: + conn.execute( + "UPDATE users SET username = ?, email = ?, account_type = ? WHERE user_id = ?", + (username, email, account_type, user_id) + ) + else: + conn.execute( + "UPDATE users SET username = ?, email = ? WHERE user_id = ?", + (username, email, user_id) + ) + return True, "Settings updated successfully" \ No newline at end of file diff --git a/routes/accounts/settings/settings.py b/routes/accounts/settings/settings.py new file mode 100644 index 0000000..c667eb5 --- /dev/null +++ b/routes/accounts/settings/settings.py @@ -0,0 +1,46 @@ +from flask import render_template, Blueprint, g, redirect, url_for, request, flash +from database.db_commands import update_user_settings + + +page = Blueprint('settings', __name__, url_prefix='/settings') + + +@page.route('/', methods=['GET', 'POST']) +def home(): + if not g.user: + return redirect(url_for('login.login')) + if request.method == 'POST': + username = request.form.get('username', '').strip() + email = request.form.get('email', '').strip() + account_type_display = request.form.get('account_type', '').strip() + + # Map display names to database values + account_type_map = { + 'private account': 'private_user', + 'teacher': 'teacher', + 'student': 'student' + } + account_type = account_type_map.get(account_type_display) + + if not username or not email or not account_type: + flash('Username, email, and account type are required.', 'error') + return redirect(url_for('settings.home')) + + if '@' not in email or '.' not in email: + flash('Please enter a valid email address.', 'error') + return redirect(url_for('settings.home')) + + success, message = update_user_settings(g.user['user_id'], username, email, account_type) + flash(message, 'success' if success else 'error') + if success: + return redirect(url_for('settings.home')) + + # Map database values to display names for the template + account_type_display_map = { + 'private_user': 'private account', + 'teacher': 'teacher', + 'student': 'student' + } + current_account_type = account_type_display_map.get(g.user.get('account_type', 'private_user'), 'private account') + + return render_template('settings/settings.jinja', current_account_type=current_account_type) \ No newline at end of file diff --git a/templates/settings/settings.jinja b/templates/settings/settings.jinja new file mode 100644 index 0000000..0d5837b --- /dev/null +++ b/templates/settings/settings.jinja @@ -0,0 +1,28 @@ +{% extends "base.jinja" %} + +{% block title %}Settings{% endblock %} + +{% block content %} +
+

Settings

+
+
+ + +
+
+ + +
+
+ + +
+ +
+
+{% endblock %} \ No newline at end of file