From 4f52f82a15bcd9d95e710a7286cfba993cd0fa90 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Sat, 5 Dec 2020 01:20:00 +0000 Subject: [PATCH] Split profile into view and edit --- app/blueprints/users/profile.py | 137 +++++++------ app/models.py | 5 + app/scss/packages.scss | 18 ++ app/templates/base.html | 3 + app/templates/users/profile.html | 270 +++++++++----------------- app/templates/users/profile_edit.html | 176 +++++++++++++++++ 6 files changed, 362 insertions(+), 247 deletions(-) create mode 100644 app/templates/users/profile_edit.html diff --git a/app/blueprints/users/profile.py b/app/blueprints/users/profile.py index 463ce5b..6592739 100644 --- a/app/blueprints/users/profile.py +++ b/app/blueprints/users/profile.py @@ -52,70 +52,13 @@ def list_all(): return render_template("users/list.html", users=users) -@bp.route("/users//", methods=["GET", "POST"]) +@bp.route("/users//") def profile(username): user = User.query.filter_by(username=username).first() if not user: abort(404) - form = None - if user.checkPerm(current_user, Permission.CHANGE_USERNAMES) or \ - user.checkPerm(current_user, Permission.CHANGE_EMAIL) or \ - user.checkPerm(current_user, Permission.CHANGE_RANK): - # Initialize form - form = UserProfileForm(formdata=request.form, obj=user) - - # Process valid POST - if request.method=="POST" and form.validate(): - severity = AuditSeverity.NORMAL if current_user == user else AuditSeverity.MODERATION - addAuditLog(severity, current_user, "Edited {}'s profile".format(user.display_name), - url_for("users.profile", username=username)) - - # Copy form fields to user_profile fields - if user.checkPerm(current_user, Permission.CHANGE_USERNAMES): - user.display_name = form.display_name.data - user.forums_username = nonEmptyOrNone(form.forums_username.data) - user.github_username = nonEmptyOrNone(form.github_username.data) - - if user.checkPerm(current_user, Permission.CHANGE_PROFILE_URLS): - user.website_url = form["website_url"].data - user.donate_url = form["donate_url"].data - - if user.checkPerm(current_user, Permission.CHANGE_RANK): - newRank = form["rank"].data - if current_user.rank.atLeast(newRank): - if newRank != user.rank: - user.rank = form["rank"].data - msg = "Set rank of {} to {}".format(user.display_name, user.rank.getTitle()) - addAuditLog(AuditSeverity.MODERATION, current_user, msg, url_for("users.profile", username=username)) - else: - flash("Can't promote a user to a rank higher than yourself!", "danger") - - if user.checkPerm(current_user, Permission.CHANGE_EMAIL): - newEmail = form["email"].data - if newEmail and newEmail != user.email and newEmail.strip() != "": - token = randomString(32) - - msg = "Changed email of {}".format(user.display_name) - addAuditLog(severity, current_user, msg, url_for("users.profile", username=username)) - - ver = UserEmailVerification() - ver.user = user - ver.token = token - ver.email = newEmail - db.session.add(ver) - db.session.commit() - - task = sendVerifyEmail.delay(newEmail, token) - return redirect(url_for("tasks.check", id=task.id, r=url_for("users.profile", username=username))) - - # Save user_profile - db.session.commit() - - # Redirect to home page - return redirect(url_for("users.profile", username=username)) - - packages = user.packages.filter(Package.state!=PackageState.DELETED) + packages = user.packages.filter(Package.state != PackageState.DELETED) if not current_user.is_authenticated or (user != current_user and not current_user.canAccessTodoList()): packages = packages.filter_by(state=PackageState.APPROVED) packages = packages.order_by(db.asc(Package.title)) @@ -123,14 +66,80 @@ def profile(username): topics_to_add = None if current_user == user or user.checkPerm(current_user, Permission.CHANGE_AUTHOR): topics_to_add = ForumTopic.query \ - .filter_by(author_id=user.id) \ - .filter(~ db.exists().where(Package.forums==ForumTopic.topic_id)) \ - .order_by(db.asc(ForumTopic.name), db.asc(ForumTopic.title)) \ - .all() + .filter_by(author_id=user.id) \ + .filter(~ db.exists().where(Package.forums == ForumTopic.topic_id)) \ + .order_by(db.asc(ForumTopic.name), db.asc(ForumTopic.title)) \ + .all() # Process GET or invalid POST return render_template("users/profile.html", - user=user, form=form, packages=packages, topics_to_add=topics_to_add) + user=user, packages=packages, topics_to_add=topics_to_add) + + +@bp.route("/users//edit/", methods=["GET", "POST"]) +def profile_edit(username): + user : User = User.query.filter_by(username=username).first() + if not user: + abort(404) + + if not user.can_see_edit_profile(current_user): + flash("Permission denied", "danger") + return redirect(url_for("users.profile", username=username)) + + + form = UserProfileForm(formdata=request.form, obj=user) + + # Process valid POST + if request.method=="POST" and form.validate(): + severity = AuditSeverity.NORMAL if current_user == user else AuditSeverity.MODERATION + addAuditLog(severity, current_user, "Edited {}'s profile".format(user.display_name), + url_for("users.profile", username=username)) + + # Copy form fields to user_profile fields + if user.checkPerm(current_user, Permission.CHANGE_USERNAMES): + user.display_name = form.display_name.data + user.forums_username = nonEmptyOrNone(form.forums_username.data) + user.github_username = nonEmptyOrNone(form.github_username.data) + + if user.checkPerm(current_user, Permission.CHANGE_PROFILE_URLS): + user.website_url = form["website_url"].data + user.donate_url = form["donate_url"].data + + if user.checkPerm(current_user, Permission.CHANGE_RANK): + newRank = form["rank"].data + if current_user.rank.atLeast(newRank): + if newRank != user.rank: + user.rank = form["rank"].data + msg = "Set rank of {} to {}".format(user.display_name, user.rank.getTitle()) + addAuditLog(AuditSeverity.MODERATION, current_user, msg, url_for("users.profile", username=username)) + else: + flash("Can't promote a user to a rank higher than yourself!", "danger") + + if user.checkPerm(current_user, Permission.CHANGE_EMAIL): + newEmail = form["email"].data + if newEmail and newEmail != user.email and newEmail.strip() != "": + token = randomString(32) + + msg = "Changed email of {}".format(user.display_name) + addAuditLog(severity, current_user, msg, url_for("users.profile", username=username)) + + ver = UserEmailVerification() + ver.user = user + ver.token = token + ver.email = newEmail + db.session.add(ver) + db.session.commit() + + task = sendVerifyEmail.delay(newEmail, token) + return redirect(url_for("tasks.check", id=task.id, r=url_for("users.profile", username=username))) + + # Save user_profile + db.session.commit() + + return redirect(url_for("users.profile", username=username)) + + # Process GET or invalid POST + return render_template("users/profile_edit.html", user=user, form=form) @bp.route("/users//check/", methods=["POST"]) diff --git a/app/models.py b/app/models.py index 7f731d4..69d30d6 100644 --- a/app/models.py +++ b/app/models.py @@ -259,6 +259,11 @@ class User(db.Model, UserMixin): assert self.id > 0 return self.id == other.id + def can_see_edit_profile(self, current_user): + return self.checkPerm(current_user, Permission.CHANGE_USERNAMES) or \ + self.checkPerm(current_user, Permission.CHANGE_EMAIL) or \ + self.checkPerm(current_user, Permission.CHANGE_RANK) + class UserEmailVerification(db.Model): id = db.Column(db.Integer, primary_key=True) diff --git a/app/scss/packages.scss b/app/scss/packages.scss index f0dd2fb..1a9aebc 100644 --- a/app/scss/packages.scss +++ b/app/scss/packages.scss @@ -53,6 +53,24 @@ color: rgba(255, 255, 255, 0.8); } + .btn-group-horizontal > span { + color: rgba(255, 255, 255, 0.8); + display: inline-block; + font-weight: 400; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + border: 1px solid transparent; + padding: 0.375rem 0.75rem; + font-size: 0.9375rem; + line-height: 1.5; + border-radius: 0.25rem; + } + a:hover { color: #fff; text-decoration: none; diff --git a/app/templates/base.html b/app/templates/base.html index 970b489..f8200ad 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -104,6 +104,9 @@ + diff --git a/app/templates/users/profile.html b/app/templates/users/profile.html index 45615d2..b7532ac 100644 --- a/app/templates/users/profile.html +++ b/app/templates/users/profile.html @@ -6,192 +6,96 @@ {% block content %} +{% if user.can_see_edit_profile(current_user) %} + + Edit Profile + +{% endif %} + +
+
+ +
+
+

