summaryrefslogtreecommitdiff
path: root/apps/patchmetrics/bin/get-linaro-membership.py
diff options
context:
space:
mode:
Diffstat (limited to 'apps/patchmetrics/bin/get-linaro-membership.py')
-rwxr-xr-xapps/patchmetrics/bin/get-linaro-membership.py97
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)