From 4e2d9747b2023b54e371420c1280d668baf5b339 Mon Sep 17 00:00:00 2001 From: James Eagan Date: Thu, 5 Oct 2023 17:08:24 +0200 Subject: [PATCH] Lookup users by name instead of by email. Searching by email address is currently broken on our installation, probably as a consequence to protect users' privacy. This version attempts to look up accounts by name. If multiple or no matches are found, then an error message will be shown and the account skipped. --- gitlab-create-student-depots.py | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/gitlab-create-student-depots.py b/gitlab-create-student-depots.py index d81a0f7..01a120e 100644 --- a/gitlab-create-student-depots.py +++ b/gitlab-create-student-depots.py @@ -28,12 +28,15 @@ def readNames(fileName): if hasHeader: next(reader) for row in reader: - result.append((row[0], row[1], row[2])) + result.append((row[0], row[1], row[2], row[3])) return result def lookupUser(email, gitlab): """ Return the first found user; throw if not found """ - return gitlab.users.list(search=email)[0] + matches = gitlab.users.list(search=email) + if len(matches) == 1: + return matches[0] + raise IndexError("Found {} matching users".format(len(matches))) def createProject(name, groupId, gitlab): return gitlab.projects.create({'name': name, @@ -44,22 +47,27 @@ def addProjectMember(project, userId, accessLevel): 'access_level': accessLevel}) def makeProjectsInGroupId(groupId, csvFile, token, options={}): - print(groupId, csvFile, options); return + # print(groupId, csvFile, options) api = gitlab.Gitlab(GITLAB_URL, token) - for (lastName, firstName, email) in readNames(csvFile): + for (lastName, firstName, email, login) in readNames(csvFile): try: - user = lookupUser(email, api) - print("::: Creating project for {} {} <{}> -- {} ({})…".format( + user = lookupUser(f"{lastName} {firstName}", api) + + print("::: {}Creating project for {} {} <{}> -- {} ({})…".format( + "Not " if options.dry_run else "", lastName, firstName, email, user.name, user.id)) + if options.dry_run: + continue + project = createProject('{} {}'.format(lastName, firstName), groupId, api) member = addProjectMember(project, user.id, gitlab.MAINTAINER_ACCESS) except IndexError as e: - print >> sys.stderr, "!!! Could not create project for {}: User not found ({})".format(email, e) + print("!!! Skipping {}: User not found ({})".format(email, e), file=sys.stderr) except Exception as e: # print("!!! Could not create user for {}: {}".format(email, e), file=sys.stderr) - print >> sys.stderr, "!!! Error creating project for {}: {}".format(email, e) + print("!!! Error creating project for {}: {}".format(email, e), file=sys.stderr) if __name__ == '__main__': import argparse @@ -77,9 +85,10 @@ if __name__ == '__main__': def parse_args(): parser = argparse.ArgumentParser(description="Create GitLab repositories") - parser.add_argument("csv", help="CSV file as exported from Synapses. The first three columns are assumed to be last name, first name, email address.") + parser.add_argument("csv", help="CSV file as exported from Synapses. The first four columns are assumed to be last name, first name, email address, login.") parser.add_argument("groupId", help="The GitLab id where all projects will be added.") parser.add_argument("-t", "--token", help="GitLab API token as created at {}/-/profile/personal_access_tokens".format(GITLAB_URL)) + parser.add_argument("-n", "--dry-run", help="Do not actually create repositories.", action="store_true") # TODO: parser.add_argument("--extract-groups", help="Extract groups from the fourth column in the CSV file", action="store_true") args = parser.parse_args()