velibLib.py 4.96 KB
Newer Older
1 2 3
import urllib.request, json, os, pymysql
from datetime import datetime
from config import getMysqlConnection, getURLVelib
4
from adresseLib import getAdresse, getInsee
5
from gbfsLib import getStationIdByLatLong
6
import hashlib, time
7

8 9 10 11 12
def val(valeur):
    if valeur is None:
        return 'NULL'
    return '"'+str(valeur)+'"'

13 14 15 16
def fichierEnBinaire(file):
    with file:
        return file.read()

17 18 19 20 21
def getAllStation():
    mysql = getMysqlConnection()

    #On récupère la liste des stations déjà en base
    requete = mysql.cursor()
22
    requete.execute('SELECT code, dateOuverture FROM stations')
23
    rep = requete.fetchall()
24
    aujourdhui = datetime.today().date()
25
    stations = []
26 27 28 29 30
    stationsFutur = []
    for row in rep:
        stations.append(row[0])
        if(row[1] is None or row[1] > aujourdhui):
            stationsFutur.append(row[0])
31 32 33 34

    nbTotalBike = 0
    nbTotalEBike = 0
    nbTotalFreeEDock = 0
35
    nbTotalEDock = 0
36 37 38 39 40 41 42

    #On créer une conso pour avoir son id
    requete = mysql.cursor()
    requete.execute('INSERT INTO statusConso (date) VALUES (NOW())')
    idConso = requete.lastrowid
    strIdConso = str(idConso)
    nbStationsOuvertes = 0
43
    nbStationsOuvertesDetectees = 0
44 45 46

    urlVelib = getURLVelib()
    tmpFileName = 'detailsStations.json'
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
    nbEssai = 0
    fichierOk = False
    while nbEssai < 3 and not fichierOk:
        urllib.request.urlretrieve(urlVelib, tmpFileName)
        dataBrut = open(tmpFileName)

        #On regarde si ce n'est pas le md5 corrompu !
        valeurMD5 = hashlib.md5(fichierEnBinaire(open(tmpFileName, 'rb'))).hexdigest()
        fichierOk = valeurMD5 != 'c746fec461216aa3a67602b879dafa6c'
        nbEssai += 1
        if not fichierOk:
            os.remove(tmpFileName)
            time.sleep(10)

    if not fichierOk: #On n'a trouvé de valeurs correctes :(
        return False

    data = json.load(dataBrut)
65 66
    for etatStation in data:
        infoStation = etatStation['station']
67

68 69 70 71 72
        try:
            codeStation = int(infoStation['code'])
        except Exception:
            codeStation = 0

73
        if codeStation > 100:
74 75 76 77 78 79 80
            if codeStation not in stations:
                longitude = infoStation['gps']['longitude']
                latitude = infoStation['gps']['latitude']
                if infoStation['state'] != 'Operative' :
                    strDateOuverture = 'NULL'
                else:
                    strDateOuverture = 'CURDATE()'
81 82
                #On récupère également le stationId des données GTFS
                stationId = getStationIdByLatLong(latitude, longitude)
83

84
                requete = mysql.cursor()
85
                requete.execute('INSERT INTO stations (code, name, longitude, latitude, type, dateOuverture, adresse, insee, stationId) VALUES \
86
                ('+val(codeStation)+', '+val(infoStation['name'])+', '+val(longitude)+', '+val(latitude)+', '+val(infoStation['type'])+', '+strDateOuverture+', '+val(getAdresse(latitude, longitude))+', '+val(getInsee(codeStation))+', '+val(stationId)+')')
87
                stations.append(codeStation)
88

89 90 91 92 93
            nbBike = int(etatStation['nbBike'])
            nbEbike = int(etatStation['nbEbike'])
            nbFreeEDock = int(etatStation['nbFreeDock'])+int(etatStation['nbFreeEDock'])
            nbEDock = int(etatStation['nbDock'])+int(etatStation['nbEDock'])
            requete = mysql.cursor()
94 95
            requete.execute('INSERT INTO status (code, idConso, state, nbBike, nbEBike, nbFreeEDock, nbEDock, nbBikeOverflow, nbEBikeOverflow, maxBikeOverflow, overflow, overflowActivation) VALUES \
            ('+str(codeStation)+', '+strIdConso+', "'+str(infoStation['state'])+'", '+str(nbBike)+', '+str(nbEbike)+', '+str(nbFreeEDock)+', '+str(nbEDock)+', '+str(etatStation['nbBikeOverflow'])+', '+str(etatStation['nbEBikeOverflow'])+', '+str(etatStation['maxBikeOverflow'])+', "'+str(etatStation['overflow'])+'", "'+str(etatStation['overflowActivation'])+'")')
96

97 98 99 100 101
            #On met à jour la station au besoin
            if codeStation in stationsFutur and nbEDock > 0:
                requete = mysql.cursor()
                requete.execute('UPDATE stations \
                SET dateOuverture = CURDATE() WHERE code = '+str(codeStation))
102

103 104 105 106 107 108 109 110 111
            #On ajoute a la conso
            nbTotalBike += nbBike
            nbTotalEBike += nbEbike
            nbTotalFreeEDock += nbFreeEDock
            nbTotalEDock += nbEDock
            if infoStation['state'] == "Operative":
                nbStationsOuvertes += 1
            if nbEDock > 0 and nbBike + nbEbike + nbFreeEDock > 0:
                nbStationsOuvertesDetectees += 1
112 113 114 115
    os.remove(tmpFileName)

    #On insert tout dans le statut
    requete = mysql.cursor()
116 117 118
    requete.execute('UPDATE statusConso SET \
    nbStation = '+str(nbStationsOuvertes)+', \
    nbStationDetecte = '+str(nbStationsOuvertesDetectees)+' ,\
119 120
    nbBike = '+str(nbTotalBike)+', \
    nbEbike = '+str(nbTotalEBike)+', \
121 122
    nbFreeEDock = '+str(nbTotalFreeEDock)+', \
    nbEDock = '+str(nbTotalEDock)+' \
123 124 125
    WHERE id = '+strIdConso)

    mysql.close()