Commit 09259dcd authored by Jérémie Passerat's avatar Jérémie Passerat

Impossibilité de modifier une version historique

parent 568b0c25
......@@ -28,20 +28,11 @@ from Utils import Utils
# 2. Installer les outils mentionnés ci dessus \n
# 3. Modifier le chemin présent à la ligne 21 du fichier Utils.py (et le remplacer par le chemin ou vous avez cloné le dépôt git) \n
# 4. Lancer Main.py, soit directement à la main, soit via un IDE configuré pour ça (environnement virtual utilisable) \n
#Menu()
Menu()
Utils.initialise_mongo()
contenus_autres = Utils.get_contenus("Auteur 1", False)
for elt in contenus_autres:
print("id : ", elt["id"], "nom :", elt["fichier"], " - v", elt["versionEnCours"]["numero"], " - du",
elt["versionEnCours"]["date"])
print (" -------------------------------------------- ")
contenus = Utils.get_contenus("Auteur 1", True)
for elt in contenus:
print("id : ", elt["id"], "nom :", elt["fichier"], " - v", elt["versionEnCours"]["numero"], " - du",
elt["versionEnCours"]["date"])
#Utils.initialise_mongo()
#Utils.get_contenus_panier("Auteur 1")
# Utils.tout_peter()
......
......@@ -13,7 +13,6 @@ class Menu:
auteur_en_cours = 0
## Constructeur, permet de lancer le 1er menu
def __init__(self):
# obligatoire à faire au début
Utils.initialise_mongo()
......@@ -34,6 +33,7 @@ class Menu:
print("Votre choix : ")
choix = (input())
# choix spécial (et masqué) permettant de réinitialiser le squelette
if choix == 'p':
Utils.tout_peter()
self.menu_de_base()
......@@ -45,10 +45,11 @@ class Menu:
self.auteur_en_cours = auteur
self.menu_des_actions()
else:
print("Mal")
print("Erreur de saisie")
sleep(1)
self.menu_de_base()
## Menu affiché une fois un compte valide sélectionné
def menu_des_actions(self):
os.system('clear')
print("Bonjour ", self.auteur_en_cours)
......@@ -73,7 +74,6 @@ class Menu:
self.menu_des_actions()
## Permet de récupérer l'action désirée par l'utilisateur
def switch_actions(self, choix):
if 0 <= choix <= 3:
if choix == 0:
......@@ -114,7 +114,7 @@ class Menu:
print("Pour manipuler un contenu, Saisir le numero du contenu puis l'action désirée (par ex : 1c)")
choix = input()
# Choix de création de contenu
if choix == 'n':
print("Selectionner le fichier à charger")
print("1 : Contenu1")
......@@ -127,7 +127,7 @@ class Menu:
elif choix.isdigit() and 1 <= int(choix) <= 2:
Utils.ajouter_contenu("Contenu" + str(choix), self.auteur_en_cours)
print("Le contenu ", choix, " a été ajouté dans vos contenus personnels")
sleep(1)
sleep(2)
self.menu_contenus_personnels()
else:
print("Choix non disponible, appuyer sur q pour revenir en arrière : ")
......@@ -138,14 +138,16 @@ class Menu:
if len(choix) > 1:
id = int(choix[:len(choix) - 1])
action = choix[len(choix) - 1:]
# Choix de consultation de contenu
if action == 'c':
os.system('clear')
print("Bonjour ", self.auteur_en_cours)
print("Vous consultez le contenu ", id)
Utils.changer_version(id, 0, "master")
version_choisie = Utils.get_version_courante(id)
if Utils.get_version_courante(id) != 1:
print("Je choisis la version que je veux : (entre 1 et", Utils.get_version_courante(id), ")")
choix = int(input())
version_choisie = int(input())
print("Je veux charger la version ", choix)
# commitVersion = Utils.getCommitPourUneVersion(choix, contenu)
Utils.changer_version(id, choix)
......@@ -155,29 +157,28 @@ class Menu:
print("Voici le détail de votre contenu n°", id)
Utils.consulter_un_contenu(id, self.auteur_en_cours)
# Utils.affichage(Utils.get_chemin_du_contenu(id))
print("Appuyez sur m pour modifier le fichier ou sur q pour quitter")
choix = input()
if choix == 'q':
Utils.detruire_fichier_tmp(id, self.auteur_en_cours)
self.menu_contenus_personnels()
elif choix == 'm':
self.modifier_contenu(id)
print("Modification ouverte sur ce contenu")
print("Appuyer sur q pour revenir en arrière : ")
input()
self.menu_contenus_en_cours()
else:
print("Choix non disponible, appuyer sur q pour revenir en arrière : ")
if Utils.get_version_courante(id) != version_choisie:
print("Vous n'etes pas dans la version courante donc ne pouvez pas modifier le contenu")
print("Appuyez sur q pour quitter")
input()
self.menu_contenus_personnels()
# elif action == 'm':
# self.modifier_contenu(id)
# print("Modification ouverte sur ce contenu")
# print("Appuyer sur q pour revenir en arrière : ")
# input()
# self.menu_contenus_en_cours()
else :
print("Appuyez sur m pour modifier le fichier ou sur q pour quitter")
choix = input()
if choix == 'q':
Utils.detruire_fichier_tmp(id, self.auteur_en_cours)
self.menu_contenus_personnels()
elif choix == 'm':
self.modifier_contenu(id)
print("Modification ouverte sur ce contenu")
print("Appuyer sur q pour revenir en arrière : ")
input()
self.menu_contenus_en_cours()
else:
print("Choix non disponible, appuyer sur q pour revenir en arrière : ")
input()
self.menu_contenus_personnels()
# Choix de suppression de contenu
elif action == 's':
if Utils.existe_en_tiers(id):
Utils.renier_contenu(id)
......@@ -188,7 +189,6 @@ class Menu:
print("Appuyer sur q pour revenir en arrière : ")
input()
self.menu_contenus_personnels()
else:
print("Action non disponible, appuyer sur q pour revenir au menu : ")
input()
......@@ -201,6 +201,7 @@ class Menu:
print("id : ", elt["id"], "nom :", elt["fichier"], " - v", elt["versionEnCours"]["numero"], " - du",
elt["versionEnCours"]["date"])
## Modification d'un contenu (dans ce cas, on incrémente l'indice de fin de fichier)
def modifier_contenu(self, id_contenu):
os.system('clear')
......@@ -217,7 +218,6 @@ class Menu:
self.menu_des_actions()
## Menu des contenus tiers
def menu_contenus_tiers(self):
os.system('clear')
print("Bonjour ", self.auteur_en_cours)
......@@ -253,22 +253,27 @@ class Menu:
Utils.changer_version(id, version_tiers)
Utils.consulter_un_contenu(id, self.auteur_en_cours)
# Utils.affichage(Utils.get_chemin_du_contenu(id))
print("Appuyez sur m pour modifier le fichier ou sur q pour quitter")
choix = input()
if choix == 'q':
Utils.detruire_fichier_tmp(id, self.auteur_en_cours)
self.menu_contenus_personnels()
elif choix == 'm':
self.modifier_contenu(id)
print("Modification ouverte sur ce tiers")
print("Appuyer sur q pour revenir en arrière : ")
if version_tiers != Utils.get_version_courante(id):
print("Vous n'etes pas dans la version courante donc ne pouvez pas modifier le contenu \r "
"Appuyez sur q pour quitter")
input()
self.menu_contenus_en_cours()
else:
print("Choix non disponible, appuyer sur q pour revenir en arrière : ")
input()
self.menu_contenus_personnels()
self.menu_contenus_tiers()
else :
print("Appuyez sur m pour modifier le fichier ou sur q pour quitter")
choix = input()
if choix == 'q':
Utils.detruire_fichier_tmp(id, self.auteur_en_cours)
self.menu_contenus_personnels()
elif choix == 'm':
self.modifier_contenu(id)
print("Modification ouverte sur ce tiers")
print("Appuyer sur q pour revenir en arrière : ")
input()
self.menu_contenus_en_cours()
else:
print("Choix non disponible, appuyer sur q pour revenir en arrière : ")
input()
self.menu_contenus_personnels()
elif action == 's':
Utils.supprimer_tiers(id, self.auteur_en_cours,
Utils.get_version_tiers_avec_id(id, self.auteur_en_cours))
......@@ -284,13 +289,13 @@ class Menu:
input()
self.menu_des_actions()
## Fonction d'affichage des contenus tiers
def afficher_contenus_tiers(self, contenu, version):
print("id :", contenu["id"], "auteur :", contenu["auteur"], " - nom :", contenu["fichier"], " - v",
version, " - du",
contenu["versionEnCours"]["date"])
## Menu des contenus en cours
def menu_contenus_en_cours(self):
os.system('clear')
print("Bonjour ", self.auteur_en_cours)
......@@ -378,10 +383,10 @@ class Menu:
"version original", elt["version"], " date modif ", elt["date"], end='')
if Utils.is_en_cours_demande(elt["idContenuEC"], self.auteur_en_cours):
print("(demande de publication en cours sur ce contenu)")
#print("\n")
else:
print("\r")
## Menu des contenus en banque
def menu_contenus_banque(self):
os.system('clear')
print("Bonjour ", self.auteur_en_cours)
......@@ -411,9 +416,10 @@ class Menu:
action = choix[len(choix) - 1:]
if action == 'c':
Utils.changer_version(id, 0, "master")
version_choisie = Utils.get_version_courante(id)
if Utils.get_version_courante(id) != 1:
print("Je choisis la version que je veux : (entre 1 et", Utils.get_version_courante(id), ")")
choix = int(input())
version_choisie = int(input())
print("Je veux charger la version ", choix)
# commitVersion = Utils.getCommitPourUneVersion(choix, contenu)
Utils.changer_version(id, choix)
......@@ -422,7 +428,7 @@ class Menu:
choix = input()
Utils.detruire_fichier_tmp(id, self.auteur_en_cours)
if choix == 't':
Utils.mettre_contenu_en_tiers(id, self.auteur_en_cours)
Utils.mettre_contenu_en_tiers(id, self.auteur_en_cours, version_choisie)
print("Le contenu ", id, 'est a présent disponible dans vos contenus tiers')
print("Appuyer sur q pour aller aux contenus tiers : ")
input()
......@@ -440,6 +446,7 @@ class Menu:
input()
self.menu_des_actions()
## Fonction d'affichage des contenus en banque
def afficher_contenus_banque(self, contenu):
for elt in contenu:
......@@ -447,6 +454,7 @@ class Menu:
elt["versionEnCours"]["numero"], " - du",
elt["versionEnCours"]["date"])
# Fonction de gestion d'une demande de validation d'un contenu en cours
def valider_modification(self, idContenuEnCours):
# on récupère l'auteur et l'id du contenu "de base" associé à la modif
......@@ -454,11 +462,12 @@ class Menu:
idContenu = Utils.get_id_contenu_associe_a_un_en_cours(idContenuEnCours)
branche = Utils.get_branche_contenu_en_cours(idContenuEnCours)
# si modification d'un contenu personnel ou d'un contenu anonyme, elle est faite directement
if auteur == self.auteur_en_cours or Utils.is_anonyme(idContenu):
chemin = Utils.get_chemin_du_contenu(idContenu)
Utils.maj_contenu(chemin, idContenu, branche)
# Dans le cas contraire, on bascule vers une demande de publication de contenu
else:
Utils.demande_publication(idContenu, idContenuEnCours, self.auteur_en_cours, auteur)
## Fonction globale de gestion des évaluations
......@@ -509,6 +518,7 @@ class Menu:
input()
self.menu_contenus_en_cours()
# Fonction d'affichage des évaluations (identique à l'affichage du détail)
def afficher_evaluations(self, evaluations):
for elt in evaluations:
print("n°", elt["idEval"], " - date", elt["date"], " - contenus : ", end='')
......@@ -516,6 +526,7 @@ class Menu:
print(i + 1, " ", end='')
print("\r")
# Création d'une évaluation
def creerEvaluation(self):
os.system('clear')
print("Bonjour ", self.auteur_en_cours)
......@@ -544,7 +555,7 @@ class Menu:
print("Bonjour ", self.auteur_en_cours)
print("Actions disponibles : ")
print("q : revenir au menu des actions")
print("d : Consulter les mises à jour disponibles")
print("d : Consulter les mises à jour recues")
print("p : Consulter les mises à jour proposées")
choix = (input())
if choix == 'q':
......
......@@ -74,7 +74,7 @@ class Utils:
if max_id is None:
max_id = 0
#print("nomFichier : ", Utils.chemin + "dossier" + nomFichier + "/")
# print("nomFichier : ", Utils.chemin + "dossier" + nomFichier + "/")
cheminFichier = Utils.chemin + "dossier" + nomFichier + "/"
......@@ -83,7 +83,7 @@ class Utils:
os.system("cp '" + Utils.chemin + nomFichier + "' '" + cheminFichier + nomFichier + "'")
commit = UtilsGit.commit(cheminFichier, nomFichier, "Version 1")
#print("commit : ", commit)
# print("commit : ", commit)
Utils.statdb.contenu.insert_one(
{"id": max_id + 1, "auteur": auteur, "note": randrange(0, 10, 1),
......@@ -96,24 +96,40 @@ class Utils:
print("Le contenu a bien été ajouté pour l'utilisateur ", auteur)
## Consultation de tous les contenus publics :
# Si panier est égal à True, on sort les contenus de l'auteur
# Si panier est égal à False, on sort toutes les questions sauf celles de l'auteur (et ses tiers)
# @param auteur le nom de l'auteur
# @ panier recherche dans les contenus persos ou non
# Si perso est égal à True, on sort les contenus perso de l'auteur
# Si perso est égal à False, on sort toutes les questions sauf celles de l'auteur (et ses tiers)
# (Nb: La problématique des contenus "en cours de modification" sera traitée ultérieurement)
# @return les contenus de l'auteur ou tous les autres
@staticmethod
def get_contenus(auteur, panier=False):
if panier:
def get_contenus(auteur, perso=False):
if perso:
return Utils.statdb.contenu.find({"auteur": auteur})
else:
contenus_tiers = Utils.get_contenus_tiers(auteur)
tiers_auteur = list()
for tier in contenus_tiers:
tiers_auteur.append(tier[0]["contenu"])
#return Utils.statdb.contenu.find({"auteur": {"$ne": auteur}} or {"id": {"$nin": tiers_auteur}})
#return Utils.statdb.contenu.find({"auteur": {"$ne": auteur}})
# print ("tiers de l'auteur : ", tiers_auteur)
return Utils.statdb.contenu.find({"$and" : [{"auteur": {"$ne": auteur}}, {"id": {"$nin": tiers_auteur}}]})
return Utils.statdb.contenu.find({"$and": [{"auteur": {"$ne": auteur}}, {"id": {"$nin": tiers_auteur}}]})
## récupérer tous les contenus du "panier" de l'auteur
# @param auteur l'auteur concerné
@staticmethod
def get_contenus_panier(auteur):
contenus_perso = Utils.get_contenus(auteur)
id_tiers = Utils.get_contenus_tiers(auteur)
contenus_tiers = list()
for (id, version) in id_tiers:
contenus_tiers.append(
Utils.get_contenu_avec_id_et_version(int(id['contenu']), int(version['version'])))
contenus_en_cours = Utils.get_contenus_en_cours(auteur)
print(type(contenus_perso))
print(type(contenus_tiers))
print(type(contenus_en_cours))
## Consultation de tous les contenus, sans distinction
# (utile temporairement pour la création d'évaluations)
......@@ -142,11 +158,13 @@ class Utils:
# @param auteur le nom de l'auteur qui désire un favori
@staticmethod
def mettre_contenu_en_tiers(idContenu, auteur):
def mettre_contenu_en_tiers(idContenu, auteur, version=0):
# print("Le contenu est dans la version ", Utils.getVersionContenuavecId(idContenu))
if version == 0:
version = Utils.get_version_contenu_avec_id(idContenu)
Utils.statdb.utilisateur.update({"nom": auteur}, {
"$push": {
"tiers": [{"contenu": int(idContenu)}, {"version": Utils.get_version_contenu_avec_id(idContenu)}]}})
"tiers": [{"contenu": int(idContenu)}, {"version": version}]}})
## Permet de dissocier un contenu du panier d'un auteur tiers
# Si cet auteur était le seul à posséder une question "anonyme", elle est supprimée
......@@ -160,7 +178,7 @@ class Utils:
# @param idContenu l'identifiant du contenu
@staticmethod
def is_anonyme(idContenu):
#print("Is anonyme : ", Utils.statdb.contenu.find_one({"id": idContenu})["auteur"])
# print("Is anonyme : ", Utils.statdb.contenu.find_one({"id": idContenu})["auteur"])
return Utils.statdb.contenu.find_one({"id": idContenu})["auteur"] == "Aucun"
## Récupérer un contenu à partir de son identifiant et sa version
......@@ -235,7 +253,7 @@ class Utils:
element = Utils.statdb.encours.find().sort("idContenuEC", -1).limit(1)
for elt in element:
#print("id : ", elt)
# print("id : ", elt)
return int(elt["idContenuEC"])
## Récupérer l'id maximal (pour les demandes de publication)
......@@ -247,7 +265,7 @@ class Utils:
element = Utils.statdb.demandesPub.find().sort("id", -1).limit(1)
for elt in element:
#print("id : ", elt)
# print("id : ", elt)
return int(elt["id"])
## Récupérer les tiers d'un utilisateur
......@@ -302,12 +320,13 @@ class Utils:
@staticmethod
## affichage d'un contenu de fichier
# @param chemin le fichier à afficher
def affichage(chemin):
def affichage(chemin, get_chemin = False):
with open(chemin, "r") as fichier:
texte = fichier.read()
texte = texte.strip()
print("Le fichier (v", int(texte[-1]), ") : " + texte)
if not get_chemin:
print("Le fichier (v", int(texte[-1]), ") : " + texte)
return texte
@staticmethod
......@@ -342,10 +361,10 @@ class Utils:
@staticmethod
def modification_fichier(chemin, idContenu, auteur, modifPremiere=True):
#print("Le chemin du fichier est : ", chemin)
# print("Le chemin du fichier est : ", chemin)
# on récupère la fin du fichier (la version)
fin = Utils.affichage(chemin)
fin = Utils.affichage(chemin, True)
version = int(fin[-1])
if version == 1:
ecart = 2
......@@ -354,14 +373,14 @@ class Utils:
repertoire = chemin[:chemin.rfind("/") + 1]
nomFichier = chemin[chemin.rfind("/") + 1:]
#print("nomFichier :", nomFichier)
#print("chemin :", chemin)
# print("nomFichier :", nomFichier)
# print("chemin :", chemin)
# exit(0)
if modifPremiere:
# on créée une nouvelle branche et on va dedans
nomBranche = "version" + str(version + 1)
#print("Je veux la branche", nomBranche)
# print("Je veux la branche", nomBranche)
UtilsGit.embranchement(repertoire, nomBranche)
UtilsGit.changerVersionBranche(repertoire, nomBranche)
# si on est pas en "modifPremiere" on est déja dans la bonne branche.
......@@ -379,7 +398,7 @@ class Utils:
# fichier.seek(0, 2)
# print("pront:", fichier.read())
fichier.close()
Utils.affichage(chemin)
#Utils.affichage(chemin)
UtilsGit.commit(repertoire, nomFichier, "modification")
# si on est dans le cas d'une modification 1ere d'un contenu, on l'entre en bd (sinon il y est déja)
......@@ -450,7 +469,7 @@ class Utils:
@staticmethod
def get_id_contenu_associe_a_un_en_cours(idContenuEnCours):
#print("L'id en cours que j'ai est", idContenuEnCours, " - ", type(idContenuEnCours))
# print("L'id en cours que j'ai est", idContenuEnCours, " - ", type(idContenuEnCours))
return Utils.statdb.encours.find_one({"idContenuEC": int(idContenuEnCours)})["reference"]
@staticmethod
......@@ -460,7 +479,7 @@ class Utils:
@staticmethod
def get_id_contenu_en_cours_associe_a_une_publication(idDdePublication):
#print("L'id en cours que j'ai est", idDdePublication, " - ", type(idDdePublication))
# print("L'id en cours que j'ai est", idDdePublication, " - ", type(idDdePublication))
return Utils.statdb.demandesPub.find_one({"id": int(idDdePublication)})["idContenuEnCours"]
## récupérer le chemin d'un fichier associé à un contenu
......@@ -527,7 +546,7 @@ class Utils:
## creer un contenu à partir d'un contenu en cours
@staticmethod
def creer_nouveau_contenu(chemin, auteurEnCours, idContenuEnCours):
#print("chemin : ", chemin)
# print("chemin : ", chemin)
# hard codé pour l'exemple, sera adaptatif dans le futur
max_id = 3
......@@ -536,9 +555,9 @@ class Utils:
cheminFichier = Utils.chemin + dossierFichier
nomFichier = chemin[chemin.rfind("/") + 1:]
#print("Chemin fichier : ", cheminFichier)
#print("Dossier Fichier : ", dossierFichier)
#print("NomFichier :", nomFichier)
# print("Chemin fichier : ", cheminFichier)
# print("Dossier Fichier : ", dossierFichier)
# print("NomFichier :", nomFichier)
Path(cheminFichier).mkdir(parents=True, exist_ok=True)
os.system("cp " + chemin + " " + cheminFichier)
os.system("mv " + cheminFichier + nomFichier + " " + cheminFichier + "Contenu" + str(max_id))
......@@ -553,7 +572,6 @@ class Utils:
"tags_fixes": {"1": "tag1", "2": "tag1", "3": "tag1", "4": "tag1",
"5": "tag1"},
"tags": {"1": "tag1", "2": "tag1", "3": "tag1", "4": "tag1", "5": "tag1"}})
print("Le contenu a bien été ajouté pour l'utilisateur ", auteurEnCours)
Utils.supprimer_contenu_en_cours(idContenuEnCours)
......@@ -595,9 +613,7 @@ class Utils:
# @param version le numéro de version désiré
@staticmethod
def get_commit_pour_une_version(idContenu, version):
print("Je veux récupérer le commit associé à la version ", version, "pour le contenu ", idContenu)
#print("Je veux récupérer le commit associé à la version ", version, "pour le contenu ", idContenu)
if version == Utils.get_version_courante(idContenu):
courante = Utils.statdb.contenu.find_one({"id": idContenu})["versionEnCours"]
......@@ -662,7 +678,7 @@ class Utils:
compteur = Utils.statdb.utilisateur.find({"nom": auteur} and
{"majRejetees": {"$elemMatch": {"$elemMatch": {"contenu": idContenu,
"version": versionMaj}}}}).count() != 0
#print("Compteur : ", compteur)
# print("Compteur : ", compteur)
return compteur
## Fonction globale de gestion de la recherche sur contenu
......
......@@ -20,8 +20,6 @@ class UtilsGit:
def commit(cheminFichier, nomFichier, texteCommit):
repo = Repo.init(cheminFichier)
print("le richier à add est : ", cheminFichier)
# Il faudra faire une extraction du nom du fichier a partir du chemin
repo.index.add([nomFichier])
repo.index.commit(texteCommit)
......
Bonjour, je suis un contenu 1 dans sa version 1
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment