Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
GUIapi.py 7.14 KiB
'''
Created on 24 May 2018

@author: yz0003
'''

from datalist import *
from sitedata import getelement, getspecies
from wx import EVT_COMBOBOX
from wx.adv import CalendarCtrl, EVT_CALENDAR_SEL_CHANGED
# from wx.lib.calendar import *
import wx
import datetime
import urllib2

class HelloFrame(wx.Frame):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
    
        self.apitext = wx.StaticText(self, label="Choose an API", pos=(20, 20))
        self.apilist = wx.ComboBox(self, value=apis[0], pos=(110, 16), size=(-1, -1), choices=apis, style=wx.CB_DROPDOWN|wx.TE_READONLY)
        self.Bind(EVT_COMBOBOX, self.OnListSelected, self.apilist)
                
        self.sitetext = wx.StaticText(self, label="Sites", pos=(20, 60))
        self.sitelist = wx.ComboBox(self, value="Newham - Cam Road",pos=(110, 56), size=(-1, -1), choices=sitename, style=wx.CB_SORT|wx.TE_READONLY)
        self.Bind(EVT_COMBOBOX, self.OnListSelected, self.sitelist)
        
        self.speciestext = wx.StaticText(self, label="Species", pos=(520, 60))
        self.specieslist = wx.ComboBox(self, value="Nitrogen Dioxide (ug/m3)", pos=(610, 56), size=(-1, -1), choices=speciesname, style=wx.CB_SORT|wx.TE_READONLY)
        self.Bind(EVT_COMBOBOX, self.OnListSelected, self.specieslist)
             
        self.starttext = wx.StaticText(self, label="Start Date", pos=(20, 100))
#         self.labelstart = wx.TextCtrl(self, pos=(110, 96), value="26-07-2012")
        self.labelstart = wx.TextCtrl(self, pos=(110, 96), value="2012-07-26", style=wx.TE_READONLY)
        self.cals = CalendarCtrl(self, pos=(110, 120), date=datetime.date(2012,7, 26))
        self.Bind(EVT_CALENDAR_SEL_CHANGED, self.OnCalsSelected, self.cals)

        self.endtext = wx.StaticText(self, label="End Date", pos=(520, 100))
#         self.labelend = wx.TextCtrl(self, pos=(610, 96), value="03-11-2012")
        self.labelend = wx.TextCtrl(self, pos=(610, 96), value="2012-11-03", style=wx.TE_READONLY)
        self.cale = CalendarCtrl(self, pos=(610, 120), date=datetime.date(2012,11, 3)) # size = (231, 149)
        self.Bind(EVT_CALENDAR_SEL_CHANGED, self.OnCaleSelected,self.cale)
     
        self.startrange = wx.StaticText(self, label="Data Available from: ", pos=(360, 140))
        self.labelsr = wx.TextCtrl(self, pos=(480, 136), style=wx.TE_READONLY, size=(120, -1))
        self.endrange = wx.StaticText(self, label="Data Available to: ", pos=(360, 180))
        self.labeler = wx.TextCtrl(self, pos=(480, 176), style=wx.TE_READONLY, size=(120, -1))
     
        # A button
        self.buttong =wx.Button(self, label="Get", pos=(20, 284))
        self.Bind(wx.EVT_BUTTON, self.OnClickGet,self.buttong)
        
        self.labelapi = wx.TextCtrl(self, pos=(110, 286), size=self.apilist.Size, style=wx.TE_READONLY)
        
        # A button
        self.buttons =wx.Button(self, label="Save", pos=(20, 324))
        self.Bind(wx.EVT_BUTTON, self.OnClickSave,self.buttons)
        self.labelsave = wx.TextCtrl(self, pos=(110, 326), value="data.csv", size=self.apilist.Size)
        
        self.logger = wx.TextCtrl(self, pos=(20,360), size=(920,40), style=wx.TE_MULTILINE | wx.TE_READONLY)
        
        self.data = wx.TextCtrl(self, pos=(20,420), size=(920,260), style=wx.TE_MULTILINE | wx.TE_READONLY)
        self.Updateurl();
        
    def OnListSelected(self, evt):
        self.Updaterange()
        self.Updateurl()
        
    def Updaterange(self):
        apistr = str(self.apilist.GetValue());
        
        ele = getelement(self.sitelist.GetValue())
        if ele:
            if "SpeciesCode" not in apistr:
                self.labelsr.SetValue(ele.get("@DateOpened"))
                self.labeler.SetValue(ele.get("@DateClosed"))
            else:
                species = ele.get("Species")
                speciescode = speciespair.get(self.specieslist.GetValue())
                spe = getspecies(species, speciescode)
                if spe:
                    self.labelsr.SetValue(spe.get("@DateMeasurementStarted"))
                    self.labeler.SetValue(spe.get("@DateMeasurementFinished"))
                else:
                    self.logger.AppendText("No such Species: %s\n" %self.specieslist.GetValue()) 
