78 lines
2.5 KiB
Python
78 lines
2.5 KiB
Python
![]() |
from datetime import timedelta
|
||
|
|
||
|
from django.apps import apps
|
||
|
from django.core.management.base import BaseCommand
|
||
|
from django.utils import timezone
|
||
|
from tqdm import tqdm
|
||
|
|
||
|
from users.models.user import _RESERVED_USERNAMES
|
||
|
|
||
|
User = apps.get_model("users", "User")
|
||
|
_RESERVED_USERNAMES = [
|
||
|
"connect",
|
||
|
"oauth2_login",
|
||
|
"__",
|
||
|
"admin",
|
||
|
"api",
|
||
|
"me",
|
||
|
]
|
||
|
|
||
|
|
||
|
class Command(BaseCommand):
|
||
|
help = "Generate unique username"
|
||
|
|
||
|
def process_users(self, users):
|
||
|
count = 0
|
||
|
for user in users:
|
||
|
if not user.is_active:
|
||
|
un = f"-{user.pk}-"
|
||
|
else:
|
||
|
un = user.mastodon_username
|
||
|
if not un:
|
||
|
un = f"_{user.pk}"
|
||
|
if un.lower() in _RESERVED_USERNAMES:
|
||
|
un = f"__{un}"
|
||
|
if User.objects.filter(username__iexact=un).exists(): # type: ignore
|
||
|
un = f"{un}_{user.pk}"
|
||
|
print(f"{user} -> {un}")
|
||
|
user.username = un
|
||
|
user.save(update_fields=["username"])
|
||
|
count += 1
|
||
|
print(f"{count} users updated")
|
||
|
|
||
|
def handle(self, *args, **options):
|
||
|
print("Processing active users")
|
||
|
# recent logged in users
|
||
|
proactive_users = User.objects.filter( # type: ignore
|
||
|
username__isnull=True,
|
||
|
is_active=True,
|
||
|
last_login__gt=timezone.now() - timedelta(days=30),
|
||
|
).order_by("date_joined")
|
||
|
# users with mastodon token still active
|
||
|
active_users = (
|
||
|
User.objects.filter( # type: ignore
|
||
|
username__isnull=True,
|
||
|
is_active=True,
|
||
|
)
|
||
|
.exclude(mastodon_token="")
|
||
|
.order_by("date_joined")
|
||
|
)
|
||
|
# users with mastodon handler still reachable
|
||
|
reachable_users = User.objects.filter( # type: ignore
|
||
|
username__isnull=True,
|
||
|
is_active=True,
|
||
|
mastodon_last_reachable__gt=timezone.now() - timedelta(days=7),
|
||
|
).order_by("date_joined")
|
||
|
# all other users
|
||
|
users = User.objects.filter( # type: ignore
|
||
|
username__isnull=True,
|
||
|
).order_by("date_joined")
|
||
|
print(f"{proactive_users.count()} proactive users")
|
||
|
self.process_users(proactive_users)
|
||
|
print(f"{active_users.count()} active users")
|
||
|
self.process_users(active_users)
|
||
|
print(f"{reachable_users.count()} reachable users")
|
||
|
self.process_users(reachable_users)
|
||
|
print(f"{users.count()} other users")
|
||
|
self.process_users(users)
|