Skip to content
Snippets Groups Projects
Commit 1911e5a8 authored by Adrien Lescourt's avatar Adrien Lescourt
Browse files

Fix group creation

parent 3c873828
No related branches found
No related tags found
No related merge requests found
# Practical Work Manager (pwm)
# WIP REFACTOR STATUS
- [ ] Create group repo
- [ ] Clone repo
- [x] List groups
- [x] List projects
Programme python pour gérer les travaux pratiques des étudiants avec la contrainte d'utiliser le gitlab d'HEPIA.
Ce script permet d'automatiser de nombreuses tâches, notamment la création de nombreuses repositories d'un coup, ou encore cloner toutes les repositories contenues dans un groupe, etc.
......
......@@ -8,7 +8,7 @@ Steven Liatti, Florent Gluck, Adrien Lescourt
from dataclasses import dataclass
from requests.models import Response
from typing import Any, Dict, List, Optional
from typing import Any
import argparse
import json
import os
......@@ -23,21 +23,18 @@ TOKEN_URL: str = BASE_URL + "/-/user_settings/personal_access_tokens"
@dataclass
class User:
def __init__(self, user_id: str) -> None:
self.id = user_id
id: str
@dataclass
class Group:
def __init__(self, name: str, user_ids: List[User]) -> None:
self.name = name
self.user_ids = user_ids
name: str
user_ids: list[User]
@dataclass
class DataSource:
def __init__(self, groups: List[Group]) -> None:
self.groups = groups
groups: list[Group]
@classmethod
def from_yaml(cls, yaml_file_path: str) -> "DataSource":
......@@ -45,19 +42,20 @@ class DataSource:
print("Syntax error in YAML file.\nAborted.")
exit(1)
groups = []
repos = yaml.full_load(yaml_file_path)
with open(yaml_file_path) as f:
repos = yaml.load(f, Loader=yaml.FullLoader)
for repo in repos:
if "name" in repo:
name = repo["name"]
else:
name = repo["users_login_aai"]
groups.append(Group(name, repo["users"]))
groups.append(Group(name, [User(u) for u in repo["users_login_aai"]]))
return cls(groups)
@staticmethod
def _validate_yaml(yaml_file_path) -> bool:
with open(yaml_file_path) as f:
repos = yaml.full_load(f)
repos = yaml.load(f, Loader=yaml.FullLoader)
for repo in repos:
if "name" in repo:
pass
......@@ -72,30 +70,23 @@ class Gitlab:
def __init__(self, token: str):
self.token = token
def create_group(self, group: Group, visibility: str = "private") -> str:
def create_group(self, name: str, visibility: str = "private") -> str:
"""Create gitlab group, Returns group_id created."""
params = {"path": group.name, "name": group.name, "visibility": visibility}
params = {"path": name, "name": name, "visibility": visibility}
headers = {"PRIVATE-TOKEN": self.token}
group_res = requests.post(
BASE_API_URL + "/group_ress", params=params, headers=headers
).json()
if "message" in group_res:
print("Error in creating group_res: %s" % group_res)
request_res = requests.post(
BASE_API_URL + "/groups", params=params, headers=headers
)
if request_res.status_code != 201:
print(f"Error: {request_res.status_code}")
print(request_res.text)
exit(1)
print(
"group_res '"
+ group_res["name"]
+ "' with id '"
+ str(group_res["id"])
+ "' and visibility '"
+ group_res["visibility"]
+ "' available at '"
+ group_res["web_url"]
+ "'"
)
return str(group_res["id"])
res = request_res.json()
print(f"Group created: name: {res['name']}, id: {res['id']}")
return str(res["id"])
def delete_group(self, group_id: str):
"""Delete a group and all subprojects."""
......@@ -113,10 +104,10 @@ class Gitlab:
def create_repository(
self,
group_id: str,
users: List[User],
users: list[User],
name: str,
import_url: Optional[str],
expires_at: Optional[str],
import_url: str | None,
expires_at: str | None,
):
"""
Create repository in group_id, with members from user_ids, a name, and
......@@ -153,6 +144,7 @@ class Gitlab:
# Add each student as maintainer (level 40)
for user in users:
print(user)
params = {"user_id": user.id, "access_level": access_level}
if expires_at:
params["expires_at"] = expires_at
......@@ -180,8 +172,8 @@ class Gitlab:
@staticmethod
def _paginate_responses(
url: str, headers: Dict[str, str], params: Dict[str, Any]
) -> List[Response]:
url: str, headers: dict[str, str], params: dict[str, Any]
) -> list[Response]:
"""
Manage gitlab pagination, max 100 results by request
"""
......@@ -203,7 +195,7 @@ class Gitlab:
return responses
def get_users_in_repository(self, id: str) -> List:
def get_users_in_repository(self, id: str) -> list:
"""
Return members list from given id
"""
......@@ -219,7 +211,7 @@ class Gitlab:
members += r.json()
return members
def get_projects_in_group(self, id: str) -> List:
def get_projects_in_group(self, id: str) -> list:
"""
Return projects list from given group id
"""
......@@ -233,7 +225,7 @@ class Gitlab:
projects += r.json()
return projects
def clone_all(self, id: str, directory: str, until_date: Optional[str]):
def clone_all(self, id: str, directory: str, until_date: str | None):
"""
Clone all repositories from a group id in directory (created in function).
"""
......@@ -325,7 +317,7 @@ def command_create_group_repos(args):
args.import_url,
args.expires_at,
)
print(f"created repo: {group.name} with the users: {group.user_ids}")
print(f"Created repo: {group.name} with the users: {group.user_ids}")
print()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment