diff --git a/zerver/lib/soft_deactivation.py b/zerver/lib/soft_deactivation.py new file mode 100644 index 0000000000..b9ff4ac8d4 --- /dev/null +++ b/zerver/lib/soft_deactivation.py @@ -0,0 +1,35 @@ +from __future__ import absolute_import + +from django.db import transaction + +from zerver.models import UserProfile, UserMessage, RealmAuditLog + +from django.utils.timezone import now as timezone_now + +from typing import List + +def do_soft_deactivate_user(user_profile): + # type: (UserProfile) -> None + user_profile.last_active_message_id = UserMessage.objects.filter( + user_profile=user_profile).order_by( + '-message__id')[0].message_id + user_profile.long_term_idle = True + user_profile.save(update_fields=[ + 'long_term_idle', + 'last_active_message_id']) + +def do_soft_deactivate_users(users): + # type: (List[UserProfile]) -> None + with transaction.atomic(): + realm_logs = [] + for user in users: + do_soft_deactivate_user(user) + event_time = timezone_now() + log = RealmAuditLog( + realm=user.realm, + modified_user=user, + event_type='user_soft_deactivated', + event_time=event_time + ) + realm_logs.append(log) + RealmAuditLog.objects.bulk_create(realm_logs) diff --git a/zerver/tests/test_soft_deactivation.py b/zerver/tests/test_soft_deactivation.py new file mode 100644 index 0000000000..38a322b907 --- /dev/null +++ b/zerver/tests/test_soft_deactivation.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import + +from zerver.lib.soft_deactivation import ( + do_soft_deactivate_user, + do_soft_deactivate_users +) + +from zerver.lib.test_classes import ( + ZulipTestCase, +) + +class UserSoftDeactivationTests(ZulipTestCase): + + def test_do_soft_deactivate_user(self): + # type: () -> None + user = self.example_user('hamlet') + self.assertFalse(user.long_term_idle) + + do_soft_deactivate_user(user) + + user.refresh_from_db() + self.assertTrue(user.long_term_idle) + + def test_do_soft_deactivate_users(self): + # type: () -> None + users = [ + self.example_user('hamlet'), + self.example_user('iago'), + self.example_user('cordelia'), + ] + for user in users: + self.assertFalse(user.long_term_idle) + + do_soft_deactivate_users(users) + + for user in users: + user.refresh_from_db() + self.assertTrue(user.long_term_idle)