From 30d1206ebca6e777e507427a31da6a0f8b48e141 Mon Sep 17 00:00:00 2001 From: mst Date: Sun, 8 Sep 2024 15:46:55 +0300 Subject: [PATCH] 1.2.0-alpha --- app.py | 45 ++++++++-- constants.py | 2 +- functions.py | 11 ++- schema.sql | 3 +- static/css/style.css | 2 +- static/icons/catask-1024.png | Bin 47086 -> 46726 bytes static/icons/catask-128.png | Bin 5290 -> 5185 bytes static/icons/catask-16.png | Bin 686 -> 710 bytes static/icons/catask-256.png | Bin 10792 -> 10586 bytes static/icons/catask-32.png | Bin 1324 -> 1334 bytes static/icons/catask-512.png | Bin 22380 -> 21845 bytes static/icons/catask-64.png | Bin 2604 -> 2606 bytes static/icons/catask.svg | 19 ++-- .../icons/favicon/android-chrome-192x192.png | Bin 10829 -> 10564 bytes .../icons/favicon/android-chrome-512x512.png | Bin 22380 -> 21845 bytes static/icons/favicon/apple-touch-icon.png | Bin 10135 -> 9922 bytes static/icons/favicon/favicon-16x16.png | Bin 686 -> 710 bytes static/icons/favicon/favicon-32x32.png | Bin 1324 -> 1334 bytes static/icons/favicon/favicon.ico | Bin 15086 -> 15086 bytes templates/admin/index.html | 13 ++- templates/base.html | 10 +-- templates/inbox.html | 85 ++++++++++-------- templates/index.html | 47 ++++++---- templates/view_question.html | 4 +- 24 files changed, 161 insertions(+), 80 deletions(-) diff --git a/app.py b/app.py index bb5ca01..3c07244 100644 --- a/app.py +++ b/app.py @@ -99,8 +99,15 @@ def render_markdown(text): def index(): conn = func.connectToDb() cursor = conn.cursor(dictionary=True) - cursor.execute("SELECT * FROM questions WHERE answered=%s ORDER BY creation_date DESC", (True,)) - questions = cursor.fetchall() + + cursor.execute("SELECT * FROM questions WHERE answered=%s AND pinned=%s ORDER BY creation_date DESC", (True, True)) + pinned_questions = cursor.fetchall() + + cursor.execute("SELECT * FROM questions WHERE answered=%s AND pinned=%s ORDER BY creation_date DESC", (True, False)) + non_pinned_questions = cursor.fetchall() + + questions = pinned_questions + non_pinned_questions + cursor.execute("SELECT * FROM answers ORDER BY creation_date DESC") answers = cursor.fetchall() @@ -123,7 +130,7 @@ def index(): def inbox(): conn = func.connectToDb() cursor = conn.cursor(dictionary=True) - cursor.execute("SELECT * FROM questions WHERE answered=%s", (False,)) + cursor.execute("SELECT * FROM questions WHERE answered=%s ORDER BY creation_date DESC", (False,)) questions = cursor.fetchall() cursor.close() @@ -146,13 +153,13 @@ def login(): admin_password = request.form.get('admin_password') if admin_password == os.environ.get('ADMIN_PASSWORD'): session['logged_in'] = True - return redirect(url_for('admin.index')) + return redirect(url_for('index')) else: flash("Wrong password", 'danger') return redirect(url_for('admin.login')) else: if logged_in: - return redirect('admin.index') + return redirect('index') else: return render_template('admin/login.html') @@ -276,6 +283,34 @@ def returnToInbox(): return {'message': 'Successfully returned question to inbox.'}, 200 +@api_bp.route('/pin_question/', methods=['POST']) +def pinQuestion(): + question_id = request.args.get('question_id', '') + if not question_id: + abort(400, "Missing 'question_id' attribute or 'question_id' is empty") + + conn = func.connectToDb() + cursor = conn.cursor() + cursor.execute("UPDATE questions SET pinned=%s WHERE id=%s", (True, question_id)) + cursor.close() + conn.close() + + return {'message': 'Successfully pinned question.'}, 200 + +@api_bp.route('/unpin_question/', methods=['POST']) +def unpinQuestion(): + question_id = request.args.get('question_id', '') + if not question_id: + abort(400, "Missing 'question_id' attribute or 'question_id' is empty") + + conn = func.connectToDb() + cursor = conn.cursor() + cursor.execute("UPDATE questions SET pinned=%s WHERE id=%s", (False, question_id)) + cursor.close() + conn.close() + + return {'message': 'Successfully unpinned question.'}, 200 + @api_bp.route('/add_answer/', methods=['POST']) @loginRequired def addAnswer(): diff --git a/constants.py b/constants.py index 8d7dff1..25e254f 100644 --- a/constants.py +++ b/constants.py @@ -2,6 +2,6 @@ antiSpamFile = 'wordlist.txt' blacklistFile = 'word_blacklist.txt' configFile = 'config.json' appName = 'CatAsk' -version = '1.1.0' +version = '1.2.0' # id (identifier) is to be interpreted as described in https://semver.org/#spec-item-9 version_id = '-alpha' diff --git a/functions.py b/functions.py index fa0282a..539ffb7 100644 --- a/functions.py +++ b/functions.py @@ -110,9 +110,12 @@ def renderMarkdown(text): 'i', 'br', 's', - 'del' + 'del', + 'a' ] - allowed_attrs = {} + allowed_attrs = { + 'a': 'href' + } # hard_wrap=True means that newlines will be # converted into
tags # @@ -141,8 +144,8 @@ def generateMetadata(question=None, answer=None): # if question is specified, generate metadata for that question if question and answer: metadata.update({ - 'title': trimContent(f"{question['content']}", 150) + " | " + cfg['instance']['title'], - 'description': trimContent(f"{answer['content']}", 150), + 'title': trimContent(question['content'], 150) + " | " + cfg['instance']['title'], + 'description': trimContent(answer['content'], 150), 'url': cfg['instance']['fullBaseUrl'] + url_for('viewQuestion', question_id=question['id']), 'image': cfg['instance']['image'] }) diff --git a/schema.sql b/schema.sql index 220ce44..e11851c 100644 --- a/schema.sql +++ b/schema.sql @@ -11,7 +11,8 @@ CREATE TABLE IF NOT EXISTS questions ( creation_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, content TEXT NOT NULL, answered BOOLEAN NOT NULL DEFAULT FALSE, - answer_id INT + answer_id INT, + pinned BOOLEAN NOT NULL DEFAULT FALSE ) ENGINE=InnoDB; ALTER TABLE questions diff --git a/static/css/style.css b/static/css/style.css index 4d2533a..45ae569 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -25,7 +25,7 @@ --bs-primary-rgb: 127,98,240; --bs-primary-subtle: color-mix(in srgb, var(--bs-primary) 10%, transparent); --bs-danger-bg-subtle: #2c0b0e; - --bs-link-color: color-mix(in srgb, var(--bs-primary) 70%, white); + --bs-link-color: color-mix(in srgb, var(--bs-primary) 60%, white); } .btn { diff --git a/static/icons/catask-1024.png b/static/icons/catask-1024.png index ca0e73878762e8a386b908610b2e6d7e3c525add..ca9d91b0a818539b42a0b67aa65de5852e3bf6a3 100644 GIT binary patch literal 46726 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