def handle(self, *args: Any, **options: str) -> None: if settings.STAGING: print('This is a Staging server. Suppressing management command.') sys.exit(0) realm = self.get_realm(options) user_emails = options[ 'users'] # type: ignore # mypy thinks this is a str, not List[str] # activate = options['activate'] deactivate = options['deactivate'] filter_kwargs = {} # type: Dict[str, Realm] if realm is not None: filter_kwargs = dict(realm=realm) if activate: if not user_emails: print( 'You need to specify at least one user to use the activate option.' ) self.print_help("./manage.py", "soft_deactivate_users") raise CommandError users_to_activate = get_users_from_emails(user_emails, filter_kwargs) users_activated = do_soft_activate_users(users_to_activate) logger.info('Soft Reactivated %d user(s)' % (len(users_activated), )) elif deactivate: if user_emails: users_to_deactivate = get_users_from_emails( user_emails, filter_kwargs) print('Soft deactivating forcefully...') users_deactivated = do_soft_deactivate_users( users_to_deactivate) else: users_deactivated = do_auto_soft_deactivate_users( int(options['inactive_for']), realm) logger.info('Soft Deactivated %d user(s)' % (len(users_deactivated), )) else: self.print_help("./manage.py", "soft_deactivate_users") raise CommandError
def handle(self, *args: Any, **options: Any) -> None: if settings.STAGING: print("This is a Staging server. Suppressing management command.") sys.exit(0) realm = self.get_realm(options) user_emails = options["users"] activate = options["activate"] deactivate = options["deactivate"] filter_kwargs: Dict[str, Realm] = {} if realm is not None: filter_kwargs = dict(realm=realm) if activate: if not user_emails: print( "You need to specify at least one user to use the activate option." ) self.print_help("./manage.py", "soft_deactivate_users") raise CommandError users_to_activate = get_users_from_emails(user_emails, filter_kwargs) users_activated = do_soft_activate_users(users_to_activate) logger.info("Soft Reactivated %d user(s)", len(users_activated)) elif deactivate: if user_emails: users_to_deactivate = get_users_from_emails( user_emails, filter_kwargs) print("Soft deactivating forcefully...") users_deactivated = do_soft_deactivate_users( users_to_deactivate) else: users_deactivated = do_auto_soft_deactivate_users( int(options["inactive_for"]), realm) logger.info("Soft deactivated %d user(s)", len(users_deactivated)) else: self.print_help("./manage.py", "soft_deactivate_users") raise CommandError
def test_do_auto_soft_deactivate_users(self) -> None: users = [ self.example_user('iago'), self.example_user('cordelia'), self.example_user('ZOE'), self.example_user('othello'), self.example_user('prospero'), self.example_user('aaron'), self.example_user('polonius'), self.example_user('desdemona'), ] sender = self.example_user('hamlet') realm = get_realm('zulip') stream_name = 'announce' for user in [*users, sender]: self.subscribe(user, stream_name) client, _ = Client.objects.get_or_create(name='website') query = '/some/random/endpoint' last_visit = timezone_now() count = 150 for user_profile in users: UserActivity.objects.get_or_create( user_profile=user_profile, client=client, query=query, count=count, last_visit=last_visit, ) with mock.patch('logging.info'): users_deactivated = do_auto_soft_deactivate_users(-1, realm) self.assert_length(users_deactivated, len(users)) for user in users: self.assertTrue(user in users_deactivated) # Verify that deactivated users are caught up automatically message_id = self.send_stream_message(sender, stream_name) received_count = UserMessage.objects.filter( user_profile__in=users, message_id=message_id).count() self.assertEqual(0, received_count) with mock.patch('logging.info'): users_deactivated = do_auto_soft_deactivate_users(-1, realm) self.assert_length(users_deactivated, 0) # all users are already deactivated received_count = UserMessage.objects.filter( user_profile__in=users, message_id=message_id).count() self.assertEqual(len(users), received_count) # Verify that deactivated users are NOT caught up if # AUTO_CATCH_UP_SOFT_DEACTIVATED_USERS is off message_id = self.send_stream_message(sender, stream_name) received_count = UserMessage.objects.filter( user_profile__in=users, message_id=message_id).count() self.assertEqual(0, received_count) with self.settings(AUTO_CATCH_UP_SOFT_DEACTIVATED_USERS=False): with mock.patch('logging.info'): users_deactivated = do_auto_soft_deactivate_users(-1, realm) self.assert_length(users_deactivated, 0) # all users are already deactivated received_count = UserMessage.objects.filter( user_profile__in=users, message_id=message_id).count() self.assertEqual(0, received_count)
def test_do_auto_soft_deactivate_users(self) -> None: users = [ self.example_user("iago"), self.example_user("cordelia"), self.example_user("ZOE"), self.example_user("othello"), self.example_user("prospero"), self.example_user("aaron"), self.example_user("polonius"), self.example_user("desdemona"), ] sender = self.example_user("hamlet") realm = get_realm("zulip") stream_name = "announce" for user in [*users, sender]: self.subscribe(user, stream_name) client, _ = Client.objects.get_or_create(name="website") query = "/some/random/endpoint" last_visit = timezone_now() count = 150 for user_profile in users: UserActivity.objects.get_or_create( user_profile=user_profile, client=client, query=query, count=count, last_visit=last_visit, ) with self.assertLogs(logger_string, level="INFO") as m: users_deactivated = do_auto_soft_deactivate_users(-1, realm) log_output = [] for user in users: log_output.append( f"INFO:{logger_string}:Soft deactivated user {user.id}") log_output.append( f"INFO:{logger_string}:Soft-deactivated batch of {len(users[:100])} users; {len(users[100:])} remain to process" ) log_output.append( f"INFO:{logger_string}:Caught up {len(users)} soft-deactivated users" ) self.assertEqual(set(m.output), set(log_output)) self.assert_length(users_deactivated, len(users)) for user in users: self.assertTrue(user in users_deactivated) # Verify that deactivated users are caught up automatically message_id = self.send_stream_message(sender, stream_name) received_count = UserMessage.objects.filter( user_profile__in=users, message_id=message_id).count() self.assertEqual(0, received_count) with self.assertLogs(logger_string, level="INFO") as m: users_deactivated = do_auto_soft_deactivate_users(-1, realm) log_output = [] log_output.append( f"INFO:{logger_string}:Caught up {len(users)} soft-deactivated users" ) self.assertEqual(set(m.output), set(log_output)) self.assert_length(users_deactivated, 0) # all users are already deactivated received_count = UserMessage.objects.filter( user_profile__in=users, message_id=message_id).count() self.assert_length(users, received_count) # Verify that deactivated users are NOT caught up if # AUTO_CATCH_UP_SOFT_DEACTIVATED_USERS is off message_id = self.send_stream_message(sender, stream_name) received_count = UserMessage.objects.filter( user_profile__in=users, message_id=message_id).count() self.assertEqual(0, received_count) with self.settings(AUTO_CATCH_UP_SOFT_DEACTIVATED_USERS=False): with self.assertLogs(logger_string, level="INFO") as m: users_deactivated = do_auto_soft_deactivate_users(-1, realm) self.assertEqual( m.output, [ f"INFO:{logger_string}:Not catching up users since AUTO_CATCH_UP_SOFT_DEACTIVATED_USERS is off" ], ) self.assert_length(users_deactivated, 0) # all users are already deactivated received_count = UserMessage.objects.filter( user_profile__in=users, message_id=message_id).count() self.assertEqual(0, received_count)