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.
100 lines
4.2 KiB
Python
100 lines
4.2 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
# Script to create Git repositories in a group from a list of names and
|
|
# email addresses in a CSV file (such as exported from SynapseS).
|
|
#
|
|
# Minimally tested. Seems to work. Use at your own risk.
|
|
#
|
|
# By James Eagan <james.eagan@telecom-paris.fr>
|
|
# https://james.eagan.fr
|
|
|
|
import csv
|
|
import gitlab
|
|
import sys
|
|
|
|
GITLAB_URL='https://gitlab.telecom-paris.fr'
|
|
|
|
def readNames(fileName):
|
|
result = []
|
|
with open(fileName) as fd:
|
|
sneakPeek = fd.read(1024)
|
|
fd.seek(0)
|
|
sniffer = csv.Sniffer()
|
|
dialect = sniffer.sniff(sneakPeek)
|
|
hasHeader = sniffer.has_header(sneakPeek)
|
|
|
|
reader = csv.reader(fd, dialect)
|
|
# reader = csv.reader(fd, delimiter=';')
|
|
if hasHeader:
|
|
next(reader)
|
|
for row in reader:
|
|
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 """
|
|
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,
|
|
'namespace_id': groupId})
|
|
|
|
def addProjectMember(project, userId, accessLevel):
|
|
return project.members.create({'user_id': userId,
|
|
'access_level': accessLevel})
|
|
|
|
def makeProjectsInGroupId(groupId, csvFile, token, options={}):
|
|
# print(groupId, csvFile, options)
|
|
api = gitlab.Gitlab(GITLAB_URL, token)
|
|
for (lastName, firstName, email, login) in readNames(csvFile):
|
|
try:
|
|
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("!!! 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("!!! Error creating project for {}: {}".format(email, e), file=sys.stderr)
|
|
|
|
if __name__ == '__main__':
|
|
import argparse
|
|
|
|
# print("*** Usage: python {} <csv> <groupId> <token>".format(sys.argv[0]))
|
|
# print("*** csv: a CSV file exported from Synapses.")
|
|
# print("*** The first three columns are assumed to be ")
|
|
# print("*** last name, first name, email address.")
|
|
# print("*** groupId: The GitLab id where all the projects will")
|
|
# print("*** be added.")
|
|
# print("*** token: A GitLab API token as created at ")
|
|
# print("*** {}/-/profile/personal_access_tokens".format(GITLAB_URL))
|
|
# print("*** Be sure to enable API scope.")
|
|
# sys.exit(1)
|
|
|
|
def parse_args():
|
|
parser = argparse.ArgumentParser(description="Create GitLab repositories")
|
|
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()
|
|
|
|
return args
|
|
|
|
args = parse_args()
|
|
makeProjectsInGroupId(args.groupId, args.csv, args.token, args)
|