Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import requests
- from tkinter.ttk import *
- from tkinter import *
- from PIL import Image
- from PIL import ImageTk
- import webbrowser
- from tkinter.filedialog import askopenfilenames
- import json
- global finestra
- from firebase import firebase
- import datetime
- from tkinter import messagebox
- #--------------------------------------------------------------------------------------------------------------------
- #Funzione che consente di accedere al database. Prende in ingresso i seguenti parametri:
- # dsn è la destinazione, ovvero il link vero e proprio del database
- # la chive segreta
- # e-mail per vedere chi sta accedendo in quel momento al database
- # admin che di default è messo a false, ovvero chi sta scrivendo non è per forza un admin
- def accessdb_fb_auth(dsn,SECRET_KEY, email, admin=False):
- auth=firebase.FirebaseAuthentication(SECRET_KEY, email, admin, admin) #funzione che serve a creare l'autenticazione
- db= firebase.FirebaseApplication(dsn,auth) #accedo al database con l'url "dsn" e l'autorizzazione e istanzio l'oggetto db
- time=datetime.datetime.now() #acquisisco la data per salvare il login d'accesso al DB
- time_log=time.strftime('%d/%m/%Y %H:%M,%S')
- timeforpath=time.strftime('%d%m%Y%H%M%S')
- nameemail=email.split('@')[0]
- db.put("/log/log_"+nameemail, "/datetime"+timeforpath+"/time", time_log) #registro l'orario e la data del login
- db.put("/log/log_"+nameemail, "/datetime"+timeforpath+"/email", email) #registro l'email nel login
- return db #ritorna l'oggetto tramite il quale accediamo al DataBase
- #Funzione per l'utente PRIVATO
- def caricaPrivatoSuDatabase():
- dsn4=dsnText4.get('1.0','end-1c')
- key4=keyText4.get('1.0','end-1c')
- uid=idUserPriv.get('1.0','end-1c')
- code='CAP-'+ idCap.get('1.0','end-1c')
- zonesArray=[]
- db=accessdb_fb_auth('https://' + dsn4, key4,"provaprova@gmail.com",True)
- areas=db.get("/Zones/Areas/"+code+"/",None)
- for y in areas:
- zonesArray.append({"cap":code,"zone":y})
- db.put("Users/"+uid,"/Areas/",zonesArray)
- db.put("Users/"+uid,"Type",'B')
- #Inseriemnto utente PRIVATO
- def utentePrivato():
- global idUserPriv, idCap, dsnText4, keyText4
- script5=Tk() #creazione dello script
- script5.configure(background="limegreen")
- script5.geometry('400x420')
- script5.title("Utente Privato")
- Label(script5, text="ID UTENTE", width=500, height=1, background="darkgreen",font="Helvetica 12 bold",foreground="white").pack()
- #Label di separazione tra ID UTENTE e la box nella quale inserire l'identificativo
- Label(script5, text="", width=500, height=1, background="limegreen").pack()
- #Label nella quale inserire l'ID dell'utente privato
- idUserPriv=Text(script5, width=23, height=1, font='Helvetica 14') #dimensioni
- idUserPriv.pack()
- #Label di separazione tra la box nella quale inserire l'identificativo e la label CAP
- Label(script5, text="", width=500, height=1, background="limegreen").pack()
- Label(script5, text="CAP", width=500, height=1, background="darkgreen",font="Helvetica 12 bold",foreground="white").pack()
- Label(script5, text="", width=500, height=1, background="limegreen").pack()
- #Label nella quale inserire il CAP dell'utente privato
- idCap=Text(script5, width=23, height=1, font='Helvetica 14') #dimensioni
- idCap.pack()
- #Label di separazione tra la box nella quale inserire il CAP e il button Inserisci
- Label(script5, text="", width=500, height=1, background="limegreen").pack()
- #Quando si clicca sul button "Inserisici utente ADMIN" viene invocata la funzione definita sopra
- Label(script5, text='Inserire link di destinazione del database',
- font='Helvetica 12',
- foreground="white",
- width=500,
- background="darkgreen").pack()
- Label(script5, text="", width=500, height=1, background="limegreen").pack()
- dsnText4=Text(script5, width=26, height=1, font='Helvetica 14')
- dsnText4.pack()
- Label(script5, text="", width=500, height=1, background="limegreen").pack()
- #Creazione della label "Inserisci link di destinazione del database"
- Label(script5, text='Inserire la chiave segreta',
- font='Helvetica 12',
- foreground="white",
- width=500,
- background="darkgreen").pack()
- Label(script5, text="", width=500, height=1, background="limegreen").pack()
- keyText4=Text(script5, width=26, height=1, font='Helvetica 14')
- keyText4.pack()
- Label(script5, text="", width=500, height=1, background="limegreen").pack()
- Button(script5, text="Inserisci utente PRIVATO", command=caricaPrivatoSuDatabase,
- font="Gill 10 bold",
- background="skyblue",
- foreground="black",
- width=30,
- height=2,
- highlightbackground="forestgreen",
- highlightcolor="forestgreen",
- relief=GROOVE).pack()
- #Funzione per l'utente PUBBLICO
- def caricaPubblicoSuDatabase():
- uid=idUserPub.get('1.0','end-1c')
- dsn3=dsnText3.get('1.0','end-1c')
- key3=keyText3.get('1.0','end-1c')
- db=accessdb_fb_auth('https://' + dsn3, key3,"provaprova@gmail.com",True)
- db.put("Users/"+uid,"Type",'A')
- #Inseriemnto utente PUBBLICO
- def utentePubblico():
- global idUserPub, dsnText3, keyText3
- script6=Tk() #creazione dello script
- script6.configure(background="limegreen")
- script6.geometry('400x350')
- script6.title("Utente Pubblico")
- Label(script6, text="ID UTENTE", width=500, height=1, background="darkgreen",font="Helvetica 12 bold",foreground="white").pack()
- #Label di separazione tra ID UTENTE e la box nella quale inserire l'identificativo
- Label(script6, text="", width=500, height=1, background="limegreen").pack()
- #Label nella quale inserire l'ID dell'utente pubblico
- idUserPub=Text(script6, width=23, height=1, font='Helvetica 14') #dimensioni
- idUserPub.pack()
- #Label di separazione tra la label, nella quale inserire l'ID, e il button
- Label(script6, text="", width=500, height=1, background="limegreen").pack()
- #Quando si clicca sul button "Inserisici utente ADMIN" viene invocata la funzione definita sopra
- Label(script6, text='Inserire link di destinazione del database',
- font='Helvetica 12',
- foreground="white",
- width=500,
- background="darkgreen").pack()
- Label(script6, text="", width=500, height=1, background="limegreen").pack()
- dsnText3=Text(script6, width=26, height=1, font='Helvetica 14')
- dsnText3.pack()
- Label(script6, text="", width=500, height=1, background="limegreen").pack()
- #Creazione della label "Inserisci link di destinazione del database"
- Label(script6, text='Inserire la chiave segreta',
- font='Helvetica 12',
- foreground="white",
- width=500,
- background="darkgreen").pack()
- Label(script6, text="", width=500, height=1, background="limegreen").pack()
- keyText3=Text(script6, width=26, height=1, font='Helvetica 14')
- keyText3.pack()
- Label(script6, text="", width=500, height=1, background="limegreen").pack()
- #Quando si clicca sul button "Inserisici utente PUBBLICO" viene invocata la funzione definita sopra
- Button(script6, text="Inserisci utente PUBBLICO", command=caricaPubblicoSuDatabase,
- font="Gill 10 bold",
- background="skyblue",
- foreground="black",
- width=30,
- height=2,
- highlightbackground="forestgreen",
- highlightcolor="forestgreen",
- relief=GROOVE).pack()
- #Funzione per l'utente ADMIN
- def caricaAdminSuDatabase():
- uid=idUserAdmin.get('1.0','end-1c')
- dsn2=dsnText2.get('1.0','end-1c')
- key2=keyText2.get('1.0','end-1c')
- db=accessdb_fb_auth('https://' + dsn2, key2,"provaprova@gmail.com",True)
- areas=db.get("/Zones/Areas",None)
- zonesArray=[]
- for x in areas:
- for y in areas[x]:
- zonesArray.append({"cap":x,"zone":y})
- db.put("Users/"+uid,"/Areas",zonesArray)
- db.put("Users/"+uid,"Type","C")
- #Inserimento utente AMMINISTRATORE
- def utenteAdmin():
- global idUserAdmin, dsnText2, keyText2
- script7=Tk() #creazione dello script
- script7.configure(background="limegreen")
- script7.geometry('400x350')
- script7.title("Utente Admin")
- Label(script7, text="ID UTENTE", width=500, height=1, background="darkgreen",font="Helvetica 12 bold",foreground="white").pack()
- #Label di separazione tra ID UTENTE e la box nella quale inserire l'identificativo
- Label(script7, text="", width=500, height=1, background="limegreen").pack()
- #Label nella quale inserire l'ID dell'utente amministratore
- idUserAdmin=Text(script7, width=23, height=1, font='Helvetica 14') #dimensioni
- idUserAdmin.pack()
- #Label di separazione tra la label, nella quale inserire l'ID, e il button
- Label(script7, text="", width=500, height=1, background="limegreen").pack()
- #Quando si clicca sul button "Inserisici utente ADMIN" viene invocata la funzione definita sopra
- Label(script7, text='Inserire link di destinazione del database',
- font='Helvetica 12',
- foreground="white",
- width=500,
- background="darkgreen").pack()
- Label(script7, text="", width=500, height=1, background="limegreen").pack()
- dsnText2=Text(script7, width=26, height=1, font='Helvetica 14')
- dsnText2.pack()
- Label(script7, text="", width=500, height=1, background="limegreen").pack()
- #Creazione della label "Inserisci link di destinazione del database"
- Label(script7, text='Inserire la chiave segreta',
- font='Helvetica 12',
- foreground="white",
- width=500,
- background="darkgreen").pack()
- Label(script7, text="", width=500, height=1, background="limegreen").pack()
- keyText2=Text(script7, width=26, height=1, font='Helvetica 14')
- keyText2.pack()
- Label(script7, text="", width=500, height=1, background="limegreen").pack()
- Button(script7, text="Inserisici utente ADMIN", command=caricaAdminSuDatabase,
- font="Gill 10 bold",
- background="skyblue",
- foreground="black",
- width=30,
- height=2,
- highlightbackground="forestgreen",
- highlightcolor="forestgreen",
- relief=GROOVE).pack()
- script7.mainloop()
- #ULTIMA schermata (a parte) che si apre se si clicca sul button "Inserisci Utente" della prima schermata
- def insertUtent():
- script8=Tk()
- script8.configure(background="limegreen")
- script8.geometry('400x300')
- script8.title("Tipologia di utente")
- #Creazione della label "Scegli la tipologia dell'utente"
- Label(script8, text="SCEGLI LA TIPOLOGIA DI UTENTE", width=500, height=1, background="darkgreen",font="Helvetica 12 bold",foreground="white").pack()
- #Label di separazione tra il comando "Scegli la tipologia" e "A: Utente pubblico"
- Label(script8, text="", width=500, height=1, background="limegreen").pack()
- #Quando si clicca sul button UTENTE PUBBLICO viene invocata la funzione definita sopra
- Button(script8, text="A: Utente PUBBLICO", command=utentePubblico,
- font="Gill 10 bold",
- background="skyblue",
- foreground="black",
- width=30,
- height=2,
- highlightbackground="forestgreen",
- highlightcolor="forestgreen",
- relief=GROOVE).pack()
- #Label di separazione tra "A" e "B"
- Label(script8, text="", width=500, height=1, background="limegreen").pack()
- #Quando si clicca sul button UTENTE PRIVATO viene invocata la funzione definita sopra
- Button(script8, text="B: Utente PRIVATO", command=utentePrivato,
- font="Gill 10 bold",
- background="skyblue",
- foreground="black",
- width=30,
- height=2,
- highlightbackground="forestgreen",
- highlightcolor="forestgreen",
- relief=GROOVE).pack()
- #Label di separazione tra "B" e "C"
- Label(script8, text="", width=500, height=1, background="limegreen").pack()
- #Quando si clicca sul button UTENTE AMMINISTRATORE viene invocata la funzione definita sopra
- Button(script8, text="C: Utente ADMIN", command=utenteAdmin,
- font="Gill 10 bold",
- background="skyblue",
- foreground="black",
- width=30,
- height=2,
- highlightbackground="forestgreen",
- highlightcolor="forestgreen",
- relief=GROOVE).pack()
- #--------------------------------------------------------------------------------------------------------------------
- #Funzione che consente di trasformare le geometry caratterisctiche in feature
- def getFeature (data,zonadec):
- CAP='CAP-'+ cap.get('1.0', 'end-1c')
- coord = data["geometries"][0]["coordinates"][0]
- feature={ }
- feature["type"] = "Feature"
- properties = {}
- properties["ID"]= zonadec
- properties["CAP"]=CAP
- feature["properties"] = properties
- geometry = {}
- geometry["type"] = "Polygon"
- geometry["coordinates"] = coord
- feature["geometry"] = geometry
- return feature
- #Funzione che consente di trasformare il o i file da "GeometryCollection" a "FeatureCollection"
- def saveAll():
- global finalName
- finalName=nom.get('1.0', 'end-1c') + '.json'
- script4.destroy()
- i=0
- numFile=len(filename)
- features=[]
- while(i<numFile):
- with open (filename[i]) as file:
- data = json.load(file)
- features.append(getFeature(data,i+1))
- i=i+1
- featureCollection={}
- featureCollection["type"] = "FeatureCollection"
- featureCollection["features"] = features
- featureJson=json.dumps(featureCollection)
- try:
- f = open(finalName, 'w')
- f.write(featureJson)
- f.close()
- except:
- root = Tk()
- root.withdraw()
- messagebox.showerror("Errore!", "Salvataggio del file non riuscito")
- root.mainloop()
- #Funzione che consente di selezionare, tramite una finestra del browser, uno o più file .json da convertire in FeatureCollection
- #e salvare il tutto in un unico file finale
- def converti():
- global nom, filename,script4
- filename=[]
- Tk().withdraw() # we don't want a full GUI, so keep the root window from appearing
- filename = askopenfilenames() # show an "Open" dialog box and return the path to the selected file
- print(filename)
- script4=Toplevel()
- script4.configure(background="limegreen")
- script4.geometry('300x350')
- script4.title("SAVE ALL")
- Label( script4, text='Salva con nome',
- font='Helvetica 12',
- foreground="white",
- width=200,
- background="darkgreen").pack()
- nom=Text(script4,width=50, height=1, font='Helvetica 14' )
- nom.pack()
- Label(script4, text="", width=500, height=2, background="limegreen").pack()
- Button(script4, text="SALVA", command=saveAll,
- font="Gill 10 bold",
- background="skyblue",
- foreground="black",
- width=30,
- height=2,
- highlightbackground="forestgreen",
- highlightcolor="forestgreen",
- relief=GROOVE).pack()
- script4.mainloop()
- #Salvataggio del file su Firebase
- def salvaSuFirebase():
- print(finalName)
- with open(finalName) as f:
- data = json.load(f)
- i=0
- zonadec=[]
- length=len(filename)
- Cap='CAP-'+cap.get('1.0','end-1c')
- while(i<length):
- zonaFeature=data['features'][i] #max 8 --per la zona7 inserisce 6
- zonadec= zonaFeature['properties']['ID']
- #Inserimento
- try:
- dsn=dsnText.get('1.0','end-1c')
- key=keyText.get('1.0','end-1c')
- db=accessdb_fb_auth('https://' + dsn, key,"provaprova@gmail.com",True)
- db.put('Zones/Areas/'+Cap,'/ZONA-'+str(zonadec).zfill(2),zonaFeature)
- print("Inserimento nel database avvenuto con successo")
- except:
- print("Errore nell'inserimento") #Il file non è stato inserito correttamente nel database
- i=i+1
- def inserDatiFirebase():
- global dsnText, keyText
- script9=Tk() #creazione dello script
- script9.configure(background="limegreen")
- script9.geometry('350x300')
- script9.title("Inserire credenziali database")
- #Creazione della label "Inserisci link di destinazione del database"
- Label(script9, text='Inserire link di destinazione del database',
- font='Helvetica 12',
- foreground="white",
- width=500,
- background="darkgreen").pack()
- Label(script9, text="", width=500, height=1, background="limegreen").pack()
- dsnText=Text(script9, width=26, height=1, font='Helvetica 14')
- dsnText.pack()
- Label(script9, text="", width=500, height=1, background="limegreen").pack()
- #Creazione della label "Inserisci link di destinazione del database"
- Label(script9, text='Inserire la chiave segreta',
- font='Helvetica 12',
- foreground="white",
- width=500,
- background="darkgreen").pack()
- Label(script9, text="", width=500, height=1, background="limegreen").pack()
- keyText=Text(script9, width=26, height=1, font='Helvetica 14')
- keyText.pack()
- Label(script9, text="", width=500, height=1, background="limegreen").pack()
- Button(script9, text="Salva sul database FIREBASE", command=salvaSuFirebase,
- font="Gill 10 bold",
- background="skyblue",
- foreground="black",
- width=41,
- height=2,
- highlightbackground="forestgreen",
- highlightcolor="forestgreen",
- relief=GROOVE).pack()
- script9.mainloop()
- #TERZA SCHERMATA
- def step3():
- global cap,script3
- script3=Toplevel()
- script3.configure(background="limegreen")
- script3.geometry('300x350')
- script3.title("CONVERTI")
- #Creazione della label "Inserisci CAP"
- Label(script3, text='Inserisci CAP',
- font='Helvetica 12',
- foreground="white",
- width=200,
- background="darkgreen").pack()
- #Label nella quale inserire il CAP
- cap=Text(script3,width=50, height=1, font='Helvetica 14' )
- cap.pack()
- #Label di separazione tra la barra nella quale inserire il CAP, e il button Converti in FeatureCollection
- Label(script3, text="", width=500, height=2, background="limegreen").pack()
- #Cliccando su questo button viene effettuata la conversione del file in FeatureCollection
- Button(script3, text="Converti in FEATURECOLLECTION", command=converti,
- font="Gill 10 bold",
- background="skyblue",
- foreground="black",
- width=30,
- height=2,
- highlightbackground="forestgreen",
- highlightcolor="forestgreen",
- relief=GROOVE).pack()
- #Label di separazione tra i due button
- Label(script3, text="", width=500, height=1, background="limegreen").pack()
- #Cliccando su questo button viene effettuato il salvataggio sul database
- Button(script3, text="Salva su FIREBASE", command=inserDatiFirebase,
- font="Gill 10 bold",
- background="skyblue",
- foreground="black",
- width=30,
- height=2,
- highlightbackground="forestgreen",
- highlightcolor="forestgreen",
- relief=GROOVE).pack()
- script3.mainloop()
- def richiesta():
- nome=name.get('1.0', 'end-1c')+ '.json'
- r=requests.get('http://polygons.openstreetmap.fr/get_geojson.py?id='+id+'¶ms=0')
- file=open(nome, 'w')
- file.write(r.text)
- file.close()
- script2.destroy()
- def salvaNome():
- global name, script2
- script2=Toplevel()
- script2.configure(background="limegreen")
- script2.geometry('300x200')
- script2.title("SALVA CON NOME")
- Label( script2, text='Salva con nome ',
- font='Helvetica 12',
- foreground="white",
- width=200,
- background="darkgreen").pack()
- name=Text(script2,width=50, height=1, font='Helvetica 14')
- name.pack()
- Label(script2, text="", width=500, height=2, background="limegreen").pack()
- Button(script2, text="SALVA", command=richiesta,
- font="Gill 10 bold",
- background="skyblue",
- foreground="black",
- width=30,
- height=2,
- highlightbackground="forestgreen",
- highlightcolor="forestgreen",
- relief=GROOVE).pack()
- script2.mainloop()
- def webBrowser():
- try:
- url='https://nominatim.openstreetmap.org/'
- webbrowser.open(url, new=2)
- r=requests.get(url)
- except:
- root = Tk()
- root.withdraw()
- messagebox.showerror("Errore: Impossibile aprire OpenStreetMap", "Connessione ad Internet assente")
- menu()
- #SECONDA SCHERMATA + apertura browser su OpenStreetMap
- def openStreetMap():
- global script, text #script e testBox nella quale inserire l'ID
- webBrowser()
- script=Tk() #creazione dello script
- script.configure(background="limegreen")
- script.geometry('450x470')
- script.title("Inserire ID")
- #Inserimento logo Sense Square
- immagine_tk = ImageTk.PhotoImage(Image.open('Sense Square1.png'))
- # Creazione della label nella quale inserire l'immagine
- Label(script, image=immagine_tk, background="black").pack()
- #Creazione della label "Inserisci ID"
- Label( script, text='Inserisci ID della Città o della circoscrizione desiderata',
- font='Helvetica 12',
- foreground="white",
- width=500,
- background="darkgreen").pack()
- Label(script, text="", width=500, height=1, background="limegreen").pack()
- text=Text(script, width=26, height=1, font='Helvetica 14')
- text.pack()
- Label(script, text="", width=500, height=1, background="limegreen").pack()
- Button(script, text="Scarica file GeoJSON", command= step2,
- font="Gill 10 bold",
- background="skyblue",
- foreground="black",
- width=30,
- height=2,
- highlightbackground="forestgreen",
- highlightcolor="forestgreen",
- relief=GROOVE).pack()
- Label(script, text="", width=500, height=1, background="limegreen").pack()
- Button(script, text="Procedi con la conversione", command= step3,
- font="Gill 10 bold",
- background="skyblue",
- foreground="black",
- width=30,
- height=2,
- highlightbackground="forestgreen",
- highlightcolor="forestgreen",
- relief=GROOVE).pack()
- script.mainloop()
- def step1():
- finestra.destroy()
- openStreetMap()
- def menu():
- # Apertura prima schermata
- global finestra
- finestra= Tk()
- finestra.configure(background="limegreen")
- finestra.geometry('450x430')
- finestra.title("Benvenuto in Sense Square")
- #Inserimento logo Sense Square
- immagine_tk = ImageTk.PhotoImage(Image.open('Sense Square1.png'))
- # Creazione della label nella quale inserire l'immagine
- Label(finestra,image=immagine_tk, background="black").pack()
- #Creazione della label nella quale inserire il testo
- Label(finestra, text="", width=500, height=1, background="limegreen", font='Helvetica 14').pack()
- #Creazione del button "Cerca Città"
- Button(finestra, text="CERCA CITTA'", command=step1,
- font="Gill 10 bold",
- background="skyblue",
- foreground="black",
- width=30,
- height=2,
- highlightbackground="forestgreen",
- highlightcolor="forestgreen",
- relief=GROOVE).pack()
- #Label di separazione tra i due button
- Label(finestra, text="", width=500, height=1, background="limegreen").pack()
- #Il button "Inserisci Utente" consente di aprire un'ulteriore schermata richiamando la funzione insertUtente
- Button(finestra, text="INSERISCI UTENTE", command=insertUtent,
- font="Gill 10 bold",
- background="skyblue",
- foreground="black",
- width=30,
- height=2,
- highlightbackground="forestgreen",
- highlightcolor="forestgreen",
- relief=GROOVE).pack()
- finestra.mainloop()
- def step2():
- global id
- id=text.get('1.0', 'end-1c')
- salvaNome()
- #Quando si clicca su "Cerca Città" viene eseguita questa funzione, che chiude la prima schermata (e apre la seconda schermata)
- # e apre openStreetMap sul browser predefinito, invocando così la funzione openStreetMap() definita sopra
- if __name__=='__main__':
- menu()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement