|
@@ -0,0 +1,156 @@
|
|
|
+import sys
|
|
|
+from collections import defaultdict
|
|
|
+
|
|
|
+from django.contrib.auth.hashers import make_password
|
|
|
+from djangotools.cmdline import Command, CronManager, Argument, CommandData
|
|
|
+
|
|
|
+from djangotools.cmdline import tasks
|
|
|
+from djangotools.cmdline.common.command import SubCommand
|
|
|
+from djangotools.config import get_settings
|
|
|
+from djangotools.run import Migrate
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+def User():
|
|
|
+
|
|
|
+ from django.contrib.auth.models import User
|
|
|
+ return User
|
|
|
+
|
|
|
+def _prompt(prompt, required, is_bool):
|
|
|
+ if is_bool:
|
|
|
+ prompt = f"{prompt} (o/n)"
|
|
|
+ while True:
|
|
|
+ ret = input(f"{prompt}: ")
|
|
|
+ ret = ret.split("\n")[0] if isinstance(ret, str) else ret
|
|
|
+ if not ret or is_bool and ret.lower() not in "on":
|
|
|
+ if required or is_bool:
|
|
|
+ continue
|
|
|
+ else:
|
|
|
+ return ret
|
|
|
+ if is_bool:
|
|
|
+ return ret.lower() == "o"
|
|
|
+ return ret
|
|
|
+
|
|
|
+
|
|
|
+def prompt(data, name, prompt, required, is_bool=False):
|
|
|
+ return getattr(data, name) or _prompt(prompt, required, is_bool)
|
|
|
+
|
|
|
+class CreateUser(SubCommand):
|
|
|
+ NAME = "create"
|
|
|
+ ALIASES = "c"
|
|
|
+ HELP = "Création d'utilisateur"
|
|
|
+ ARGUMENT = [
|
|
|
+ Argument("name"),
|
|
|
+ Argument("--password", "-p", help="Mot de passe"),
|
|
|
+ Argument("--email", "-e", help="E mail"),
|
|
|
+ Argument("--staff", "-s", help="Staff", action="store_true", default=False),
|
|
|
+ Argument("--root", "-r", help="Superutilisateur", action="store_true", default=False),
|
|
|
+ Argument("--ask", "-a", help="Demander via la console les informations", action="store_true")
|
|
|
+ ]
|
|
|
+
|
|
|
+ def run(self, data):
|
|
|
+ password = data.password if not data.ask else prompt(data, "password", "Mot de passe", False)
|
|
|
+ email = data.email if not data.ask else prompt(data, "email", "Email", False)
|
|
|
+ staff = data.staff if not data.ask else prompt(data, "staff", "Est staff", False, True)
|
|
|
+ root = data.root if not data.ask else prompt(data, "root", "Est root", False, True)
|
|
|
+ try:
|
|
|
+ User().objects.create_user(username=data.name, password=password, email=email,
|
|
|
+ is_staff=staff, is_superuser=root)
|
|
|
+ except Exception as err:
|
|
|
+ print(f"Erreur: {err}", file=sys.stderr)
|
|
|
+ return
|
|
|
+
|
|
|
+class EditUser(SubCommand):
|
|
|
+ NAME = "edit"
|
|
|
+ ALIASES = "e"
|
|
|
+ HELP = "Edition d'utilisateur"
|
|
|
+ ARGUMENT = [
|
|
|
+ Argument("name"),
|
|
|
+ Argument("--name", "-n", help="Nouveau nom", dest="new_name"),
|
|
|
+ Argument("--password", "-p", help="Mot de passe"),
|
|
|
+ Argument("--email", "-e", help="E mail"),
|
|
|
+ Argument("--staff", "-s", help="Staff", action="store_true", default=None),
|
|
|
+ Argument("--root", "-r", help="Superutilisateur", action="store_true", default=None),
|
|
|
+ Argument("--ask", "-a", help="Demander via la console les informations", action="store_true")
|
|
|
+ ]
|
|
|
+
|
|
|
+ def run(self, data):
|
|
|
+ try:
|
|
|
+ user = User().objects.get(username=data.name)
|
|
|
+ except User().DoesNotExist as err:
|
|
|
+ print(f"L'utlisateur {data.name} n'existe pas", file=sys.stderr)
|
|
|
+ return
|
|
|
+
|
|
|
+ if data.ask:
|
|
|
+ user.username = prompt(data, "new_name", "Nouveau nom", False)
|
|
|
+ user.email = prompt(data, "email", "Email", False)
|
|
|
+ user.password = make_password(prompt(data, "password", "password", True))
|
|
|
+ user.is_staff = prompt(data, "staff", "Est staff", False, True)
|
|
|
+ user.is_superuser = prompt(data, "root", "Est root", False, True)
|
|
|
+ else:
|
|
|
+ if data.new_name is not None: user.username = data.new_name
|
|
|
+ if data.email is not None: user.username = data.email
|
|
|
+ if data.password is not None: user.password = make_password(data.password)
|
|
|
+ if data.staff is not None: user.is_staff = data.staff
|
|
|
+ if data.root is not None: user.is_superuser = data.root
|
|
|
+ try:
|
|
|
+ user.save()
|
|
|
+ except Exception as err:
|
|
|
+ print(f"Erreur: {err}", file=sys.stderr)
|
|
|
+ return
|
|
|
+
|
|
|
+class RemoveUser(SubCommand):
|
|
|
+ NAME = "remove"
|
|
|
+ ALIASES = "r"
|
|
|
+ HELP = "Suppression d'utilisateurs"
|
|
|
+ ARGUMENT = [
|
|
|
+ Argument("names", nargs='+')
|
|
|
+ ]
|
|
|
+
|
|
|
+ def run(self, data):
|
|
|
+ for name in data.names:
|
|
|
+ try:
|
|
|
+ user = User().objects.get(username=name)
|
|
|
+ except User().DoesNotExist:
|
|
|
+ print(f"Erreur l'utilisateur {name} n'existe pas", file=sys.stderr)
|
|
|
+ continue
|
|
|
+
|
|
|
+
|
|
|
+ try:
|
|
|
+ user.delete()
|
|
|
+ except Exception as err:
|
|
|
+ print(f"Erreur pour l'utilisateur {name}: {err}", file=sys.stderr)
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+class ListUser(SubCommand):
|
|
|
+ NAME = "list"
|
|
|
+ ALIASES = "l"
|
|
|
+ HELP = "Liste les utilisateur"
|
|
|
+ ARGUMENT = [
|
|
|
+ Argument("search", nargs='?')
|
|
|
+ ]
|
|
|
+
|
|
|
+ def run(self, data):
|
|
|
+ content = [x.username for x in User().objects.all()]
|
|
|
+ if data.search:
|
|
|
+ search = data.search.lower()
|
|
|
+ content = [x for x in content if search in x.lower()]
|
|
|
+ print(f"Liste des utilisateurs:\n"," "+" ".join(content))
|
|
|
+
|
|
|
+
|
|
|
+class UserCommand(Command):
|
|
|
+ NAME = "user"
|
|
|
+ ALIASES = ["u"]
|
|
|
+
|
|
|
+ HELP = "Gère les utilisateur"
|
|
|
+ ARGUMENT = [
|
|
|
+ CreateUser(),
|
|
|
+ EditUser(),
|
|
|
+ RemoveUser(),
|
|
|
+ ListUser()
|
|
|
+ ]
|
|
|
+
|
|
|
+ def run(self, data):
|
|
|
+ self.print_help()
|