mirror of
https://github.com/zulip/zulip.git
synced 2025-10-29 19:13:53 +00:00
This code duplicated the code in setup_realm_internal_bots, with some added logic to avoid trying to create the same bot twice. That logic was buggy so that it would never work at all -- it subtracted a set of UserProfile objects from a set of email strings -- so it looked like the command might blow up when run after the users already existed. In fact, the buggy logic wasn't necessary, because the work the command does after it is idempotent -- in particular `create_users`, within its subroutine `bulk_create_users`, already filters out users that already exist. So just cut the buggy stuff out, deduplicate the rest with `setup_realm_internal_bots`, and document that invariant on the latter. While we're here, in the common case bail early without doing any per-realm work in Python, since we're running this on every upgrade.
35 lines
1.3 KiB
Python
35 lines
1.3 KiB
Python
|
|
from typing import Any, Iterable, Text, Tuple
|
|
|
|
from django.conf import settings
|
|
from django.core.management.base import BaseCommand
|
|
from django.db.models import Count
|
|
|
|
from zerver.lib.onboarding import setup_realm_internal_bots
|
|
from zerver.models import Realm, UserProfile
|
|
|
|
class Command(BaseCommand):
|
|
help = """\
|
|
Create realm internal bots if absent, in all realms.
|
|
|
|
These are normally created when the realm is, so this should be a no-op
|
|
except when upgrading to a version that adds a new realm internal bot.
|
|
"""
|
|
|
|
@staticmethod
|
|
def missing_any_bots() -> bool:
|
|
bot_emails = [bot['email_template'] % (settings.INTERNAL_BOT_DOMAIN,)
|
|
for bot in settings.REALM_INTERNAL_BOTS]
|
|
bot_counts = dict(UserProfile.objects.filter(email__in=bot_emails)
|
|
.values_list('email')
|
|
.annotate(Count('id')))
|
|
realm_count = Realm.objects.count()
|
|
return any(bot_counts.get(email, 0) < realm_count for email in bot_emails)
|
|
|
|
def handle(self, *args: Any, **options: Any) -> None:
|
|
if self.missing_any_bots():
|
|
for realm in Realm.objects.all():
|
|
setup_realm_internal_bots(realm)
|
|
# create_users is idempotent -- it's a no-op when a given email
|
|
# already has a user in a given realm.
|