From f5e01a6ec534af63e177300a195c0fd58736ca08 Mon Sep 17 00:00:00 2001 From: Manuel Kaufmann Date: Sat, 13 Mar 2021 11:45:02 +0100 Subject: [PATCH 1/2] Improvements to sync_vcs_data.py script --- .../management/commands/sync_vcs_data.py | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/readthedocs/oauth/management/commands/sync_vcs_data.py b/readthedocs/oauth/management/commands/sync_vcs_data.py index ede0c061d9d..6fc8448b1d8 100644 --- a/readthedocs/oauth/management/commands/sync_vcs_data.py +++ b/readthedocs/oauth/management/commands/sync_vcs_data.py @@ -1,3 +1,7 @@ +import datetime +import json + +from django.utils import timezone from django.contrib.auth.models import User from django.core.management.base import BaseCommand @@ -21,6 +25,18 @@ def add_arguments(self, parser): default=[], help='Re-sync VCS provider data for specific users only.', ) + parser.add_argument( + '--logged-in-days-ago', + type=int, + default=0, + help='Re-sync users logged in in the last days.', + ) + parser.add_argument( + '--skip-revoked-users', + action='store_true', + default=False, + help='Skip users who revoked our access token (pulled down from Sentry).', + ) parser.add_argument( '--skip-users', nargs='+', @@ -49,6 +65,8 @@ def add_arguments(self, parser): def handle(self, *args, **options): queue = options.get('queue') + logged_in_days_ago = options.get('logged_in_days_ago') + skip_revoked_users = options.get('skip_revoked_users') sync_users = options.get('users') skip_users = options.get('skip_users') max_users = options.get('max_users') @@ -60,6 +78,11 @@ def handle(self, *args, **options): socialaccount__isnull=False ).distinct() + if logged_in_days_ago: + users = users.filter( + last_login__gte=timezone.now() - datetime.timedelta(days=logged_in_days_ago), + ) + if not force_sync: users = users.filter( remote_repository_relations__isnull=True @@ -77,7 +100,19 @@ def handle(self, *args, **options): if skip_users: users = users.exclude(username__in=skip_users) - if sync_users or skip_users: + revoked_users = [] + if skip_revoked_users: + # `revoked-users.json` was created by a script pullig down data from Sentry + # https://gist.github.com/humitos/aba1a004abeb3552fd8ef9a741f5dce1 + revoked_users = json.load(open('revoked-users.json', 'r')) + users = users.exclude(username__in=revoked_users) + self.stdout.write( + self.style.WARNING( + f'Excluding {len(revoked_users)} revoked users.' + ) + ) + + if sync_users or skip_users or revoked_users: self.stdout.write( self.style.SUCCESS( f'Found {users.count()} user(s) with the given parameters' From 53a1b95ab892e9d1fbec2cb78dc30d93d54d8d43 Mon Sep 17 00:00:00 2001 From: Manuel Kaufmann Date: Mon, 15 Mar 2021 13:53:13 +0100 Subject: [PATCH 2/2] Update readthedocs/oauth/management/commands/sync_vcs_data.py Co-authored-by: Maksudul Haque --- readthedocs/oauth/management/commands/sync_vcs_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readthedocs/oauth/management/commands/sync_vcs_data.py b/readthedocs/oauth/management/commands/sync_vcs_data.py index 6fc8448b1d8..4cfb36ac1bf 100644 --- a/readthedocs/oauth/management/commands/sync_vcs_data.py +++ b/readthedocs/oauth/management/commands/sync_vcs_data.py @@ -78,7 +78,7 @@ def handle(self, *args, **options): socialaccount__isnull=False ).distinct() - if logged_in_days_ago: + if logged_in_days_ago > 0: users = users.filter( last_login__gte=timezone.now() - datetime.timedelta(days=logged_in_days_ago), )