+ {{ user.display_name }} +

+ +
+
+ + + + {{ user.rank.getTitle() }} + + + + {% if user.forums_username %} + + + + {{ _("Forum Account") }} + + + {% elif user == current_user %} + No forum account + {% endif %} + + {% if user.github_username %} + + + + {{ _("GitHub") }} + + + {% endif %} + + {% if user.website_url %} + Website + {% endif %} + + {% if user.donate_url %} + Donate + {% endif %} + + + + + {{ user.packages.count() }} + {{ _("packages") }} + + + + + + + {{ user.reviews | length }} + {{ _("reviews") }} + + + + + + + {{ user.replies.count() }} + {{ _("comments") }} + + +
+
+
+
+ + {% if not current_user.is_authenticated and user.rank == user.rank.NOT_JOINED and user.forums_username %} -
- Claim +
+ Claim - Is this you? Claim your account now! -
-{% endif %} - -
- -
-
-

{{ user.display_name }}

-
- -
- - - - - - - - - - - {% if user == current_user and user.github_username %} - - - - - {% endif %} - - {% if current_user.is_authenticated and current_user.rank.atLeast(current_user.rank.MODERATOR) %} - - - - - {% endif %} - {% if user == current_user %} - - - - - - - - - {% endif %} - {% if user.checkPerm(current_user, "CREATE_TOKEN") %} - - - - - {% endif %} -
Rank: - {{ user.rank.getTitle() }} -
Links: - {% if user.forums_username %} - - Minetest Forum - - {% elif user == current_user %} - No forum account - {% endif %} - - {% if user.github_username or user == current_user %} - | - {% endif %} - - {% if user.github_username %} - GitHub - {% elif user == current_user %} - Link Github - {% endif %} - - {% if user.website_url %} - | Website - {% endif %} - - - {% if user == current_user %} -
- - 🌎 - Visible to everyone - - {% endif %} -
Privacy: - View ContentDB's GitHub Permissions -
Admin - {% if user.email %} - - Email - - {% else %} - - Email - - {% endif %} -
Profile Picture: - {% if user.forums_username %} -
- - -
- {% endif %} - {% if user.email %} - - Gravatar - - {% else %} - - Gravatar - - {% endif %} -
Password: - {% if user.password %} - Set | Change - {% else %} - Not set | Set - {% endif %} -
API Tokens: - Manage - {{ user.tokens.count() }} -
-
-
-
-
- -{% if form %} - {% from "macros/forms.html" import render_field, render_submit_field %} -
-
-
Edit Details
-
-
- {{ form.hidden_tag() }} - - {% if user.checkPerm(current_user, "CHANGE_USERNAMES") %} - {{ render_field(form.display_name, tabindex=230) }} - {{ render_field(form.forums_username, tabindex=230) }} - {{ render_field(form.github_username, tabindex=230) }} - {% endif %} - - {% if user.checkPerm(current_user, "CHANGE_PROFILE_URLS") %} - {{ render_field(form.website_url, tabindex=232) }} - {{ render_field(form.donate_url, tabindex=233) }} - {% endif %} - - {% if user.checkPerm(current_user, "CHANGE_EMAIL") %} - {{ render_field(form.email, tabindex=240) }} - We'll send you an email to verify it if changed. - {% endif %} - - {% if user.checkPerm(current_user, "CHANGE_RANK") %} - {{ render_field(form.rank, tabindex=250) }} - {% endif %} - -

