softdeactivation/management: Make specifying realm an optional arg.

This commit is contained in:
Aditya Bansal
2017-08-22 06:13:03 +05:30
committed by Tim Abbott
parent ed31a5988c
commit 9d7e23c100
3 changed files with 34 additions and 18 deletions

View File

@@ -6,7 +6,7 @@ from django.db import transaction
from django.db.models import Max from django.db.models import Max
from django.conf import settings from django.conf import settings
from django.utils.timezone import now as timezone_now from django.utils.timezone import now as timezone_now
from typing import DefaultDict, List, Union from typing import DefaultDict, List, Union, Any
from zerver.models import UserProfile, UserMessage, RealmAuditLog, \ from zerver.models import UserProfile, UserMessage, RealmAuditLog, \
Subscription, Message, Recipient, UserActivity, Realm Subscription, Message, Recipient, UserActivity, Realm
@@ -214,14 +214,14 @@ def maybe_catch_up_soft_deactivated_user(user_profile):
return user_profile return user_profile
return None return None
def get_users_for_soft_deactivation(realm, inactive_for_days): def get_users_for_soft_deactivation(inactive_for_days, filter_kwargs):
# type: (Realm, int) -> List[UserProfile] # type: (int, **Any) -> List[UserProfile]
users_activity = list(UserActivity.objects.filter( users_activity = list(UserActivity.objects.filter(
user_profile__realm=realm,
user_profile__is_active=True, user_profile__is_active=True,
user_profile__is_bot=False, user_profile__is_bot=False,
user_profile__long_term_idle=False).values( user_profile__long_term_idle=False,
'user_profile_id').annotate(last_visit=Max('last_visit'))) **filter_kwargs).values('user_profile_id').annotate(
last_visit=Max('last_visit')))
user_ids_to_deactivate = [] user_ids_to_deactivate = []
today = timezone_now() today = timezone_now()
for user_activity in users_activity: for user_activity in users_activity:

View File

@@ -5,7 +5,7 @@ from django.db import connection
from django.conf import settings from django.conf import settings
from django.utils.timezone import now as timezone_now from django.utils.timezone import now as timezone_now
from typing import Any, List from typing import Any, List, Dict
from argparse import ArgumentParser from argparse import ArgumentParser
from six.moves import map from six.moves import map
import sys import sys
@@ -22,7 +22,7 @@ class Command(ZulipBaseCommand):
def add_arguments(self, parser): def add_arguments(self, parser):
# type: (ArgumentParser) -> None # type: (ArgumentParser) -> None
self.add_realm_args(parser, True) self.add_realm_args(parser)
parser.add_argument('-d', '--deactivate', parser.add_argument('-d', '--deactivate',
dest='deactivate', dest='deactivate',
action='store_true', action='store_true',
@@ -42,30 +42,44 @@ class Command(ZulipBaseCommand):
def handle(self, *args, **options): def handle(self, *args, **options):
# type: (*Any, **str) -> None # type: (*Any, **str) -> None
realm = self.get_realm(options) if options['realm_id']:
realm = self.get_realm(options)
filter_kwargs = {} # type: Dict[str, Realm]
if options['realm_id']:
filter_kwargs = dict(realm=realm)
user_emails = options['users'] user_emails = options['users']
activate = options['activate'] activate = options['activate']
deactivate = options['deactivate'] deactivate = options['deactivate']
if activate: if activate:
if not user_emails: if not user_emails:
print('You need to specify at least one user to use the activate option.') print('You need to specify at least one user to use the activate option.')
self.print_help("./manage.py", "soft_activate_deactivate_users") self.print_help("./manage.py", "soft_activate_deactivate_users")
sys.exit(1) sys.exit(1)
users_to_activate = list(UserProfile.objects.filter(
realm=realm, users_to_activate = UserProfile.objects.filter(
email__in=user_emails)) email__in=user_emails,
**filter_kwargs
)
users_to_activate = list(users_to_activate)
if len(users_to_activate) != len(user_emails): if len(users_to_activate) != len(user_emails):
user_emails_found = [user.email for user in users_to_activate] user_emails_found = [user.email for user in users_to_activate]
for user in user_emails: for user in user_emails:
if user not in user_emails_found: if user not in user_emails_found:
raise Exception('User with email %s was not found. Check if the email is correct.' % (user)) raise Exception('User with email %s was not found. Check if the email is correct.' % (user))
users_activated = do_soft_activate_users(users_to_activate) users_activated = do_soft_activate_users(users_to_activate)
logger.info('Soft Reactivated %d user(s)' % (len(users_activated))) logger.info('Soft Reactivated %d user(s)' % (len(users_activated)))
elif deactivate: elif deactivate:
if user_emails: if user_emails:
users_to_deactivate = list(UserProfile.objects.filter( users_to_deactivate = UserProfile.objects.filter(
realm=realm, email__in=user_emails,
email__in=user_emails)) **filter_kwargs
)
users_to_deactivate = list(users_to_deactivate)
if len(users_to_deactivate) != len(user_emails): if len(users_to_deactivate) != len(user_emails):
user_emails_found = [user.email for user in users_to_deactivate] user_emails_found = [user.email for user in users_to_deactivate]
for user in user_emails: for user in user_emails:
@@ -73,7 +87,9 @@ class Command(ZulipBaseCommand):
raise Exception('User with email %s was not found. Check if the email is correct.' % (user)) raise Exception('User with email %s was not found. Check if the email is correct.' % (user))
print('Soft deactivating forcefully...') print('Soft deactivating forcefully...')
else: else:
users_to_deactivate = get_users_for_soft_deactivation(realm, int(options['inactive_for'])) if options['realm_id']:
filter_kwargs = dict(user_profile__realm=realm)
users_to_deactivate = get_users_for_soft_deactivation(int(options['inactive_for']), filter_kwargs)
if users_to_deactivate: if users_to_deactivate:
users_deactivated = do_soft_deactivate_users(users_to_deactivate) users_deactivated = do_soft_deactivate_users(users_to_deactivate)

View File

@@ -70,8 +70,8 @@ class UserSoftDeactivationTests(ZulipTestCase):
count=count, count=count,
last_visit=last_visit last_visit=last_visit
) )
realm = get_realm('zulip') filter_kwargs = dict(user_profile__realm=get_realm('zulip'))
users_to_deactivate = get_users_for_soft_deactivation(realm, -1) users_to_deactivate = get_users_for_soft_deactivation(-1, filter_kwargs)
self.assert_length(users_to_deactivate, 7) self.assert_length(users_to_deactivate, 7)
for user in users_to_deactivate: for user in users_to_deactivate: