mirror of
https://github.com/zulip/zulip.git
synced 2025-11-04 05:53:43 +00:00
@@ -452,6 +452,25 @@ function _setup_page() {
|
||||
$('#default_language_modal').modal('show');
|
||||
});
|
||||
|
||||
$("#user_deactivate_account_button").on('click', function (e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
$("#deactivate_self_modal").modal("show");
|
||||
});
|
||||
|
||||
$("#do_deactivate_self_button").on('click',function (e) {
|
||||
$("#deactivate_self_modal").modal("hide");
|
||||
channel.del({
|
||||
url: '/json/users/me',
|
||||
success: function () {
|
||||
window.location.href = "/login";
|
||||
},
|
||||
error: function (xhr, error_type) {
|
||||
ui.report_error(i18n.t("Error deactivating account"), xhr, $('#settings-status').expectOne());
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$("#get_api_key_box").hide();
|
||||
$("#show_api_key_box").hide();
|
||||
$("#get_api_key_box form").ajaxForm({
|
||||
|
||||
@@ -56,9 +56,26 @@
|
||||
<input type="file" name="user_avatar_file_input" class="notvisible" id="user_avatar_file_input" value="{{t 'Upload avatar' }}" />
|
||||
<div id="upload_avatar_spinner"></div>
|
||||
<button class="button standalone" id="user_avatar_upload_button">{{t 'Customize avatar' }}</button>
|
||||
<button class="button standalone btn-danger" id="user_deactivate_account_button">{{t 'Deactivate Account' }}</button>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
<div id="deactivate_self_modal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="deactivation_self_modal_label" aria-hidden="true">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||
<h3 id="deactivation_user_modal_label">{{t "Deactivate Your Account" }} </h3>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<p>{{#tr this}}By deactivating your account, you will be logged out immediately.{{/tr}}</p>
|
||||
<p>{{t "Note that any bots that you maintain will be disabled." }}</p>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button class="btn btn-default" data-dismiss="modal" aria-hidden="true">{{t "Cancel" }}</button>
|
||||
<button class="button btn-danger" id="do_deactivate_self_button">{{t "Deactivate now" }}</button>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -16,6 +16,7 @@ from zerver.models import (
|
||||
from zerver.lib.actions import (
|
||||
create_stream_if_needed,
|
||||
set_default_streams,
|
||||
do_change_is_admin
|
||||
)
|
||||
|
||||
from zerver.lib.initial_password import initial_password
|
||||
@@ -749,3 +750,35 @@ class UserSignUpTest(ZulipTestCase):
|
||||
self.assertEqual(realm.name, realm_name)
|
||||
self.assertEqual(realm.subdomain, subdomain)
|
||||
self.assertEqual(get_user_profile_by_email(email).realm, realm)
|
||||
|
||||
class DeactivateUserTest(ZulipTestCase):
|
||||
|
||||
def test_deactivate_user(self):
|
||||
# type: () -> None
|
||||
email = 'hamlet@zulip.com'
|
||||
self.login(email)
|
||||
user = get_user_profile_by_email('hamlet@zulip.com')
|
||||
self.assertTrue(user.is_active)
|
||||
result = self.client_delete('/json/users/me')
|
||||
self.assert_json_success(result)
|
||||
user = get_user_profile_by_email('hamlet@zulip.com')
|
||||
self.assertFalse(user.is_active)
|
||||
self.login(email, fails=True)
|
||||
|
||||
def test_do_not_deactivate_final_admin(self):
|
||||
# type: () -> None
|
||||
email = 'iago@zulip.com'
|
||||
self.login(email)
|
||||
user = get_user_profile_by_email('iago@zulip.com')
|
||||
self.assertTrue(user.is_active)
|
||||
self.client_delete('/json/users/me')
|
||||
user = get_user_profile_by_email('iago@zulip.com')
|
||||
self.assertTrue(user.is_active)
|
||||
self.assertTrue(user.is_realm_admin)
|
||||
email = 'hamlet@zulip.com'
|
||||
user_2 = get_user_profile_by_email('hamlet@zulip.com')
|
||||
do_change_is_admin(user_2, True)
|
||||
self.assertTrue(user_2.is_realm_admin)
|
||||
result = self.client_delete('/json/users/me')
|
||||
self.assert_json_success(result)
|
||||
do_change_is_admin(user, True)
|
||||
|
||||
@@ -33,6 +33,15 @@ def deactivate_user_backend(request, user_profile, email):
|
||||
return json_error(_('No such user'))
|
||||
return _deactivate_user_profile_backend(request, user_profile, target)
|
||||
|
||||
def deactivate_user_own_backend(request, user_profile):
|
||||
# type: (HttpRequest, UserProfile) -> HttpResponse
|
||||
admins = set(user_profile.realm.get_admin_users())
|
||||
|
||||
if user_profile.is_realm_admin and len(admins) == 1:
|
||||
return json_error(_('Cannot deactivate the only admin'))
|
||||
do_deactivate_user(user_profile)
|
||||
return json_success({})
|
||||
|
||||
def deactivate_bot_backend(request, user_profile, email):
|
||||
# type: (HttpRequest, UserProfile, text_type) -> HttpResponse
|
||||
try:
|
||||
|
||||
@@ -175,7 +175,8 @@ v1_api_and_json_patterns = [
|
||||
|
||||
# users/me -> zerver.views
|
||||
url(r'^users/me$', 'zerver.lib.rest.rest_dispatch',
|
||||
{'GET': 'zerver.views.pointer.get_profile_backend'}),
|
||||
{'GET': 'zerver.views.pointer.get_profile_backend',
|
||||
'DELETE':'zerver.views.users.deactivate_user_own_backend'}),
|
||||
url(r'^users/me/pointer$', 'zerver.lib.rest.rest_dispatch',
|
||||
{'GET': 'zerver.views.pointer.get_pointer_backend',
|
||||
'PUT': 'zerver.views.pointer.update_pointer_backend'}),
|
||||
|
||||
Reference in New Issue
Block a user