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