- {{ render_submit_field(form.submit, tabindex=280) }} -

-
-
-
+ Is this you? Claim your account now!
{% endif %} -
+ {% if current_user == user or (current_user.is_authenticated and current_user.rank.atLeast(current_user.rank.EDITOR)) %} {{ _("Reviews") }} +

{{ _("Reviews") }}

{% from "macros/reviews.html" import render_reviews %} {{ render_reviews(user.reviews, current_user, True) }} diff --git a/app/templates/users/profile_edit.html b/app/templates/users/profile_edit.html new file mode 100644 index 0000000..19458d8 --- /dev/null +++ b/app/templates/users/profile_edit.html @@ -0,0 +1,176 @@ +{% extends "base.html" %} + +{% block title %} + Edit Profile | {{ user.username }} +{% endblock %} + +{% block content %} + +

+ Editing {{ user.display_name }}'s profile +

+ +
+
+
+

{{ _("Profile Picture") }}

+
+ +
+ {% if user.forums_username %} +
+ + +
+ {% endif %} + {% if user.email %} + + Gravatar + + {% else %} + + Gravatar + + {% endif %} +
+
+
+ +
+

{{ _("Passwords and Security") }}

+ + {% if user == current_user %} + + + + + {% endif %} + {% if user.checkPerm(current_user, "CREATE_TOKEN") %} + + + + + {% endif %} +
Password: + {% if user.password %} + Set | Change + {% else %} + Not set | Set + {% endif %} +
API Tokens: + Manage + {{ user.tokens.count() }} +
+
+ +
+

