1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452
| # ==============================================================================
# GESTION PLANNING :
# ==============================================================================
from liste import *
class Cours(object):
def __init__ (self, date_creneau =201712200 ,dic_prof=" ",dic_salle=" ",
dic_groupe=" "):
self.date_creneau = date_creneau
self.dic_prof = dic_prof
self.dic_salle = dic_salle
self.dic_groupe = dic_groupe
def __lt__(self, cours):
return self.date_creneau < cours.date_creneau
def __eq__(self, cours):
return self.date_creneau == cours.date_creneau
# ==============================================================================
def lecture_csv(nom):
"Lit le fichier csv"
assert isinstance (nom, str), "Type nom incorrect, il faut un nom"
# var
n = 0 # int
# begin
# creation de dictionnaire libre
dictionnaire_prof = {}
dictionnaire_salle = {}
dictionnaire_groupe = {}
fichier = open(nom, "r") # ouvre le csv
l = fichier.readlines ()
fichier.close () # ferme le fichier
n = len(l)-1
while n != -1 : # part a la fin puis on remonte
# begin
a = l[n]
a = a[:len(a)-1]
s = a.split(",")
c = Cours (int(s[0]),s[1],s[2],s[3]) #fichier excel coder date pour que ca le donne en nombre
# Associer les element de la classe "cours"
if c.dic_prof not in dictionnaire_prof : # la clé n'existe pas
dictionnaire_prof[c.dic_prof] = liste() # crée une clé qui devient une liste
dictionnaire_prof[c.dic_prof].insere_en_tete(c) # ajouter le cours dans le planning
if c.dic_salle not in dictionnaire_salle : # la clé n'existe pas
dictionnaire_salle[c.dic_salle] = liste() # crée une clé qui devient une liste
dictionnaire_salle[c.dic_salle].insere_en_tete(c) # ajouter le cours dans le planning
if c.dic_groupe not in dictionnaire_groupe : # la clé n'existe pas
dictionnaire_groupe[c.dic_groupe] = liste() # crée une clé qui devient une liste
dictionnaire_groupe[c.dic_groupe].insere_en_tete(c) # ajouter le cours dans le planning
n = n-1
# end
return (dictionnaire_prof, dictionnaire_salle, dictionnaire_groupe)
# end
# ==============================================================================
def conv_dc(date_creneau):
"Convertis la date_creneau en str"
assert isinstance (date_creneau, int), "Type date_creneau incorrect, il faut un int"
# var
date_creneau_str = "" # str
date_creneau_creneau = "" # str
date_creneau_annee = "" # str
date_creneau_mois = "" # str
date_creneau_jour = "" # str
# begin
date_creneau_str = str(date_creneau) # convertie en str
date_creneau_creneau = date_creneau_str [8:] # prend le dernier element
date_creneau_jour = date_creneau_str [6:] # prend les trois dernier
date_creneau_jour = date_creneau_jour[:2] # garde les deux premier
date_creneau_mois = date_creneau_str [4:] # prend les cinq dernier
date_creneau_mois = date_creneau_mois [:2] # garde les deux premier
date_creneau_annee = date_creneau_str[:4] # prend les quatre premier
# cree une chaine de caractere qui forme la date et le creneau a la suite
return str(date_creneau_jour) + '/' + str(date_creneau_mois) + '/' + str(date_creneau_annee) + ' ' + str(date_creneau_creneau)
# ==============================================================================
def bisextile(date_creneau) :
""" Renvoie True, si l'année est bisextile, False sinon"""
assert isinstance(date_creneau, int), "Type annee incorrect, il faut un int"
# begin
date_creneau_str = str(date_creneau) # convertis en str pour recuperer l'année
date_creneau_annee = date_creneau_str[:4] # on recupere juste l'année (donc les 4 premiers
date_creneau_annee_int = int(date_creneau_annee) # convertis en int pour l'utiliser
return (date_creneau_annee_int % 4 == 0 and date_creneau_annee_int % 100 != 0) or (date_creneau_annee_int % 400 == 0)
# end
# ==============================================================================
def jours_apres (date_creneau):
"""Permet de connaitre le jour d'apres"""
assert isinstance (date_creneau,int), "Type date_creneau est incorrecte"
# var
date_creneau_str = "" # str
date_creneau_creneau = "" # str
date_creneau_annee = "" # str
date_creneau_mois = "" # str
date_creneau_jour = "" # str
date_creneau_apres = "" # str
date_creneau_creneau_int = 0 # int
date_creneau_annee_int = 0 # int
date_creneau_mois_int = 0 # int
date_creneau_jour_int = 0 # int
# begin
date_creneau_str = str(date_creneau) # convertis date_creneau en str
date_creneau_creneau = date_creneau_str [8:] # prend le dernier
date_creneau_jour = date_creneau_str [6:] # prend les 3 derniers
date_creneau_jour = date_creneau_jour[:2] # garde les deux premiers
date_creneau_jour_int = int(date_creneau_jour) # convertis en int
date_creneau_mois = date_creneau_str [4:] # prend les 5 dernier
date_creneau_mois = date_creneau_mois [:2] # garde les 2 premier
date_creneau_mois_int = int(date_creneau_mois) # convertis en int
date_creneau_annee = date_creneau_str[:4] # prend les 4 premier
date_creneau_annee_int = int(date_creneau_annee) # convertis en int
# cas ou le creneau correspond au dernier entier
if date_creneau_creneau == "4" :
# cas pour les mois avec 31 jours
if (date_creneau_mois == "01" or date_creneau_mois == "03" or date_creneau_mois == "05" or date_creneau_mois == "07" or
date_creneau_mois == "08" or date_creneau_mois == "10") and date_creneau_jour == "31":
# begin
date_creneau_mois = str(date_creneau_mois_int + 1) # ajoute un mois en plus
if len(date_creneau_mois) == 1 : # le chiffre est plus petit que 10
date_creneau_mois = "0" + date_creneau_mois # rajoute un 0 pour que le str soit composer de deux chiffres
else :
date_creneau_mois # sinon on renvoie le mois
date_creneau_jour = "01" # le jour repasse au premier
date_creneau_creneau = "0" # le creneau redevient le premier
# end
# cas pour les mois avec 30 jours
elif (date_creneau_mois == "04" or date_creneau_mois == "06" or date_creneau_mois == "09" or
date_creneau_mois == "11") and date_creneau_jour == "30":
# begin
date_creneau_mois = str(date_creneau_mois_int + 1) # ajoute un mois en plus
if len(date_creneau_mois) == 1 : # chiffre est plus petit que 10
date_creneau_mois = "0" + date_creneau_mois # rajoute un 0 pour que le str soit composer de deux chiffres
else :
date_creneau_mois # sinon on renvoie le mois
date_creneau_jour = "01" # le jour repasse au premier
date_creneau_creneau = "0" # le creneau redevient le premier
# end
# cas bisextile et fevrier
elif bisextile (date_creneau) == True and date_creneau_mois == "02" and date_creneau_jour == "29":
# begin
date_creneau_mois = "03" # le mois passe au prochaine c'est-a-dire mars (03)
date_creneau_jour = "01" # le jour repasse au premier
date_creneau_creneau = "0" # le creneau redevient le premier
# end
# cas non bisextile et fevrier
elif bisextile (date_creneau) == False and date_creneau_mois == "02" and date_creneau_jour == "28":
# begin
date_creneau_mois = "03" # le mois passe au prochaine c'est-a-dire mars (03)
date_creneau_jour = "01" # le jour repasse au premier
date_creneau_creneau = "0" # le creneau redeviens le premier
# end
# cas dernier jour de l'année
elif date_creneau_mois == "12" and date_creneau_jour == "31" :
# begin
date_creneau_mois = "01" # le mois repasse au premier
date_creneau_jour = "01" # le jour repasse au premier
date_creneau_annee = str(date_creneau_annee_int + 1) # ajoute un an en plus
date_creneau_creneau = "0" # le creneau redeviens le premier
# end
# sinon on ajoute un jour
else :
# begin
date_creneau_jour = str(date_creneau_jour_int + 1) # ajoute un jour en plus
if len(date_creneau_jour) == 1 : # chiffre est plus petit que 10
date_creneau_jour = "0" + date_creneau_jour # rajoute un 0 pour que le str soit composer de deux chiffres
else :
date_creneau_jour # sinon on renvoie le jour
date_creneau_creneau = "0" # le creneau redeviens le premier
# end
# on ajoute un creneau tant que on est pas a 4
else :
# begin
date_creneau_creneau = str(date_creneau_creneau_int + 1) # ajoute un creneau en plus
# end
# creation de la nouvelle date
date_creneau_apres = date_creneau_annee + date_creneau_mois + date_creneau_jour + date_creneau_creneau
# convertis la date en int et aussi grâcea a la fonction au-dessus
return conv_dc(int(date_creneau_apres))
# end
# ==============================================================================
def verifier_1 (dic,date_creneau) :
""" fonction qui verifie si la date_creneau est libre dans le planning donné"""
assert isinstance (dic, liste), "Type dic incorrect, il faut une liste"
assert isinstance (date_creneau, int), "Type date_creneau incorrect, il faut un int"
# var
ptr = None # on utilise un pointeur pour parcourir la liste
# begin
ptr = dic.debut # on place le pointeur au debut de la liste
while ptr != None and ptr.valeur < date_creneau : # on arrete quand on est arriver a la fin ou que l'on a trouve la valeur
# begin
if ptr.valeur == date_creneau :
return False
ptr = ptr.suivant
# end
return True
# end
# ==============================================================================
def verifier_2 (dic1,dic2, date_creneau):
""" fonction qui verifie si la date_creneau est libre dans les deux planning donné"""
assert isinstance (dic1, liste), "Type dic1 incorrect, il faut une liste"
assert isinstance (dic2, liste), "Type dic2 incorrect, il faut une liste"
assert isinstance (date_creneau, int), "Type date_creneau incorrect, il faut un int"
# il faut que les deux planning sois libre pour que ca soit vrai
if verifier_1(dic1,date_creneau)== True and verifier_1(dic2,date_creneau) == True :
return True
return False
# ==============================================================================
def verifier_3 (dic1,dic2,dic3, date_creneau):
""" fonction qui verifie si la date_creneau est libre dans les trois planning donné"""
assert isinstance (dic1, liste), "Type dic1 incorrect, il faut une liste"
assert isinstance (dic2, liste), "Type dic2 incorrect, il faut une liste"
assert isinstance (dic3, liste), "Type dic3 incorrect, il faut une liste"
assert isinstance (date_creneau, int), "Type date_creneau incorrect, il faut un int"
# il faut que les trois planning sois libre pour que ca soit vrai
if verifier_2(dic1,dic2,date_creneau)== True and verifier_1(dic3,date_creneau) == True :
return True
return False
# ==============================================================================
def ajoute_cours(date_creneau,dic_prof,dic_salle,dic_groupe):
""" Ajouter un cours dans les planning respectifs, seulement si cest possible"""
assert isinstance (dic_prof, liste), "Type dic1 incorrect, il faut une liste"
assert isinstance (dic_salle, liste), "Type dic2 incorrect, il faut une liste"
assert isinstance (dic_groupe, liste), "Type dic3 incorrect, il faut une liste"
assert isinstance (date_creneau, int), "Type date_creneau incorrect, il faut un int"
#var
c = Cours()
#begin
c = Cours(date_creneau,dic_prof,dic_salle,dic_groupe)
# on verifie si les planning sont disponible
if verifier_3 (dic_prof,dic_salle,dic_groupe,date_creneau) == True :
# begin
dictionnaire_prof[dic_prof].insere_triee(c)
dictionnaire_salle[dic_salle].insere_triee(c)
dictionnaire_groupe[dic_groupe].insere_triee(c)
# end
else:
("Ce n'est pas possible!")
# end
# ==============================================================================
def supprime_cours(date_creneau,dic,dic_prof,dic_salle,dic_groupe):
"Supprimer un cours dun des planning"
assert isinstance (dic, liste), "Type dic1 incorrect, il faut une liste"
assert isinstance (date_creneau, int), "Type date_creneau incorrect, il faut un int"
assert isinstance (dic_salle, liste), "Type dic_salle incorrect, il faut une liste"
assert isinstance (dic_groupe, liste), "Type dic_groupe incorrect, il faut une liste"
assert isinstance (dic_prof, liste), "Type dic_prof incorrect, il faut une liste"
# var
ptr_dic = None #on utilise un pointeur pour se deplacer dans le dic
c = cours()
# begin
c = cours(date_creneau,dic_prof,dic_salle,dic_groupe)
# avant on verifie si le cours que l'on veut supprimer existe
if verifier_1(dic,date_creneau.c)== False :
return ("On peut supprimer")
# On place le pointeur au debut de liste
ptr_dic = dic.debut
if ptr_dic.valeur == c :
supprime_en_tete(dic)
else :
# begin
while ptr_dic != None and ptr_dic.valeur < c :
ptr_dic = ptr_dic.suivant
ptr.suivant = ptr.suivant.suivant
# end
# end
return dic
# ==============================================================================
def mise_a_jour (date_creneau,dic1,dic2,dic_prof, dic_salle, dic_groupe):
""" mise a jour des autres dictionnaire apres suppression d'un cours"""
assert isinstance (dic1, liste), "Type dic1 incorrect, il faut une liste"
assert isinstance (dic2, liste), "Type dic2 incorrect, il faut une liste"
assert isinstance (date_creneau, int), "Type date_creneau incorrect, il faut un int"
assert isinstance (dic_salle, liste), "Type dic_salle incorrect, il faut une liste"
assert isinstance (dic_groupe, liste), "Type dic_groupe incorrect, il faut une liste"
assert isinstance (dic_prof, liste), "Type dic_prof incorrect, il faut une liste"
supprime_cours (date_creneau, dic1, dic_prof, dic_salle, dic_groupe)
supprime_cours (date_creneau, dic2, dic_prof, dic_salle, dic_groupe)
# ==============================================================================
def liste_couples_libres (dic, date_creneau_1, date_creneau_2):
"""Entre deux dates données génére la liste des couples libres pour un planning"""
assert isinstance (dic,liste), "Type dic incorrect, il faut une liste"
assert isinstance (date_creneau_1, int), "Type date_creneau_1 incorrect, il faut un int"
assert isinstance (date_creneau_2, int), "Type date_creneau_2 incorrect, il faut un int"
# var
liste_dates = liste() # liste
# begin
liste_date = liste() # crée une liste vide
while date_creneau_1 != date_creneau_2:
# begin
if verifie1(dic,date_creneau_1) == True : # on regarde si la date_creneau exite
liste_dates.insere_triee(date_creneau_1)
date_creneau_1 = jours_apres(date_creneau_1) #on passe au prochain, creneau ou jour
# end
return liste_dates
# end
# ==============================================================================
def liste_couples_libres_2( dic1, dic2, date_creneau_1, date_creneau_2):
"""Entre deux dates données génére la liste des couples libres pour deux planning"""
assert isinstance (dic1,liste), "Type dic1 incorrect, il faut une liste"
assert isinstance (dic2,liste), "Type dic2 incorrect, il faut une liste"
assert isinstance (date_creneau_1, int), "Type date_creneau_1 incorrect, il faut un int"
assert isinstance (date_creneau_2, int), "Type date_creneau_2 incorrect, il faut un int"
# var
liste_dates = liste() # liste
date_creneau_liste_dic1 = liste() # liste
date_creneau_liste_dic2 = liste() # liste
ptr1 = None # pointeur
ptr2 = None # pointeur
# begin
date_creneau_liste_dic1= liste() # creation d'une liste vide
date_creneau_liste_dic2 = liste() # creation d'une liste vide
liste_dates = liste () # cree une liste vide
# Recupere les date_creneau libres pour le premier dic et le deuxieme dic
date_creneau_liste_dic1 = liste_couples_libres(dic1, date_creneau_1, date_creneau_2)
date_creneau_liste_dic2 = liste_couples_libres(dic2, date_creneau_1, date_creneau_2)
#On place les pointeur au debut des listes
ptr1 = date_creneau_liste_dic1.debut
ptr2 = date_creneau_liste_dic2.debut
while ptr2 != None :
# begin
while ptr1 != None and ptr1.valeur < ptr2.valeur :
# begin
if ptr1.valeur == ptr2.valeur :
liste_dates.insere_triee(ptr1.valeur)
ptr1 = ptr1.suivant
# end
ptr2 = ptr2.suivant
# end
return liste_dates
# end
# ==============================================================================
def salles_disponibles (date_creneau_1,date_creneau_2, dic_prof, dic_groupe, dic_salle, dictionnaire_salle):
"""Générer la liste des salles disponibles"""
assert isinstance (date_creneau_1, int), "Type date_creneau_1 incorrect, il faut un int"
assert isinstance (date_creneau_2, int), "Type date_creneau_2 incorrect, il faut un int"
assert isinstance (dic_prof, liste), "Type dic_prof incorrect, il faut une liste"
assert isinstance (dic_groupe, liste), "Type dic_groupe incorrect, il faut une liste"
assert isinstance (dic_salle, liste), "Type dic_salle incorrect, il faut une liste"
assert isinstance (dictionnaire_salle, dict), "Type dico incorrect, il faut un dictionnaire"
# var
liste_dates = liste () # liste
nom_des_salles = liste () # liste
liste_salles = liste() # liste
liste_salles_dispo = liste() # liste
ptr_liste_dates = None # Pointeur
ptr_nom_des_salles = None # Pointeur
ptr_liste_salles = None # Pointeur
# begin
nom_des_salles = liste() # création d'une liste vide
liste_dates = liste() # création d'une liste vide
liste_salles = liste() # création d'une liste vide
liste_salles_dispo = liste() # création d'une liste vide
# Recupérer les noms des salles à l'aide des clé du dictionnaire
for cle in dictionnire_salle.keys():
nom_des_salles.insere_en_tete(cle)
# Permet d'avoir les date disponibles entre le planning des prof et celle des groupe
liste_dates = liste_couples_2(dic_prof,dic_groupe,date_creneau_1,date_creneau_2)
# Permet d'avoir les date disponibles pour le planning des salles
liste_salles = liste_couples_1(dic_salle,date_creneau_1,date_creneau_2)
#On place les pointeur aux debut des liste
ptr_liste_dates = liste_dates.debut
ptr_nom_des_salles = nom_des_salles.debut
ptr_liste_salles = liste_salles.debut
while ptr_liste_dates != None :
# begin
while ptr_nom_des_salles != None :
while ptr_liste_salles != None and ptr_liste_salles.valeur < ptr_liste_dates.valeur :
# begin
if ptr_liste_salles.valeur == ptr_liste_dates.valeur :
liste_salles_dispo.insere_triee((ptr_listes_dates.valeur,ptr_nom_des_salles))
ptr_liste_salles = ptr_liste_salles.suivant
# end
ptr_nom_des_salles = ptr_nom_des_salles.suivant
# end
ptr_liste_dates = ptr_liste_dates.suivant
return liste_salles_dispo
# end
# ==============================================================================
def main() :
""" Explication de ce que fait le programme """
cours = [Cours(*ligne) for ligne in lecture_csv("gestion_planning.csv")]
#end
#-----------------------------------------------------------------------------------
if __name__ == "__main__" :
main() |
Partager