zulip/zerver/management/commands/delete_tutorial_streams.py

54 lines
2.2 KiB
Python

from __future__ import absolute_import
from django.core.management.base import BaseCommand
from zerver.models import Subscription, Recipient, Message, Stream, \
get_user_profile_by_email
from django.db.models import Q
import datetime
import pytz
from optparse import make_option
class Command(BaseCommand):
help = """Delete all inactive tutorial stream subscriptions."""
option_list = BaseCommand.option_list + (
make_option('-f', '--for-real',
dest='for_real',
action='store_true',
default=False,
help="Actually deactive subscriptions. Default is a dry run."),
)
def has_sent_to(self, user_profile, recipient):
return Message.objects.filter(sender=user_profile, recipient=recipient).count() != 0
def handle(self, **options):
possible_tutorial_streams = Stream.objects.filter(Q(name__startswith='tutorial-'))
tutorial_bot = get_user_profile_by_email("tutorial-bot@zulip.com")
for stream in possible_tutorial_streams:
recipient = Recipient.objects.get(type=Recipient.STREAM, type_id=stream.id)
subscribers = Subscription.objects.filter(recipient=recipient, active=True)
if ((subscribers.count() == 1) and self.has_sent_to(tutorial_bot, recipient)):
# This is a tutorial stream.
most_recent_message = Message.objects.filter(
recipient=recipient).latest("pub_date")
# This cutoff must be more generous than the tutorial bot cutoff
# in the client code.
cutoff = datetime.datetime.now(tz=pytz.utc) - datetime.timedelta(hours=2)
if most_recent_message.pub_date < cutoff:
# The tutorial has expired, so delete the stream.
print stream.name, most_recent_message.pub_date
if options["for_real"]:
tutorial_user = subscribers[0]
tutorial_user.active = False
tutorial_user.save(update_fields=["active"])
if options["for_real"]:
print "Subscriptions deactivated."
else:
print "This was a dry run. Pass -f to actually deactivate."