From 7820b9fcc883a70b9b85a74e0bcb7b4dd14535ae Mon Sep 17 00:00:00 2001 From: girst Date: Wed, 26 Apr 2023 17:19:02 +0000 Subject: [PATCH] [DATABASE CHANGE: Migration below] allow setting user settings from profile page CREATE TABLE IF NOT EXISTS user_settings( user_id INTEGER, setting TEXT NOT NULL, value TEXT NOT NULL, PRIMARY KEY(user_id, setting), FOREIGN KEY(user_id) REFERENCES users(id)); --- app/common/user.py | 22 +++++++++++++++++++++- app/templates/account_mgmt.html.j2 | 10 ++++++++++ config/setup.sql | 6 ++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/app/common/user.py b/app/common/user.py index 7b62e7c..d935bf0 100644 --- a/app/common/user.py +++ b/app/common/user.py @@ -2,6 +2,7 @@ from werkzeug.security import generate_password_hash, check_password_hash from .common import cf import sqlite3 import secrets +import json from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user from flask import Blueprint, flash, redirect, render_template, url_for, request @@ -107,6 +108,16 @@ def init_login(app): def account_manager(): with sqlite3.connect(cf['global']['database']) as conn: c = conn.cursor() + c.execute(""" + SELECT setting, value + FROM user_settings + WHERE user_id = ? + """, (current_user.id,)) + result = c.fetchall() + settings = { + setting: json.loads(value) + for setting, value in result + } c.execute(""" SELECT token FROM user_tokens @@ -117,7 +128,7 @@ def init_login(app): (login_token,) = result else: login_token = "" - return render_template('account_mgmt.html.j2', login_token=login_token, random_pwd=secrets.token_hex(16)) + return render_template('account_mgmt.html.j2', settings=settings, login_token=login_token, random_pwd=secrets.token_hex(16)) @usermgmt.route('/manage/account', methods=['POST']) @login_required @@ -139,6 +150,15 @@ def init_login(app): VALUES (?, ?) """, (current_user.id, new_token)) flash('new token generated.', 'info') + elif action == 'chset': + with sqlite3.connect(cf['global']['database']) as conn: + noshorts = request.form.get('noshorts') == 'yes' + c = conn.cursor() + c.execute(""" + INSERT OR REPLACE INTO user_settings (user_id, setting, value) + VALUES (?, ?, ?) + """, (current_user.id, "noshorts", json.dumps(noshorts))) + flash('settings saved.', 'info') elif action == 'addusr': if not current_user.admin: return "only admins may do that!", 403 diff --git a/app/templates/account_mgmt.html.j2 b/app/templates/account_mgmt.html.j2 index dce7455..db8928e 100644 --- a/app/templates/account_mgmt.html.j2 +++ b/app/templates/account_mgmt.html.j2 @@ -21,6 +21,16 @@ + +

Site settings

+
+
Subscription Feed +
+ + +
+
+ {% if current_user.admin %}

Administration

diff --git a/config/setup.sql b/config/setup.sql index 1f76da4..c94469a 100644 --- a/config/setup.sql +++ b/config/setup.sql @@ -76,3 +76,9 @@ CREATE TABLE IF NOT EXISTS users( CREATE TABLE IF NOT EXISTS user_tokens( -- stores revocable url tokens for feeds. user_id INTEGER PRIMARY KEY NOT NULL, token TEXT NOT NULL); +CREATE TABLE IF NOT EXISTS user_settings( -- stores per-user settings as a vertical table. + user_id INTEGER, + setting TEXT NOT NULL, + value TEXT NOT NULL, + PRIMARY KEY(user_id, setting), + FOREIGN KEY(user_id) REFERENCES users(id)); -- 2.39.3