17 |
17 |
from __future__ import print_function
|
18 |
18 |
|
19 |
19 |
import logging
|
20 |
|
import smtplib
|
21 |
20 |
|
22 |
21 |
from datetime import timedelta
|
23 |
22 |
from django.contrib.auth import get_user_model
|
... | ... | |
39 |
38 |
class Command(BaseCommand):
|
40 |
39 |
help = '''Clean unused accounts'''
|
41 |
40 |
|
|
41 |
verbosity_to_log_level = {
|
|
42 |
0: logging.CRITICAL,
|
|
43 |
1: logging.WARNING,
|
|
44 |
2: logging.INFO,
|
|
45 |
3: logging.DEBUG,
|
|
46 |
}
|
|
47 |
|
42 |
48 |
def add_arguments(self, parser):
|
43 |
49 |
parser.add_argument("--fake", action='store_true', help='do nothing', default=False)
|
44 |
50 |
|
45 |
51 |
def handle(self, *args, **options):
|
46 |
|
if options['verbosity'] == '0':
|
47 |
|
logger.setLevel(level=logging.CRITICAL)
|
48 |
|
if options['verbosity'] == '1':
|
49 |
|
logger.setLevel(level=logging.WARNING)
|
50 |
|
elif options['verbosity'] == '2':
|
51 |
|
logger.setLevel(level=logging.INFO)
|
52 |
|
elif options['verbosity'] == '3':
|
53 |
|
logger.setLevel(level=logging.DEBUG)
|
54 |
52 |
self.fake = options['fake']
|
55 |
53 |
|
56 |
|
self.clean_unused_accounts()
|
|
54 |
# add StreamHandler for console output
|
|
55 |
handler = logging.StreamHandler()
|
|
56 |
handler.setLevel(level=self.verbosity_to_log_level[options['verbosity']])
|
|
57 |
logger.addHandler(handler)
|
|
58 |
# prevent logging to external logs when fake
|
|
59 |
if self.fake:
|
|
60 |
logger.propagate = False
|
|
61 |
|
|
62 |
try:
|
|
63 |
self.clean_unused_accounts()
|
|
64 |
except Exception:
|
|
65 |
logger.exception('clean-unused-accounts failed')
|
57 |
66 |
|
58 |
67 |
def clean_unused_accounts(self):
|
59 |
68 |
now = timezone.now()
|
60 |
|
if self.fake:
|
61 |
|
logger.info('fake call to clean-unused-accounts')
|
62 |
69 |
|
63 |
70 |
for ou in get_ou_model().objects.filter(clean_unused_accounts_alert__isnull=False):
|
64 |
71 |
alert_delay = timedelta(days=ou.clean_unused_accounts_alert)
|
... | ... | |
87 |
94 |
'days_to_deletion': days_to_deletion,
|
88 |
95 |
'login_url': urlparse.urljoin(settings.SITE_BASE_URL, settings.LOGIN_URL),
|
89 |
96 |
}
|
90 |
|
try:
|
91 |
|
self.send_mail('authentic2/unused_account_alert', user, ctx)
|
92 |
|
except smtplib.SMTPException as e:
|
93 |
|
logger.exception('email sending failure: %s', e)
|
94 |
|
else:
|
95 |
|
if not self.fake:
|
96 |
|
user.last_account_deletion_alert = timezone.now()
|
97 |
|
user.save()
|
|
97 |
self.send_mail('authentic2/unused_account_alert', user, ctx)
|
|
98 |
if not self.fake:
|
|
99 |
user.last_account_deletion_alert = timezone.now()
|
|
100 |
user.save()
|
98 |
101 |
|
99 |
102 |
def send_mail(self, prefix, user, ctx):
|
100 |
103 |
if not user.email:
|
101 |
104 |
logger.debug('%s has no email, no mail sent', user)
|
102 |
|
if not self.fake:
|
|
105 |
else:
|
103 |
106 |
logger.debug('sending mail to %s', user.email)
|
104 |
|
send_templated_mail(user.email, prefix, ctx)
|
|
107 |
if not self.fake:
|
|
108 |
send_templated_mail(user.email, prefix, ctx)
|
105 |
109 |
|
106 |
110 |
def delete_user(self, user):
|
107 |
111 |
ctx = {'user': user}
|
108 |
|
try:
|
109 |
|
self.send_mail('authentic2/unused_account_delete', user, ctx)
|
110 |
|
except smtplib.SMTPException as e:
|
111 |
|
logger.exception('email sending failure: %s', e)
|
|
112 |
self.send_mail('authentic2/unused_account_delete', user, ctx)
|
112 |
113 |
if not self.fake:
|
113 |
114 |
DeletedUser.objects.delete_user(user)
|
114 |
|
-
|