From: <jb...@us...> - 2009-12-26 01:06:12
|
Revision: 438 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=438&view=rev Author: jblance Date: 2009-12-26 01:06:05 +0000 (Sat, 26 Dec 2009) Log Message: ----------- Some fixes to DB check functionality so it will create missing columns Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/sqliteUtils.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/lib/sqliteUtils.py =================================================================== --- pytrainer/trunk/pytrainer/lib/sqliteUtils.py 2009-12-25 23:40:43 UTC (rev 437) +++ pytrainer/trunk/pytrainer/lib/sqliteUtils.py 2009-12-26 01:06:05 UTC (rev 438) @@ -19,6 +19,7 @@ #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. import logging +import sys try: from sqlite3 import dbapi2 as sqlite except ImportError: @@ -222,17 +223,34 @@ columnsDB.update(newField) logging.debug('Useful data retrieved from '+str(tableName)+' in DB: '+str(columnsDB)) - # http://mail.python.org/pipermail/python-list/2002-May/142854.html - tempDict = dict(zip(columns,columns)) + # http://mail.python.org/pipermail/python-list/2002-May/142854.html - not correct URL.... + #tempDict = dict(zip(columns,columns)) + tempDict = dict(columns) + #Test for columns that are in DB that shouldn't be result = [x for x in columnsDB if x not in tempDict] + #Test for columns that are not in the DB that should be + result2 = [x for x in tempDict if x not in columnsDB] + + #print result, result2 logging.debug("Comparison result: "+str(result)) + logging.debug("Comparison result: "+str(result2)) - if len(result) > 0: # may have also different data type - logging.debug('Found columns missed in DB: '+ str(result)) + table_ok = True + if len(result) > 0: + logging.debug('Found columns in DB that should not be: '+ str(result)) + table_ok = False for entry in result: + logging.debug('Column '+ str(entry) +' in DB but not in definition') + print "Column %s in DB but not in definition - please fix manually" % (str(entry)) + print "#TODO need to add auto fix code" + sys.exit(1) + if len(result2) > 0: # may have also different data type + logging.debug('Found columns missed in DB: '+ str(result2)) + table_ok = False + for entry in result2: logging.debug('Column '+ str(entry) +' not found in DB') - self.addColumn(tableName,str(entry),columnsDB[entry]) - else: + self.addColumn(tableName,str(entry),columns[entry]) + if table_ok: logging.info('Table '+ str(tableName) +' is OK') logging.debug('<<') Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2009-12-25 23:40:43 UTC (rev 437) +++ pytrainer/trunk/pytrainer/main.py 2009-12-26 01:06:05 UTC (rev 438) @@ -97,7 +97,7 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.0_svn#437" + self.version ="1.7.0_svn#438" self.date = Date() main_dir = os.path.realpath(os.path.dirname(__file__)) #why? sys.path.insert(0, main_dir) #why? This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2009-12-26 01:15:42
|
Revision: 439 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=439&view=rev Author: jblance Date: 2009-12-26 01:15:32 +0000 (Sat, 26 Dec 2009) Log Message: ----------- More DB check fixes Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/sqliteUtils.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/lib/sqliteUtils.py =================================================================== --- pytrainer/trunk/pytrainer/lib/sqliteUtils.py 2009-12-26 01:06:05 UTC (rev 438) +++ pytrainer/trunk/pytrainer/lib/sqliteUtils.py 2009-12-26 01:15:32 UTC (rev 439) @@ -266,8 +266,8 @@ def addColumn(self,tableName,columnName,dataType): sql = "alter table %s add %s %s" %(tableName,columnName,dataType) try: - self.ddbbObject.freeExec(sql) + self.freeExec(sql) except: logging.error('Not able to add/change column '+columnName+' to table '+tableName) - traceback.print_exc() + #traceback.print_exc() Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2009-12-26 01:06:05 UTC (rev 438) +++ pytrainer/trunk/pytrainer/main.py 2009-12-26 01:15:32 UTC (rev 439) @@ -97,7 +97,7 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.0_svn#438" + self.version ="1.7.0_svn#439" self.date = Date() main_dir = os.path.realpath(os.path.dirname(__file__)) #why? sys.path.insert(0, main_dir) #why? This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2009-12-26 01:47:06
|
Revision: 440 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=440&view=rev Author: jblance Date: 2009-12-26 01:46:55 +0000 (Sat, 26 Dec 2009) Log Message: ----------- Initial changes for timezone support Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/ddbb.py pytrainer/trunk/pytrainer/lib/gpx.py pytrainer/trunk/pytrainer/lib/sqliteUtils.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/record.py Modified: pytrainer/trunk/pytrainer/lib/ddbb.py =================================================================== --- pytrainer/trunk/pytrainer/lib/ddbb.py 2009-12-26 01:15:32 UTC (rev 439) +++ pytrainer/trunk/pytrainer/lib/ddbb.py 2009-12-26 01:46:55 UTC (rev 440) @@ -237,6 +237,7 @@ "maxpace":"float", "pace":"float", "maxbeats":"float", + "date_time_local":"varchar2(20)", "date_time_utc":"varchar2(20)"} columnsWaypoints = {"id_waypoint":"integer primary key autoincrement", "lat":"float", Modified: pytrainer/trunk/pytrainer/lib/gpx.py =================================================================== --- pytrainer/trunk/pytrainer/lib/gpx.py 2009-12-26 01:15:32 UTC (rev 439) +++ pytrainer/trunk/pytrainer/lib/gpx.py 2009-12-26 01:46:55 UTC (rev 440) @@ -174,7 +174,8 @@ return retorno date_ = tree.find(timeTag).text - mk_time = self.getDateTime(date_)[0] + #mk_time = self.getDateTime(date_)[0] #UTC Date + mk_time = self.getDateTime(date_)[1] #Local Date self.date = mk_time.strftime("%Y-%m-%d") for trkpoint in trkpoints: @@ -291,10 +292,12 @@ if date_time is None: print "Problems when retrieving start time from "+gpxFile+". Please check data integrity" return 0 - zuluDateTime = self.getDateTime(date_time.text)[0].strftime("%Y-%m-%dT%H:%M:%SZ") + dateTime = self.getDateTime(date_time.text) + zuluDateTime = dateTime[0].strftime("%Y-%m-%dT%H:%M:%SZ") + localDateTime = dateTime[1] logging.debug(gpxFile+" | "+ date_time.text +" | " + zuluDateTime) - print zuluDateTime + print localDateTime #return date_time.text logging.debug("<<") - return zuluDateTime + return (zuluDateTime, localDateTime) Modified: pytrainer/trunk/pytrainer/lib/sqliteUtils.py =================================================================== --- pytrainer/trunk/pytrainer/lib/sqliteUtils.py 2009-12-26 01:15:32 UTC (rev 439) +++ pytrainer/trunk/pytrainer/lib/sqliteUtils.py 2009-12-26 01:46:55 UTC (rev 440) @@ -231,9 +231,8 @@ #Test for columns that are not in the DB that should be result2 = [x for x in tempDict if x not in columnsDB] - #print result, result2 - logging.debug("Comparison result: "+str(result)) - logging.debug("Comparison result: "+str(result2)) + logging.debug("Columns in DB that shouldnt be: "+str(result)) + logging.debug("Columns missing from DB: "+str(result2)) table_ok = True if len(result) > 0: Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2009-12-26 01:15:32 UTC (rev 439) +++ pytrainer/trunk/pytrainer/main.py 2009-12-26 01:46:55 UTC (rev 440) @@ -97,7 +97,7 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.0_svn#439" + self.version ="1.7.0_svn#440" self.date = Date() main_dir = os.path.realpath(os.path.dirname(__file__)) #why? sys.path.insert(0, main_dir) #why? Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2009-12-26 01:15:32 UTC (rev 439) +++ pytrainer/trunk/pytrainer/record.py 2009-12-26 01:46:55 UTC (rev 440) @@ -116,7 +116,7 @@ logging.debug('>>') time = self.date.time2second(list_options["rcd_time"]) average = self.parseFloatRecord(list_options["rcd_average"]) - keys= "date,sport,distance,time,beats,comments,average,calories,title,upositive,unegative,maxspeed,maxpace,pace,maxbeats,date_time_utc" + keys= "date,sport,distance,time,beats,comments,average,calories,title,upositive,unegative,maxspeed,maxpace,pace,maxbeats,date_time_utc,date_time_local" if (list_options["rcd_beats"] == ""): list_options["rcd_beats"] = 0 @@ -140,6 +140,7 @@ self.parseFloatRecord(list_options["rcd_pace"]), self.parseFloatRecord(list_options["rcd_maxbeats"]), list_options["date_time_utc"], + list_options["date_time_local"], ) logging.debug('<<') return keys,values @@ -208,9 +209,11 @@ summaryRecord['rcd_upositive'] = upositive summaryRecord['rcd_unegative'] = unegative if entry[1]=="": # coming from new track dialog (file opening) - summaryRecord['date_time_utc'] = gpx.getStartTimeFromGPX(gpxOrig) + summaryRecord['date_time_utc'], summaryRecord['date_time_local'] = gpx.getStartTimeFromGPX(gpxOrig) else: # coming from GPS device summaryRecord['date_time_utc'] = entry[1] + summaryRecord['date_time_local'] = entry[1] + print "#TODO fix record summaryRecord local and utc time..." logging.debug('summary: '+str(summaryRecord)) logging.debug('<<') return summaryRecord @@ -244,13 +247,13 @@ def getrecordInfo(self,id_record): logging.debug('--') return self.ddbb.select("records,sports", - "sports.name,date,distance,time,beats,comments,average,calories,id_record,title,upositive,unegative,maxspeed,maxpace,pace,maxbeats,date_time_utc", + "sports.name,date,distance,time,beats,comments,average,calories,id_record,title,upositive,unegative,maxspeed,maxpace,pace,maxbeats,date_time_utc,date_time_local", "id_record=\"%s\" and records.sport=sports.id_sports" %id_record) def getrecordList(self,date): logging.debug('--') return self.ddbb.select("records,sports", - "sports.name,date,distance,time,beats,comments,average,calories,id_record,maxspeed,maxbeats,date_time_utc", + "sports.name,date,distance,time,beats,comments,average,calories,id_record,maxspeed,maxbeats,date_time_utc,date_time_local", "date=\"%s\" and records.sport=sports.id_sports" %date) def getrecordPeriod(self,date_ini, date_end, sport=None): @@ -484,7 +487,7 @@ for gpxFile in os.listdir(gpxDir): #logging.debug('File: '+gpxFile) gpx = Gpx() - date_time = gpx.getStartTimeFromGPX(gpxDir+"/"+gpxFile) + date_time = gpx.getStartTimeFromGPX(gpxDir+"/"+gpxFile)[0] if date_time != 0: logging.debug('File: '+gpxFile+' | Date: '+date_time) id_record = gpxFile.partition('.')[0] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2009-12-26 02:19:34
|
Revision: 441 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=441&view=rev Author: jblance Date: 2009-12-26 02:19:28 +0000 (Sat, 26 Dec 2009) Log Message: ----------- Fix for calorie count Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/lib/gpx.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2009-12-26 01:46:55 UTC (rev 440) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2009-12-26 02:19:28 UTC (rev 441) @@ -192,16 +192,19 @@ maxspeed = self.parseFloat(record_list[12]) #to review maxpace = self.parseFloat(record_list[13]) - #Get datetime from date_time_utc and create a local datetime... + #Get datetime from DB, use local time if available otherwise use date_time_utc and create a local datetime... #TODO get data from date_time_local and parse - dateTime = dateutil.parser.parse(record_list[16]) - timezone = dateTime.tzname() - if timezone == 'UTC': #got a zulu time - local_dateTime = dateTime.astimezone(tzlocal()) #datetime with localtime offset (from OS) - else: - local_dateTime = dateTime #use datetime as supplied - recordDateTime = local_dateTime.strftime("%Y-%m-%d %H:%M:%S") - recordDateTimeOffset = local_dateTime.strftime("%z") + date_time_local = record_list[17] + date_time_utc = record_list[16] + if date_time_local is not None: #Have a local time stored in DB + dateTime = dateutil.parser.parse(date_time_local) + recordDateTime = dateTime.strftime("%Y-%m-%d %H:%M:%S") + recordDateTimeOffset = dateTime.strftime("%z") + else: #No local time in DB + dateTime = dateutil.parser.parse(date_time_utc) + local_dateTime = dateTime.astimezone(tzlocal()) #datetime with localtime offset (using value from OS) + recordDateTime = local_dateTime.strftime("%Y-%m-%d %H:%M:%S") + recordDateTimeOffset = local_dateTime.strftime("%z") if configuration.getValue("pytraining","prf_us_system") == "True": self.record_distance.set_text("%0.2f" %km2miles(distance)) Modified: pytrainer/trunk/pytrainer/lib/gpx.py =================================================================== --- pytrainer/trunk/pytrainer/lib/gpx.py 2009-12-26 01:46:55 UTC (rev 440) +++ pytrainer/trunk/pytrainer/lib/gpx.py 2009-12-26 02:19:28 UTC (rev 441) @@ -157,9 +157,11 @@ trkpoints = tree.findall(trackPointTag) #start with the info at trkseg level #calories - maybe more than one, currently adding them together - calorieCollection = tree.findall(calorieTag) - for cal in calorieCollection: - self.calories += int(cal.text) + trks = tree.findall(trackTag) + for trk in trks: + calorieCollection = trk.findall(calorieTag) + for cal in calorieCollection: + self.calories += int(cal.text) retorno = [] his_vel = [] last_lat = "False" @@ -296,7 +298,7 @@ zuluDateTime = dateTime[0].strftime("%Y-%m-%dT%H:%M:%SZ") localDateTime = dateTime[1] logging.debug(gpxFile+" | "+ date_time.text +" | " + zuluDateTime) - print localDateTime + #print localDateTime #return date_time.text logging.debug("<<") return (zuluDateTime, localDateTime) Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2009-12-26 01:46:55 UTC (rev 440) +++ pytrainer/trunk/pytrainer/main.py 2009-12-26 02:19:28 UTC (rev 441) @@ -97,7 +97,7 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.0_svn#440" + self.version ="1.7.0_svn#441" self.date = Date() main_dir = os.path.realpath(os.path.dirname(__file__)) #why? sys.path.insert(0, main_dir) #why? This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2009-12-26 15:06:44
|
Revision: 444 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=444&view=rev Author: dgranda Date: 2009-12-26 15:06:35 +0000 (Sat, 26 Dec 2009) Log Message: ----------- Changed link to python list for explanation on how to compare lists Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/sqliteUtils.py pytrainer/trunk/pytrainer/profile.py pytrainer/trunk/pytrainer/record.py Modified: pytrainer/trunk/pytrainer/lib/sqliteUtils.py =================================================================== --- pytrainer/trunk/pytrainer/lib/sqliteUtils.py 2009-12-26 10:14:10 UTC (rev 443) +++ pytrainer/trunk/pytrainer/lib/sqliteUtils.py 2009-12-26 15:06:35 UTC (rev 444) @@ -223,7 +223,7 @@ columnsDB.update(newField) logging.debug('Useful data retrieved from '+str(tableName)+' in DB: '+str(columnsDB)) - # http://mail.python.org/pipermail/python-list/2002-May/142854.html - not correct URL.... + # http://mail.python.org/pipermail/python-list/2002-May/141458.html #tempDict = dict(zip(columns,columns)) tempDict = dict(columns) #Test for columns that are in DB that shouldn't be Modified: pytrainer/trunk/pytrainer/profile.py =================================================================== --- pytrainer/trunk/pytrainer/profile.py 2009-12-26 10:14:10 UTC (rev 443) +++ pytrainer/trunk/pytrainer/profile.py 2009-12-26 15:06:35 UTC (rev 444) @@ -114,7 +114,7 @@ logging.debug("Default values: "+ str(defaultList)) #logging.debug("Default keys: "+ str(defaultListKeys)) # Comparing fields - # http://mail.python.org/pipermail/python-list/2002-May/142854.html + # http://mail.python.org/pipermail/python-list/2002-May/141458.html tempDict = dict(zip(currentListKeys,currentListKeys)) resultList = [x for x in defaultListKeys if x not in tempDict] logging.info('Fields to be added: '+str(resultList)) Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2009-12-26 10:14:10 UTC (rev 443) +++ pytrainer/trunk/pytrainer/record.py 2009-12-26 15:06:35 UTC (rev 444) @@ -526,7 +526,7 @@ def compareLists(self,list1,list2): # Optimizing comparison - 26042008 - # http://mail.python.org/pipermail/python-list/2002-May/142854.html + # http://mail.python.org/pipermail/python-list/2002-May/141458.html tempDict = dict(zip(list1,list1)) return [x for x in list2 if x not in tempDict] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2009-12-27 06:30:02
|
Revision: 447 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=447&view=rev Author: jblance Date: 2009-12-27 06:29:53 +0000 (Sun, 27 Dec 2009) Log Message: ----------- Update lap display in googlemaps v3 Modified Paths: -------------- pytrainer/trunk/pytrainer/extensions/googlemaps.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/extensions/googlemaps.py =================================================================== --- pytrainer/trunk/pytrainer/extensions/googlemaps.py 2009-12-26 18:48:33 UTC (rev 446) +++ pytrainer/trunk/pytrainer/extensions/googlemaps.py 2009-12-27 06:29:53 UTC (rev 447) @@ -87,8 +87,8 @@ timeHours = int(info[0][3]) / 3600 timeMin = (float(info[0][3]) / 3600.0 - timeHours) * 60 time = "%d%s %02d%s" % (timeHours, _("h"), timeMin, _("min")) - startinfo = "<div id='info_content'>%s: %s</div>" % (info[0][0], info[0][9]) - finishinfo = "<div id='info_content'>%s: %s<br>%s: %s%s</div>" % (_("Time"), time, _("Distance"), info[0][2], _("km")) + startinfo = "<div class='info_content'>%s: %s</div>" % (info[0][0], info[0][9]) + finishinfo = "<div class='info_content'>%s: %s<br>%s: %s%s</div>" % (_("Time"), time, _("Distance"), info[0][2], _("km")) startinfo = startinfo.encode('ascii', 'xmlcharrefreplace') #Encode for html finishinfo = finishinfo.encode('ascii', 'xmlcharrefreplace') #Encode for html self.createHtml_api3(polyline, minlat, minlon, maxlat, maxlon, startinfo, finishinfo, laps) @@ -115,6 +115,9 @@ content = ''' <html> <head> + <style type="text/css"> + div.info_content { font-family: sans-serif; font-size: 10px; } + </style> <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> <script type="text/javascript"> @@ -192,8 +195,13 @@ for lap in laps: lapNumber = laps.index(lap)+1 + elapsedTime = float(lap[0]) + elapsedTimeHours = int(elapsedTime/3600) + elapsedTimeMins = int((elapsedTime - (elapsedTimeHours * 3600)) / 60) + elapsedTimeSecs = elapsedTime - (elapsedTimeHours * 3600) - (elapsedTimeMins * 60) + strElapsedTime = "%0.0dh:%0.0dm:%0.2fs" % (elapsedTimeHours, elapsedTimeMins, elapsedTimeSecs) content += "var lap%dmarker = new google.maps.Marker({position: new google.maps.LatLng(%f, %f), icon: lapimage, map: map, title:\"Lap%d\"}); \n " % (lapNumber, float(lap[1]), float(lap[2]), lapNumber) - content += "var lap%d = new google.maps.InfoWindow({content: \"End of lap:%s<br>Elapsed time:%s<br>Distance:%s<br>Calories:%s\" });\n" % (lapNumber, lapNumber, lap[0], lap[4], lap[3]) + content += "var lap%d = new google.maps.InfoWindow({content: \"<div class='info_content'>End of lap:%s<br>Elapsed time:%s<br>Distance:%0.2f km<br>Calories:%s</div>\" });\n" % (lapNumber, lapNumber, strElapsedTime, float(lap[4])/1000, lap[3]) content += "google.maps.event.addListener(lap%dmarker, 'click', function() { lap%d.open(map,lap%dmarker); });\n" % (lapNumber,lapNumber,lapNumber) content += ''' Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2009-12-26 18:48:33 UTC (rev 446) +++ pytrainer/trunk/pytrainer/main.py 2009-12-27 06:29:53 UTC (rev 447) @@ -97,7 +97,7 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.0_svn#443" + self.version ="1.7.0_svn#447" self.date = Date() main_dir = os.path.realpath(os.path.dirname(__file__)) #why? sys.path.insert(0, main_dir) #why? This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2009-12-28 08:13:38
|
Revision: 451 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=451&view=rev Author: jblance Date: 2009-12-28 08:13:28 +0000 (Mon, 28 Dec 2009) Log Message: ----------- Added lap info to recordview window... Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2009-12-28 05:56:06 UTC (rev 450) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2009-12-28 08:13:28 UTC (rev 451) @@ -31,11 +31,11 @@ from pytrainer.lib.date import Date from pytrainer.lib.system import checkConf from pytrainer.lib.xmlUtils import XMLParser - +from pytrainer.lib.gpx import Gpx from pytrainer.lib.unitsconversor import * class Main(SimpleGladeApp): - def __init__(self, data_path = None, parent = None, version = None): + def __init__(self, data_path = None, parent = None, version = None, gpxDir = None): def url_hook(dialog, url): pytrainer.lib.webUtils.open_url_in_browser(url) # Available in PyGTK 2.6 and above @@ -51,6 +51,7 @@ self.popup = PopupMenu(data_path,self) self.block = False self.activeSport = None + self.gpxDir = gpxDir def new(self): self.menublocking = 0 @@ -937,7 +938,7 @@ logging.debug("<<") return False - def actualize_recordTreeView(self, record_list): + '''def actualize_recordTreeView(self, record_list): logging.debug(">>") iterOne = False store = gtk.ListStore( @@ -966,6 +967,62 @@ if iterOne: self.recordTreeView.get_selection().select_iter(iterOne) logging.debug("<<") + #if len(record_list)>0:''' + + def actualize_recordTreeView(self, record_list): + logging.debug(">>") + iterOne = False + store = gtk.TreeStore( + gobject.TYPE_INT, #record_id + gobject.TYPE_STRING, #Time + gobject.TYPE_STRING, #Sport + gobject.TYPE_STRING, #Distance + object) + for i in record_list: + #Get lap info #TODO refactor to use a database table + gpxfile = "%s/%s.gpx" %(self.gpxDir, i[8]) + if os.path.isfile(gpxfile): + gpx = Gpx(self.data_path,gpxfile) + laps = gpx.getLaps() #(elapsedTime, lat, lon, calories, distance) + #print gpxfile, laps + iter = store.append(None) + if not iterOne: + iterOne = iter + dateTime = i[12] + if dateTime is not None: + localTime = dateutil.parser.parse(dateTime).strftime("%H:%M") + else: + localTime = "" + store.set ( + iter, + 0, int(i[8]), + 1, str(localTime), + 2, str(i[0]), + 3, str(i[2]) + ) + for lap in laps: + lapNumber = "%s%d" % ( _("lap"), (laps.index(lap)+1) ) + distance = "%0.2f" % (float(lap[4]) / 1000.0) + timeHours = int(float(lap[0]) / 3600) + timeMin = int((float(lap[0]) / 3600.0 - timeHours) * 60) + timeSec = float(lap[0]) - (timeHours * 3600) - (timeMin * 60) + if timeHours > 0: + duration = "%d%s%02d%s%02d%s" % (timeHours, _("h"), timeMin, _("m"), timeSec, _("s")) + else: + duration = "%2d%s%02d%s" % (timeMin, _("m"), timeSec, _("s")) + + child_iter = store.append(iter) + store.set ( + child_iter, + 0, int(i[8]), + 1, lapNumber, + 2, duration, + 3, distance + ) + self.recordTreeView.set_model(store) + if iterOne: + self.recordTreeView.get_selection().select_iter(iterOne) + logging.debug("<<") #if len(record_list)>0: def parseFloat(self,string): Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2009-12-28 05:56:06 UTC (rev 450) +++ pytrainer/trunk/pytrainer/main.py 2009-12-28 08:13:28 UTC (rev 451) @@ -97,7 +97,7 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.0_svn#450" + self.version ="1.7.0_svn#451" self.date = Date() # Checking profile self.profile = Profile(self.data_path,self) @@ -136,7 +136,7 @@ logging.info('No sanity check requested') #preparamos la ventana principal - self.windowmain = Main(data_path,self,self.version) + self.windowmain = Main(data_path,self,self.version, gpxDir=self.conf.getValue("gpxdir")) self.date = Date(self.windowmain.calendar) #Preparamos el webservice This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2009-12-28 08:58:12
|
Revision: 453 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=453&view=rev Author: jblance Date: 2009-12-28 08:58:02 +0000 (Mon, 28 Dec 2009) Log Message: ----------- Fix for elapsed time for garmintools (not in seconds) v2 Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/gpx.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/lib/gpx.py =================================================================== --- pytrainer/trunk/pytrainer/lib/gpx.py 2009-12-28 08:55:20 UTC (rev 452) +++ pytrainer/trunk/pytrainer/lib/gpx.py 2009-12-28 08:58:02 UTC (rev 453) @@ -140,10 +140,10 @@ lat = endPoint.get("lat") lon = endPoint.get("lon") elapsedTime = lap.findtext(elapsedTimeTag) - if elapsedTime.count(":") > 0: # got a 0:41:42.14 type elasped time + if elapsedTime.count(":") == 2: # got a 0:41:42.14 type elasped time hours, mins, secs = elapsedTime.split(":") elapsedTime = (int(hours) *3600) + (int(mins) * 60) + float(secs) - print elapsedTime + #print elapsedTime calories = lap.findtext(calorieTag) distance = lap.findtext(distanceTag) #print "Found time: %s, lat: %s lon: %s cal: %s dist: %s " % (elapsedTime, lat, lon, calories, distance) Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2009-12-28 08:55:20 UTC (rev 452) +++ pytrainer/trunk/pytrainer/main.py 2009-12-28 08:58:02 UTC (rev 453) @@ -97,7 +97,7 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.0_svn#451" + self.version ="1.7.0_svn#453" self.date = Date() # Checking profile self.profile = Profile(self.data_path,self) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2009-12-30 04:11:28
|
Revision: 455 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=455&view=rev Author: jblance Date: 2009-12-30 04:11:21 +0000 (Wed, 30 Dec 2009) Log Message: ----------- Bug fix on record graph lap display Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/drawArea.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/gui/drawArea.py =================================================================== --- pytrainer/trunk/pytrainer/gui/drawArea.py 2009-12-30 03:55:53 UTC (rev 454) +++ pytrainer/trunk/pytrainer/gui/drawArea.py 2009-12-30 04:11:21 UTC (rev 455) @@ -293,10 +293,10 @@ if xzones is not None: for xzone in xzones: if xzones.index(xzone) % 2: - color='b' + zonecolor='b' else: - color='g' - axis.axvspan(xzone[0], xzone[1], alpha=0.25, facecolor=color) + zonecolor='g' + axis.axvspan(xzone[0], xzone[1], alpha=0.25, facecolor=zonecolor) maxX = max(xvalues[i]) if i>=1: ax2 = axis.twinx() Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2009-12-30 03:55:53 UTC (rev 454) +++ pytrainer/trunk/pytrainer/main.py 2009-12-30 04:11:21 UTC (rev 455) @@ -97,7 +97,7 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.0_svn#454" + self.version ="1.7.0_svn#455" self.date = Date() # Checking profile self.profile = Profile(self.data_path,self) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-01-02 03:02:43
|
Revision: 456 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=456&view=rev Author: jblance Date: 2010-01-02 03:02:37 +0000 (Sat, 02 Jan 2010) Log Message: ----------- Bug fix for pytrainer-Bugs-2924209 Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/sqliteUtils.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/lib/sqliteUtils.py =================================================================== --- pytrainer/trunk/pytrainer/lib/sqliteUtils.py 2009-12-30 04:11:21 UTC (rev 455) +++ pytrainer/trunk/pytrainer/lib/sqliteUtils.py 2010-01-02 03:02:37 UTC (rev 456) @@ -264,6 +264,7 @@ def addColumn(self,tableName,columnName,dataType): sql = "alter table %s add %s %s" %(tableName,columnName,dataType) + logging.debug("Trying SQL: %s" % sql) try: self.freeExec(sql) except: Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2009-12-30 04:11:21 UTC (rev 455) +++ pytrainer/trunk/pytrainer/main.py 2010-01-02 03:02:37 UTC (rev 456) @@ -97,7 +97,7 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.0_svn#455" + self.version ="1.7.0_svn#456" self.date = Date() # Checking profile self.profile = Profile(self.data_path,self) @@ -122,7 +122,7 @@ self.ddbb = DDBB(self.configuration) logging.debug('connecting to DDBB') self.ddbb.connect() - self.record = Record(data_path,self) + #self.record = Record(data_path,self) #Look for force check file check_file = self.data_path+"/FORCE_DB_CHECK" @@ -134,7 +134,9 @@ self.sanityCheck() # Deprecates migrationCheck. Review first installation and version control else: logging.info('No sanity check requested') - + + self.record = Record(data_path,self) + #preparamos la ventana principal self.windowmain = Main(data_path,self,self.version, gpxDir=self.conf.getValue("gpxdir")) self.date = Date(self.windowmain.calendar) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-01-17 00:50:32
|
Revision: 481 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=481&view=rev Author: jblance Date: 2010-01-17 00:50:25 +0000 (Sun, 17 Jan 2010) Log Message: ----------- Allow GUI to update statusbar while importing activities Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowimportdata.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/gui/windowimportdata.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowimportdata.py 2010-01-17 00:19:42 UTC (rev 480) +++ pytrainer/trunk/pytrainer/gui/windowimportdata.py 2010-01-17 00:50:25 UTC (rev 481) @@ -290,6 +290,7 @@ else: logging.error('File %s not valid' % gpxFile) + def updateActivity(self, activityID, status = None, notes = None): path = 0 for item in self.store: @@ -396,15 +397,15 @@ msgImporting = _("Importing %d activities" % selectedCount) msgImported = _("Imported %d activities" % selectedCount) self.updateStatusbar(self.statusbarImportFile, msgImporting) + while gtk.events_pending(): # This allows the GUI to update + gtk.main_iteration() # before completion of this entire action self.importSelectedActivities(selectedActivities) self.updateStatusbar(self.statusbarImportFile, msgImported) - #Display informational dialog box md = gtk.MessageDialog(self.win_importdata, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO, gtk.BUTTONS_CLOSE, msgImported) md.set_title(_("Import Success")) md.run() md.destroy() - self.buttonFileImport.set_sensitive(0) #Disable import button def on_buttonFileClose_clicked(self, widget): Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-01-17 00:19:42 UTC (rev 480) +++ pytrainer/trunk/pytrainer/main.py 2010-01-17 00:50:25 UTC (rev 481) @@ -101,7 +101,7 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.0_svn#480" + self.version ="1.7.0_svn#481" self.DB_version = 1 self.date = Date() # Checking profile This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-01-17 02:54:03
|
Revision: 482 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=482&view=rev Author: jblance Date: 2010-01-17 02:53:53 +0000 (Sun, 17 Jan 2010) Log Message: ----------- Sanitycheck writes DB version after run, disable legacy migration code Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/ddbb.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/profile.py Modified: pytrainer/trunk/pytrainer/lib/ddbb.py =================================================================== --- pytrainer/trunk/pytrainer/lib/ddbb.py 2010-01-17 00:50:25 UTC (rev 481) +++ pytrainer/trunk/pytrainer/lib/ddbb.py 2010-01-17 02:53:53 UTC (rev 482) @@ -75,7 +75,7 @@ def update(self,table,cells,value,condition): self.ddbbObject.update(table,cells,value,condition) - def lastRecord(self,table): + def lastRecord(self,table): #TODO Make generic i.e. something like id = "id_" + table[:-1] if table=="records": id = "id_record" if table=="sports": @@ -86,18 +86,21 @@ ret_val = self.ddbbObject.freeExec(sql) return ret_val[0][0] - def addTitle2ddbb(self): - #this function add a title column in + #TODO Remove extra check functions below + #TODO Add functions to check that fill in date_time_local and update date etc + + #def addTitle2ddbb(self): + '''#this function add a title column in #the record ddbb. New in 0.9.9 version sql = "alter table records add title varchar(200)" try: self.ddbbObject.freeExec(sql) except: logging.error('Column title already exists in DB. Printing traceback and continuing') - traceback.print_exc() + traceback.print_exc()''' - def addUnevenness2ddbb(self): - #this function add accumulated unevennes columns in + #def addUnevenness2ddbb(self): + '''#this function add accumulated unevennes columns in #the record ddbb. New in 1.3.2 version sql = "alter table records add upositive float" try: @@ -110,28 +113,28 @@ self.ddbbObject.freeExec(sql) except: logging.error('Column unegative already exists in DB. Printing traceback and continuing') - traceback.print_exc() + traceback.print_exc()''' - def addWaypoints2ddbb(self): - #adds waipoints table to database + #def addWaypoints2ddbb(self): + '''#adds waipoints table to database try: self.ddbbObject.addWaipoints2ddbb() except: logging.error('Waypoints table already exists in DB. Printing traceback and continuing') - traceback.print_exc() + traceback.print_exc()''' - def updatemonth(self): - #this is a function to repair a bug from + #def updatemonth(self): + '''#this is a function to repair a bug from #pytrainer 0.9.5 and previus listOfRecords = self.ddbbObject.select("records","id_record,date", None) for record in listOfRecords: rec = record[1].split("-") newmonth = int(rec[1])+1 newdate = "%s-%d-%s" %(rec[0],newmonth,rec[2]) - self.ddbbObject.update("records","date",[newdate], "id_record = %d" %record[0]) + self.ddbbObject.update("records","date",[newdate], "id_record = %d" %record[0])''' - def updateDateFormat(self): - #this is a function to repair a bug from + #def updateDateFormat(self): + '''#this is a function to repair a bug from #pytrainer 0.9.8 and previus listOfRecords = self.ddbbObject.select("records","id_record,date", None) for record in listOfRecords: @@ -140,10 +143,10 @@ newdate = "%0.4d-%0.2d-%0.2d" %(int(rec[0]),int(rec[1]),int(rec[2])) self.ddbbObject.update("records","date",[newdate], "id_record = %d" %record[0]) except: - print record + print record''' - def addweightandmet2ddbb(self): - #this function add weight extra and met fields to sports table + #def addweightandmet2ddbb(self): + '''#this function add weight extra and met fields to sports table sql = "alter table sports add weight float" try: self.ddbbObject.freeExec(sql) @@ -155,18 +158,18 @@ self.ddbbObject.freeExec(sql) except: logging.error('Column met already exists in DB. Printing traceback and continuing') - traceback.print_exc() + traceback.print_exc()''' - def checkmettable(self): - sql = "alter table sports add met float" + #def checkmettable(self): + '''sql = "alter table sports add met float" try: self.ddbbObject.freeExec(sql) except: logging.error('Column met already exists in DB. Printing traceback and continuing') - traceback.print_exc() + traceback.print_exc()''' - def addpaceandmax2ddbb(self): - sql = "alter table records add maxspeed float" + #def addpaceandmax2ddbb(self): + '''sql = "alter table records add maxspeed float" try: self.ddbbObject.freeExec(sql) except: @@ -189,15 +192,15 @@ self.ddbbObject.freeExec(sql) except: logging.error('Column maxbeats already exists in DB. Printing traceback and continuing') - traceback.print_exc() + traceback.print_exc()''' - def addDateTimeUTC2ddbb(self): - sql = "alter table records add date_time_utc varchar2(20)" + #def addDateTimeUTC2ddbb(self): + '''sql = "alter table records add date_time_utc varchar2(20)" try: self.ddbbObject.freeExec(sql) except: logging.error('Column date_time_utc already exists in DB. Printing traceback and continuing') - traceback.print_exc() + traceback.print_exc()''' def shortFromLocal(self, getSport=True): # Check LEFT and RIGHT JOINS for people with multiple sports if getSport is True: Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-01-17 00:50:25 UTC (rev 481) +++ pytrainer/trunk/pytrainer/main.py 2010-01-17 02:53:53 UTC (rev 482) @@ -130,18 +130,19 @@ self.ddbb = DDBB(self.configuration) logging.debug('connecting to DDBB') self.ddbb.connect() - - # DB check can be triggered either via new version (mandatory) or as runtime parameter (--check) + + #Get user's DB version currentDB_version = self.configuration.getValue("pytraining","DB_version") logging.debug("Current DB version: "+str(currentDB_version)) - - if currentDB_version is None or self.check: - self.sanityCheck() # Deprecates migrationCheck. Review first installation and version control + # DB check can be triggered either via new version (mandatory) or as runtime parameter (--check) + if self.check: # User requested check + self.sanityCheck() + elif currentDB_version is None: # No stored DB version - check DB etc + self.sanityCheck() + elif self.DB_version > int(currentDB_version): # DB version expected is newer than user's version - check DB etc + self.sanityCheck() else: - if self.DB_version > int(currentDB_version): - self.sanityCheck() # Deprecates migrationCheck. Review first installation and version control - else: - logging.info('No sanity check requested') + logging.info('No sanity check requested') self.record = Record(data_path,self) @@ -452,7 +453,7 @@ def sanityCheck(self): """23.11.2009 - dgranda - Checks database and configuration file if flag "--check" is enabled at start + Checks database and configuration file args: none returns: none""" logging.debug('>>') @@ -460,14 +461,16 @@ self.ddbb.checkDBIntegrity() logging.info('Checking configuration file integrity') self.profile.checkProfile() + logging.info('Setting DB version to: ' + str(self.DB_version)) + self.configuration.setValue("pytraining","DB_version", str(self.DB_version)) logging.debug('<<') - def addDateTimeUTC(self): + #def addDateTimeUTC(self): """12.07.2008 - dgranda Adds date_time (UTC format) for each record (new column date_time_utc in table records). New in version 1.6.0.1 args: none returns: none""" - logging.debug('>>') + '''logging.debug('>>') # Retrieves info from all GPX files stored locally listTracksGPX = self.record.shortFromLocal() logging.debug('Retrieved info from local files: '+ str(listTracksGPX)) @@ -489,14 +492,14 @@ logging.error('Error when updating data for track '+ track[2]) traceback.print_exc() logging.info('Updated '+str(num)+' entries') - logging.debug('<<') + logging.debug('<<')''' - def checkPacesDB(self): + #def checkPacesDB(self): """19.07.2008 - dgranda Updates paces in DB (maxspeed<->maxpace | average<->pace). New in version 1.6.0.2 args: none returns: none""" - logging.debug('>>') + '''logging.debug('>>') # Retrieves info from DB: id_record,maxspeed,maxpace,average,pace listPaces = self.ddbb.select("records", "id_record,maxspeed,maxpace,average,pace") logging.debug('Retrieved info from db: '+ str(listPaces)) @@ -514,4 +517,4 @@ else: logging.error('No pace info available for entry '+str(entry[0])+' in DB. Please check') logging.info('Updated '+str(num)+' entries') - logging.debug('<<') + logging.debug('<<')''' Modified: pytrainer/trunk/pytrainer/profile.py =================================================================== --- pytrainer/trunk/pytrainer/profile.py 2010-01-17 00:50:25 UTC (rev 481) +++ pytrainer/trunk/pytrainer/profile.py 2010-01-17 02:53:53 UTC (rev 482) @@ -108,7 +108,7 @@ ("prf_ddbbuser",""), ("prf_ddbbpass",""), ("prf_us_system","False"), - ("DB_version","1")] + ("DB_version","0")] defaultListKeys = [] for entry in defaultList: defaultListKeys.append(unicode(entry[0])) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-01-17 04:50:50
|
Revision: 484 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=484&view=rev Author: jblance Date: 2010-01-17 04:50:44 +0000 (Sun, 17 Jan 2010) Log Message: ----------- Added a few extra comments Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/ddbb.py pytrainer/trunk/pytrainer/lib/sqliteUtils.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/lib/ddbb.py =================================================================== --- pytrainer/trunk/pytrainer/lib/ddbb.py 2010-01-17 04:25:47 UTC (rev 483) +++ pytrainer/trunk/pytrainer/lib/ddbb.py 2010-01-17 04:50:44 UTC (rev 484) @@ -58,7 +58,7 @@ def disconnect(self): self.ddbbObject.disconnect() - def build_ddbb(self): + def build_ddbb(self): #TODO Is this needed? self.ddbbObject.createDDBB() self.ddbbObject.connect() self.ddbbObject.createTables() @@ -88,7 +88,6 @@ return ret_val[0][0] #TODO Remove extra check functions below - #TODO Add functions to check that fill in date_time_local and update date etc #def addTitle2ddbb(self): '''#this function add a title column in @@ -134,7 +133,7 @@ newdate = "%s-%d-%s" %(rec[0],newmonth,rec[2]) self.ddbbObject.update("records","date",[newdate], "id_record = %d" %record[0])''' - #def updateDateFormat(self): + #def updateDateFormat(self): #TODO Might still need this function?? '''#this is a function to repair a bug from #pytrainer 0.9.8 and previus listOfRecords = self.ddbbObject.select("records","id_record,date", None) @@ -281,6 +280,7 @@ self.ddbbObject.checkTable(entry,tablesList[entry]) #Run any functions to update or correct data + #These functions _must_ be safe to run at any time (i.e. not be version specfic or only safe to run once) self.populate_date_time_local() logging.debug('<<') @@ -300,6 +300,8 @@ using OS timezone to create local_time also updates date if date != local_time + + TODO - leaves date_time_local blank for records that have been manually created (as date_time_utc will actually be local time) ''' logging.debug('--') listOfRecords = self.ddbbObject.select("records","id_record,date,date_time_utc,date_time_local", "date_time_local is NULL") Modified: pytrainer/trunk/pytrainer/lib/sqliteUtils.py =================================================================== --- pytrainer/trunk/pytrainer/lib/sqliteUtils.py 2010-01-17 04:25:47 UTC (rev 483) +++ pytrainer/trunk/pytrainer/lib/sqliteUtils.py 2010-01-17 04:50:44 UTC (rev 484) @@ -53,7 +53,7 @@ def createDDBB(self): pass - def createTables(self): + def createTables(self): #TODO Needs to be fixed to create tables based on definition, perhaps replaced by createTableDefault? cur = self.db.cursor() #creamos la tabla sports sql = """CREATE TABLE sports ( @@ -125,7 +125,7 @@ cur.execute(sql) logging.debug('<<') - def addWaipoints2ddbb(self): + def addWaipoints2ddbb(self): #TODO Remove? cur = self.db.cursor() sql = """CREATE TABLE waypoints ( id_waypoint integer primary key autoincrement , Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-01-17 04:25:47 UTC (rev 483) +++ pytrainer/trunk/pytrainer/main.py 2010-01-17 04:50:44 UTC (rev 484) @@ -101,7 +101,7 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.0_svn#483" + self.version ="1.7.0_svn#484" self.DB_version = 1 self.date = Date() # Checking profile This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-01-17 05:47:49
|
Revision: 485 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=485&view=rev Author: jblance Date: 2010-01-17 05:47:42 +0000 (Sun, 17 Jan 2010) Log Message: ----------- More comments and disabling of unused code Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/ddbb.py pytrainer/trunk/pytrainer/lib/sqliteUtils.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/record.py Modified: pytrainer/trunk/pytrainer/lib/ddbb.py =================================================================== --- pytrainer/trunk/pytrainer/lib/ddbb.py 2010-01-17 04:50:44 UTC (rev 484) +++ pytrainer/trunk/pytrainer/lib/ddbb.py 2010-01-17 05:47:42 UTC (rev 485) @@ -28,7 +28,7 @@ class DDBB: def __init__(self, configuration): self.ddbb_type = configuration.getValue("pytraining","prf_ddbb") - if self.ddbb_type == "mysql": + if self.ddbb_type == "mysql": #TODO no longer supported? from mysqlUtils import Sql else: from sqliteUtils import Sql @@ -44,9 +44,9 @@ self.ddbbObject = Sql(ddbb_host,ddbb,ddbb_user,ddbb_pass) def connect(self): - #si devolvemos 1 ha ido todo con exito - #con 0 es que no estaba la bbdd creada - #con -1 imposible conectar a la maquina. + #si devolvemos 1 ha ido todo con exito : return 1 if all successful + #con 0 es que no estaba la bbdd creada : 0 is DB not created + #con -1 imposible conectar a la maquina. : -1 is impossible to connect to the host var = self.ddbbObject.connect() if var == 0: self.ddbbObject.createDDBB() @@ -202,12 +202,12 @@ logging.error('Column date_time_utc already exists in DB. Printing traceback and continuing') traceback.print_exc()''' - def shortFromLocal(self, getSport=True): # Check LEFT and RIGHT JOINS for people with multiple sports - if getSport is True: + #def shortFromLocal(self, getSport=True): # Check LEFT and RIGHT JOINS for people with multiple sports + '''if getSport is True: sql = "select sports.name,records.date_time_utc from sports INNER JOIN records ON sports.id_sports = records.sport" else: sql = "select records.date_time_utc from sports INNER JOIN records ON sports.id_sports = records.sport" - return self.ddbbObject.freeExec(sql) + return self.ddbbObject.freeExec(sql)''' def checkDBIntegrity(self): """17.11.2009 - dgranda Modified: pytrainer/trunk/pytrainer/lib/sqliteUtils.py =================================================================== --- pytrainer/trunk/pytrainer/lib/sqliteUtils.py 2010-01-17 04:50:44 UTC (rev 484) +++ pytrainer/trunk/pytrainer/lib/sqliteUtils.py 2010-01-17 05:47:42 UTC (rev 485) @@ -19,7 +19,7 @@ #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. import logging -import sys +import sys, traceback try: from sqlite3 import dbapi2 as sqlite except ImportError: @@ -269,5 +269,5 @@ self.freeExec(sql) except: logging.error('Not able to add/change column '+columnName+' to table '+tableName) - #traceback.print_exc() + traceback.print_exc() Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-01-17 04:50:44 UTC (rev 484) +++ pytrainer/trunk/pytrainer/main.py 2010-01-17 05:47:42 UTC (rev 485) @@ -101,7 +101,7 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.0_svn#484" + self.version ="1.7.0_svn#485" self.DB_version = 1 self.date = Date() # Checking profile @@ -117,17 +117,17 @@ self.windowmain = None logging.debug('checking configuration...') - self.conf = checkConf() + self.conf = checkConf() #TODO set this up so other modules can reference this and not have to duplicate this logging.debug("clearing tmp directory %s" % self.conf.getValue("tmpdir")) self.conf.clearTempDir() self.filename = self.conf.getValue("conffile") logging.debug('retrieving data from '+ self.filename) - self.configuration = XMLParser(self.filename) + self.configuration = XMLParser(self.filename) #TODO set this up so other modules can reference this and not have to duplicate this if self.configuration.getValue("pytraining","prf_us_system") == "True": self.prf_us_system = True else: self.prf_us_system = False - self.ddbb = DDBB(self.configuration) + self.ddbb = DDBB(self.configuration) #TODO set this up so other modules can reference this and not have to duplicate this logging.debug('connecting to DDBB') self.ddbb.connect() @@ -151,6 +151,7 @@ self.date = Date(self.windowmain.calendar) #Preparamos el webservice + #TODO check reason for webservice - remove / change to optional start if not needed gtk.gdk.threads_init() self.webservice = webService(data_path,self.refreshWaypointView,self.newRecord) self.webservice.start() @@ -465,7 +466,7 @@ self.configuration.setValue("pytraining","DB_version", str(self.DB_version)) logging.debug('<<') - #def addDateTimeUTC(self): + #def addDateTimeUTC(self): #TODO remove """12.07.2008 - dgranda Adds date_time (UTC format) for each record (new column date_time_utc in table records). New in version 1.6.0.1 args: none @@ -494,7 +495,7 @@ logging.info('Updated '+str(num)+' entries') logging.debug('<<')''' - #def checkPacesDB(self): + #def checkPacesDB(self): #TODO remove """19.07.2008 - dgranda Updates paces in DB (maxspeed<->maxpace | average<->pace). New in version 1.6.0.2 args: none Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2010-01-17 04:50:44 UTC (rev 484) +++ pytrainer/trunk/pytrainer/record.py 2010-01-17 05:47:42 UTC (rev 485) @@ -38,13 +38,13 @@ logging.debug('setting date...') self.date = Date() logging.debug('Checking current configuration...') - self.conf = checkConf() - self.filename = self.conf.getValue("conffile") - logging.debug('Retrieving data from '+ self.filename) - self.configuration = XMLParser(self.filename) - self.ddbb = DDBB(self.configuration) - logging.debug('connecting to DDBB') - self.ddbb.connect() + self.conf = checkConf() #TODO change to reference main versions of these + self.filename = self.conf.getValue("conffile") # + logging.debug('Retrieving data from '+ self.filename) # + self.configuration = XMLParser(self.filename) # + self.ddbb = DDBB(self.configuration) # + logging.debug('connecting to DDBB') # + self.ddbb.connect() # logging.debug('<<') def newRecord(self, list_sport, date, title=None, distance=None, time=None, upositive=None, unegative=None, bpm=None, calories=None, comment=None): @@ -67,7 +67,7 @@ self.recordwindow.run() logging.debug('<<') - def removeRecord(self,id_record): + def removeRecord(self,id_record): #TODO remember to update once laps are in DB logging.debug('>>') record = self.ddbb.delete("records", "id_record=\"%s\"" %id_record) logging.debug('removed record '+str(id_record)+' from bbdd') @@ -164,7 +164,7 @@ logging.debug('<<') return self.ddbb.lastRecord("records") - def insertNewRecord(self, gpxOrig, entry): + def insertNewRecord(self, gpxOrig, entry): #TODO consolidate with insertRecord """29.03.2008 - dgranda Moves GPX file to store destination and updates database args: path to source GPX file""" @@ -299,7 +299,7 @@ sport_id = self.ddbb.select("sports","id_sports","name=\"%s\"" %(sport))[0][0] except: logging.error('Error retrieving id_sports from '+ str(sport)) - #traceback.print_last() + traceback.print_last() if add is None: logging.debug('Sport '+str(sport)+' will not be added to DB') else: @@ -355,7 +355,7 @@ logging.debug('<<') return day_list - def actualize_fromgpx(self,gpxfile): + def actualize_fromgpx(self,gpxfile): #TODO remove? - should never have multiple tracks per GPX file logging.debug('>>') logging.debug('loading file: '+gpxfile) gpx = Gpx(self.data_path,gpxfile) @@ -404,7 +404,7 @@ self._actualize_fromgpx(gpx) logging.debug('<<') - def _select_trkfromgpx(self,gpxfile,tracks): + def _select_trkfromgpx(self,gpxfile,tracks): #TODO remove? - should never have multiple tracks per GPX file logging.debug('>>') logging.debug('Track dialog '+ self.data_path +'|'+ gpxfile) selectrckdialog = DialogSelectTrack(self.data_path, tracks,self.__actualize_fromgpx, gpxfile) @@ -412,7 +412,7 @@ selectrckdialog.run() logging.debug('<<') - def newGpxRecord(self,gpxfile,list_sport): + def newGpxRecord(self,gpxfile,list_sport): #TODO Not used? logging.debug('>>') logging.debug("opening a new window record "+self.data_path+'|'+gpxfile+'|'+str(list_sport)) self.recordwindow = WindowRecord(self.data_path, list_sport,self, None) @@ -440,7 +440,7 @@ logging.info("Entry %d has been added" % entry_id) logging.debug('<<') - #def importFromGTRNCTR(self,gtrnctrFile): + #def importFromGTRNCTR(self,gtrnctrFile): #TODO remove """22.03.2008 - dgranda Retrieves sport, date and start time from each entry coming from GPS and compares with what is stored locally, just to import new entries @@ -472,7 +472,7 @@ logging.debug('<<') """ - #def shortFromLocal(self): + #def shortFromLocal(self): #TODO remove """25.03.2008 - dgranda Retrieves sport, date and start time from each entry stored locally 12.07.2008 - dgranda - Added id_record for each one @@ -497,7 +497,7 @@ logging.debug('<<') return listTracksGPX''' - #def shortFromLocalDB(self, getSport=True): + #def shortFromLocalDB(self, getSport=True): #TODO remove """12.07.2008 - dgranda Retrieves sport, date and start time from local database returns: list with lists: SPORT|DATE_START_TIME""" @@ -518,19 +518,19 @@ logging.debug('<<') return listTracksGPX''' - #def removeSportFromList(self, list1): + #def removeSportFromList(self, list1): #TODO remove '''resultList = [] for entry in list1: resultList.append(entry[1]) return resultList''' - #def compareLists(self,list1,list2): + #def compareLists(self,list1,list2): #TODO remove '''# Optimizing comparison - 26042008 # http://mail.python.org/pipermail/python-list/2002-May/141458.html tempDict = dict(zip(list1,list1)) return [x for x in list2 if x not in tempDict]''' - #def compareTracks(self,listTracksGPS,listTracksLocal,checkSport=True): + #def compareTracks(self,listTracksGPS,listTracksLocal,checkSport=True): #TODO remove """22.03.2008 - dgranda Compares tracks retrieved from GPS with already locally stored args: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-01-20 07:41:40
|
Revision: 490 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=490&view=rev Author: jblance Date: 2010-01-20 07:41:33 +0000 (Wed, 20 Jan 2010) Log Message: ----------- Fix for gpx import without elevaltion Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/gpx.py pytrainer/trunk/pytrainer/record.py Modified: pytrainer/trunk/pytrainer/lib/gpx.py =================================================================== --- pytrainer/trunk/pytrainer/lib/gpx.py 2010-01-18 06:48:59 UTC (rev 489) +++ pytrainer/trunk/pytrainer/lib/gpx.py 2010-01-20 07:41:33 UTC (rev 490) @@ -145,7 +145,6 @@ ''' logging.debug(">>") tree = self.tree - # Calories data comes within laps. Maybe more than one, adding them together - dgranda 20100114 laps = tree.findall(lapTag) for lap in laps: @@ -200,7 +199,11 @@ else: time_ = 1 #get the elevation - ele = trkpoint.find(elevationTag).text + eleResult = trkpoint.find(elevationTag) + if eleResult is not None: + ele = eleResult.text + else: + ele = None #chequeamos que la altura sea correcta / check that the height is correct if ele is not None: if len(ele)<15: @@ -209,7 +212,7 @@ print "ele len >= 15" + ele else: tmp_alt= 0 - print "tmp_alt:" + tmp_alt + #print "tmp_alt:" + str(tmp_alt) #evitamos los puntos blancos / we avoid the white points if (float(lat) < -0.000001) or (float(lat) > 0.0000001): Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2010-01-18 06:48:59 UTC (rev 489) +++ pytrainer/trunk/pytrainer/record.py 2010-01-20 07:41:33 UTC (rev 490) @@ -294,12 +294,14 @@ add: attribute to add or not the sport to db returns: id_sports from provided sport""" logging.debug('>>') - sport_id=0 + sport_id=1 + if sport == "" or sport is None: + return sport_id try: sport_id = self.ddbb.select("sports","id_sports","name=\"%s\"" %(sport))[0][0] except: logging.error('Error retrieving id_sports from '+ str(sport)) - traceback.print_last() + #traceback.print_last() if add is None: logging.debug('Sport '+str(sport)+' will not be added to DB') else: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-02-01 09:37:22
|
Revision: 507 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=507&view=rev Author: jblance Date: 2010-02-01 09:37:15 +0000 (Mon, 01 Feb 2010) Log Message: ----------- Create laps table, refactor code to use laps table and create entries if non-existant Modified Paths: -------------- pytrainer/trunk/pytrainer/extensions/googlemaps.py pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/lib/ddbb.py pytrainer/trunk/pytrainer/lib/gpx.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/record.py pytrainer/trunk/pytrainer/recordgraph.py Modified: pytrainer/trunk/pytrainer/extensions/googlemaps.py =================================================================== --- pytrainer/trunk/pytrainer/extensions/googlemaps.py 2010-01-25 21:52:36 UTC (rev 506) +++ pytrainer/trunk/pytrainer/extensions/googlemaps.py 2010-02-01 09:37:15 UTC (rev 507) @@ -81,7 +81,9 @@ points = points.replace("\\","\\\\") if self.useGM3: logging.debug("Using Google Maps version 3 API") - laps = gpx.getLaps() # [](elapsedTime, lat, lon, calories, distance) + #laps = gpx.getLaps() # [](elapsedTime, lat, lon, calories, distance) + #"id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories", + laps = self.record.getLaps(id_record) #"sports.name,date,distance,time,beats,comments,average,calories,id_record,title,upositive,unegative,maxspeed,maxpace,pace,maxbeats" info = self.record.getrecordInfo(id_record) timeHours = int(info[0][3]) / 3600 @@ -193,9 +195,10 @@ finishinfo.open(map,finishmarker); });\n''' + #"id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories", for lap in laps: lapNumber = laps.index(lap)+1 - elapsedTime = float(lap[0]) + elapsedTime = float(lap[2]) elapsedTimeHours = int(elapsedTime/3600) elapsedTimeMins = int((elapsedTime - (elapsedTimeHours * 3600)) / 60) elapsedTimeSecs = elapsedTime - (elapsedTimeHours * 3600) - (elapsedTimeMins * 60) @@ -207,15 +210,15 @@ strElapsedTime = "%0.0fs" % (elapsedTimeSecs) #process lat and lon for this lap try: - lapLat = float(lap[1]) - lapLon = float(lap[2]) + lapLat = float(lap[6]) + lapLon = float(lap[7]) content += "var lap%dmarker = new google.maps.Marker({position: new google.maps.LatLng(%f, %f), icon: lapimage, map: map, title:\"Lap%d\"}); \n " % (lapNumber, lapLat, lapLon, lapNumber) - content += "var lap%d = new google.maps.InfoWindow({content: \"<div class='info_content'>End of lap:%s<br>Elapsed time:%s<br>Distance:%0.2f km<br>Calories:%s</div>\" });\n" % (lapNumber, lapNumber, strElapsedTime, float(lap[4])/1000, lap[3]) + content += "var lap%d = new google.maps.InfoWindow({content: \"<div class='info_content'>End of lap:%s<br>Elapsed time:%s<br>Distance:%0.2f km<br>Calories:%s</div>\" });\n" % (lapNumber, lapNumber, strElapsedTime, float(lap[3])/1000, lap[8]) content += "google.maps.event.addListener(lap%dmarker, 'click', function() { lap%d.open(map,lap%dmarker); });\n" % (lapNumber,lapNumber,lapNumber) except: #Error processing lap lat or lon #dont show this lap - print "Error processing lap "+ str(lapNumber) + " (lat,lon) ( " + str(lap[1]) + "," +str (lap[2]) + ")" + print "Error processing lap "+ str(lapNumber) + " id: " + lap(lap[0]) + " (lat,lon) ( " + str(lap[6]) + "," +str (lap[7]) + ")" content += ''' Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2010-01-25 21:52:36 UTC (rev 506) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-02-01 09:37:15 UTC (rev 507) @@ -951,37 +951,6 @@ logging.debug("<<") return False - '''def actualize_recordTreeView(self, record_list): - logging.debug(">>") - iterOne = False - store = gtk.ListStore( - gobject.TYPE_INT, - gobject.TYPE_STRING, - gobject.TYPE_STRING, - gobject.TYPE_STRING, - object) - for i in record_list: - iter = store.append() - if not iterOne: - iterOne = iter - dateTime = i[12] - if dateTime is not None: - localTime = dateutil.parser.parse(dateTime).strftime("%H:%M") - else: - localTime = "" - store.set ( - iter, - 0, int(i[8]), - 1, str(localTime), - 2, str(i[0]), - 3, str(i[2]) - ) - self.recordTreeView.set_model(store) - if iterOne: - self.recordTreeView.get_selection().select_iter(iterOne) - logging.debug("<<") - #if len(record_list)>0:''' - def actualize_recordTreeView(self, record_list): logging.debug(">>") iterOne = False @@ -992,13 +961,23 @@ gobject.TYPE_STRING, #Distance object) for i in record_list: - #Get lap info #TODO refactor to use a database table - gpxfile = "%s/%s.gpx" %(self.gpxDir, i[8]) - laps = None - if os.path.isfile(gpxfile): - gpx = Gpx(self.data_path,gpxfile) - laps = gpx.getLaps() #(elapsedTime, lat, lon, calories, distance) - #print gpxfile, laps + #Get lap info + id_record = i[8] + laps = self.parent.record.getLaps(id_record) + if laps is None or laps == []: #No laps stored - update DB + laps = [] + #Get details from gpx file + gpxfile = "%s/%s.gpx" %(self.gpxDir, id_record) + if os.path.isfile(gpxfile): + gpx = Gpx(self.data_path,gpxfile) + gpxLaps = gpx.getLaps() #(elapsedTime, lat, lon, calories, distance) + cells = "record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories" + for lap in gpxLaps: + values = (id_record, lap[0], lap[4], lap[5], lap[6], lap[1], lap[2], lap[3]) + logging.debug("Adding lap information: " + str(values)) + self.parent.record.insertLaps(cells,values) + #Try to get lap info again #TODO? refactor + laps = self.parent.record.getLaps(id_record) iter = store.append(None) if not iterOne: iterOne = iter @@ -1016,11 +995,12 @@ ) if laps is not None: for lap in laps: + #"id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories", lapNumber = "%s%d" % ( _("lap"), (laps.index(lap)+1) ) - distance = "%0.2f" % (float(lap[4]) / 1000.0) - timeHours = int(float(lap[0]) / 3600) - timeMin = int((float(lap[0]) / 3600.0 - timeHours) * 60) - timeSec = float(lap[0]) - (timeHours * 3600) - (timeMin * 60) + distance = "%0.2f" % (float(lap[3]) / 1000.0) + timeHours = int(float(lap[2]) / 3600) + timeMin = int((float(lap[2]) / 3600.0 - timeHours) * 60) + timeSec = float(lap[2]) - (timeHours * 3600) - (timeMin * 60) if timeHours > 0: duration = "%d%s%02d%s%02d%s" % (timeHours, _("h"), timeMin, _("m"), timeSec, _("s")) else: Modified: pytrainer/trunk/pytrainer/lib/ddbb.py =================================================================== --- pytrainer/trunk/pytrainer/lib/ddbb.py 2010-01-25 21:52:36 UTC (rev 506) +++ pytrainer/trunk/pytrainer/lib/ddbb.py 2010-02-01 09:37:15 UTC (rev 507) @@ -76,139 +76,12 @@ def update(self,table,cells,value,condition): self.ddbbObject.update(table,cells,value,condition) - def lastRecord(self,table): #TODO Make generic i.e. something like id = "id_" + table[:-1] - if table=="records": - id = "id_record" - if table=="sports": - id = "id_sport" - if table=="waypoints": - id = "id_waypoint" + def lastRecord(self,table): + id = "id_" + table[:-1] #prune 's' of table name and pre-pend 'id_' to get id column sql = "select %s from %s order by %s Desc limit 0,1" %(id,table,id) ret_val = self.ddbbObject.freeExec(sql) return ret_val[0][0] - #TODO Remove extra check functions below - - #def addTitle2ddbb(self): - '''#this function add a title column in - #the record ddbb. New in 0.9.9 version - sql = "alter table records add title varchar(200)" - try: - self.ddbbObject.freeExec(sql) - except: - logging.error('Column title already exists in DB. Printing traceback and continuing') - traceback.print_exc()''' - - #def addUnevenness2ddbb(self): - '''#this function add accumulated unevennes columns in - #the record ddbb. New in 1.3.2 version - sql = "alter table records add upositive float" - try: - self.ddbbObject.freeExec(sql) - except: - logging.error('Column upositive already exists in DB. Printing traceback and continuing') - traceback.print_exc() - sql = "alter table records add unegative float" - try: - self.ddbbObject.freeExec(sql) - except: - logging.error('Column unegative already exists in DB. Printing traceback and continuing') - traceback.print_exc()''' - - #def addWaypoints2ddbb(self): - '''#adds waipoints table to database - try: - self.ddbbObject.addWaipoints2ddbb() - except: - logging.error('Waypoints table already exists in DB. Printing traceback and continuing') - traceback.print_exc()''' - - #def updatemonth(self): - '''#this is a function to repair a bug from - #pytrainer 0.9.5 and previus - listOfRecords = self.ddbbObject.select("records","id_record,date", None) - for record in listOfRecords: - rec = record[1].split("-") - newmonth = int(rec[1])+1 - newdate = "%s-%d-%s" %(rec[0],newmonth,rec[2]) - self.ddbbObject.update("records","date",[newdate], "id_record = %d" %record[0])''' - - #def updateDateFormat(self): #TODO Might still need this function?? - '''#this is a function to repair a bug from - #pytrainer 0.9.8 and previus - listOfRecords = self.ddbbObject.select("records","id_record,date", None) - for record in listOfRecords: - try: - rec = record[1].split("-") - newdate = "%0.4d-%0.2d-%0.2d" %(int(rec[0]),int(rec[1]),int(rec[2])) - self.ddbbObject.update("records","date",[newdate], "id_record = %d" %record[0]) - except: - print record''' - - #def addweightandmet2ddbb(self): - '''#this function add weight extra and met fields to sports table - sql = "alter table sports add weight float" - try: - self.ddbbObject.freeExec(sql) - except: - logging.error('Column weight already exists in DB. Printing traceback and continuing') - traceback.print_exc() - sql = "alter table sports add met float" - try: - self.ddbbObject.freeExec(sql) - except: - logging.error('Column met already exists in DB. Printing traceback and continuing') - traceback.print_exc()''' - - #def checkmettable(self): - '''sql = "alter table sports add met float" - try: - self.ddbbObject.freeExec(sql) - except: - logging.error('Column met already exists in DB. Printing traceback and continuing') - traceback.print_exc()''' - - #def addpaceandmax2ddbb(self): - '''sql = "alter table records add maxspeed float" - try: - self.ddbbObject.freeExec(sql) - except: - logging.error('Column maxspeed already exists in DB. Printing traceback and continuing') - traceback.print_exc() - sql = "alter table records add maxpace float" - try: - self.ddbbObject.freeExec(sql) - except: - logging.error('Column maxpace already exists in DB. Printing traceback and continuing') - traceback.print_exc() - sql = "alter table records add pace float" - try: - self.ddbbObject.freeExec(sql) - except: - logging.error('Column pace already exists in DB. Printing traceback and continuing') - traceback.print_exc() - sql = "alter table records add maxbeats float" - try: - self.ddbbObject.freeExec(sql) - except: - logging.error('Column maxbeats already exists in DB. Printing traceback and continuing') - traceback.print_exc()''' - - #def addDateTimeUTC2ddbb(self): - '''sql = "alter table records add date_time_utc varchar2(20)" - try: - self.ddbbObject.freeExec(sql) - except: - logging.error('Column date_time_utc already exists in DB. Printing traceback and continuing') - traceback.print_exc()''' - - #def shortFromLocal(self, getSport=True): # Check LEFT and RIGHT JOINS for people with multiple sports - '''if getSport is True: - sql = "select sports.name,records.date_time_utc from sports INNER JOIN records ON sports.id_sports = records.sport" - else: - sql = "select records.date_time_utc from sports INNER JOIN records ON sports.id_sports = records.sport" - return self.ddbbObject.freeExec(sql)''' - def checkDBIntegrity(self): """17.11.2009 - dgranda Retrieves tables and columns from database, checks current ones and adds something if missed. New in version 1.7.0 @@ -219,38 +92,52 @@ if self.ddbb_type != "sqlite": logging.error('Support for MySQL database is decommissioned, please migrate to SQLite. Exiting check') exit(-2) - columnsSports = {"id_sports":"integer primary key autoincrement", - "name":"varchar(100)", - "weight":"float", - "met":"float"} - columnsRecords = {"id_record":"integer primary key autoincrement", - "date":"date", - "sport":"integer", - "distance":"float", - "time":"varchar(200)", - "beats":"float", - "average":"float", - "calories":"int", - "comments":"text", - "gpslog":"varchar(200)", - "title":"varchar(200)", - "upositive":"float", - "unegative":"float", - "maxspeed":"float", - "maxpace":"float", - "pace":"float", - "maxbeats":"float", - "date_time_local":"varchar2(20)", - "date_time_utc":"varchar2(20)"} - columnsWaypoints = {"id_waypoint":"integer primary key autoincrement", - "lat":"float", - "lon":"float", - "ele":"float", - "comment":"varchar(240)", - "time":"date", - "name":"varchar(200)", - "sym":"varchar(200)"} - tablesList = {"records":columnsRecords,"sports":columnsSports,"waypoints":columnsWaypoints} + #Define the tables and their columns that should be in the database + tablesList = { "records":{ "id_record":"integer primary key autoincrement", + "date":"date", + "sport":"integer", + "distance":"float", + "time":"varchar(200)", + "beats":"float", + "average":"float", + "calories":"int", + "comments":"text", + "gpslog":"varchar(200)", + "title":"varchar(200)", + "upositive":"float", + "unegative":"float", + "maxspeed":"float", + "maxpace":"float", + "pace":"float", + "maxbeats":"float", + "date_time_local":"varchar2(20)", + "date_time_utc":"varchar2(20)", + }, + "sports":{ "id_sports":"integer primary key autoincrement", + "name":"varchar(100)", + "weight":"float", + "met":"float", + }, + "waypoints":{ "id_waypoint":"integer primary key autoincrement", + "lat":"float", + "lon":"float", + "ele":"float", + "comment":"varchar(240)", + "time":"date", + "name":"varchar(200)", + "sym":"varchar(200)", + }, + "laps":{ "id_lap": "integer primary key autoincrement", + "record": "integer", + "elapsed_time": "varchar(20)", + "distance": "float", + "start_lat": "float", + "start_lon": "float", + "end_lat": "float", + "end_lon": "float", + "calories": "int", + }, + } try: tablesDBT = self.ddbbObject.select("sqlite_master","name", "type IN ('table','view') AND name NOT LIKE 'sqlite_%' ORDER BY name") except: Modified: pytrainer/trunk/pytrainer/lib/gpx.py =================================================================== --- pytrainer/trunk/pytrainer/lib/gpx.py 2010-01-25 21:52:36 UTC (rev 506) +++ pytrainer/trunk/pytrainer/lib/gpx.py 2010-02-01 09:37:15 UTC (rev 507) @@ -46,6 +46,7 @@ cadTag = gpxdataNS.substitute(tag="cadence") lapTag = gpxdataNS.substitute(tag="lap") endPointTag = gpxdataNS.substitute(tag="endPoint") +startPointTag = gpxdataNS.substitute(tag="startPoint") elapsedTimeTag = gpxdataNS.substitute(tag="elapsedTime") distanceTag = gpxdataNS.substitute(tag="distance") @@ -128,6 +129,12 @@ endPoint = lap.find(endPointTag) lat = endPoint.get("lat") lon = endPoint.get("lon") + startPoint = lap.find(startPointTag) + if startPoint is not None: + stLat = startPoint.get("lat") + stLon = startPoint.get("lon") + else: + stLat, stLon = "","" elapsedTime = lap.findtext(elapsedTimeTag) if elapsedTime.count(":") == 2: # got a 0:41:42.14 type elasped time hours, mins, secs = elapsedTime.split(":") @@ -136,7 +143,7 @@ calories = lap.findtext(calorieTag) distance = lap.findtext(distanceTag) logging.debug("Found time: %s, lat: %s lon: %s cal: %s dist: %s " % (elapsedTime, lat, lon, calories, distance)) - lapInfo.append((elapsedTime, lat, lon, calories, distance)) + lapInfo.append((elapsedTime, lat, lon, calories, distance, stLat, stLon)) return lapInfo def _getValues(self): Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-01-25 21:52:36 UTC (rev 506) +++ pytrainer/trunk/pytrainer/main.py 2010-02-01 09:37:15 UTC (rev 507) @@ -101,8 +101,8 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.1" - self.DB_version = 1 + self.version ="1.7.1_svn#507" + self.DB_version = 2 self.date = Date() # Checking profile self.profile = Profile(self.data_path,self) @@ -302,7 +302,7 @@ if os.path.isfile(gpxfile): gpx = Gpx(self.data_path,gpxfile) gpx_tracklist = gpx.getTrackList() - gpx_laps = gpx.getLaps() + gpx_laps = self.record.getLaps(id_record) self.windowmain.actualize_recordgraph(gpx_tracklist, gpx_laps) if view=="map": Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2010-01-25 21:52:36 UTC (rev 506) +++ pytrainer/trunk/pytrainer/record.py 2010-02-01 09:37:15 UTC (rev 507) @@ -259,6 +259,16 @@ "sports.name,date,distance,time,beats,comments,average,calories,id_record,maxspeed,maxbeats,date_time_utc,date_time_local", "date=\"%s\" and records.sport=sports.id_sports" %date) + def getLaps(self, id_record): + logging.debug('--') + return self.ddbb.select("laps", + "id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories", + "record=\"%s\"" % id_record) + + def insertLaps(self, cells, values): + logging.debug('--') + self.ddbb.insert("laps",cells,values) + def getrecordPeriod(self,date_ini, date_end, sport=None): #TODO This is essentially the same as getrecordPeriodSport (except date ranges) - need to look at merging the two tables = "records,sports" Modified: pytrainer/trunk/pytrainer/recordgraph.py =================================================================== --- pytrainer/trunk/pytrainer/recordgraph.py 2010-01-25 21:52:36 UTC (rev 506) +++ pytrainer/trunk/pytrainer/recordgraph.py 2010-02-01 09:37:15 UTC (rev 507) @@ -46,8 +46,8 @@ if laps is not None and showLaps: lapValues = [] lastPoint = 0.0 - for lap in laps: #(elapsedTime, lat, lon, calories, distance) - thisPoint = float(lap[4])/1000.0 + lastPoint + for lap in laps: #"id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories", + thisPoint = float(lap[3])/1000.0 + lastPoint lapValues.append((lastPoint, thisPoint)) lastPoint = thisPoint else: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-02-03 09:49:13
|
Revision: 509 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=509&view=rev Author: jblance Date: 2010-02-03 09:49:07 +0000 (Wed, 03 Feb 2010) Log Message: ----------- Update DB lap code to populate laps on import, refactor earlier lap work, add lap_number column to DB (DB now v3) Modified Paths: -------------- pytrainer/trunk/pytrainer/extensions/googlemaps.py pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/lib/ddbb.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/record.py Modified: pytrainer/trunk/pytrainer/extensions/googlemaps.py =================================================================== --- pytrainer/trunk/pytrainer/extensions/googlemaps.py 2010-02-01 09:52:03 UTC (rev 508) +++ pytrainer/trunk/pytrainer/extensions/googlemaps.py 2010-02-03 09:49:07 UTC (rev 509) @@ -195,9 +195,9 @@ finishinfo.open(map,finishmarker); });\n''' - #"id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories", + #"id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories, lap_number", for lap in laps: - lapNumber = laps.index(lap)+1 + lapNumber = int(lap[9])+1 elapsedTime = float(lap[2]) elapsedTimeHours = int(elapsedTime/3600) elapsedTimeMins = int((elapsedTime - (elapsedTimeHours * 3600)) / 60) Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2010-02-01 09:52:03 UTC (rev 508) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-02-03 09:49:07 UTC (rev 509) @@ -964,20 +964,6 @@ #Get lap info id_record = i[8] laps = self.parent.record.getLaps(id_record) - if laps is None or laps == []: #No laps stored - update DB - laps = [] - #Get details from gpx file - gpxfile = "%s/%s.gpx" %(self.gpxDir, id_record) - if os.path.isfile(gpxfile): - gpx = Gpx(self.data_path,gpxfile) - gpxLaps = gpx.getLaps() #(elapsedTime, lat, lon, calories, distance) - cells = "record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories" - for lap in gpxLaps: - values = (id_record, lap[0], lap[4], lap[5], lap[6], lap[1], lap[2], lap[3]) - logging.debug("Adding lap information: " + str(values)) - self.parent.record.insertLaps(cells,values) - #Try to get lap info again #TODO? refactor - laps = self.parent.record.getLaps(id_record) iter = store.append(None) if not iterOne: iterOne = iter @@ -995,8 +981,8 @@ ) if laps is not None: for lap in laps: - #"id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories", - lapNumber = "%s%d" % ( _("lap"), (laps.index(lap)+1) ) + #"id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories, lap_number", + lapNumber = "%s%d" % ( _("lap"), int(lap[9])+1 ) distance = "%0.2f" % (float(lap[3]) / 1000.0) timeHours = int(float(lap[2]) / 3600) timeMin = int((float(lap[2]) / 3600.0 - timeHours) * 60) Modified: pytrainer/trunk/pytrainer/lib/ddbb.py =================================================================== --- pytrainer/trunk/pytrainer/lib/ddbb.py 2010-02-01 09:52:03 UTC (rev 508) +++ pytrainer/trunk/pytrainer/lib/ddbb.py 2010-02-03 09:49:07 UTC (rev 509) @@ -129,6 +129,7 @@ }, "laps":{ "id_lap": "integer primary key autoincrement", "record": "integer", + "lap_number": "integer", "elapsed_time": "varchar(20)", "distance": "float", "start_lat": "float", Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-02-01 09:52:03 UTC (rev 508) +++ pytrainer/trunk/pytrainer/main.py 2010-02-03 09:49:07 UTC (rev 509) @@ -101,8 +101,8 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.1_svn#508" - self.DB_version = 2 + self.version ="1.7.1_svn#509" + self.DB_version = 3 self.date = Date() # Checking profile self.profile = Profile(self.data_path,self) Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2010-02-01 09:52:03 UTC (rev 508) +++ pytrainer/trunk/pytrainer/record.py 2010-02-03 09:49:07 UTC (rev 509) @@ -69,7 +69,7 @@ self.recordwindow.run() logging.debug('<<') - def removeRecord(self,id_record): #TODO remember to update once laps are in DB + def removeRecord(self,id_record): logging.debug('>>') record = self.ddbb.delete("records", "id_record=\"%s\"" %id_record) laps = self.ddbb.delete("laps", "record=\"%s\"" %id_record) @@ -148,8 +148,9 @@ logging.debug('<<') return keys,values - def insertRecord(self, list_options): + def insertRecord(self, list_options, laps=None): logging.debug('>>') + #Create entry for activity in records table if list_options is None: logging.info('No data provided, abort adding entry') return None @@ -157,10 +158,17 @@ cells,values = self._formatRecordNew(list_options) self.ddbb.insert("records",cells,values) logging.debug('DB updated: '+str(cells)+' | '+str(values)) + id_record = self.ddbb.lastRecord("records") + #Create entry(s) for activity in laps table + if laps is not None: + for lap in laps: + lap['record'] = id_record #Add reference to entry in record table + lap_keys = ", ".join(map(str, lap.keys())) + lap_values = lap.values() + self.insertLaps(lap_keys,lap.values()) gpxOrig = list_options["rcd_gpxfile"] if os.path.isfile(gpxOrig): gpxDest = self.conf.getValue("gpxdir") - id_record = self.ddbb.lastRecord("records") gpxNew = gpxDest+"/%d.gpx"%id_record shutil.move(gpxOrig, gpxNew) logging.debug('Moving '+gpxOrig+' to '+gpxNew) @@ -173,13 +181,35 @@ Moves GPX file to store destination and updates database args: path to source GPX file""" logging.debug('--') - return self.insertRecord(self.summaryFromGPX(gpxOrig, entry)) - + list_options, gpx_laps = self.summaryFromGPX(gpxOrig, entry) + return self.insertRecord(list_options, laps=gpx_laps) + + def lapsFromGPX(self, gpx): + logging.debug('>>') + laps = [] + gpxLaps = gpx.getLaps() + for lap in gpxLaps: + lap_number = gpxLaps.index(lap) + tmp_lap = {} + tmp_lap['record'] = "" + tmp_lap['lap_number'] = lap_number + tmp_lap['elapsed_time'] = lap[0] + tmp_lap['distance'] = lap[4] + tmp_lap['start_lat'] = lap[5] + tmp_lap['start_lon'] = lap[6] + tmp_lap['end_lat'] = lap[1] + tmp_lap['end_lon'] = lap[2] + tmp_lap['calories'] = lap[3] + laps.append(tmp_lap) + logging.debug('<<') + return laps + def summaryFromGPX(self, gpxOrig, entry): """29.03.2008 - dgranda Retrieves info which will be stored in DB from GPX file args: path to source GPX file - returns: list with fields and values""" + returns: list with fields and values, list of laps + """ logging.debug('>>') gpx = Gpx(self.data_path,gpxOrig) distance, time, maxspeed, maxheartrate = gpx.getMaxValues() @@ -212,15 +242,16 @@ summaryRecord['rcd_maxbeats'] = maxheartrate summaryRecord['rcd_upositive'] = upositive summaryRecord['rcd_unegative'] = unegative - if entry[1]=="": # coming from new track dialog (file opening) - summaryRecord['date_time_utc'], summaryRecord['date_time_local'] = gpx.getStartTimeFromGPX(gpxOrig) - else: # coming from GPS device - summaryRecord['date_time_utc'] = entry[1] - summaryRecord['date_time_local'] = entry[1] - print "#TODO fix record summaryRecord local and utc time..." + if entry[1]=="": # coming from new track dialog (file opening) #TODO This if-else needs checking + summaryRecord['date_time_utc'], summaryRecord['date_time_local'] = gpx.getStartTimeFromGPX(gpxOrig) # + else: # coming from GPS device # + summaryRecord['date_time_utc'] = entry[1] # + summaryRecord['date_time_local'] = entry[1] # + print "#TODO fix record summaryRecord local and utc time..." # logging.debug('summary: '+str(summaryRecord)) + laps = self.lapsFromGPX(gpx) logging.debug('<<') - return summaryRecord + return summaryRecord, laps def updateRecord(self, list_options, id_record): logging.debug('>>') @@ -262,12 +293,30 @@ def getLaps(self, id_record): logging.debug('--') - return self.ddbb.select("laps", - "id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories", + laps = self.ddbb.select("laps", + "id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories, lap_number", "record=\"%s\"" % id_record) + if laps is None or laps == []: #No laps stored - update DB + logging.debug("No laps in DB for record %d" % id_record) + gpx_dest = self.conf.getValue("gpxdir") + gpxfile = gpx_dest+"/%d.gpx"%id_record + gpx = Gpx(self.data_path,gpxfile) + laps = self.lapsFromGPX(gpx) + if laps is not None: + for lap in laps: + lap['record'] = id_record #Add reference to entry in record table + lap_keys = ", ".join(map(str, lap.keys())) + lap_values = lap.values() + self.insertLaps(lap_keys,lap.values()) + #Try to get lap info again #TODO? refactor + laps = self.ddbb.select("laps", + "id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories, lap_number", + "record=\"%s\"" % id_record) + return laps def insertLaps(self, cells, values): logging.debug('--') + logging.debug("Adding lap information: " + ", ".join(map(str, values))) self.ddbb.insert("laps",cells,values) def getrecordPeriod(self,date_ini, date_end, sport=None): @@ -445,15 +494,20 @@ Add a record from a valid pytrainer type GPX file """ logging.debug('>>') - logging.info('Retrieving data from '+gpxFile) - if not sport: - sport = "import" - entry = [sport,""] - entry_id = self.insertNewRecord(gpxFile, entry) - if entry_id is None: - logging.error("Entry not created for file %s" % gpxFile) + print gpxFile + if not os.path.isfile(gpxFile): + logging.error("Invalid file: " +gpxFile) else: - logging.info("Entry %d has been added" % entry_id) + logging.info('Retrieving data from '+gpxFile) + if not sport: + sport = "import" + entry = [sport,""] + entry_id = self.insertNewRecord(gpxFile, entry) + if entry_id is None: + logging.error("Entry not created for file %s" % gpxFile) + else: + logging.info("Entry %d has been added" % entry_id) + logging.debug('<<') #def importFromGTRNCTR(self,gtrnctrFile): #TODO remove This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-02-17 09:28:02
|
Revision: 513 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=513&view=rev Author: jblance Date: 2010-02-17 09:27:56 +0000 (Wed, 17 Feb 2010) Log Message: ----------- Small tidy up of globals in main.py Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2010-02-15 10:40:37 UTC (rev 512) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-02-17 09:27:56 UTC (rev 513) @@ -80,7 +80,7 @@ #Disable import menu item unless specified on startup if not self.testimport: self.menu_importdata.set_sensitive(0) - + def _createXmlListView(self,file): menufile = XMLParser(file) savedOptions = [] @@ -117,7 +117,7 @@ def runExtension(self,widget,widget2,extension): txtbutton,extensioncode,extensiontype = extension if extensiontype=="record": - selected,iter = self.recordTreeView.get_selection().get_selected() + selected,iter = self.recordTreeView.get_selection().get_selected() id = selected.get_value(iter,0) self.parent.runExtension(extension,id) @@ -1042,12 +1042,12 @@ self.actualize_yearview() def on_recordTree_clicked(self,widget,num,num2): - selected,iter = self.recordTreeView.get_selection().get_selected() + selected,iter = self.recordTreeView.get_selection().get_selected() self.parent.editRecord(selected.get_value(iter,0)) ######## waypoints events ########## def on_savewaypoint_clicked(self,widget): - selected,iter = self.waypointTreeView.get_selection().get_selected() + selected,iter = self.waypointTreeView.get_selection().get_selected() id_waypoint = selected.get_value(iter,0) lat = self.waypoint_latitude.get_text() lon = self.waypoint_longitude.get_text() @@ -1057,7 +1057,7 @@ self.parent.updateWaypoint(id_waypoint,lat,lon,name,desc,sym) def on_removewaypoint_clicked(self,widget): - selected,iter = self.waypointTreeView.get_selection().get_selected() + selected,iter = self.waypointTreeView.get_selection().get_selected() id_waypoint = selected.get_value(iter,0) self.parent.removeWaypoint(id_waypoint) Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-02-15 10:40:37 UTC (rev 512) +++ pytrainer/trunk/pytrainer/main.py 2010-02-17 09:27:56 UTC (rev 513) @@ -60,60 +60,53 @@ from lib.system import checkConf from lib.heartrate import * - -##TODO The below should all be able to be in the __init__ section, i.e. does not need to be global - -# ERROR is the default log level -PATH = os.environ['HOME']+"/.pytrainer" -if not os.path.exists(PATH): - os.mkdir(PATH) -LOG_FILENAME = PATH + "/log.out" - -#Setup usage and permitted options -usage = """usage: %prog [options] - -For more help on valid options try: - %prog -h """ -parser = OptionParser(usage=usage) -parser.set_defaults(log_level=logging.ERROR, validate=False, gm3=True, testimport=False) -parser.add_option("-d", "--debug", action="store_const", const=logging.DEBUG, dest="log_level", help="enable logging at debug level") -parser.add_option("-i", "--info", action="store_const", const=logging.INFO, dest="log_level", help="enable logging at info level") -parser.add_option("-w", "--warn", action="store_const", const=logging.WARNING, dest="log_level", help="enable logging at warning level") -parser.add_option("--valid", action="store_true", dest="validate", help="enable validation of files imported by plugins (details at info or debug logging level) - note plugin must support validation") -parser.add_option("--check", action="store_true", dest="check", help="triggers database (only sqlite based) and configuration file sanity checks, adding fields if necessary. Backup of database is done before any change. Details at info or debug logging level") -parser.add_option("--gmaps2", action="store_false", dest="gm3", help="Use old Google Maps API version (v2)") -parser.add_option("--testimport", action="store_true", dest="testimport", help="EXPERIMENTAL: show new import functionality - for testing only USE AT YOUR OWN RISK") -(options, args) = parser.parse_args() -log_level = options.log_level -validate = options.validate -check = options.check -gm3 = options.gm3 -testimport = options.testimport - -# Adding rotating support to default logger with customized format -rotHandler = logging.handlers.RotatingFileHandler(LOG_FILENAME, maxBytes=100000, backupCount=5) -formatter = logging.Formatter('%(asctime)s|%(levelname)s|%(module)s|%(funcName)s|%(message)s') -rotHandler.setFormatter(formatter) -logging.getLogger('').addHandler(rotHandler) -logging.getLogger('').setLevel(log_level) - class pyTrainer: def __init__(self,filename = None, data_path = None): + #Version constants + self.version ="1.7.1_svn#513" + self.DB_version = 3 + + #Setup usage and permitted options + usage = '''usage: %prog [options] + + For more help on valid options try: + %prog -h ''' + parser = OptionParser(usage=usage) + parser.set_defaults(log_level=logging.ERROR, validate=False, gm3=True, testimport=False) + parser.add_option("-d", "--debug", action="store_const", const=logging.DEBUG, dest="log_level", help="enable logging at debug level") + parser.add_option("-i", "--info", action="store_const", const=logging.INFO, dest="log_level", help="enable logging at info level") + parser.add_option("-w", "--warn", action="store_const", const=logging.WARNING, dest="log_level", help="enable logging at warning level") + parser.add_option("--valid", action="store_true", dest="validate", help="enable validation of files imported by plugins (details at info or debug logging level) - note plugin must support validation") + parser.add_option("--check", action="store_true", dest="check", help="triggers database (only sqlite based) and configuration file sanity checks, adding fields if necessary. Backup of database is done before any change. Details at info or debug logging level") + parser.add_option("--gmaps2", action="store_false", dest="gm3", help="Use old Google Maps API version (v2)") + parser.add_option("--testimport", action="store_true", dest="testimport", help="EXPERIMENTAL: show new import functionality - for testing only USE AT YOUR OWN RISK") + (options, args) = parser.parse_args() + #Populate startup options + self.log_level = options.log_level + self.validate = options.validate + self.check = options.check + self.gm3 = options.gm3 + self.testimport = options.testimport + + PATH = os.environ['HOME']+"/.pytrainer" + if not os.path.exists(PATH): + os.mkdir(PATH) + LOG_FILENAME = PATH + "/log.out" + + # Adding rotating support to default logger with customized format + rotHandler = logging.handlers.RotatingFileHandler(LOG_FILENAME, maxBytes=100000, backupCount=5) + formatter = logging.Formatter('%(asctime)s|%(levelname)s|%(module)s|%(funcName)s|%(message)s') + rotHandler.setFormatter(formatter) + logging.getLogger('').addHandler(rotHandler) + logging.getLogger('').setLevel(self.log_level) + logging.debug('>>') self.data_path = data_path - self.version ="1.7.1_svn#512" - self.DB_version = 3 self.date = Date() # Checking profile self.profile = Profile(self.data_path,self) self.profile.isProfileConfigured() - #Populate startup options - self.log_level = log_level - self.validate = validate - self.check = check - self.gm3 = gm3 - self.testimport = testimport - + self.windowmain = None logging.debug('checking configuration...') @@ -475,57 +468,3 @@ logging.info('Setting DB version to: ' + str(self.DB_version)) self.configuration.setValue("pytraining","DB_version", str(self.DB_version)) logging.debug('<<') - - #def addDateTimeUTC(self): #TODO remove - """12.07.2008 - dgranda - Adds date_time (UTC format) for each record (new column date_time_utc in table records). New in version 1.6.0.1 - args: none - returns: none""" - '''logging.debug('>>') - # Retrieves info from all GPX files stored locally - listTracksGPX = self.record.shortFromLocal() - logging.debug('Retrieved info from local files: '+ str(listTracksGPX)) - # Creates column date_time_utc in records table - try: - self.ddbb.addDateTimeUTC2ddbb() - except: - logging.error('Column date_time_utc already exists in DB') - traceback.print_exc() - # Updates data - num=0 - for track in listTracksGPX: - try: - # update records set date_time_utc="2008-07-11T10:21:31Z" where id_record='158'; - logging.debug('Updating: '+str(track)) - self.ddbb.update("records","date_time_utc",[track[1]], "id_record = %d" %int(track[2])) - num+=1 - except: - logging.error('Error when updating data for track '+ track[2]) - traceback.print_exc() - logging.info('Updated '+str(num)+' entries') - logging.debug('<<')''' - - #def checkPacesDB(self): #TODO remove - """19.07.2008 - dgranda - Updates paces in DB (maxspeed<->maxpace | average<->pace). New in version 1.6.0.2 - args: none - returns: none""" - '''logging.debug('>>') - # Retrieves info from DB: id_record,maxspeed,maxpace,average,pace - listPaces = self.ddbb.select("records", "id_record,maxspeed,maxpace,average,pace") - logging.debug('Retrieved info from db: '+ str(listPaces)) - num=0 - for entry in listPaces: - if entry[1]>0 and entry[3]>0: - tmpMax = "%d.%02d" %((3600/entry[1])/60,(3600/entry[1])%60) - tmpAve = "%d.%02d" %((3600/entry[3])/60,(3600/entry[3])%60) - try: - self.ddbb.update("records","maxpace,pace",[eval(tmpMax),eval(tmpAve)], "id_record = %d" %int(entry[0])) - num+=1 - except: - logging.error('Error when updating data for track '+ entry[0]) - traceback.print_last() - else: - logging.error('No pace info available for entry '+str(entry[0])+' in DB. Please check') - logging.info('Updated '+str(num)+' entries') - logging.debug('<<')''' This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-02-25 08:50:32
|
Revision: 516 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=516&view=rev Author: jblance Date: 2010-02-25 08:50:25 +0000 (Thu, 25 Feb 2010) Log Message: ----------- Davidfraser's code changes for waypoint editor - incomplete (see Trac #40) Modified Paths: -------------- pytrainer/trunk/pytrainer/extensions/waypointeditor.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/waypoint.py Modified: pytrainer/trunk/pytrainer/extensions/waypointeditor.py =================================================================== --- pytrainer/trunk/pytrainer/extensions/waypointeditor.py 2010-02-22 09:47:56 UTC (rev 515) +++ pytrainer/trunk/pytrainer/extensions/waypointeditor.py 2010-02-25 08:50:25 UTC (rev 516) @@ -36,11 +36,44 @@ self.conf = checkConf() self.extension = Extension() self.moz = gtkmozembed.MozEmbed() + self.moz.connect('title', self.handle_title_changed) vbox.pack_start(self.moz, True, True) vbox.show_all() self.htmlfile = "" self.waypoint=waypoint logging.debug("<<") + + def handle_title_changed(self, *args): + title = self.moz.get_title() + m = re.match("call:([a-zA-Z]*)[(](.*)[)]", title) + if m: + fname = m.group(1) + args = m.group(2) + if fname == "addWaypoint": + am = re.match("([+-]?[0-9]+[.][0-9]+),([+-]?[0-9]+[.][0-9]+)", args) + if am: + lon, lat = am.group(1), am.group(2) + lon, lat = float(lon), float(lat) + self.waypoint.addWaypoint(lon, lat, "NEW WAYPOINT") + else: + raise ValueError("Error parsing addWaypoint parameters: %s" % args) + elif fname == "updateWaypoint": + am = re.match("([+-]?[0-9]+[.][0-9]+),([+-]?[0-9]+[.][0-9]+),([0-9]*)", args) + if am: + lon, lat, id_waypoint = am.group(1), am.group(2), am.group(3) + lon, lat, id_waypoint = float(lon), float(lat), int(id_waypoint) + retorno = self.waypoint.getwaypointInfo(id_waypoint) + if retorno: + name, comment, sym = retorno[5], retorno[3], retorno[6] + self.waypoint.updateWaypoint(id_waypoint, lat, lon, name, comment, sym) + else: + raise KeyError("Unknown waypoint id %d", id_waypoint) + self.waypoint.addWaypoint(lon, lat, "NEW WAYPOINT") + else: + raise ValueError("Error parsing addWaypoint parameters: %s" % args) + else: + raise ValueError("Unexpected function name %s" % fname) + return False def drawMap(self): logging.debug(">>") @@ -74,6 +107,8 @@ """ i = 0 arrayjs = "" + if default_waypoint is None and points: + default_waypoint = points[0][0] for point in points: if point[0] == default_waypoint: londef = point[2] @@ -95,74 +130,11 @@ //<![CDATA[ function addWaypoint(lon,lat) { - var pytrainerAPI = new SOAPCall(); - netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead"); - pytrainerAPI.transportURI = "http://localhost:8081/"; - - var param1 = new SOAPParameter(); - param1.name = "lon"; - param1.value = lon; - - var param2 = new SOAPParameter(); - param2.name = "lat"; - param2.value = lat; - - var param3 = new SOAPParameter(); - param3.name = "name"; - param3.value = "NEW WAYPOINT"; - - var parameters = [param1,param2,param3]; - pytrainerAPI.encode(0, - "addWaypoint", null, - 0, null, - parameters.length, parameters); - - var response = pytrainerAPI.invoke(); - - if(response.fault){ - alert("An error occured: " + response.fault.faultString); - return 0; - } - else { - var re = new Array(); - re = response.getParameters(false, {}); - } - return re[0].value; + document.title = "call:addWaypoint(" + lon + "," + lat + ")"; } function updateWaypoint(lon,lat,id) { - var pytrainerAPI = new SOAPCall(); - netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead"); - pytrainerAPI.transportURI = "http://localhost:8081/"; - - var param1 = new SOAPParameter(); - param1.name = "lon"; - param1.value = lon; - - var param2 = new SOAPParameter(); - param2.name = "lat"; - param2.value = lat; - - var param3 = new SOAPParameter(); - param3.name = "id_waypoint"; - param3.value = id; - - var parameters = [param1,param2,param3]; - pytrainerAPI.encode(0, - "updateWaypoint", null, - 0, null, - parameters.length, parameters); - - var response = pytrainerAPI.invoke(); - - if(response.fault){ - alert("An error occured: " + response.fault.faultString); - } - else { - var re = new Array(); - re = response.getParameters(false, {}); - //alert("Return value: " + re[0].value); - } + document.title = "call:updateWaypoint(" + lon + "," + lat + "," + id + ")"; } function createMarker(waypoint) { Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-02-22 09:47:56 UTC (rev 515) +++ pytrainer/trunk/pytrainer/main.py 2010-02-25 08:50:25 UTC (rev 516) @@ -63,7 +63,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.1_svn#515" + self.version ="1.7.1_svn#516" self.DB_version = 3 #Setup usage and permitted options @@ -345,7 +345,7 @@ self.windowmain.actualize_listview(record_list) logging.debug('<<') - def refreshWaypointView(self,default_waypoint=False,redrawmap=1): + def refreshWaypointView(self,default_waypoint=None,redrawmap=1): logging.debug('>>') waypoint_list = self.waypoint.getAllWaypoints() self.windowmain.actualize_waypointview(waypoint_list,default_waypoint,redrawmap) Modified: pytrainer/trunk/pytrainer/waypoint.py =================================================================== --- pytrainer/trunk/pytrainer/waypoint.py 2010-02-22 09:47:56 UTC (rev 515) +++ pytrainer/trunk/pytrainer/waypoint.py 2010-02-25 08:50:25 UTC (rev 516) @@ -46,6 +46,16 @@ self.ddbb.update("waypoints","lat,lon,comment,name,sym",[lat,lon,desc,name,sym]," id_waypoint=%d" %id_waypoint) self.ddbb.disconnect() logging.debug("<<") + + def addWaypoint(self,lon=None,lat=None,name=None,comment=None,sym=None): + logging.debug(">>") + self.ddbb.connect() + cells = "lat,lon,comment,name,sym" + values = (lat,lon,comment,name,sym) + self.ddbb.insert("waypoints",cells,values) + id_waypoint = self.ddbb.lastRecord("waypoints") + self.ddbb.disconnect() + logging.debug("<<") def getwaypointInfo(self,id_waypoint): logging.debug(">>") This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-03-10 06:37:56
|
Revision: 524 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=524&view=rev Author: jblance Date: 2010-03-10 06:37:50 +0000 (Wed, 10 Mar 2010) Log Message: ----------- Some minor corrections to waypoint editor code Modified Paths: -------------- pytrainer/trunk/pytrainer/extensions/waypointeditor.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/waypoint.py Modified: pytrainer/trunk/pytrainer/extensions/waypointeditor.py =================================================================== --- pytrainer/trunk/pytrainer/extensions/waypointeditor.py 2010-03-08 10:29:29 UTC (rev 523) +++ pytrainer/trunk/pytrainer/extensions/waypointeditor.py 2010-03-10 06:37:50 UTC (rev 524) @@ -45,6 +45,7 @@ def handle_title_changed(self, *args): title = self.moz.get_title() + print "Received title", title m = re.match("call:([a-zA-Z]*)[(](.*)[)]", title) if m: fname = m.group(1) @@ -64,7 +65,8 @@ lon, lat, id_waypoint = float(lon), float(lat), int(id_waypoint) retorno = self.waypoint.getwaypointInfo(id_waypoint) if retorno: - name, comment, sym = retorno[5], retorno[3], retorno[6] + print retorno + name, comment, sym = retorno[0][5], retorno[0][3], retorno[0][6] self.waypoint.updateWaypoint(id_waypoint, lat, lon, name, comment, sym) else: raise KeyError("Unknown waypoint id %d", id_waypoint) Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-03-08 10:29:29 UTC (rev 523) +++ pytrainer/trunk/pytrainer/main.py 2010-03-10 06:37:50 UTC (rev 524) @@ -63,7 +63,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.1_svn#523" + self.version ="1.7.1_svn#524" self.DB_version = 3 #Setup usage and permitted options Modified: pytrainer/trunk/pytrainer/waypoint.py =================================================================== --- pytrainer/trunk/pytrainer/waypoint.py 2010-03-08 10:29:29 UTC (rev 523) +++ pytrainer/trunk/pytrainer/waypoint.py 2010-03-10 06:37:50 UTC (rev 524) @@ -60,8 +60,8 @@ def getwaypointInfo(self,id_waypoint): logging.debug(">>") self.ddbb.connect() - retorno = self.ddbb.select("waypoint", - "lat,lon,ele,comment,time,name,sym" + retorno = self.ddbb.select("waypoints", + "lat,lon,ele,comment,time,name,sym", "id_waypoint=\"%s\"" %id_waypoint) self.ddbb.disconnect() logging.debug("<<") This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-03-11 07:51:33
|
Revision: 530 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=530&view=rev Author: jblance Date: 2010-03-11 07:51:27 +0000 (Thu, 11 Mar 2010) Log Message: ----------- Minor patches from David Fraser Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowrecord.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/record.py Modified: pytrainer/trunk/pytrainer/gui/windowrecord.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowrecord.py 2010-03-11 07:42:37 UTC (rev 529) +++ pytrainer/trunk/pytrainer/gui/windowrecord.py 2010-03-11 07:51:27 UTC (rev 530) @@ -471,11 +471,11 @@ sec = self.rcd_second.get_value_as_int() time = sec + (min*60) + (hour*3600) if time<1: - return false + return False time_in_min = time/60.0 distance = float(self.rcd_distance.get_text()) if distance<1: - return false + return False average = time_in_min/distance self.rcd_pace.set_text("%0.2f" %average) Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-03-11 07:42:37 UTC (rev 529) +++ pytrainer/trunk/pytrainer/main.py 2010-03-11 07:51:27 UTC (rev 530) @@ -63,7 +63,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.1_svn#527" + self.version ="1.7.1_svn#530" self.DB_version = 3 #Setup usage and permitted options Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2010-03-11 07:42:37 UTC (rev 529) +++ pytrainer/trunk/pytrainer/record.py 2010-03-11 07:51:27 UTC (rev 530) @@ -448,7 +448,7 @@ logging.debug('Found '+str(len(tracks))+' tracks') self._select_trkfromgpx(gpxfile,tracks) else: - msg = _("pyTrainer cant import data from your gpx file") + msg = _("pyTrainer can't import data from your gpx file") from gui.warning import Warning warning = Warning(self.data_path) warning.set_text(msg) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-03-15 07:49:57
|
Revision: 534 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=534&view=rev Author: jblance Date: 2010-03-15 07:49:50 +0000 (Mon, 15 Mar 2010) Log Message: ----------- Fixes to unified import, comments and advanced tab enabled for editing, main screen refreshes correctly Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowimportdata.py pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/gui/windowrecord.py pytrainer/trunk/pytrainer/lib/gpx.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/record.py Modified: pytrainer/trunk/pytrainer/gui/windowimportdata.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowimportdata.py 2010-03-14 04:19:01 UTC (rev 533) +++ pytrainer/trunk/pytrainer/gui/windowimportdata.py 2010-03-15 07:49:50 UTC (rev 534) @@ -22,6 +22,7 @@ import os, glob, sys import StringIO import logging +import types from lxml import etree from pytrainer.plugins import Plugins @@ -453,7 +454,7 @@ duration = item[4] sport = item[5] gpx_file = self.processClasses[file_id].getGPXFile(activity_id, file_id)[1] - selectedActivities.append((activity_id, start_time, distance, duration, sport, gpx_file)) + selectedActivities.append((activity_id, start_time, distance, duration, sport, gpx_file, file_id)) logging.debug( "Found %d selected activities to import" % len(selectedActivities) ) return selectedActivities @@ -465,24 +466,20 @@ #selectedActivities.append((activity_id, start_time, distance, duration, sport, gpx_file)) logging.debug( "Importing %d activities" % len(activities)) list_sport = self.pytrainer_main.profile.getSportList() - self.pytrainer_main.record.newMultiRecord(activities, list_sport) - #sport, gpxFile = self.processClasses[file_id].getGPXFile(activity_id) - #process returned GPX files - '''if os.path.isfile(gpxFile): - logging.info('File exists. Size: %d. Sport: %s' % (os.path.getsize(gpxFile), sport)) - #TODO trigger newentry screen to allow user to edit data - #list_sport = self.pytrainer_main.profile.getSportList() - #logging.debug('id_record: '+str(id_record)+' | list_sport: '+str(list_sport)) - #def newRecord(self, list_sport, date, title=None, distance=None, time=None, upositive=None, unegative=None, bpm=None, calories=None, comment=None): - #self.pytrainer_main.record.newMultiRecord(list_sport, date=start_time, distance=distance, time=duration, comment=sport) - #self.pytrainer_main.record.importFromGPX(gpxFile, sport) - #Deselect imported activity and change note - self.updateActivity(activity_id, file_id, status=False, notes="Imported into database") - else: - logging.error('File %s not valid' % gpxFile) - ''' + result = self.pytrainer_main.record.newMultiRecord(activities, list_sport) + for activity in result: + if "db_id" in activity.keys() and type(activity["db_id"]) is types.IntType: + #Activity imported correctly + duration = "%0.0f:%0.0f:%02.0f" % (float(activity["rcd_time"][0]), float(activity["rcd_time"][1]), float(activity["rcd_time"][2])) + self.updateActivity(activity["activity_id"], activity["file_id"], + status = False, + notes = _("Imported into database"), + sport = activity["rcd_sport"], + distance = activity["rcd_distance"], + duration = duration) + #print "updating activity %s " % (str(activity)) - def updateActivity(self, activityID, file_id, status = None, notes = None): + def updateActivity(self, activityID, file_id, status = None, notes = None, sport = None, distance = None, duration = None): path = 0 for item in self.activities_store: if item[0] == activityID and item[7] == str(file_id): @@ -490,6 +487,12 @@ self.activities_store[path][1] = status if notes is not None: self.activities_store[path][6] = notes + if sport is not None: + self.activities_store[path][5] = sport + if distance is not None: + self.activities_store[path][3] = distance + if duration is not None: + self.activities_store[path][4] = duration path +=1 def close_window(self): @@ -672,11 +675,13 @@ self.files_store.set( iter, 0, class_index, - 1, False, + 1, True, 2, filename, 3, self.processClasses[class_index].getFileType(), 4, activity_count ) + #File valid, so enable remove button + self.buttonRemoveSelectedFiles.set_sensitive(1) #Get activities in file for activity in activitiesSummary: #Add activity details to TreeView store to display Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2010-03-14 04:19:01 UTC (rev 533) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-03-15 07:49:50 UTC (rev 534) @@ -248,6 +248,7 @@ buffer.set_text(comments) else: + self.recordview.set_current_page(0) self.recordview.set_sensitive(0) logging.debug(">>") @@ -879,11 +880,11 @@ if self.block: self.block = False else: - self.parent.refreshListRecords() - self.parent.refreshGraphView(self.selected_view) if self.selected_view == "record": self.recordview.set_current_page(0) self.parent.refreshRecordGraphView("info") + self.parent.refreshListRecords() + self.parent.refreshGraphView(self.selected_view) def on_calendar_changemonth(self,widget): logging.debug("--") Modified: pytrainer/trunk/pytrainer/gui/windowrecord.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowrecord.py 2010-03-14 04:19:01 UTC (rev 533) +++ pytrainer/trunk/pytrainer/gui/windowrecord.py 2010-03-15 07:49:50 UTC (rev 534) @@ -37,6 +37,7 @@ self.id_record = "" self.store = None self.active_row = None + self.activity_data = [] SimpleGladeApp.__init__(self, data_path+glade_path, root, domain) self.conf_options = [ "rcd_date", @@ -81,10 +82,13 @@ if calories != None: self.rcd_calories.set_text(calories) + def getActivityData(self): + return self.activity_data + def populateMultiWindow(self, activities): self.mode = "multiple_activities" - #activities (activity_id, start_time, distance, duration, sport, gpx_file) - self.activity_data = [] + #activities (activity_id, start_time, distance, duration, sport, gpx_file, file_id) + self.activity_data = [] #Make treeview self.store = self.build_tree_view() #Add data @@ -111,9 +115,11 @@ #details["rcd_min"] = float(mins) #details["rcd_second"] = float(secs) #details["rcd_time"] = (((float(hours) * 60) + float(mins)) * 60) + float(secs) + details["activity_id"] = activity[0] details["rcd_time"] = (float(hours), float(mins), float(secs)) details["rcd_sport"] = activity[4] details["rcd_gpxfile"] = activity[5] + details["file_id"] = activity[6] self.activity_data.append(details) self.scrolledwindowEntries.show_all() #Hide some of the buttons @@ -124,16 +130,7 @@ #self.button12.hide() #Velocity "Calculate" button self.button43.hide() #Pace "Calculate" button #Make GPX file 'unsensitive' - self.rcd_gpxfile.set_sensitive(0) - #Make General settings unsensitive - #self.frameGeneral.set_sensitive(0) #TODO fix update to allow edits here - #Make Velocity settings unsensitive - #self.frameVelocity.set_sensitive(0) #TODO fix update to allow edits here - #Make advanced tab settings unsensitive - self.vbox26.set_sensitive(0) #TODO fix update to allow edits here - #Make comments unsensitive - self.frame23.set_sensitive(0) #TODO fix update to allow edits here - + self.rcd_gpxfile.set_sensitive(0) while gtk.events_pending(): # This allows the GUI to update gtk.main_iteration() # before completion of this entire action #Select first row and display details @@ -162,8 +159,23 @@ def on_accept_clicked(self,widget): if self.mode == "multiple_activities": + #Check for edited data in comments + if self.active_row is not None: + buffer = self.rcd_comments.get_buffer() + start,end = buffer.get_bounds() + comments = buffer.get_text(start,end, True).replace("\"","'") + self.activity_data[self.active_row]["rcd_comments"] = comments + #Advanced tab items + self.activity_data[self.active_row]["rcd_maxpace"] = self.rcd_maxpace.get_text() + self.activity_data[self.active_row]["rcd_pace"] = self.rcd_pace.get_text() + self.activity_data[self.active_row]["rcd_upositive"] = self.rcd_upositive.get_text() + self.activity_data[self.active_row]["rcd_unegative"] = self.rcd_unegative.get_text() + self.activity_data[self.active_row]["rcd_maxbeats"] = self.rcd_maxbeats.get_text() + self.activity_data[self.active_row]["rcd_beats"] = self.rcd_beats.get_text() + self.activity_data[self.active_row]["rcd_calories"] = self.rcd_calories.get_text() row = 0 for activity in self.activity_data: + index = self.activity_data.index(activity) if activity["complete"] is False: #Did not view or modify this record - need to get all the details print "Activity incomplete.. " + activity["rcd_gpxfile"] @@ -171,9 +183,9 @@ activity["rcd_title"] = activity["rcd_title"].replace("\"","'") #Add activity to DB etc laps = activity.pop("laps", ()) - self.parent.insertRecord(activity, laps) + self.activity_data[index]["db_id"] = self.parent.insertRecord(activity, laps) row += 1 - + logging.debug("Processed %d rows of activity data" % row) else: list_options = {} trackSummary = {} @@ -439,6 +451,21 @@ ''' Callback to display details of different activity ''' + #Check for edited data in previous row + if self.active_row is not None: + #Check for edited data in comments + buffer = self.rcd_comments.get_buffer() + start,end = buffer.get_bounds() + comments = buffer.get_text(start,end, True).replace("\"","'") + self.activity_data[self.active_row]["rcd_comments"] = comments + #Advanced tab items + self.activity_data[self.active_row]["rcd_maxpace"] = self.rcd_maxpace.get_text() + self.activity_data[self.active_row]["rcd_pace"] = self.rcd_pace.get_text() + self.activity_data[self.active_row]["rcd_upositive"] = self.rcd_upositive.get_text() + self.activity_data[self.active_row]["rcd_unegative"] = self.rcd_unegative.get_text() + self.activity_data[self.active_row]["rcd_maxbeats"] = self.rcd_maxbeats.get_text() + self.activity_data[self.active_row]["rcd_beats"] = self.rcd_beats.get_text() + self.activity_data[self.active_row]["rcd_calories"] = self.rcd_calories.get_text() #Get row that was selected x = int(event.x) y = int(event.y) Modified: pytrainer/trunk/pytrainer/lib/gpx.py =================================================================== --- pytrainer/trunk/pytrainer/lib/gpx.py 2010-03-14 04:19:01 UTC (rev 533) +++ pytrainer/trunk/pytrainer/lib/gpx.py 2010-03-15 07:49:50 UTC (rev 534) @@ -338,7 +338,7 @@ dateTime = self.getDateTime(date_time.text) zuluDateTime = dateTime[0].strftime("%Y-%m-%dT%H:%M:%SZ") localDateTime = dateTime[1] - logging.debug(gpxFile+" | "+ date_time.text +" | " + zuluDateTime) + logging.debug(gpxFile+" | "+ date_time.text +" | " + zuluDateTime + " | " + str(localDateTime)) #print localDateTime #return date_time.text logging.debug("<<") Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-03-14 04:19:01 UTC (rev 533) +++ pytrainer/trunk/pytrainer/main.py 2010-03-15 07:49:50 UTC (rev 534) @@ -63,7 +63,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.1_svn#532" + self.version ="1.7.1_svn#534" self.DB_version = 3 #Setup usage and permitted options @@ -372,6 +372,8 @@ activeplugins_after = self.plugins.getActivePlugins() #Need to check for plugins that have been disabled (were active and now are not) self.setMenuPlugins(activeplugins_before, activeplugins_after) + self.refreshListRecords() + self.refreshGraphView(self.windowmain.selected_view) logging.debug('<<') def editGpsPlugins(self): Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2010-03-14 04:19:01 UTC (rev 533) +++ pytrainer/trunk/pytrainer/record.py 2010-03-15 07:49:50 UTC (rev 534) @@ -59,6 +59,7 @@ self.recordwindow = WindowRecord(self.data_path, list_sport, parent=self, windowTitle="Modify details before importing") self.recordwindow.populateMultiWindow(activities) self.recordwindow.run() + return self.recordwindow.getActivityData() logging.debug('<<') def editRecord(self,id_record,list_sport): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-03-15 08:06:54
|
Revision: 535 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=535&view=rev Author: jblance Date: 2010-03-15 08:06:45 +0000 (Mon, 15 Mar 2010) Log Message: ----------- Changes suggested by DF to gpx for his unique case (they dont appear to negatively impact normal cases) Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/gpx.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/lib/gpx.py =================================================================== --- pytrainer/trunk/pytrainer/lib/gpx.py 2010-03-15 07:49:50 UTC (rev 534) +++ pytrainer/trunk/pytrainer/lib/gpx.py 2010-03-15 08:06:45 UTC (rev 535) @@ -189,10 +189,11 @@ retorno = [] his_vel = [] - last_lat = "False" - last_lon = "False" - last_time = "False" + last_lat = None + last_lon = None + last_time = None total_dist = 0 + dist_elapsed = 0 # distance since the last time found total_hr = 0 tmp_alt = 0 len_validhrpoints = 0 @@ -206,6 +207,7 @@ #mk_time = self.getDateTime(date_)[0] #UTC Date mk_time = self.getDateTime(date_)[1] #Local Date self.date = mk_time.strftime("%Y-%m-%d") + waiting_points = [] for trkpoint in trkpoints: @@ -234,7 +236,7 @@ mk_time = self.getDateTime(date_)[0] time_ = time.mktime(mk_time.timetuple()) #Convert date to seconds else: - time_ = 1 + time_ = None #get the elevation eleResult = trkpoint.find(elevationTag) if eleResult is not None: @@ -256,11 +258,11 @@ #Convert lat and lon from degrees to radians tmp_lat = float(lat)*0.01745329252 #0.01745329252 = number of radians in a degree tmp_lon = float(lon)*0.01745329252 #57.29577951 = 1/0.01745329252 or degrees per radian - tmp_time = int(time_) + #tmp_time = int(time_) #Para las vueltas diferentes a la primera / For the returns different from first - if last_lat != "False": - time_ = tmp_time - last_time + if last_lat is not None: + #time_ = tmp_time - last_time #if time_>0: #Caqlculate diference betwen last and new point #tempnum=(math.sin(last_lat)*math.sin(tmp_lat))+(math.cos(last_lat)*math.cos(tmp_lat)*math.cos(tmp_lon-last_lon)) @@ -273,32 +275,67 @@ dist=math.acos((math.sin(last_lat)*math.sin(tmp_lat))+(math.cos(last_lat)*math.cos(tmp_lat)*math.cos(tmp_lon-last_lon)))*111.302*57.29577951 except: dist=0 + dist_elapsed += dist total_dist += dist total_hr += hr if hr>self.maxhr: self.maxhr = hr - if time_>0: - #dividimos kilometros por hora (no por segundo) / Calculate kilometers per hour (not including seconds) - tmp_vel = dist/((time_)/3600.0) - vel,his_vel = self._calculate_velocity(tmp_vel,his_vel, 3) - #si la velocidad es menor de 90 lo damos por bueno / if speed is greater than 90 or time greater than 100 we exclude the result - if vel<90 and time_ <100: - if vel>self.maxvel: - self.maxvel=vel - self.total_time += time_ + #if time_>0: + # #dividimos kilometros por hora (no por segundo) / Calculate kilometers per hour (not including seconds) + # tmp_vel = dist/((time_)/3600.0) + # vel,his_vel = self._calculate_velocity(tmp_vel,his_vel, 3) + # #si la velocidad es menor de 90 lo damos por bueno / if speed is greater than 90 or time greater than 100 we exclude the result + # if vel<90 and time_ <100: + # if vel>self.maxvel: + # self.maxvel=vel + # self.total_time += time_ + if time_ is not None: + tmp_time = int(time_) + time_elapsed = tmp_time - last_time if last_time is not None else 0 + if time_elapsed>0: + #Caqlculate diference betwen last and new point + #tempnum=(math.sin(last_lat)*math.sin(tmp_lat))+(math.cos(last_lat)*math.cos(tmp_lat)*math.cos(tmp_lon-last_lon)) + #try: + #Pasamos la distancia de radianes a metros.. creo / We convert the distance from radians to meters + #David no me mates que esto lo escribi hace anhos / Do not kill me this was written ages ago + #http://faculty.washington.edu/blewis/ocn499/EXER04.htm equation for the distance between 2 points on a spherical earth + #dividimos kilometros por hora (no por segundo) / Calculate kilometers per hour (not including seconds) + tmp_vel = dist_elapsed/((time_elapsed)/3600.0) + vel,his_vel = self._calculate_velocity(tmp_vel,his_vel, 3) + #si la velocidad es menor de 90 lo damos por bueno / if speed is greater than 90 we exclude the result + self.total_time += time_elapsed + if vel<90: + if vel>self.maxvel: + self.maxvel=vel + for ((w_total_dist, w_dist, w_alt, w_total_time, w_lat, w_lon, w_hr, w_cadence)) in waiting_points: + w_time = (w_dist/dist_elapsed) * time_elapsed + w_vel = w_dist/((w_time)/3600.0) + w_total_time += w_time + retorno.append((w_total_dist, w_alt, w_total_time, w_vel, w_lat, w_lon, w_hr, w_cadence)) + waiting_points = [] + retorno.append((total_dist,tmp_alt, self.total_time,vel,lat,lon,hr,cadence)) + rel_alt = tmp_alt - last_alt #Could allow for some 'jitter' in height here + if rel_alt > 0: + self.upositive += rel_alt + elif rel_alt < 0: + self.unegative -= rel_alt + dist_elapsed = 0 else: - vel = 0 - rel_alt = tmp_alt - last_alt #Could allow for some 'jitter' in height here - if rel_alt > 0: - self.upositive += rel_alt - elif rel_alt < 0: - self.unegative -= rel_alt - retorno.append((total_dist,tmp_alt, self.total_time,vel,lat,lon,hr,cadence)) + waiting_points.append((total_dist, dist_elapsed, tmp_alt, self.total_time, lat, lon, hr, cadence)) + # vel = 0 + #rel_alt = tmp_alt - last_alt #Could allow for some 'jitter' in height here + #if rel_alt > 0: + # self.upositive += rel_alt + #elif rel_alt < 0: + # self.unegative -= rel_alt + #retorno.append((total_dist,tmp_alt, self.total_time,vel,lat,lon,hr,cadence)) last_lat = tmp_lat last_lon = tmp_lon last_alt = tmp_alt - last_time = tmp_time + #last_time = tmp_time + if time_ is not None: + last_time = int(time_) self.hr_average = 0 if len_validhrpoints > 0: Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-03-15 07:49:50 UTC (rev 534) +++ pytrainer/trunk/pytrainer/main.py 2010-03-15 08:06:45 UTC (rev 535) @@ -63,7 +63,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.1_svn#534" + self.version ="1.7.1_svn#535" self.DB_version = 3 #Setup usage and permitted options This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-03-16 08:32:08
|
Revision: 537 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=537&view=rev Author: jblance Date: 2010-03-16 08:32:00 +0000 (Tue, 16 Mar 2010) Log Message: ----------- Unified import - bug fix for edited comments Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/gui/windowrecord.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2010-03-15 09:18:47 UTC (rev 536) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-03-16 08:32:00 UTC (rev 537) @@ -122,7 +122,7 @@ self.recordbuttons_hbox.show_all() def runExtension(self,widget,widget2,extension): - print extension + #print extension txtbutton,extensioncode,extensiontype = extension id = None if extensiontype=="record": Modified: pytrainer/trunk/pytrainer/gui/windowrecord.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowrecord.py 2010-03-15 09:18:47 UTC (rev 536) +++ pytrainer/trunk/pytrainer/gui/windowrecord.py 2010-03-16 08:32:00 UTC (rev 537) @@ -364,14 +364,14 @@ #set duration time = Date().time2second(self.activity_data[row]["rcd_time"]) #TODO Fix to use timeinseconds!! self.setTime(time) #TODO Fix to use timeinseconds!! - #self.rcd_hour.set_value(self.activity_data[row]["rcd_hour"]) - #self.rcd_min.set_value(self.activity_data[row]["rcd_min"]) - #self.rcd_second.set_value(self.activity_data[row]["rcd_second"]) #Set distance self.setValue("rcd_distance",self.activity_data[row]["rcd_distance"], "%s") - #set start date - #start_date = start - #self.setValue("rcd_date", start, "%s") + #Set comments + buffer = self.rcd_comments.get_buffer() + start,end = buffer.get_bounds() + if "rcd_comments" not in self.activity_data[row]: + self.activity_data[row]["rcd_comments"] = "" + buffer.set_text(self.activity_data[row]["rcd_comments"]) while gtk.events_pending(): # This allows the GUI to update gtk.main_iteration() # before completion of this entire action if self.activity_data[row]["complete"] is False: @@ -396,16 +396,17 @@ self.setValue("rcd_date", self.activity_data[row]["rcd_date"], "%s") self.setValue("rcd_starttime", self.activity_data[row]["rcd_starttime"], "%s") self.setValue("rcd_average",self.activity_data[row]["rcd_average"]) - self.setValue("rcd_calories",self.activity_data[row]["rcd_calories"], "%0.0f") - self.setValue("rcd_beats",self.activity_data[row]["rcd_beats"], "%0.0f") - self.setValue("rcd_upositive",self.activity_data[row]["rcd_upositive"]) - self.setValue("rcd_unegative",self.activity_data[row]["rcd_unegative"]) + self.setValue("rcd_calories",self.activity_data[row]["rcd_calories"], "%s") + self.setValue("rcd_beats",self.activity_data[row]["rcd_beats"], "%s") + self.setValue("rcd_upositive",self.activity_data[row]["rcd_upositive"], "%s") + self.setValue("rcd_unegative",self.activity_data[row]["rcd_unegative"], "%s") self.setValue("rcd_maxvel",self.activity_data[row]["rcd_maxvel"]) self.rcd_maxpace.set_text(self.activity_data[row]["rcd_maxpace"]) self.rcd_pace.set_text(self.activity_data[row]["rcd_pace"]) - self.setValue("rcd_maxbeats",self.activity_data[row]["rcd_maxbeats"], "%0.0f") + self.setValue("rcd_maxbeats",self.activity_data[row]["rcd_maxbeats"], "%s") self.rcd_title.set_text(self.activity_data[row]["rcd_title"]) + def on_rcd_title_changed(self, widget): if self.mode == "multiple_activities" and self.active_row is not None: self.activity_data[self.active_row]["rcd_title"] = self.rcd_title.get_text() Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-03-15 09:18:47 UTC (rev 536) +++ pytrainer/trunk/pytrainer/main.py 2010-03-16 08:32:00 UTC (rev 537) @@ -63,7 +63,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.1_svn#536" + self.version ="1.7.1_svn#537" self.DB_version = 3 #Setup usage and permitted options This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-03-19 06:52:17
|
Revision: 538 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=538&view=rev Author: jblance Date: 2010-03-19 06:52:10 +0000 (Fri, 19 Mar 2010) Log Message: ----------- Unified import - fix to preserve information across tab changes Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowimportdata.py pytrainer/trunk/pytrainer/gui/windowrecord.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/gui/windowimportdata.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowimportdata.py 2010-03-16 08:32:00 UTC (rev 537) +++ pytrainer/trunk/pytrainer/gui/windowimportdata.py 2010-03-19 06:52:10 UTC (rev 538) @@ -60,9 +60,16 @@ else: self.auto_launch = False logging.debug("Default tab: %s, Auto launch: %s" % (str(self.defaulttab), str(self.auto_launch))) + self.init_all_tabs() self.notebookMainTabs.set_current_page(self.defaulttab) - self.init_tab(self.defaulttab, first=True) + self.init_tab(self.defaulttab, first=True) #TODO fix so dont need to re-call init_tab logging.debug("<<") + + def init_all_tabs(self): + logging.debug(">>") + tabs = (0,1,2,3) + for tab in tabs: + self.init_tab(tab) def init_tab(self, page, first=False): ''' Initialise tab ''' @@ -83,7 +90,6 @@ else: #unknown tab logging.error("Unknown page %d passed to init_tab" % page) - pass def updateStatusbar(self, statusbar, text, context_id = None): ''' Help function to set the text of the statusbar ''' @@ -596,7 +602,7 @@ def on_notebookMainTabs_switch_page(self, notebook, page, new_page): logging.debug('--') - self.init_tab(new_page) + #self.init_tab(new_page) def on_buttonOptionsSave_clicked(self, widget): logging.debug('>>') Modified: pytrainer/trunk/pytrainer/gui/windowrecord.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowrecord.py 2010-03-16 08:32:00 UTC (rev 537) +++ pytrainer/trunk/pytrainer/gui/windowrecord.py 2010-03-19 06:52:10 UTC (rev 538) @@ -149,8 +149,8 @@ #Add columns column = gtk.TreeViewColumn(column_name, gtk.CellRendererText(), text=column_index) column.set_sort_column_id(column_index) - #if column_name == "id": - # column.set_visible(False) + if column_name == "id": + column.set_visible(False) column.set_resizable(True) self.treeviewEntries.append_column(column) self.treeviewEntries.set_headers_clickable(True) Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-03-16 08:32:00 UTC (rev 537) +++ pytrainer/trunk/pytrainer/main.py 2010-03-19 06:52:10 UTC (rev 538) @@ -63,7 +63,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.1_svn#537" + self.version ="1.7.1_svn#538" self.DB_version = 3 #Setup usage and permitted options This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |