diff options
Diffstat (limited to 'apps/patchmetrics/bin/get-linaro-membership.py')
-rwxr-xr-x | apps/patchmetrics/bin/get-linaro-membership.py | 97 |
1 files changed, 74 insertions, 23 deletions
diff --git a/apps/patchmetrics/bin/get-linaro-membership.py b/apps/patchmetrics/bin/get-linaro-membership.py index 535ed7b..ae7e980 100755 --- a/apps/patchmetrics/bin/get-linaro-membership.py +++ b/apps/patchmetrics/bin/get-linaro-membership.py @@ -1,36 +1,87 @@ -#!/usr/bin/python +#!/usr/bin/env python import _pythonpath +import logging import sys -from patchmetrics.crowd import Crowd from django.conf import settings -from patchmetrics.utils import ( - sync_user_memberships, +from django.contrib.auth.models import User + +from patchmetrics.crowd import Crowd +from patchmetrics.models import ( + Team, + TeamMembership, ) from patchwork.models import Person +logging.basicConfig() +log = logging.getLogger() +log.setLevel(logging.INFO) + + +def get_or_create_user(crowd, email): + name = None + try: + person = Person.objects.get(email__iexact=email) + except Person.DoesNotExist: + # use crowd to get the "display-name" for the user + user = crowd.get_user(email) + name = user.display_name + log.info('Creating person %s(%s)', name, email) + person = Person(name=name, email=email) + person.save() + + if not person.user: + users = User.objects.filter(person__email=email) + if users.count() == 0: + if not name: + name = crowd.get_user(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) + + person.user = user + person.save() + + return person.user + + +def sync_group(crowd, group, emails, user_memberships): + team, created = Team.objects.get_or_create(name=group) + if created: + log.info('new team created: %s', team.name) + for email in emails: + user_memberships.setdefault(email, []).append(group) + user = get_or_create_user(crowd, email) + _, created = TeamMembership.objects.get_or_create( + team=team, member=user) + if created: + log.info('New team membership created for: %s', email) + + +def sync_crowd(crowd, groups): + user_memberships = {} + for group in groups: + emails = crowd.get_group(group) + if len(emails): + log.info('syncing group: %s - (%s)', group, emails) + sync_group(crowd, group, emails, user_memberships) + else: + log.warn('empty group definition in crowd for: %s', group) + + for person in Person.objects.all(): + memberships = user_memberships.get(person.email, []) + for team in TeamMembership.objects.filter(member=person.user): + if team.team.name not in memberships: + log.warn('TODO: Delete %s\'s membership in %s', + person.email, team.team.name) + #team.delete() + if __name__ == '__main__': - """Maps email addresses to Linaro personnel to track Linaro's patches - - Pulls all email addresses out of the database, checks to see if each - email address is associated with a Linaro Login user who is a member of - a Linaro sub-team, and if they are, add a mapping between that Person - object and a User object (many people (email addresses) can be mapped - onto a single User (Linaro identity)). This allows us to map patches - by email address on to Linaro users, and thus Linaro teams. - - This script has been significantly re-written. Previously we pulled all - users who were members of a linaro sub-team out of Launchpad and saved - their email addresses. We lost the privilages to do this though, so now - we look up email addresses that we know. We only know email addresses - because someone has emailed a patch to patches@linaro.org. For this reason - we don't automatically pick up new Linaro engineers until they have - submitted a patch in this way, which is a change vs the old behaviour. + """Syncronize memberships to Crowd groups for Persons in the DB """ - input_email_addresses = [person.email for person in Person.objects.all()] - if settings.AUTH_CROWD_APPLICATION_USER: whitelisted_groups = [] if settings.CROWD_GROUPS_WHITELIST is None: @@ -43,7 +94,7 @@ if __name__ == '__main__': crwd = Crowd(settings.AUTH_CROWD_APPLICATION_USER, settings.AUTH_CROWD_APPLICATION_PASSWORD, settings.AUTH_CROWD_SERVER_REST_URI) - sync_user_memberships(input_email_addresses, crwd, whitelisted_groups) + sync_crowd(crwd, whitelisted_groups) else: print "No Crowd credentials provided, cannot continue." sys.exit(1) |