- from datetime import timedelta
- import time
-
- from django.conf import settings
- from django.core.management.base import BaseCommand
- from django.utils.timezone import now
- from hc.accounts.models import Profile, Member
- from hc.api.models import Ping
- from hc.lib import emails
-
-
- class Command(BaseCommand):
- help = """Send deletion notices to inactive user accounts.
-
- Conditions for sending the notice:
- - deletion notice has not been sent recently
- - last login more than a year ago
- - none of the owned projects has invited team members
- - none of the owned projects has pings in the last year
- - is on a free plan
-
- """
-
- def pause(self):
- time.sleep(1)
-
- def handle(self, *args, **options):
- year_ago = now() - timedelta(days=365)
-
- q = Profile.objects.order_by("id")
- # Exclude accounts with logins in the last year
- q = q.exclude(user__last_login__gt=year_ago)
- # Exclude accounts less than a year old
- q = q.exclude(user__date_joined__gt=year_ago)
- # Exclude accounts with the deletion notice already sent
- q = q.exclude(deletion_notice_date__gt=year_ago)
- # Exclude accounts with activity in the last year
- q = q.exclude(last_active_date__gt=year_ago)
- # Exclude paid accounts
- q = q.exclude(sms_limit__gt=5)
-
- sent = 0
- skipped_has_team = 0
- skipped_has_pings = 0
-
- for profile in q:
- members = Member.objects.filter(project__owner_id=profile.user_id)
- if members.exists():
- # Don't send deletion notice: this account has team members
- skipped_has_team += 1
- continue
-
- pings = Ping.objects.filter(owner__project__owner_id=profile.user_id)
- pings = pings.filter(created__gt=year_ago)
- if pings.exists():
- # Don't send deletion notice: this account has pings in the last year
- skipped_has_pings += 1
- continue
-
- self.stdout.write("Sending notice to %s" % profile.user.email)
-
- profile.deletion_notice_date = now()
- profile.save()
-
- ctx = {"email": profile.user.email, "support_email": settings.SUPPORT_EMAIL}
- emails.deletion_notice(profile.user.email, ctx)
- sent += 1
-
- # Throttle so we don't send too many emails at once:
- self.pause()
-
- return (
- f"Done!\n"
- f"* Notices sent: {sent}\n"
- f"* Skipped (has team members): {skipped_has_team}\n"
- f"* Skipped (has pings in the last year): {skipped_has_pings}\n"
- )
|