From 9682295daecc00dff612f2283ebcf6435b37c135 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lera=20Elvo=C3=A9?= Date: Sun, 19 Apr 2026 10:03:03 +0300 Subject: [PATCH] start user page and stub more endpoints --- app/routes/mod.py | 12 ++++ app/routes/users.py | 32 ++++++++-- app/templates/users/user_page.html | 97 ++++++++++++++++++++++++++++++ 3 files changed, 135 insertions(+), 6 deletions(-) create mode 100644 app/templates/users/user_page.html diff --git a/app/routes/mod.py b/app/routes/mod.py index a2523f5..ce7b5b1 100644 --- a/app/routes/mod.py +++ b/app/routes/mod.py @@ -79,3 +79,15 @@ def sticky_thread(thread_id): abort(404) thread.update({'is_stickied': request.form.get('sticky')}) return redirect(url_for('threads.thread', slug=thread.slug)) + +@bp.post('/users//make-guest/') +def make_user_guest(user_id): + return 'stub' + +@bp.post('/users//make-user/') +def make_user_regular(user_id): + return 'stub' + +@bp.post('/users//make-mod/') +def make_user_mod(user_id): + return 'stub' diff --git a/app/routes/users.py b/app/routes/users.py index e79ca5b..1bf248a 100644 --- a/app/routes/users.py +++ b/app/routes/users.py @@ -2,9 +2,10 @@ from flask import Blueprint, redirect, url_for, render_template, request, sessio from functools import wraps import time -from ..auth import digest, verify, create_session, is_logged_in, parse_username, is_password_valid +from ..auth import digest, verify, create_session, is_logged_in, parse_username, is_password_valid, login_required from ..models import Users from ..constants import PermissionLevel +from secrets import compare_digest as compare_timesafe bp = Blueprint('users', __name__, url_prefix='/users/') @@ -55,7 +56,7 @@ def sign_up_post(): username = request.form.get('username', default='') if not username: return generic_error_page - if request.form.get('password', default=None) is None: + if request.form.get('password') is None: return generic_error_page if len(request.form.getlist('password')) != 2: return passwords_error_page @@ -67,7 +68,7 @@ def sign_up_post(): if potential_user: return invalid_username_error_page - if request.form.getlist('password')[0] != request.form.getlist('password')[1]: + if not compare_timesafe(request.form.getlist('password')[0], request.form.getlist('password')[1]): return passwords_error_page password_hash = digest(request.form.get('password')) @@ -94,17 +95,36 @@ def sign_up_post(): @bp.get('//') def user_page(username): + target_user = Users.find({'username': username}) + if not target_user: + abort(404) + return render_template('users/user_page.html', target_user=target_user) + +@bp.get('//posts/') +def posts(username): return 'stub' -@bp.get('//settings') +@bp.get('//threads/') +def threads(username): + return 'stub' + +@bp.get('//comments/') +def comments(username): + return 'stub' + +@bp.get('//settings/') def settings(username): return 'stub' -@bp.get('//inbox') +@bp.get('//inbox/') def inbox(username): return 'stub' -@bp.get('//bookmarks') +@bp.get('//bookmarks/') def bookmarks(username): return 'stub' +@bp.post('//log_out/') +@login_required +def log_out(username): + return 'stub' diff --git a/app/templates/users/user_page.html b/app/templates/users/user_page.html new file mode 100644 index 0000000..a9dcf59 --- /dev/null +++ b/app/templates/users/user_page.html @@ -0,0 +1,97 @@ +{%- from 'common/macros.html' import subheader, timestamp, pager -%} +{%- extends 'base.html' -%} +{%- block title -%}{{ target_user.get_readable_name() }}'s profile{%- endblock -%} +{%- set stats = target_user.get_post_stats() -%} +{%- block content -%} +{%- call() subheader("%s's profile" % target_user.get_readable_name()) -%} +{%- if is_logged_in() -%} + +{%- if target_user.id == get_active_user().id -%} +
+ Actions +
+ +
+
+{%- endif -%} + +{%- if get_active_user().is_mod() and target_user.id != get_active_user().id -%} +
+ Moderation actions +
+ {%- if target_user.is_guest() -%} + + {%- else -%} + + {%- if get_active_user().is_admin() -%} + {%- if not target_user.is_mod_only() -%} + + {%- else -%} + + {%- endif -%} + {%- endif -%} + {%- endif -%} +
+
+{%- endif -%} + +{%- endif -%} +{%- endcall -%} +
+
+
+ +
+
+
+

{{target_user.get_readable_name()}}

+ Display name: {{target_user.get_readable_name()}} + Mention: @{{target_user.username}} + Status: {{target_user.status}} + Rank: {{target_user.permission | permission_string}} + {%- set time = target_user.created_at -%} + {%- if target_user.approved_at -%} + {%- set time = target_user.approved_at -%} + {%- endif -%} + Joined: {{timestamp(target_user.created_at)}} + {%- if not target_user.is_guest() -%} + Posts: {{stats.post_count}} + Threads started: {{stats.thread_count}} + {%- set badges = target_user.get_badges() -%} + + {%- if badges -%} +
+ Badges: + {%- for badge in badges -%} + {%- if badge.link -%}{%- endif -%} + {{badge.label}} + {%- if badge.link -%}{%- endif -%} + {%- endfor -%} +
+ {%- endif -%} +
+ About me +

stub

+
+ {%- if target_user.signature_rendered -%} +
+ Signature + {{target_user.signature_rendered | safe}} +
+ {%- endif -%} + {# +
+ Profile comments +
+ Page + {{pager(0, 3, url=url_for('users.log_in'))}} +
+
+

stub

+
+
+ #} + {%- endif -%} +
+
+{%- endblock -%}