recopytex/recopytex/scripts/prompts.py

196 lines
5.2 KiB
Python
Raw Normal View History

2020-10-04 14:11:55 +00:00
#!/usr/bin/env python
# encoding: utf-8
2020-10-04 14:38:36 +00:00
from PyInquirer import prompt
2020-10-04 14:11:55 +00:00
from datetime import datetime
from functools import wraps
from .getconfig import config
2020-10-04 16:10:43 +00:00
class CancelError(Exception):
pass
def prompt_until_validate_or_cancel(func):
@wraps(func)
def wrapper(*args, **kwrd):
ans = func(*args, **kwrd)
question = [
{
"type": "list",
"name": "confirm",
"message": "C'est bon?",
"choices": ["Oui", "Non", "Annuler cet élément"],
}
]
confirm = prompt(question)["confirm"]
while confirm == "Non":
ans = func(*args, **ans, **kwrd)
if confirm == "Annuler cet élément":
raise CancelError
return ans
return wrapper
2020-10-04 14:11:55 +00:00
def prompt_until_validate(func):
@wraps(func)
def wrapper(*args, **kwrd):
ans = func(*args, **kwrd)
2020-10-04 14:38:36 +00:00
question = [{"type": "confirm", "name": "confirm", "message": "C'est bon?"}]
2020-10-04 14:11:55 +00:00
while not prompt(question)["confirm"]:
2020-10-04 16:10:43 +00:00
ans = func(*args, **ans, **kwrd)
2020-10-04 14:11:55 +00:00
return ans
return wrapper
@prompt_until_validate
2020-10-04 14:38:36 +00:00
def prompt_exam(**kwrd):
2020-10-04 14:11:55 +00:00
""" Prompt questions to edit an exam """
questions = [
2020-10-04 16:10:43 +00:00
{
"message": "Nom de l'évaluation",
"type": "input",
"name": "name",
"default": kwrd.get("name", "DS"),
},
2020-10-04 14:11:55 +00:00
{
2020-10-04 14:38:36 +00:00
"message": "Nom de la classe",
2020-10-04 14:11:55 +00:00
"type": "list",
"name": "_tribe",
"choices": [t["name"] for t in config["tribes"]],
2020-10-04 14:38:36 +00:00
"default": kwrd.get("tribe", ""),
2020-10-04 14:11:55 +00:00
},
{
2020-10-04 14:38:36 +00:00
"message": "Date (%y%m%d)",
2020-10-04 14:11:55 +00:00
"type": "input",
"name": "_date",
"validate": lambda x: (len(x) == 6) and x.isdigit(),
2020-10-04 14:38:36 +00:00
"default": kwrd.get("_date", datetime.today().strftime("%y%m%d")),
2020-10-04 14:11:55 +00:00
},
2020-10-04 16:10:43 +00:00
{
"message": "Trimestre",
"type": "input",
"name": "term",
"validate": lambda x: x.isdigit(),
"default": kwrd.get("term", "1"),
},
2020-10-04 14:11:55 +00:00
{
2020-10-04 14:38:36 +00:00
"message": "Nombre d'exercice",
2020-10-04 14:11:55 +00:00
"type": "input",
"name": "ExQty",
"validate": lambda x: x.isdigit(),
2020-10-04 14:38:36 +00:00
"default": kwrd.get("ExQty", "1"),
2020-10-04 14:11:55 +00:00
},
]
2020-10-04 16:10:43 +00:00
print("Nouvelle évaluation")
2020-10-04 14:11:55 +00:00
exam = prompt(questions)
exam["tribe"] = [t for t in config["tribes"] if exam["_tribe"] == t["name"]][0]
exam["date"] = datetime.strptime(exam["_date"], "%y%m%d")
return exam
2020-10-04 14:38:36 +00:00
@prompt_until_validate
def prompt_exercise(number=1, **kwrd):
2020-10-04 16:10:43 +00:00
try:
kwrd["name"]
except KeyError:
print("Nouvel exercice")
else:
print(f"Modification de la questions {kwrd['name']}")
2020-10-04 14:38:36 +00:00
questions = [
{
"message": "Nom de l'exercice",
"type": "input",
"name": "name",
"default": kwrd.get("name", f"Exercice {number}"),
}
]
exercise = prompt(questions)
exercise["questions"] = []
2020-10-04 16:10:43 +00:00
try:
kwrd["questions"]
except KeyError:
last_question_id = "1a"
else:
for ques in kwrd["questions"]:
try:
exercise["questions"].append(prompt_question())
except CancelError:
print("Cette question a été supprimée")
last_question_id = exercise["questions"][-1]["id"]
2020-10-04 14:38:36 +00:00
append = [
{
"message": "Ajouter un élément de notation",
"type": "confirm",
"name": "append",
}
]
while prompt(append)["append"]:
2020-10-04 16:10:43 +00:00
try:
exercise["questions"].append(prompt_question(last_question_id))
except CancelError:
print("Cette question a été supprimée")
else:
last_question_id = exercise["questions"][-1]["id"]
2020-10-04 14:38:36 +00:00
return exercise
2020-10-04 14:11:55 +00:00
2020-10-04 16:10:43 +00:00
@prompt_until_validate_or_cancel
def prompt_question(last_question_id="1a", **kwrd):
try:
kwrd["id"]
except KeyError:
print("Nouvelle question")
else:
print(f"Modification de la questions {kwrd['id']}")
questions = [
{
"message": "Identifiant de la question",
"type": "input",
"name": "id",
"default": kwrd.get("id", "1a"),
},
{
"message": "Competence",
"type": "input",
"name": "competence",
"default": kwrd.get("competence", "Cal"),
},
{
"message": "Domaine",
"type": "input",
"name": "theme",
"default": kwrd.get("domain", ""),
},
{
"message": "Commentaire",
"type": "input",
"name": "comment",
"default": kwrd.get("comment", ""),
},
{
"message": "Évaluation par niveau",
"type": "confirm",
"name": "is_leveled",
"default": kwrd.get("is_leveled", True),
},
{
"message": "Bareme",
"type": "input",
"name": "score_rate",
"default": kwrd.get("score_rate", "1"),
"validate": lambda x: x.isdigit(),
},
]
return prompt(questions)