This repository has been archived on 2021-09-15. You can view files and clone it, but cannot push or open issues or pull requests.
L3GestionParking/src/m/Parking.py

438 lines
15 KiB
Python
Raw Normal View History

2015-02-07 22:59:01 +00:00
"""
Module qui implémente les classes representants un parking de DreamPark.
"""
2015-01-13 23:39:12 +00:00
import random
import string
2015-02-04 13:20:39 +00:00
import time
2015-02-07 22:59:01 +00:00
from datetime import datetime
2015-02-05 00:21:43 +00:00
2015-02-07 22:59:01 +00:00
from src.c.utils.connexionBDD import connexionBDD
2015-02-05 00:21:43 +00:00
from src.m.Voiture import Voiture
2014-12-05 14:54:04 +00:00
2014-12-23 10:37:14 +00:00
2015-01-13 23:39:12 +00:00
2015-02-07 22:59:01 +00:00
## Representation d'un parking de DreamPark
2014-12-23 10:37:14 +00:00
class Parking:
2015-01-13 23:39:12 +00:00
parkings = []
2015-02-05 00:21:43 +00:00
2015-02-07 22:59:01 +00:00
## Retourne un objet parking correspondant à id
# @param id id du Parking a retourner
2015-01-13 23:39:12 +00:00
@staticmethod
def get(id):
2015-02-05 00:21:43 +00:00
if len(Parking.parkings) == 0:
2015-02-04 13:20:39 +00:00
Parking.getAllActif()
2015-02-05 00:21:43 +00:00
for p in Parking.parkings:
if p.id == id:
2015-01-13 23:39:12 +00:00
return p
2015-02-07 22:59:01 +00:00
## Retourne tout les Parking actif present dans la bd
2015-01-13 23:39:12 +00:00
@staticmethod
2015-02-04 13:20:39 +00:00
def getAllActif():
2015-02-05 00:21:43 +00:00
if len(Parking.parkings) == 0:
2015-02-04 13:20:39 +00:00
c = connexionBDD()
r = c.execute("SELECT * FROM parking WHERE actif = 1")
rows = r.fetchall()
c.seDeconnecter()
2015-02-05 00:21:43 +00:00
for row in rows:
2015-02-04 13:20:39 +00:00
Parking(row["idParking"], row["nom"], None)
2015-01-13 23:39:12 +00:00
return Parking.parkings
2015-02-07 22:59:01 +00:00
## Supprime un parking
# @param parking L'objet parking a supprimer
2015-02-04 13:20:39 +00:00
@staticmethod
def remove(parking):
Parking.parkings.remove(parking)
c = connexionBDD()
2015-02-05 00:21:43 +00:00
c.execute("UPDATE parking SET actif = 0 WHERE idParking='" + str(parking.id) + "'")
2015-02-04 13:20:39 +00:00
c.seDeconnecter()
2015-02-07 22:59:01 +00:00
## Supprime les parkings present dans la mémoire vive (pas dans la bd)
2015-02-04 13:20:39 +00:00
@staticmethod
def removeAllRam():
Parking.parkings = []
2015-02-07 22:59:01 +00:00
## Constructeur du Parking
# @param id Si None : Cree un Parking dans la BD Sinon : tentative de récupération du Parking avec cet id dans la bd
# @param nom : Si creation nom du parking
# @param listeTypePlace : Si creation Liste des TypePlace du parking
2015-02-04 13:20:39 +00:00
def __init__(self, id, nom=None, listeTypePlace=None):
2014-12-23 18:05:26 +00:00
self.__nom = nom
2015-02-05 00:21:43 +00:00
if id is None:
2015-02-04 13:20:39 +00:00
c = connexionBDD()
2015-02-05 00:21:43 +00:00
c.execute("INSERT INTO parking (nom) VALUES ('" + str(self.__nom) + "')", ())
2015-02-04 13:20:39 +00:00
self.__id = c.lastId()
2015-02-05 00:21:43 +00:00
# Crea des places
2015-02-04 13:20:39 +00:00
n = 0
2015-02-05 00:21:43 +00:00
placeParNiveau = {}
for typePlace in listeTypePlace:
try:
i = placeParNiveau[typePlace.niveau]
except KeyError:
i = 0
placeParNiveau[typePlace.niveau] = i + typePlace.nombre
for i in range(placeParNiveau[typePlace.niveau]):
Place(None, self, typePlace, i, True, False)
else:
2015-02-04 13:20:39 +00:00
self.__id = id
2015-01-13 23:39:12 +00:00
self.parkings.append(self)
2015-01-12 15:06:44 +00:00
2015-02-07 22:59:01 +00:00
## Propriete : id du Parking
2015-01-13 23:39:12 +00:00
@property
def id(self):
return self.__id
2014-12-23 21:18:11 +00:00
2015-02-07 22:59:01 +00:00
## propriete : nom du Parking
2014-12-23 21:18:11 +00:00
@property
def nom(self):
return self.__nom
2015-02-07 22:59:01 +00:00
## propriete : nombre de Place du Parking
2014-12-23 21:18:11 +00:00
@property
2015-01-12 15:06:44 +00:00
def nbPlaces(self):
2015-01-13 23:39:12 +00:00
return Place.nbPlaceParking(self.__id)
2014-12-23 21:18:11 +00:00
2015-02-07 22:59:01 +00:00
## propriete : nombre de Place libres du Parking
2014-12-23 21:18:11 +00:00
@property
2015-01-12 15:06:44 +00:00
def nbPlacesLibresParking(self):
2015-01-13 23:39:12 +00:00
return Place.nbPlaceLibreParking(self.__id)
2015-02-07 22:59:01 +00:00
## propriete : nombre de Place super abo
2015-01-13 23:39:12 +00:00
@property
def nbSuperAbo(self):
return Place.nbSuperAbo(self.__id)
2014-12-05 14:54:04 +00:00
2015-02-08 14:48:22 +00:00
## propriete : listeTypePlace
@property
def listeTypePlace(self):
c = connexionBDD()
r = c.execute("SELECT idTypePlace FROM typePlace WHERE idTypePlace in (SELECT idTypePlace FROM place WHERE idParking = '" + str(self.__id) + "')")
rows = r.fetchall()
c.seDeconnecter()
l = []
for row in rows:
l.append(TypePlace(row["idTypePlace"]))
return l
2015-02-07 22:59:01 +00:00
## Recherche une place pour une voiture
# @param voiture voiture pour laquel on recherche la place
# @return Place Si touvé : Place sinon : None
2014-12-23 10:37:14 +00:00
def recherchePlace(self, voiture):
2015-01-13 23:39:12 +00:00
return Place.placeValide(self.__id, voiture)
2015-02-07 22:59:01 +00:00
## Ajout d'une place surmesure pour super abo
# @param parking le parking ou il faut ajouter la place
def addPlaceSuperAbo(self):
return Place(None, self, None, None, False, True)
2015-02-04 13:20:39 +00:00
2015-02-07 22:59:01 +00:00
## Representation du Parking en chaine
2015-01-13 23:39:12 +00:00
def __str__(self):
2015-02-05 00:21:43 +00:00
return "[Parking : nom = " + self.__nom + "]"
2015-01-13 23:39:12 +00:00
2015-02-07 22:59:01 +00:00
## Representation d'une place de DreamPark
2015-01-13 23:39:12 +00:00
class Place:
2015-02-07 22:59:01 +00:00
## Contructeur de Place
# @param id Si None : creation de la Place dans la bd Sinon : tentative de récupération de la Place avec cet id dans la bd
# @param parking Si creation : le Parking ou est creer la Place
# @param typePlace Si creation : le TypePlace de Place
# @param numero Si creation : le numero de Place
# @param estLibre Si creation : Si la Place est libre ou non
# @param estSuperAbo Si creation : Si la Place est superAbo ou non
def __init__(self, id, parking=None, typePlace=None, numero=None, estLibre=True, estSuperAbo=False):
2015-02-05 00:21:43 +00:00
if id is None:
2015-02-04 13:20:39 +00:00
self.__parking = parking
self.__typePlace = typePlace
self.__numero = numero
self.__estLibre = estLibre
self.__estSuperAbo = estSuperAbo
2015-02-04 14:33:15 +00:00
if self.__typePlace is None:
t = "NULL"
2015-02-05 00:21:43 +00:00
else:
2015-02-04 14:33:15 +00:00
t = self.__typePlace.id
2015-01-13 23:39:12 +00:00
c = connexionBDD()
2015-02-04 13:20:39 +00:00
c.execute("INSERT INTO place (idParking, idTypePlace, numero, estLibre, estSuperAbo) "
"VALUES (?,?,?,?,?)",
2015-02-04 14:33:15 +00:00
(self.__parking.id, t,
2015-02-04 13:20:39 +00:00
self.__numero, int(self.__estLibre), int(self.__estSuperAbo)))
2015-01-13 23:39:12 +00:00
self.__id = c.lastId()
c.seDeconnecter()
2015-02-05 00:21:43 +00:00
else:
2015-02-04 13:20:39 +00:00
c = connexionBDD()
2015-02-05 00:21:43 +00:00
r = c.execute("SELECT * FROM place WHERE idPlace='" + str(id) + "'")
2015-02-04 13:20:39 +00:00
row = r.fetchone()
2015-02-05 00:21:43 +00:00
if row is None:
2015-02-04 13:20:39 +00:00
raise IndexError("Invalid id")
c.seDeconnecter()
self.__parking = Parking.get(row["idParking"])
self.__typePlace = TypePlace(row["idTypePlace"])
2015-02-05 00:21:43 +00:00
self.__numero = row["numero"]
2015-02-04 13:20:39 +00:00
self.__estLibre = row["estLibre"]
self.__estSuperAbo = row["estSuperAbo"]
2015-01-13 23:39:12 +00:00
self.__id = id
2015-02-04 13:20:39 +00:00
2015-02-05 00:21:43 +00:00
2015-02-07 22:59:01 +00:00
## Rend la Place la indisponible
2015-01-13 23:39:12 +00:00
def prendre(self):
if (self.__estLibre == False):
raise Exception("Place déjà prise")
self.__estLibre = False
c = connexionBDD()
2015-02-05 00:21:43 +00:00
c.execute("UPDATE place SET estLibre = 0 WHERE idPlace ='" + str(self.__id) + "'")
2015-01-13 23:39:12 +00:00
c.seDeconnecter()
2015-02-07 22:59:01 +00:00
## Rend la Place disponible
2015-01-13 23:39:12 +00:00
def liberer(self):
if (self.__estLibre == True):
raise Exception("Impossible de liberer une place vide")
2015-02-04 13:20:39 +00:00
self.__estLibre = True
2015-01-13 23:39:12 +00:00
c = connexionBDD()
2015-02-07 22:59:01 +00:00
c.execute("UPDATE place SET estLibre = 1 WHERE idPlace ='" + str(self.__id) + "'")
2015-01-13 23:39:12 +00:00
c.seDeconnecter()
2015-02-07 22:59:01 +00:00
## Suppression place de la bd
def supprimer(self):
c = connexionBDD()
c.execute("DELETE FROM place idPlace ='" + str(self.__id) + "'")
c.seDeconnecter()
## propriete : id de la Place
@property
def id(self):
return self.__id
## propriete : identification etage : numero de la Place
2015-02-04 13:20:39 +00:00
@property
def identification(self):
2015-02-05 00:21:43 +00:00
return str(chr(self.__typePlace.niveau + ord('A')) + ":" + str(self.__numero))
2015-02-04 13:20:39 +00:00
2015-02-07 22:59:01 +00:00
## propriete : True si la place est Place
2015-02-04 13:20:39 +00:00
@property
def estlibre(self):
return self.__estLibre
2015-02-07 22:59:01 +00:00
## propriete : typePlace de la Place
2015-02-05 00:21:43 +00:00
@property
def typePlace(self):
return self.__typePlace
2015-02-07 22:59:01 +00:00
## propriete : typePlace de la Place
@property
def estSuperAbo(self):
return self.__estSuperAbo
## Retourne les nombre de place du Parking d'id idParking
# @param idParking l'id du Parking
# @return le nombre de Place
2015-01-13 23:39:12 +00:00
@staticmethod
def nbPlaceParking(idParking):
c = connexionBDD()
2015-02-04 13:20:39 +00:00
r = c.execute("SELECT COUNT(*) FROM place WHERE idParking = " + str(idParking))
2015-01-13 23:39:12 +00:00
row = r.fetchone()
c.seDeconnecter()
return row[0]
2015-02-07 22:59:01 +00:00
## Retourne les nombre de place libre du Parking d'id idParking
# @param idParking l'id du Parking
# @return le nombre de Place libre
2015-01-13 23:39:12 +00:00
@staticmethod
def nbPlaceLibreParking(idParking):
c = connexionBDD()
2015-02-05 00:21:43 +00:00
r = c.execute("SELECT COUNT(*) FROM place WHERE idParking = " + str(idParking) + " AND estLibre = 1")
2015-01-13 23:39:12 +00:00
row = r.fetchone()
c.seDeconnecter()
return row[0]
2015-02-07 22:59:01 +00:00
## Retourne les nombre de place superAbo du Parking d'id idParking
# @param idParking l'id du Parking
# @return le nombre de Place superAbo
2015-01-13 23:39:12 +00:00
@staticmethod
def nbSuperAbo(idParking):
c = connexionBDD()
2015-02-05 00:21:43 +00:00
r = c.execute("SELECT COUNT(*) FROM place WHERE idParking = " + str(idParking) + " AND estSuperAbo = 1")
2015-01-13 23:39:12 +00:00
row = r.fetchone()
c.seDeconnecter()
return row[0]
2015-02-07 22:59:01 +00:00
## Retourne si une Place valide pour une Voiture dans un parking
# @param idParking id du Parking ou est recherché la place
# @param voiture Voiture pour laquelle est recherché la place
# @return Si non trouve : None. Sinon : Place une place valide
2015-01-13 23:39:12 +00:00
@staticmethod
def placeValide(idPArking, voiture):
c = connexionBDD()
r = c.execute("SELECT * FROM place WHERE idParking= ? AND estLibre = 1 "
"AND idTypePlace =(SELECT idTypePlace FROM typePlace "
"WHERE hauteur>? AND longueur>? ORDER BY longueur) ",
2015-02-05 00:21:43 +00:00
(str(idPArking), str(voiture.hauteur), str(voiture.longueur)))
2015-01-13 23:39:12 +00:00
row = r.fetchone()
c.seDeconnecter()
2015-02-05 00:21:43 +00:00
if row is None:
2015-01-13 23:39:12 +00:00
return None
2015-02-05 00:21:43 +00:00
else:
return Place(row["idPlace"], row["idParking"], row["idTypePlace"],
2015-02-04 13:20:39 +00:00
row["numero"], bool(row["estLibre"]), bool(row["estSuperAbo"]))
2015-01-13 23:39:12 +00:00
2015-02-07 22:59:01 +00:00
## Representation d'une Place en chaine
2015-01-13 23:39:12 +00:00
def __str__(self):
2015-02-07 22:59:01 +00:00
return "[Place : " +\
"Parking = " + str(self.__parking) + ","+\
"typePlace = " + str(self.__typePlace) + ","+\
"numero = " + str(self.__numero) + ","+\
"estLibre = " + str(self.__estLibre) + ","+\
"estSuperAbo = " + str(self.__estSuperAbo) + "]"
## Representation d'un TypePlace de DreamPark
2015-02-04 13:20:39 +00:00
class TypePlace:
2015-02-07 22:59:01 +00:00
## Constructeur de TypePlace
# @param id Si None : creation du TypePlace dans la bd Sinon : tentative de récupération du TypePlace avec cet id dans la bd
# @param longueur Longueur de la Place en cm
# @param hauteur Hauteur de la Place en cm
# @param nombre Nombre de Place de ce type
# @param prix Le prix pur ce type de Place
# @param niveau Le niveau ou se trouve les Place
2015-02-05 00:21:43 +00:00
def __init__(self, id, longueur=None, hauteur=None, nombre=None, prix=None, niveau=None):
if id is None:
2015-02-04 13:20:39 +00:00
self.__longueur = longueur
self.__hauteur = hauteur
self.__nombre = nombre
self.__prix = prix
self.__niveau = niveau
2015-01-13 23:39:12 +00:00
c = connexionBDD()
2015-02-04 13:20:39 +00:00
c.execute("INSERT INTO typePlace (longueur,hauteur,nombre, prix, niveau) VALUES (?,?,?,?,?)",
2015-02-05 00:21:43 +00:00
(self.__longueur, self.__hauteur, self.__nombre, self.__prix, self.__niveau))
2015-01-13 23:39:12 +00:00
self.__id = c.lastId()
c.seDeconnecter()
else:
2015-02-04 13:20:39 +00:00
c = connexionBDD()
2015-02-05 00:21:43 +00:00
r = c.execute("SELECT * FROM typePlace WHERE idTypePlace='" + str(id) + "'")
2015-02-04 13:20:39 +00:00
row = r.fetchone()
2015-02-05 00:21:43 +00:00
if row is None:
2015-02-04 13:20:39 +00:00
raise IndexError("Invalid id")
c.seDeconnecter()
self.__longueur = row["longueur"]
self.__hauteur = row["hauteur"]
self.__nombre = row["nombre"]
self.__prix = row["prix"]
self.__niveau = row["niveau"]
2015-01-13 23:39:12 +00:00
self.__id = id
2014-12-05 14:54:04 +00:00
2015-02-07 22:59:01 +00:00
## propriete : id du Typeplace
2015-01-13 23:39:12 +00:00
@property
def id(self):
return self.__id
2015-02-07 22:59:01 +00:00
## propriete : longueur du Typeplace
2015-01-13 23:39:12 +00:00
@property
def longueur(self):
return self.__longueur
2015-02-07 22:59:01 +00:00
## propriete : hauteur du Typeplace
2015-01-13 23:39:12 +00:00
@property
def hauteur(self):
return self.__hauteur
2014-12-23 18:05:26 +00:00
2015-02-07 22:59:01 +00:00
## propriete : nombre du Typeplace
2015-01-13 23:39:12 +00:00
@property
def nombre(self):
return self.__nombre
2014-12-23 10:37:14 +00:00
2015-02-07 22:59:01 +00:00
## propriete : prix du Typeplace
2015-02-04 13:20:39 +00:00
@property
def prix(self):
return self.__prix
2015-02-07 22:59:01 +00:00
## propriete : niveau du Typeplace
2015-02-04 13:20:39 +00:00
@property
def niveau(self):
return self.__niveau
2015-02-07 22:59:01 +00:00
## Representation du TypePlace en chaine
2014-12-23 10:37:14 +00:00
def __str__(self):
2015-01-13 23:39:12 +00:00
return "[TypePlace : " \
2015-02-07 22:59:01 +00:00
"id = " + str(self.__id) + ","+\
"longueur = " + str(self.__longueur) + ","+\
"hauteur = " + str(self.__hauteur) + ","+\
"nombre = " + str(self.__nombre) + "," +\
"prix = " + str(self.__prix) + ","+\
"niveau = " + str(self.__niveau) + "]"
## Representation d'un Placement de DreamPark
2015-01-13 23:39:12 +00:00
class Placement:
2015-02-07 22:59:01 +00:00
## Constructeur Placement
# @param id Si None : creation du Placement dans la bd Sinon : tentative de récupération du Placement avec cet id dans la bd
# @param voiture Si creation : Voiture lié au Placement
# @param place Si creation : Place lié au Placement
def __init__(self, id, voiture=None, place=None):
2015-02-05 00:21:43 +00:00
if id is None:
2015-02-04 13:20:39 +00:00
self.__voiture = voiture
self.__place = place
self.__debut = time.time()
2015-01-13 23:39:12 +00:00
self.__fin = None
while True:
id = ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for _ in
2015-02-05 00:21:43 +00:00
range(random.randint(1, 10)))
2015-01-13 23:39:12 +00:00
try:
2015-02-04 14:33:15 +00:00
Placement(id)
2015-01-13 23:39:12 +00:00
except IndexError:
break
c = connexionBDD()
c.execute("INSERT INTO placement (idPlacement,idVoiture,idPlace, debut, fin) VALUES (?,?,?,?,?)",
(str(id), str(self.__voiture.id), str(self.__place.id), str(self.__debut), "NULL"))
self.__id = id
c.seDeconnecter()
else:
2015-02-04 13:20:39 +00:00
c = connexionBDD()
2015-02-05 00:21:43 +00:00
r = c.execute("SELECT * FROM placement WHERE idPlacement='" + str(id) + "'")
2015-02-04 13:20:39 +00:00
row = r.fetchone()
2015-02-05 00:21:43 +00:00
if row is None:
2015-02-04 13:20:39 +00:00
raise IndexError("Invalid id")
c.seDeconnecter()
2015-02-04 14:33:15 +00:00
self.__voiture = Voiture(row["idVoiture"])
self.__place = Place(row["idPlace"])
2015-01-13 23:39:12 +00:00
self.__id = id
2015-02-07 22:59:01 +00:00
self.__debut = row["debut"]
self.__fin = row["fin"]
2015-01-13 23:39:12 +00:00
2015-02-07 22:59:01 +00:00
## Propriete : id du Placement
2015-01-13 23:39:12 +00:00
@property
def id(self):
return self.__id
2015-02-07 22:59:01 +00:00
## Propriete : place liée du Placement
2015-02-04 13:20:39 +00:00
@property
def place(self):
return self.__place
2015-01-13 23:39:12 +00:00
2015-02-07 22:59:01 +00:00
## Propriete : voiture liée du Placement
2015-02-05 00:21:43 +00:00
@property
def voiture(self):
return self.__voiture
2015-02-07 22:59:01 +00:00
## Retourne la durée moyenne des placement
# @return duree moyenne placement
@staticmethod
def dureeMoyPlacement():
c = connexionBDD()
r= c.execute("SELECT AVG(FIN - DEBUT) AS duree FROM placement")
nb = r.fetchone()[0]
c.seDeconnecter()
return nb
## Fin du placement (depart voiture)
2015-02-04 13:20:39 +00:00
def end(self):
self.__fin = time.time()
c = connexionBDD()
2015-02-07 22:59:01 +00:00
c.execute("UPDATE placement SET fin='" + str(self.__fin) + "' WHERE idPlacement='" + str(self.__id) + "'")
2015-02-04 13:20:39 +00:00
c.seDeconnecter()
2015-02-05 00:21:43 +00:00
self.__place.liberer()
2015-01-13 23:39:12 +00:00
2015-02-07 22:59:01 +00:00
## Representation du Placement en chaine
2015-02-04 13:20:39 +00:00
def __str__(self):
return "[Placement : " \
2015-02-07 22:59:01 +00:00
"id = " + str(self.__id) + "," +\
"Voiture = " + str(self.__voiture) + ","+\
"Place = " + str(self.__place) + "," +\
"Debut = " + str( self.__debut) + "," +\
"Fin = " + str(self.__fin) + "]"