Add ability for superusers to change user emails

This commit is contained in:
Joseph Schorr 2015-05-11 14:38:10 -04:00
parent 628d80895d
commit 1c41d34b7c
4 changed files with 60 additions and 13 deletions

View file

@ -19,7 +19,7 @@ from data.database import (User, Repository, Image, AccessToken, Role, Repositor
db, BUILD_PHASE, QuayUserField, ImageStorageSignature, QueueItem,
ImageStorageSignatureKind, validate_database_url, db_for_update,
AccessTokenKind, Star, get_epoch_timestamp, RepositoryActionCount)
from peewee import JOIN_LEFT_OUTER, fn, SQL
from peewee import JOIN_LEFT_OUTER, fn, SQL, IntegrityError
from util.validation import (validate_username, validate_email, validate_password,
INVALID_PASSWORD_MESSAGE)
from util.names import format_robot_username, parse_robot_username
@ -1131,9 +1131,12 @@ def change_user_tag_expiration(user, tag_expiration_s):
def update_email(user, new_email, auto_verify=False):
user.email = new_email
user.verified = auto_verify
user.save()
try:
user.email = new_email
user.verified = auto_verify
user.save()
except IntegrityError:
raise DataModelException('E-mail address already used')
def get_all_user_permissions(user):

View file

@ -304,7 +304,7 @@ class SuperUserManagement(ApiResource):
model.change_password(user, user_data['password'])
if 'email' in user_data:
model.update_email(user, user_data['email'])
model.update_email(user, user_data['email'], auto_verify=True)
return user_view(user)

View file

@ -124,6 +124,11 @@
$('#changePasswordModal').modal({});
};
$scope.showChangeEmail = function(user) {
$scope.userToChange = user;
$('#changeEmailModal').modal({});
};
$scope.createUser = function() {
$scope.creatingUser = true;
$scope.createdUser = null;
@ -160,6 +165,24 @@
$('#confirmDeleteUserModal').modal({});
};
$scope.changeUserEmail = function(user) {
$('#changeEmailModal').modal('hide');
var params = {
'username': user.username
};
var data = {
'email': user.newemail
};
ApiService.changeInstallUser(data, params).then(function(resp) {
$scope.loadUsersInternal();
user.email = user.newemail;
delete user.newemail;
}, ApiService.errorDisplay('Could not change user'));
};
$scope.changeUserPassword = function(user) {
$('#changePasswordModal').modal('hide');

View file

@ -137,13 +137,9 @@
</td>
<td>
<span class="labels">
<span class="label label-default" ng-if="user.username == current_user.username">
You
</span>
<span class="label label-success" ng-if="user.username == current_user.username">You</span>
<span class="label label-primary"
ng-if="current_user.super_user">
Superuser
</span>
ng-if="current_user.super_user">Superuser</span>
</span>
{{ current_user.username }}
</td>
@ -153,12 +149,15 @@
<td style="text-align: center;">
<span class="cor-options-menu"
ng-if="user.username != current_user.username && !current_user.super_user">
<span class="cor-option" option-click="showChangeEmail(current_user)">
<i class="fa fa-envelope-o"></i> Change E-mail Address
</span>
<span class="cor-option" option-click="showChangePassword(current_user)">
<i class="fa fa-key"></i> Change Password
</span>
<span class="cor-option" option-click="sendRecoveryEmail(current_user)"
quay-show="Features.MAILING">
<i class="fa fa-envelope"></i> Send Recovery Email
<i class="fa fa-envelope"></i> Send Recovery E-mail
</span>
<span class="cor-option" option-click="showDeleteUser(current_user)">
<i class="fa fa-times"></i> Delete User
@ -269,7 +268,6 @@
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
<!-- Modal message dialog -->
<div class="co-dialog modal fade" id="changePasswordModal">
<div class="modal-dialog">
@ -297,5 +295,28 @@
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
<!-- Modal message dialog -->
<div class="co-dialog modal fade" id="changeEmailModal">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title">Change User E-mail Address</h4>
</div>
<div class="modal-body">
<form class="form-change" id="changeEmailForm" name="changeEmailForm" data-trigger="manual">
<input type="email" class="form-control" placeholder="User's new email" ng-model="userToChange.newemail" required>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" ng-click="changeUserEmail(userToChange)"
ng-disabled="changeEmailForm.$invalid">Change User E-mail</button>
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
</div> <!-- /page-content -->
</div>