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))
|