From 561a9b221a37213e724fbe57d18289d06f7da680 Mon Sep 17 00:00:00 2001
From: "steven.liatti" <steven@liatti.ch>
Date: Thu, 15 Oct 2020 10:38:57 +0200
Subject: [PATCH] Improve api token management

Now the token can be placed in ~/gitedu.token or
in env var $GITEDU_TOKEN or
given to command line with "-t" or "--token" argument
---
 pwm | 44 ++++++++++++++++++++++++--------------------
 1 file changed, 24 insertions(+), 20 deletions(-)

diff --git a/pwm b/pwm
index ce9402e..ec1aaf8 100755
--- a/pwm
+++ b/pwm
@@ -1,5 +1,11 @@
 #!/usr/bin/env python3
 
+"""
+Practical Work Manager (pwm)
+Steven Liatti
+2020
+"""
+
 from argparse import Namespace
 import os
 from typing import Dict, List, Optional
@@ -45,17 +51,6 @@ def delete_group(token: str, group_id: str):
             print('Group ' + group_id + ' successfully deleted')
 
 
-def get_project_name(args: Namespace) -> str:
-    """
-    If name is not defined in args, take it from first email.
-    Split at '@' and take first part.
-    """
-    if args.name:
-        return args.name
-    else:
-        return args.emails.split('@')[0]
-
-
 def emails_to_ids(emails: List[str], headers: Dict[str, str]) -> List[int]:
     """
     Get students ids from their emails
@@ -220,8 +215,12 @@ def command_create_repository(args):
     """
     Call create_repository
     """
+    if args.name:
+        name = args.name
+    else:
+        name = args.emails.split('@')[0]
     create_repository(args.token, args.group_id, args.emails.split(
-        ','), get_project_name(args), args.import_url, args.expires_at)
+        ','), name, args.import_url, args.expires_at)
 
 
 def command_clone_all(args):
@@ -239,13 +238,13 @@ if __name__ == '__main__':
     parser = argparse.ArgumentParser(description='Practical Work Manager - \
         Manage students PW - Create group, projects or clone repositories')
     parser.set_defaults(func=lambda _: parser.print_help())
+    parser.add_argument("-t", "--token", metavar="TOKEN",
+                        help="Create a token here: https://gitedu.hesge.ch/profile/personal_access_tokens")
     subparsers = parser.add_subparsers(
         metavar='(group_repos | group | repo | clone)')
 
     parser_group_repos = subparsers.add_parser(
         'group_repos', help='Create group and repos associated')
-    parser_group_repos.add_argument(
-        "token", metavar="TOKEN", help="Create a token here: https://gitedu.hesge.ch/profile/personal_access_tokens")
     parser_group_repos.add_argument(
         "group_name", metavar="GROUP_NAME", help="The group name.")
     parser_group_repos.add_argument(
@@ -259,8 +258,6 @@ if __name__ == '__main__':
     parser_group_repos.set_defaults(func=command_create_group_repos)
 
     parser_group = subparsers.add_parser('group', help='Create gitlab group')
-    parser_group.add_argument(
-        "token", metavar="TOKEN", help="Create a token here: https://gitedu.hesge.ch/profile/personal_access_tokens")
     parser_group.add_argument(
         "group_name", metavar="GROUP_NAME", help="The group name.")
     parser_group.add_argument(
@@ -268,8 +265,6 @@ if __name__ == '__main__':
     parser_group.set_defaults(func=command_create_group)
 
     parser_repo = subparsers.add_parser('repo', help='Create gitlab project')
-    parser_repo.add_argument(
-        "token", metavar="TOKEN", help="Create a token here: https://gitedu.hesge.ch/profile/personal_access_tokens")
     parser_repo.add_argument(
         "group_id", metavar="GROUP_ID", help="The group id (int) where to store the created new project.")
     parser_repo.add_argument(
@@ -289,8 +284,6 @@ if __name__ == '__main__':
                              help="Clone repositories from a group (with group_id) or forks of a project (with project_id) (default behavior).")
     group_clone.add_argument("-f", "--forks", action="store_true",
                              help="Clone forks of a project (with project_id).")
-    parser_clone.add_argument(
-        "token", metavar="TOKEN", help="Create a token here: https://gitedu.hesge.ch/profile/personal_access_tokens")
     parser_clone.add_argument(
         "id", metavar="ID", help="The group_id (int) of the projects or the project_id (int) of the forks.")
     parser_clone.add_argument(
@@ -300,4 +293,15 @@ if __name__ == '__main__':
     parser_clone.set_defaults(func=command_clone_all)
 
     args = parser.parse_args()
+
+    if not args.token:
+        if os.path.isfile(path := os.environ.get('HOME') + '/.gitedu_token'):
+            with open(path) as file:
+                args.token = file.read().strip()
+        elif os.environ.get('GITEDU_TOKEN'):
+            args.token = os.environ.get('GITEDU_TOKEN')
+        else:
+            print('Error: you must given a token')
+            exit(1)
+
     args.func(args)
-- 
GitLab