#                     self.logger.SetForegroundColour(wx.RED)
                    self.labelsr.SetValue("")
                    self.labeler.SetValue("")
        else:
            self.logger.AppendText("No such Site: %s\n" %self.sitelist.GetValue())
            self.labelsr.SetValue("")
            self.labeler.SetValue("")
            
         
    def Updateurl(self):
        apistr = str(self.apilist.GetValue());
        
        sitecode = sitepair.get(self.sitelist.GetValue())
        startdate = self.labelstart.GetValue()
        enddate = self.labelend.GetValue()
        
        apistr = apistr.replace(sc, sitecode)
        apistr = apistr.replace(sd, startdate)
        apistr = apistr.replace(ed, enddate)
        
        if "SpeciesCode" not in apistr:
            self.specieslist.Disable()
            savestr = sitecode +"_"+ startdate +"_"+ enddate + self.tail(apistr)
        else:
            self.specieslist.Enable(enable=True)
            speciescode = speciespair.get(self.specieslist.GetValue())
            apistr = apistr.replace(spc, speciescode)
            savestr = sitecode +"_"+ speciescode +"_"+ startdate +"_"+ enddate + self.tail(apistr)
            
        self.labelsave.SetValue(savestr)
        self.labelapi.SetValue(apistr)
        
    def tail(self, apistr):
        if "Json" in apistr:
            return ".json"
        if "csv" in apistr:
            return ".csv"
        return ".xml"
     
    def FormatDate(self, date):
#         return date.Format(format="%d-%m-%Y")
        return date.Format(format="%Y-%m-%d")
    
    def OnClickGet(self,event):
        url = self.labelapi.GetValue()
        self.logger.AppendText("Send request to API: %s\n" %url)
        contents = urllib2.urlopen(url).read()
        self.data.SetValue(contents)
    
    def OnClickSave(self,event):
        filename = self.labelsave.GetValue()
        try:
            f = open(filename,"w") 
            if "csv" in filename:
                text = self.data.GetValue()
                index = text.rfind("\n")
                text = text[0:index]
                index = text.rfind("\n")
                f.write(text[0:index]+"\n")
            else:
                f.write(self.data.GetValue())
            self.logger.AppendText("Save Data in %s\n" %filename)
        except IOError:
            self.logger.AppendText("Error: %s\n" %str(IOError))
        finally:
            f.close()
            return
        
    def OnCalsSelected(self, evt):
        sdate = evt.GetDate()
        text = self.FormatDate(sdate)
        self.labelstart.SetLabel(text)
        self.Updateurl();    
        
    def OnCaleSelected(self, evt):
        edate = evt.GetDate()
        text = self.FormatDate(edate)
        self.labelend.SetLabel(text) 
        self.Updateurl();   
        

if __name__ == '__main__':
    app = wx.App()
    frm = HelloFrame(None)
    frm.SetTitle("Get data from London Air API")
    frm.SetSize(200, 200, 980, 720)
#     frm.ToggleWindowStyle(wx.STAY_ON_TOP)
    frm.Show()
    app.MainLoop()