mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 14:03:30 +00:00 
			
		
		
		
	softdeactivation/management: Make specifying realm an optional arg.
This commit is contained in:
		
				
					committed by
					
						
						Tim Abbott
					
				
			
			
				
	
			
			
			
						parent
						
							ed31a5988c
						
					
				
				
					commit
					9d7e23c100
				
			@@ -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:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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:
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user