From 12ad2c5ef8a55391faa1d27fb2965755cdbfbcb7 Mon Sep 17 00:00:00 2001 From: "steven.liatti" <steven.liatti@hesge.ch> Date: Mon, 25 Nov 2019 09:01:15 +0100 Subject: [PATCH] Students are now developers with push and merge access on master Add optionnal parameters "expires_at" to remove students at date In create_repo_for_students.py --- README.md | 3 ++- scripts/create_repo_for_students.py | 25 ++++++++++++++++++------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index adb02a9..98385ba 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Crée un groupe au sens gitlab du terme, nommé `group_name`, avec la visibilit ### create_repo_for_students.py ```bash -python3 create_repo_for_students.py <token> <import_url> <group_id> <project_name> <student1,student2,...,studentN> +python3 create_repo_for_students.py <token> <import_url> <group_id> <project_name> <student1,student2,...,studentN> <expires_at> ``` Crée un dépôt git (projet) au sein d'un groupe à partir de l'URL d'un projet existant pour une liste d'étudiants. Détail des arguments : - `token` : le token gitlab. @@ -38,6 +38,7 @@ Crée un dépôt git (projet) au sein d'un groupe à partir de l'URL d'un projet - `group_id` : l'identifiant du groupe dédié au cours/TP, créé précédemment (avec `create_group.py` par exemple). - `project_name` : le nom du nouveau repository à créer pour le ou les étudiants concernés. - `student1,student2,...,studentN` : une liste de login gitlab des étudiants. Les login sont séparés par une virgule. Peut contenir un seul login. +- `expires_at`: optionnel, au format `AAAA-MM-DD`, supprime les étudiants ajoutés à la date donnée. ### clone_all_repos_in_group.py ```bash diff --git a/scripts/create_repo_for_students.py b/scripts/create_repo_for_students.py index 23a0088..3d3f008 100755 --- a/scripts/create_repo_for_students.py +++ b/scripts/create_repo_for_students.py @@ -6,7 +6,7 @@ import requests import subprocess if len(sys.argv) < 6: - print('Usage: ' + sys.argv[0] + ' <token> <import_url> <group_id> <project_name> <student1,student2,...,studentN>') + print('Usage: ' + sys.argv[0] + ' <token> <import_url> <group_id> <project_name> <student1,student2,...,studentN> <expires_at>') exit(1) token = sys.argv[1] @@ -19,14 +19,14 @@ headers = {'PRIVATE-TOKEN': token} # Get students ids from their usernames users_names = sys.argv[5].split(',') -users_ids = [] +user_ids = [] for username in users_names: user_requested = requests.get(base_url + '/users', params={'username': username}, headers=headers).json() if len(user_requested) == 0: print('No user %s found, operation aborted' % username) exit(1) user_id = user_requested[0]['id'] - users_ids.append(user_id) + user_ids.append(user_id) # Create project from name, basis and group given params = {'name': project_name, 'import_url': import_url, 'namespace_id': group_id, 'visibility': 'private'} @@ -37,14 +37,25 @@ if 'message' in project: exit(1) print("Project '" + project['name'] + "' at '" + project['web_url'] + "' created") -# Add each student as project's maintainer (level 40) -for user_id in users_ids: - params = {'user_id': user_id, 'access_level': 40} +# Allow users with developer access level to push and merge on master +access_level = 30 +params = {'name': 'master', 'push_access_level': str(access_level), 'merge_access_level': str(access_level)} +requests.post(base_url + '/projects/' + str(project['id']) + '/protected_branches', params=params, headers=headers).json() + +# Add each student as project's developer (level 30) +for user_id in user_ids: + params = {'user_id': user_id, 'access_level': access_level} + if len(sys.argv) > 6: + expires_at = sys.argv[6] + params['expires_at'] = expires_at new_user = requests.post(base_url + '/projects/' + str(project['id']) + '/members', params=params, headers=headers).json() if 'message' in new_user: print('Error in adding user: %s' % new_user) else: - print("Adding '" + new_user['name'] + "' (" + new_user['username'] + ") in '" + project['name'] + "'") + print( + "Adding '" + new_user['name'] + "' (" + new_user['username'] + ") in '" + + project['name'] + "' with access level: " + str(new_user['access_level']) + + ", expires at: " + new_user['expires_at']) # Do not forget : students have to add second remote in their local repositories for pulling last changes. -- GitLab