summaryrefslogtreecommitdiff
path: root/linaro_metrics/sync_teams.py
blob: 76eaa97dc841044db5788ddcb0bed54a4ff5b203 (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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#!/usr/bin/env python
import os
import sys

sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
from bin import django_setup, add_logging_arguments
django_setup()  # must be called to get sys.path and django settings in place

import logging

from django.conf import settings
from django.contrib.auth.models import User
from patchwork.models import Person

from linaro_metrics.crowd import Crowd
from linaro_metrics.models import Team, TeamMembership

log = logging.getLogger('sync_teams')


def get_or_create_person(crowd, email, save_person=True):
    name = None
    try:
        person = Person.objects.get(email__iexact=email)
    except Person.DoesNotExist:
        # use crowd to get the "display-name" for the user
        name = crowd.get_user_no_cache(email)['display-name']
        log.info('Creating person %s(%s)', name, email)
        person = Person(name=name, email=email)
        if save_person:
            person.save()

    if not person.user:
        users = User.objects.filter(person__email=email)
        if users.count() == 0:
            if not name:
                name = crowd.get_user_no_cache(email)['display-name']
            users = User.objects.filter(username=name)
        if users.count() == 0:
            log.info('Creating user for %s', email)
            user = User.objects.create_user(name, email, password=None)
        else:
            user = users[0]
        person.user = user
        if save_person:
            person.save()

    return person


def sync_team(crowd, team, emails, user_memberships):
    for email in emails:
        user = get_or_create_person(crowd, email).user
        user_memberships.setdefault(user, []).append(team)
        _, created = TeamMembership.objects.get_or_create(team=team, user=user)
        if created:
            log.info('New team membership created for: %s', email)


def sync_crowd(crowd, teams):
    user_memberships = {}
    for team in teams:
        emails = crowd.get_group(team.name)
        log.info('syncing team: %s - (%s)', team, emails)
        sync_team(crowd, team, emails, user_memberships)
        if len(emails) == 0:
            log.warn('empty group definition in crowd for: %s', team)

    for user in User.objects.all():
        memberships = user_memberships.get(user, [])
        for tm in TeamMembership.objects.filter(user=user):
            if tm.team not in memberships:
                log.warn('Deleting %s\'s membership in %s',
                         user.email, tm.team.name)
                tm.delete()


if __name__ == '__main__':
    import argparse

    parser = argparse.ArgumentParser(
        description='Synchronize team memberships with info from crowd')
    add_logging_arguments(parser)
    parser.parse_args()

    crowd = Crowd(settings.CROWD_USER, settings.CROWD_PASS, settings.CROWD_URL)
    sync_crowd(crowd, Team.objects.filter(active=True))