diff --git a/cps/admin.py b/cps/admin.py index ccb07d84..4f293058 100644 --- a/cps/admin.py +++ b/cps/admin.py @@ -35,7 +35,7 @@ from flask_login import login_required, current_user, logout_user from flask_babel import gettext as _ from sqlalchemy import and_ from sqlalchemy.exc import IntegrityError -from sqlalchemy.sql.expression import func +from sqlalchemy.sql.expression import func, exists from werkzeug.security import generate_password_hash from . import constants, logger, helper, services @@ -563,7 +563,6 @@ def edit_user(user_id): else: if "password" in to_save and to_save["password"]: content.password = generate_password_hash(to_save["password"]) - anonymous = content.is_anonymous content.role = constants.selected_roles(to_save) if anonymous: @@ -601,6 +600,22 @@ def edit_user(user_id): return render_title_template("user_edit.html", translations=translations, languages=languages, new_user=0, content=content, downloads=downloads, registered_oauth=oauth_check, title=_(u"Edit User %(nick)s", nick=content.nickname), page="edituser") + if "nickname" in to_save and to_save["nickname"] != content.nickname: + existing_nickname = ub.session.query(exists().where( + ub.User.nickname == to_save["nickname"])).scalar() + if not existing_nickname: + content.nickname = to_save["nickname"] + else: + flash(_(u"This username is already taken."), category="error") + return render_title_template("user_edit.html", + translations=translations, + languages=languages, + new_user=0, content=content, + downloads=downloads, + registered_oauth=oauth_check, + title=_(u"Edit User %(nick)s", + nick=content.nickname), + page="edituser") if "kindle_mail" in to_save and to_save["kindle_mail"] != content.kindle_mail: content.kindle_mail = to_save["kindle_mail"] diff --git a/cps/templates/user_edit.html b/cps/templates/user_edit.html index e22a9415..99aaeeb3 100644 --- a/cps/templates/user_edit.html +++ b/cps/templates/user_edit.html @@ -3,7 +3,7 @@

{{title}}

- {% if g.user and g.user.role_admin() and new_user %} + {% if g.user or g.user.role_admin() or new_user %}
diff --git a/cps/ub.py b/cps/ub.py index b262e0eb..84ac3e2a 100644 --- a/cps/ub.py +++ b/cps/ub.py @@ -27,6 +27,7 @@ from flask import g from flask_babel import gettext as _ from flask_login import AnonymousUserMixin from werkzeug.local import LocalProxy + try: from flask_dance.consumer.backend.sqla import OAuthConsumerMixin oauth_support = True diff --git a/cps/web.py b/cps/web.py index a946573e..1ba3e1d3 100644 --- a/cps/web.py +++ b/cps/web.py @@ -38,7 +38,8 @@ from flask import render_template, request, redirect, send_from_directory, make_ from flask_babel import gettext as _ from flask_login import login_user, logout_user, login_required, current_user from sqlalchemy.exc import IntegrityError -from sqlalchemy.sql.expression import text, func, true, false, not_, and_ +from sqlalchemy.sql.expression import text, func, true, false, not_, and_, \ + exists from werkzeug.exceptions import default_exceptions from werkzeug.datastructures import Headers from werkzeug.security import generate_password_hash, check_password_hash @@ -1252,6 +1253,22 @@ def profile(): return render_title_template("user_edit.html", content=current_user, downloads=downloads, title=_(u"%(name)s's profile", name=current_user.nickname), page="me", registered_oauth=oauth_check, oauth_status=oauth_status) + if "nickname" in to_save and to_save["nickname"] != current_user.nickname: + existing_nickname = ub.session.query(exists().where( + ub.User.nickname == to_save["nickname"])).scalar() + if not existing_nickname: + current_user.nickname = to_save["nickname"] + else: + flash(_(u"This username is already taken."), category="error") + return render_title_template("user_edit.html", + translations=translations, + languages=languages, + new_user=0, content=current_user, + downloads=downloads, + registered_oauth=oauth_check, + title=_(u"Edit User %(nick)s", + nick=current_user.nickname), + page="edituser") current_user.email = to_save["email"] if "show_random" in to_save and to_save["show_random"] == "on": current_user.random_books = 1