{{ _("Linked Accounts") }}

+ + + + + + + + + + + + {% if current_user.is_authenticated and current_user.rank.atLeast(current_user.rank.MODERATOR) %} + + + + + {% endif %} +
Forums + {% if user.forums_username %} + + Connected + + {% elif user == current_user %} + None + {% endif %} +
GitHub + {% if user.github_username %} +

+ Connected +

+ + {% if user == current_user %} +

+ View ContentDB's GitHub Permissions +

+ {% endif %} + {% elif user == current_user %} + Link Github + {% else %} + None + {% endif %} +
Admin + {% if user.email %} + + Email + + {% else %} + + Email + + {% endif %} +
+
+
+ + {% from "macros/forms.html" import render_field, render_submit_field %} +
+
+
Edit Details
+
+
+ {{ form.hidden_tag() }} + + {% if user.checkPerm(current_user, "CHANGE_USERNAMES") %} + {{ render_field(form.display_name, tabindex=230) }} + {{ render_field(form.forums_username, tabindex=230) }} + {{ render_field(form.github_username, tabindex=230) }} + {% endif %} + + {% if user.checkPerm(current_user, "CHANGE_PROFILE_URLS") %} + {{ render_field(form.website_url, tabindex=232) }} + {{ render_field(form.donate_url, tabindex=233) }} + {% endif %} + + {% if user.checkPerm(current_user, "CHANGE_EMAIL") %} + {{ render_field(form.email, tabindex=240) }} + We'll send you an email to verify it if changed. + {% endif %} + + {% if user.checkPerm(current_user, "CHANGE_RANK") %} + {{ render_field(form.rank, tabindex=250) }} + {% endif %} + +

+ {{ render_submit_field(form.submit, tabindex=280) }} +

+
+
+
+
+
+ +{% endblock %}