summaryrefslogtreecommitdiffstats
path: root/devel/management/commands/retire_user.py
blob: 0a7259f30c7d9e8e1905bc2b5d8ab889b8c15db5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# -*- coding: utf-8 -*-
"""
retire_user

Retire a user by de-activing the account and moving the user to the retired
group.

Usage ./manage.py retire_user user
"""

import logging
import sys

from django.contrib.auth.models import User, Group
from django.core.management.base import BaseCommand, CommandError

from devel.models import UserProfile


logging.basicConfig(
    level=logging.WARNING,
    format=u'%(asctime)s -> %(levelname)s: %(message)s',
    datefmt=u'%Y-%m-%d %H:%M:%S',
    stream=sys.stderr)
logger = logging.getLogger()

MAPPING = {
        'Developers': 'Retired Developers',
        'Trusted Users': 'Retired Trusted Users',
        'Support Staff': 'Retired Support Staff',
}


class Command(BaseCommand):
    help = "Retires a user by deactivating the user and moving the group membership to retired groups."
    missing_args_message = 'missing argument user.'

    def add_arguments(self, parser):
        parser.add_argument('user', type=str)


    def handle(self, *args, **options):
        v = int(options.get('verbosity', 0))
        if v == 0:
            logger.level = logging.ERROR
        elif v == 1:
            logger.level = logging.INFO
        elif v >= 2:
            logger.level = logging.DEBUG

        try:
            user = User.objects.get(username=options['user'])
        except User.DoesNotExist:
            raise CommandError(u"Failed to find User '{}'".format(options['user']))

        try:
            profile = UserProfile.objects.get(user=user)
        except UserProfile.DoesNotExist:
            raise CommandError(u"Failed to find UserProfile")

        # Set user inactive
        user.is_active = False

        # Clear allowed repos
        profile.allowed_repos.clear()

        # Move Groups to Retired.
        del_groups = list(user.groups.filter(name__in=MAPPING.keys()))
        add_groups = [Group.objects.get(name=MAPPING.get(group.name)) for group in del_groups]
        user.groups.remove(*del_groups)
        user.groups.add(*add_groups)
        user.save()