From: <jb...@us...> - 2010-04-03 06:21:13
|
Revision: 542 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=542&view=rev Author: jblance Date: 2010-04-03 06:21:07 +0000 (Sat, 03 Apr 2010) Log Message: ----------- Remove bugs that cause errors if no GPX data is present for an entry 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 2010-03-25 19:37:07 UTC (rev 541) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-04-03 06:21:07 UTC (rev 542) @@ -264,6 +264,7 @@ logging.debug(">>") if len(record_list)>0: self.record_vbox.set_sensitive(1) + self.drawarearecord.drawgraph(record_list,laps) else: #Remove graph vboxChildren = self.record_vbox.get_children() @@ -275,8 +276,6 @@ logging.debug('Removing child: '+str(child)) self.record_vbox.remove(child) self.record_vbox.set_sensitive(0) - #logging.debug("Going to draw "+str(record_list)) - self.drawarearecord.drawgraph(record_list,laps) logging.debug("<<") def actualize_heartrategraph(self,record_list): Modified: pytrainer/trunk/pytrainer/lib/gpx.py =================================================================== --- pytrainer/trunk/pytrainer/lib/gpx.py 2010-03-25 19:37:07 UTC (rev 541) +++ pytrainer/trunk/pytrainer/lib/gpx.py 2010-04-03 06:21:07 UTC (rev 542) @@ -69,6 +69,7 @@ self.date = "" #self.Date = Date() self.calories= 0 + self.tree = None if filename != None: if not os.path.isfile(self.filename): return None @@ -145,6 +146,8 @@ def getLaps(self): logging.debug(">>") lapInfo = [] + if self.tree is None: + return lapInfo tree = self.tree #date = tree.findtext(timeTag) #startTime = self.getDateTime(date) Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-03-25 19:37:07 UTC (rev 541) +++ pytrainer/trunk/pytrainer/main.py 2010-04-03 06:21:07 UTC (rev 542) @@ -63,7 +63,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.1_svn#541" + self.version ="1.7.1_svn#542" self.DB_version = 3 #Setup usage and permitted options @@ -292,16 +292,17 @@ self.windowmain.actualize_recordview(record_list) if view=="graphs": - selected,iter = self.windowmain.recordTreeView.get_selection().get_selected() - gpx_tracklist = [] - if iter: + selected,iter = self.windowmain.recordTreeView.get_selection().get_selected() + gpx_tracklist = [] + gpx_laps = None + if iter: id_record = selected.get_value(iter,0) gpxfile = self.conf.getValue("gpxdir")+"/%s.gpx" %id_record if os.path.isfile(gpxfile): gpx = Gpx(self.data_path,gpxfile) gpx_tracklist = gpx.getTrackList() gpx_laps = self.record.getLaps(id_record) - self.windowmain.actualize_recordgraph(gpx_tracklist, gpx_laps) + self.windowmain.actualize_recordgraph(gpx_tracklist, gpx_laps) if view=="map": self.refreshMapView() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-04-04 10:30:53
|
Revision: 543 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=543&view=rev Author: jblance Date: 2010-04-04 10:30:47 +0000 (Sun, 04 Apr 2010) Log Message: ----------- Fixes to waypoint code - no longer duplicates type, selects last added and correctly deals with drag and drop of waypoints Modified Paths: -------------- pytrainer/trunk/pytrainer/extensions/waypointeditor.py pytrainer/trunk/pytrainer/gui/windowmain.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-04-03 06:21:07 UTC (rev 542) +++ pytrainer/trunk/pytrainer/extensions/waypointeditor.py 2010-04-04 10:30:47 UTC (rev 543) @@ -30,7 +30,7 @@ import logging class WaypointEditor: - def __init__(self, data_path = None, vbox = None, waypoint=None): + def __init__(self, data_path = None, vbox = None, waypoint=None, parent=None): logging.debug(">>") self.data_path = data_path self.conf = checkConf() @@ -41,11 +41,12 @@ vbox.show_all() self.htmlfile = "" self.waypoint=waypoint + self.pytrainer_main=parent logging.debug("<<") def handle_title_changed(self, *args): title = self.moz.get_title() - print "Received title", title + logging.debug("Received title: "+ title) m = re.match("call:([a-zA-Z]*)[(](.*)[)]", title) if m: fname = m.group(1) @@ -55,21 +56,26 @@ if am: lon, lat = am.group(1), am.group(2) lon, lat = float(lon), float(lat) - self.waypoint.addWaypoint(lon, lat, "NEW WAYPOINT") + id_waypoint = self.waypoint.addWaypoint(lon, lat, "NEW WAYPOINT") + self.pytrainer_main.refreshWaypointView(default_waypoint=id_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) + try: + lon, lat, id_waypoint = float(lon), float(lat), int(id_waypoint) + except ValueError as e: + print "Error parsing addWaypoint parameters: " % args + print e retorno = self.waypoint.getwaypointInfo(id_waypoint) if retorno: name, comment, sym = retorno[0][5], retorno[0][3], retorno[0][6] self.waypoint.updateWaypoint(id_waypoint, lat, lon, name, comment, sym) + self.pytrainer_main.refreshWaypointView(default_waypoint=id_waypoint) 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: Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2010-04-03 06:21:07 UTC (rev 542) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-04-04 10:30:47 UTC (rev 543) @@ -695,13 +695,28 @@ self.waypoint_longitude.set_text(str(record_list[default_id][2])) self.waypoint_name.set_text(str(record_list[default_id][6])) self.waypoint_description.set_text(str(record_list[default_id][4])) - self.waypoint_type.insert_text(0,str(record_list[default_id][7])) - self.waypoint_type.set_active(0) + self.set_waypoint_type(str(record_list[default_id][7])) if redrawmap == 1: self.waypointeditor.createHtml(default_waypoint) self.waypointeditor.drawMap() logging.debug("<<") + def set_waypoint_type(self, type): + x = 0 + tree_model = self.waypoint_type.get_model() + if tree_model is not None: + #iter = tree_model.get_iter_root() + for item in tree_model: + #if isinstance(item, gtk.TreeModelRow): + if item[0] == type: + self.waypoint_type.set_active(x) + return + x += 1 + self.waypoint_type.insert_text(0, type) + self.waypoint_type.set_active(0) + return + + def on_waypointTreeView_button_press(self, treeview, event): x = int(event.x) y = int(event.y) @@ -791,8 +806,8 @@ menuItems[numcolumn-1].set_active(visible) self.menublocking = 1 - def createWaypointEditor(self,WaypointEditor,waypoint): - self.waypointeditor = WaypointEditor(self.data_path, self.waypointvbox,waypoint) + def createWaypointEditor(self,WaypointEditor,waypoint, parent=None): + self.waypointeditor = WaypointEditor(self.data_path, self.waypointvbox,waypoint,parent) ###################### ## Lista de eventos ## Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-04-03 06:21:07 UTC (rev 542) +++ pytrainer/trunk/pytrainer/main.py 2010-04-04 10:30:47 UTC (rev 543) @@ -157,7 +157,7 @@ self.loadExtensions() self.windowmain.createGraphs(RecordGraph,DayGraph,WeekGraph, MonthGraph,YearGraph,HeartRateGraph) self.windowmain.createMap(Googlemaps,self.waypoint, self.gm3) - self.windowmain.createWaypointEditor(WaypointEditor,self.waypoint) + self.windowmain.createWaypointEditor(WaypointEditor,self.waypoint, parent=self) self.windowmain.on_calendar_selected(None) self.refreshMainSportList() self.windowmain.run() Modified: pytrainer/trunk/pytrainer/waypoint.py =================================================================== --- pytrainer/trunk/pytrainer/waypoint.py 2010-04-03 06:21:07 UTC (rev 542) +++ pytrainer/trunk/pytrainer/waypoint.py 2010-04-04 10:30:47 UTC (rev 543) @@ -36,6 +36,7 @@ def removeWaypoint(self,id_waypoint): logging.debug(">>") self.ddbb.connect() + logging.debug("Deleting id_waypoint=%s" %id_waypoint) self.ddbb.delete("waypoints", "id_waypoint=\"%s\"" %id_waypoint) self.ddbb.disconnect() logging.debug("<<") @@ -43,6 +44,7 @@ def updateWaypoint(self,id_waypoint,lat,lon,name,desc,sym): logging.debug(">>") self.ddbb.connect() + logging.debug("Updating waypoint id: %d with lat %s,lon %s,comment %s,name %s,sym %s" %(id_waypoint,lat,lon,desc,name,sym) ) self.ddbb.update("waypoints","lat,lon,comment,name,sym",[lat,lon,desc,name,sym]," id_waypoint=%d" %id_waypoint) self.ddbb.disconnect() logging.debug("<<") @@ -52,10 +54,12 @@ self.ddbb.connect() cells = "lat,lon,comment,name,sym" values = (lat,lon,comment,name,sym) + logging.debug("Adding waypoint with details lat %s,lon %s,comment %s,name %s,sym %s" % (lat,lon,comment,name,sym) ) self.ddbb.insert("waypoints",cells,values) id_waypoint = self.ddbb.lastRecord("waypoints") self.ddbb.disconnect() logging.debug("<<") + return id_waypoint 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-04-05 09:42:55
|
Revision: 549 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=549&view=rev Author: jblance Date: 2010-04-05 09:42:45 +0000 (Mon, 05 Apr 2010) Log Message: ----------- Fix to ensure correct order of DB records is returned Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowrecord.py pytrainer/trunk/pytrainer/record.py Modified: pytrainer/trunk/pytrainer/gui/windowrecord.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowrecord.py 2010-04-05 05:04:17 UTC (rev 548) +++ pytrainer/trunk/pytrainer/gui/windowrecord.py 2010-04-05 09:42:45 UTC (rev 549) @@ -261,6 +261,7 @@ def setValues(self,values): #(24, u'2009-12-26', 4, 23.48, u'9979', 0.0, 8.4716666232200009, 2210, u'', None, u'', 573.0, 562.0, 11.802745244400001, 5.0499999999999998, 7.04, 0.0, u'2009-12-25T19:41:48Z', u'2009-12-26 08:41:48+13:00') #(50, u'2006-10-13', 1, 25.0, u'5625', 0.0, 16.0, 0, u'', gpsfile, title,upositive,unegative,maxspeed|maxpace|pace|maxbeats + self.mode = "editrecord" self.id_record = values[0] self.setTime(values[4]) self.rcd_date.set_text(str(values[1])) @@ -287,7 +288,6 @@ buffer = self.rcd_comments.get_buffer() start,end = buffer.get_bounds() buffer.set_text(values[8]) - self.mode = "editrecord" def getSportPosition(self, sportID): """ Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2010-04-05 05:04:17 UTC (rev 548) +++ pytrainer/trunk/pytrainer/record.py 2010-04-05 09:42:45 UTC (rev 549) @@ -64,7 +64,8 @@ def editRecord(self,id_record,list_sport): logging.debug('>>') - record = self.ddbb.select("records", "*", "id_record=\"%s\"" %id_record) + #record = self.ddbb.select("records", "*", "id_record=\"%s\"" %id_record) + record = self.ddbb.select("records", "id_record, date, sport, distance, time, beats, average, calories, comments, gpslog, title, upositive, unegative, maxspeed, maxpace, pace, maxbeats, date_time_utc, date_time_local", "id_record=\"%s\"" %id_record) logging.debug('retrieving data from DB: '+str(record)) gpxfile = self.conf.getValue("gpxdir")+"/%d.gpx"%int(id_record) logging.debug('gpx file associated: '+gpxfile) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-04-08 07:29:20
|
Revision: 550 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=550&view=rev Author: jblance Date: 2010-04-08 07:29:13 +0000 (Thu, 08 Apr 2010) Log Message: ----------- Remove error on successful import as per David's suggestion Modified Paths: -------------- pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/record.py Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-04-05 09:42:45 UTC (rev 549) +++ pytrainer/trunk/pytrainer/main.py 2010-04-08 07:29:13 UTC (rev 550) @@ -63,7 +63,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.1_svn#548" + self.version ="1.7.1_svn#550" self.DB_version = 3 #Setup usage and permitted options Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2010-04-05 09:42:45 UTC (rev 549) +++ pytrainer/trunk/pytrainer/record.py 2010-04-08 07:29:13 UTC (rev 550) @@ -511,6 +511,7 @@ Add a record from a valid pytrainer type GPX file """ logging.debug('>>') + entry_id = None if not os.path.isfile(gpxFile): logging.error("Invalid file: " +gpxFile) else: @@ -523,8 +524,8 @@ logging.error("Entry not created for file %s" % gpxFile) else: logging.info("Entry %d has been added" % entry_id) - logging.debug('<<') + return entry_id #def importFromGTRNCTR(self,gtrnctrFile): #TODO remove """22.03.2008 - dgranda This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2010-04-09 17:32:22
|
Revision: 555 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=555&view=rev Author: dgranda Date: 2010-04-09 17:32:16 +0000 (Fri, 09 Apr 2010) Log Message: ----------- Added check for early detection of empty local configuration file Modified Paths: -------------- pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/profile.py Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-04-08 16:49:27 UTC (rev 554) +++ pytrainer/trunk/pytrainer/main.py 2010-04-09 17:32:16 UTC (rev 555) @@ -63,7 +63,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.1_svn#554" + self.version ="1.7.1_svn#555" self.DB_version = 3 #Setup usage and permitted options @@ -104,6 +104,7 @@ self.data_path = data_path self.date = Date() # Checking profile + #TODO configuration is first checked within profile, needs to be centralized - dgranda 2010.04.09 self.profile = Profile(self.data_path,self) self.profile.isProfileConfigured() Modified: pytrainer/trunk/pytrainer/profile.py =================================================================== --- pytrainer/trunk/pytrainer/profile.py 2010-04-08 16:49:27 UTC (rev 554) +++ pytrainer/trunk/pytrainer/profile.py 2010-04-09 17:32:16 UTC (rev 555) @@ -33,6 +33,13 @@ self.conf = checkConf() self.filename = self.conf.getValue("conffile") self.configuration = XMLParser(self.filename) + # Checks if configuration file is empty + if self.configuration.xmldoc is None: + logging.error("Seems no data available in local configuration file: "+self.filename+", please check") + logging.error("Fatal error, exiting") + exit(-3) + else: + logging.debug("Configuration retrieved: "+str(self.configuration.getOptions())) logging.debug("<<") def isProfileConfigured(self): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-04-14 08:33:18
|
Revision: 561 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=561&view=rev Author: jblance Date: 2010-04-14 08:33:10 +0000 (Wed, 14 Apr 2010) Log Message: ----------- Refactor of configuration and profile, so they are reused Modified Paths: -------------- pytrainer/trunk/pytrainer/extension.py pytrainer/trunk/pytrainer/extensions/googlemaps.py pytrainer/trunk/pytrainer/extensions/waypointeditor.py pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/gui/windowprofile.py pytrainer/trunk/pytrainer/lib/ddbb.py pytrainer/trunk/pytrainer/lib/gpx.py pytrainer/trunk/pytrainer/lib/heartrate.py pytrainer/trunk/pytrainer/lib/mysqlUtils.py pytrainer/trunk/pytrainer/lib/sqliteUtils.py pytrainer/trunk/pytrainer/lib/system.py pytrainer/trunk/pytrainer/lib/xmlUtils.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/plugins.py pytrainer/trunk/pytrainer/profile.py pytrainer/trunk/pytrainer/record.py pytrainer/trunk/pytrainer/waypoint.py Modified: pytrainer/trunk/pytrainer/extension.py =================================================================== --- pytrainer/trunk/pytrainer/extension.py 2010-04-11 19:26:32 UTC (rev 560) +++ pytrainer/trunk/pytrainer/extension.py 2010-04-14 08:33:10 UTC (rev 561) @@ -20,15 +20,16 @@ import logging from lib.xmlUtils import XMLParser -from lib.system import checkConf +#from lib.system import checkConf from gui.windowextensions import WindowExtensions class Extension: def __init__(self, data_path = None, parent = None): self.data_path=data_path - self.conf = checkConf() + #self.conf = checkConf() self.parent = parent + self.pytrainer_main = parent def getActiveExtensions(self): retorno = [] @@ -61,7 +62,7 @@ name = info.getValue("pytrainer-extension","name") description = info.getValue("pytrainer-extension","description") code = info.getValue("pytrainer-extension","extensioncode") - extensiondir = self.conf.getValue("extensiondir") + extensiondir = self.pytrainer_main.profile.extensiondir helpfile = pathExtension+"/"+info.getValue("pytrainer-extension","helpfile") type = info.getValue("pytrainer-extension","type") Modified: pytrainer/trunk/pytrainer/extensions/googlemaps.py =================================================================== --- pytrainer/trunk/pytrainer/extensions/googlemaps.py 2010-04-11 19:26:32 UTC (rev 560) +++ pytrainer/trunk/pytrainer/extensions/googlemaps.py 2010-04-14 08:33:10 UTC (rev 561) @@ -21,7 +21,7 @@ import re import logging -from pytrainer.lib.system import checkConf +#from pytrainer.lib.system import checkConf from pytrainer.lib.gpx import Gpx import pytrainer.lib.points as Points from pytrainer.lib.fileUtils import fileUtils @@ -31,15 +31,14 @@ def __init__(self, data_path = None, vbox = None, waypoint = None, pytrainer_main=None): logging.debug(">>") self.data_path = data_path - self.conf = checkConf() - gtkmozembed.set_profile_path("/tmp", "foobar") # http://faq.pygtk.org/index.py?req=show&file=faq19.018.htp + self.waypoint=waypoint + self.pytrainer_main = pytrainer_main + gtkmozembed.set_profile_path("/tmp", "foobar") # http://faq.pygtk.org/index.py?req=show&file=faq19.018.htp #TODO FIX??? self.moz = gtkmozembed.MozEmbed() vbox.pack_start(self.moz, True, True) vbox.show_all() - self.htmlfile = "%s/index.html" % (self.conf.getValue("tmpdir")) - self.waypoint=waypoint - self.pytrainer_main = pytrainer_main - self.record = Record() + self.htmlfile = "%s/index.html" % (self.pytrainer_main.profile.tmpdir) + logging.debug("<<") def drawMap(self,id_record): @@ -51,7 +50,7 @@ ''' logging.debug(">>") code = "googlemapsviewer" - extensiondir = self.conf.getValue("extensiondir")+"/"+code + extensiondir = self.pytrainer_main.profile.extensiondir+"/"+code if not os.path.isdir(extensiondir): os.mkdir(extensiondir) points = [] @@ -59,7 +58,7 @@ pointlist = [] polyline = [] - gpxfile = "%s/%s.gpx" % (self.conf.getValue("gpxdir"), id_record) + gpxfile = "%s/%s.gpx" % (self.pytrainer_main.profile.gpxdir, id_record) if os.path.isfile(gpxfile): gpx = Gpx(self.data_path,gpxfile) list_values = gpx.getTrackList() @@ -79,13 +78,13 @@ logging.debug("minlon: %s, maxlon: %s" % (minlon, maxlon)) points,levels = Points.encodePoints(pointlist) points = points.replace("\\","\\\\") - if self.pytrainer_main.gm3: + if self.pytrainer_main.startup_options.gm3: logging.debug("Using Google Maps version 3 API") #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) + laps = self.pytrainer_main.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) + info = self.pytrainer_main.record.getrecordInfo(id_record) timeHours = int(info[0][3]) / 3600 timeMin = (float(info[0][3]) / 3600.0 - timeHours) * 60 time = "%d%s %02d%s" % (timeHours, _("h"), timeMin, _("min")) @@ -218,7 +217,7 @@ except: #Error processing lap lat or lon #dont show this lap - print "Error processing lap "+ str(lapNumber) + " id: " + lap(lap[0]) + " (lat,lon) ( " + str(lap[6]) + "," +str (lap[7]) + ")" + print "Error processing lap "+ str(lapNumber) + " id: " + str(lap[0]) + " (lat,lon) ( " + str(lap[6]) + "," +str (lap[7]) + ")" content += ''' Modified: pytrainer/trunk/pytrainer/extensions/waypointeditor.py =================================================================== --- pytrainer/trunk/pytrainer/extensions/waypointeditor.py 2010-04-11 19:26:32 UTC (rev 560) +++ pytrainer/trunk/pytrainer/extensions/waypointeditor.py 2010-04-14 08:33:10 UTC (rev 561) @@ -20,7 +20,6 @@ import os import re -from pytrainer.lib.system import checkConf from pytrainer.extension import Extension from pytrainer.lib.fileUtils import fileUtils @@ -33,7 +32,6 @@ def __init__(self, data_path = None, vbox = None, waypoint=None, parent=None): logging.debug(">>") self.data_path = data_path - self.conf = checkConf() self.extension = Extension() self.moz = gtkmozembed.MozEmbed() self.moz.connect('title', self.handle_title_changed) @@ -85,7 +83,7 @@ def drawMap(self): logging.debug(">>") #self.createHtml() - tmpdir = self.conf.getValue("tmpdir") + tmpdir = self.pytrainer_main.profile.tmpdir htmlfile = tmpdir+"/waypointeditor.html" logging.debug("HTML file: "+str(htmlfile)) self.moz.load_url("file://"+htmlfile) @@ -93,7 +91,7 @@ def createHtml(self,default_waypoint=None): logging.debug(">>") - tmpdir = self.conf.getValue("tmpdir") + tmpdir = self.pytrainer_main.profile.tmpdir filename = tmpdir+"/waypointeditor.html" points = self.waypoint.getAllWaypoints() Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2010-04-11 19:26:32 UTC (rev 560) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-04-14 08:33:10 UTC (rev 561) @@ -29,7 +29,7 @@ from aboutdialog import About from pytrainer.lib.date import Date -from pytrainer.lib.system import checkConf +#from pytrainer.lib.system import checkConf from pytrainer.lib.xmlUtils import XMLParser from pytrainer.lib.gpx import Gpx from pytrainer.lib.unitsconversor import * @@ -42,6 +42,7 @@ gtk.about_dialog_set_url_hook(url_hook) self.version = version self.parent = parent + self.pytrainer_main = parent self.data_path = data_path glade_path="glade/pytrainer.glade" root = "window1" @@ -56,7 +57,7 @@ self.laps = None def new(self): - self.testimport = self.parent.testimport + self.testimport = self.pytrainer_main.startup_options.testimport self.menublocking = 0 self.selected_view="day" self.window1.set_title ("pyTrainer %s" % self.version) @@ -71,8 +72,8 @@ #create the columns for the waypoints treeview column_names=[_("id"),_("Waypoint")] self.create_treeview(self.waypointTreeView,column_names) - conf = checkConf() - self.fileconf = conf.getValue("confdir")+"/listviewmenu.xml" + #conf = checkConf() + self.fileconf = self.pytrainer_main.profile.confdir+"/listviewmenu.xml" if not os.path.isfile(self.fileconf): self._createXmlListView(self.fileconf) self.showAllRecordTreeViewColumns() @@ -176,10 +177,7 @@ def actualize_recordview(self,record_list): logging.debug(">>") - conf = checkConf() - filename = conf.getValue("conffile") - configuration = XMLParser(filename) - if configuration.getValue("pytraining","prf_us_system") == "True": + if self.pytrainer_main.profile.getValue("pytraining","prf_us_system") == "True": self.r_distance_unit.set_text(_("miles")) self.r_speed_unit.set_text(_("miles/h")) self.r_maxspeed_unit.set_text(_("miles/h")) @@ -227,7 +225,7 @@ recordTime = dateTime.strftime("%X") recordDateTimeOffset = dateTime.strftime("%z") - if configuration.getValue("pytraining","prf_us_system") == "True": + if self.pytrainer_main.profile.getValue("pytraining","prf_us_system") == "True": self.record_distance.set_text("%0.2f" %km2miles(distance)) self.record_upositive.set_text("%0.2f" %m2feet(upositive)) self.record_unegative.set_text("%0.2f" %m2feet(unegative)) @@ -314,10 +312,7 @@ def actualize_dayview(self,record_list): logging.debug(">>") - conf = checkConf() - filename = conf.getValue("conffile") - configuration = XMLParser(filename) - if configuration.getValue("pytraining","prf_us_system") == "True": + if self.pytrainer_main.profile.getValue("pytraining","prf_us_system") == "True": self.d_distance_unit.set_text(_("miles")) self.d_speed_unit.set_text(_("miles/h")) self.d_maxspeed_unit.set_text(_("miles/h")) @@ -353,7 +348,7 @@ if record[10] > maxbeats: maxbeats = self.parseFloat(record[10]) - if configuration.getValue("pytraining","prf_us_system") == "True": + if self.pytrainer_main.profile.getValue("pytraining","prf_us_system") == "True": distance = km2miles(distance) maxspeed = km2miles(maxspeed) @@ -418,10 +413,7 @@ maxpace = "0.00" maxbeats = 0 - conf = checkConf() - filename = conf.getValue("conffile") - configuration = XMLParser(filename) - if configuration.getValue("pytraining","prf_us_system") == "True": + if self.pytrainer_main.profile.getValue("pytraining","prf_us_system") == "True": self.w_distance_unit.set_text(_("miles")) self.w_speed_unit.set_text(_("miles/h")) self.w_maxspeed_unit.set_text(_("miles/h")) @@ -449,7 +441,7 @@ if record[8] > maxbeats: maxbeats = self.parseFloat(record[8]) - if configuration.getValue("pytraining","prf_us_system") == "True": + if self.pytrainer_main.profile.getValue("pytraining","prf_us_system") == "True": km = km2miles(km) maxspeed = km2miles(maxspeed) @@ -496,10 +488,7 @@ maxpace = "0.00" maxbeats = 0 - conf = checkConf() - filename = conf.getValue("conffile") - configuration = XMLParser(filename) - if configuration.getValue("pytraining","prf_us_system") == "True": + if self.pytrainer_main.profile.getValue("pytraining","prf_us_system") == "True": self.m_distance_unit.set_text(_("miles")) self.m_speed_unit.set_text(_("miles/h")) self.m_maxspeed_unit.set_text(_("miles/h")) @@ -527,7 +516,7 @@ if record[8] > maxbeats: maxbeats = self.parseFloat(record[8]) - if configuration.getValue("pytraining","prf_us_system") == "True": + if self.pytrainer_main.profile.getValue("pytraining","prf_us_system") == "True": km = km2miles(km) maxspeed = km2miles(maxspeed) Modified: pytrainer/trunk/pytrainer/gui/windowprofile.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowprofile.py 2010-04-11 19:26:32 UTC (rev 560) +++ pytrainer/trunk/pytrainer/gui/windowprofile.py 2010-04-14 08:33:10 UTC (rev 561) @@ -159,99 +159,90 @@ def init_params_tab(self): #Show log level - if self.pytrainer_main.log_level == logging.ERROR: + if self.pytrainer_main.startup_options.log_level == logging.ERROR: self.comboboxLogLevel.set_active(0) - elif self.pytrainer_main.log_level == logging.WARNING: + elif self.pytrainer_main.startup_options.log_level == logging.WARNING: self.comboboxLogLevel.set_active(1) - elif self.pytrainer_main.log_level == logging.INFO: + elif self.pytrainer_main.startup_options.log_level == logging.INFO: self.comboboxLogLevel.set_active(2) - elif self.pytrainer_main.log_level == logging.DEBUG: + elif self.pytrainer_main.startup_options.log_level == logging.DEBUG: self.comboboxLogLevel.set_active(3) else: self.comboboxLogLevel.set_active(0) print "Unknown logging level specified" #Show if validation requested - if self.pytrainer_main.validate: + if self.pytrainer_main.startup_options.validate: self.checkbuttonValidate.set_active(True) else: self.checkbuttonValidate.set_active(False) #Show if database and config check requested - if self.pytrainer_main.check: + if self.pytrainer_main.startup_options.check: self.checkbuttonCheck.set_active(True) else: self.checkbuttonCheck.set_active(False) #Show if using Googlemaps API v3 - if self.pytrainer_main.gm3: + if self.pytrainer_main.startup_options.gm3: self.checkbuttonGM3.set_active(True) else: self.checkbuttonGM3.set_active(False) #Show if unified import activated - if self.pytrainer_main.testimport: + if self.pytrainer_main.startup_options.testimport: self.checkbuttonUnifiedImport.set_active(True) else: self.checkbuttonUnifiedImport.set_active(False) - #TODO Allow changes to settings!!! - #Disable editing as processing of changes not yet implemented - #self.comboboxLogLevel.set_sensitive(0) - #logging.getLogger('').setLevel(self.log_level) - #self.checkbuttonValidate.set_sensitive(0) - #self.checkbuttonCheck.set_sensitive(0) - #self.checkbuttonGM3.set_sensitive(0) - #self.checkbuttonUnifiedImport.set_sensitive(0) - def on_comboboxLogLevel_changed(self, widget): active = self.comboboxLogLevel.get_active() if active == 1: logging.debug("Setting log level to WARNING") - self.pytrainer_main.log_level = logging.WARNING + self.pytrainer_main.startup_options.log_level = logging.WARNING elif active == 2: logging.debug("Setting log level to INFO") - self.pytrainer_main.log_level = logging.INFO + self.pytrainer_main.startup_options.log_level = logging.INFO elif active == 3: logging.debug("Setting log level to DEBUG") - self.pytrainer_main.log_level = logging.DEBUG + self.pytrainer_main.startup_options.log_level = logging.DEBUG else: logging.debug("Setting log level to ERROR") - self.pytrainer_main.log_level = logging.ERROR - self.pytrainer_main.set_logging_level(self.pytrainer_main.log_level) + self.pytrainer_main.startup_options.log_level = logging.ERROR + self.pytrainer_main.set_logging_level(self.pytrainer_main.startup_options.log_level) def on_checkbuttonValidate_toggled(self, widget): if self.checkbuttonValidate.get_active(): logging.debug( "Validate activated") - self.pytrainer_main.validate = True + self.pytrainer_main.startup_options.validate = True else: logging.debug("Validate deactivated") - self.pytrainer_main.validate = False + self.pytrainer_main.startup_options.validate = False def on_checkbuttonCheck_toggled(self, widget): if self.checkbuttonCheck.get_active(): logging.debug( "Check activated") - if self.pytrainer_main.check is not True: + if self.pytrainer_main.startup_options.check is not True: #Need to do sanitycheck logging.debug("Need to do sanitycheck") self.pytrainer_main.sanityCheck() - self.pytrainer_main.check = True + self.pytrainer_main.startup_options.check = True else: logging.debug("Check deactivated") - self.pytrainer_main.check = False + self.pytrainer_main.startup_options.check = False def on_checkbuttonGM3_toggled(self, widget): if self.checkbuttonGM3.get_active(): logging.debug("GM3 activated") - self.pytrainer_main.gm3 = True + self.pytrainer_main.startup_options.gm3 = True else: logging.debug("GM3 deactivated") - self.pytrainer_main.gm3 = False + self.pytrainer_main.startup_options.gm3 = False def on_checkbuttonUnifiedImport_toggled(self, widget): if self.checkbuttonUnifiedImport.get_active(): logging.debug("Unified Import activated") - if self.pytrainer_main.testimport is not True: + if self.pytrainer_main.startup_options.testimport is not True: #Need to enable unified import logging.debug("Need to enable unified import") self.pytrainer_main.windowmain.set_unified_import(True) @@ -260,7 +251,7 @@ logging.debug("No change to unified import") else: logging.debug("Unified Import deactivated") - if self.pytrainer_main.testimport is True: + if self.pytrainer_main.startup_options.testimport is True: logging.debug("Need to deactivate unified import") self.pytrainer_main.windowmain.set_unified_import(False) else: Modified: pytrainer/trunk/pytrainer/lib/ddbb.py =================================================================== --- pytrainer/trunk/pytrainer/lib/ddbb.py 2010-04-11 19:26:32 UTC (rev 560) +++ pytrainer/trunk/pytrainer/lib/ddbb.py 2010-04-14 08:33:10 UTC (rev 561) @@ -22,26 +22,28 @@ import logging import traceback import commands, os -from system import checkConf +#from system import checkConf from pytrainer.lib.date import Date class DDBB: - def __init__(self, configuration): + def __init__(self, configuration, pytrainer_main=None): + self.pytrainer_main = pytrainer_main + self.configuration = configuration self.ddbb_type = configuration.getValue("pytraining","prf_ddbb") if self.ddbb_type == "mysql": #TODO no longer supported? from mysqlUtils import Sql else: from sqliteUtils import Sql - self.conf = checkConf() - self.confdir = self.conf.getValue("confdir") + #self.conf = checkConf() + self.confdir = configuration.confdir self.ddbb_path = "%s/pytrainer.ddbb" %self.confdir ddbb_host = configuration.getValue("pytraining","prf_ddbbhost") ddbb = configuration.getValue("pytraining","prf_ddbbname") ddbb_user = configuration.getValue("pytraining","prf_ddbbuser") ddbb_pass = configuration.getValue("pytraining","prf_ddbbpass") - self.ddbbObject = Sql(ddbb_host,ddbb,ddbb_user,ddbb_pass) + self.ddbbObject = Sql(ddbb_host,ddbb,ddbb_user,ddbb_pass,configuration) def connect(self): #si devolvemos 1 ha ido todo con exito : return 1 if all successful @@ -196,7 +198,7 @@ logging.debug("Found %d records in DB without date_time_local field populated" % (len(listOfRecords) ) ) for record in listOfRecords: try: - gpxfile = self.conf.getValue("gpxdir")+"/%s.gpx"%(record[0]) + gpxfile = configuration.gpxdir+"/%s.gpx"%(record[0]) dateFromUTC = Date().getDateTime(record[2]) if os.path.isfile(gpxfile) : #GPX file exists for this record - probably not a manual record date_time_local = str(dateFromUTC[1]) Modified: pytrainer/trunk/pytrainer/lib/gpx.py =================================================================== --- pytrainer/trunk/pytrainer/lib/gpx.py 2010-04-11 19:26:32 UTC (rev 560) +++ pytrainer/trunk/pytrainer/lib/gpx.py 2010-04-14 08:33:10 UTC (rev 561) @@ -21,12 +21,10 @@ import math import re import os -from system import checkConf import time from datetime import datetime import logging -from xmlUtils import XMLParser from lxml import etree from pytrainer.lib.date import Date @@ -58,7 +56,6 @@ self.filename = filename self.trkname = trkname logging.debug(str(data_path)+"|"+str(filename)+"|"+str(trkname)) - self.conf = checkConf() self.total_dist = 0 self.total_time = 0 self.upositive = 0 Modified: pytrainer/trunk/pytrainer/lib/heartrate.py =================================================================== --- pytrainer/trunk/pytrainer/lib/heartrate.py 2010-04-11 19:26:32 UTC (rev 560) +++ pytrainer/trunk/pytrainer/lib/heartrate.py 2010-04-14 08:33:10 UTC (rev 561) @@ -16,7 +16,6 @@ #along with this program; if not, write to the Free Software #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -from system import checkConf from xmlUtils import XMLParser def getZones(): Modified: pytrainer/trunk/pytrainer/lib/mysqlUtils.py =================================================================== --- pytrainer/trunk/pytrainer/lib/mysqlUtils.py 2010-04-11 19:26:32 UTC (rev 560) +++ pytrainer/trunk/pytrainer/lib/mysqlUtils.py 2010-04-14 08:33:10 UTC (rev 561) @@ -24,7 +24,7 @@ # Fixed some issues with MySql tables creation (email from Jonas Liljenfeldt) class Sql: - def __init__(self,host=None, ddbb = None, user = None, password = None): + def __init__(self,host=None, ddbb = None, user = None, password = None, configuration = None): self.ddbb_user = user self.ddbb_pass = password self.ddbb_host = host Modified: pytrainer/trunk/pytrainer/lib/sqliteUtils.py =================================================================== --- pytrainer/trunk/pytrainer/lib/sqliteUtils.py 2010-04-11 19:26:32 UTC (rev 560) +++ pytrainer/trunk/pytrainer/lib/sqliteUtils.py 2010-04-14 08:33:10 UTC (rev 561) @@ -26,14 +26,13 @@ logging.error('Not able to find sqlite2 module (new in python 2.5)') from pysqlite2 import dbapi2 as sqlite logging.info('Using pysqlite2 module to access DB. Think about upgrading to python 2.5!') -from system import checkConf + from logs import Log class Sql: - def __init__(self,host=None, ddbb = None, user = None, password = None): + def __init__(self,host=None, ddbb = None, user = None, password = None, configuration = None): self.db = None - conf = checkConf() - confdir = conf.getValue("confdir") + confdir = configuration.confdir self.ddbb = "%s/pytrainer.ddbb" %confdir self.log = Log() Modified: pytrainer/trunk/pytrainer/lib/system.py =================================================================== --- pytrainer/trunk/pytrainer/lib/system.py 2010-04-11 19:26:32 UTC (rev 560) +++ pytrainer/trunk/pytrainer/lib/system.py 2010-04-14 08:33:10 UTC (rev 561) @@ -21,82 +21,5 @@ class checkConf: def __init__(self): - self.home = None - self.tmpdir = None - self.confdir = None - self.conffile = None - self.gpxdir = None - self.extensiondir = None - self.plugindir = None - - self._setHome() - self._setConfFiles() - self._setTempDir() - self._setExtensionDir() - self._setPluginDir() - self._setGpxDir() - - def _setHome(self): - if sys.platform == "linux2": - variable = 'HOME' - elif sys.platform == "win32": - variable = 'USERPROFILE' - else: - print "Unsupported sys.platform: %s." % sys.platform - sys.exit(1) - self.home = os.environ[variable] - - def _setTempDir(self): - self.tmpdir = self.confdir+"/tmp" - if not os.path.isdir(self.tmpdir): - os.mkdir(self.tmpdir) - - def clearTempDir(self): - """Function to clear out the tmp directory that pytrainer uses - will only remove files - """ - if not os.path.isdir(self.tmpdir): - return - else: - files = os.listdir(self.tmpdir) - for name in files: - fullname = (os.path.join(self.tmpdir, name)) - if os.path.isfile(fullname): - os.remove(os.path.join(self.tmpdir, name)) - - def _setConfFiles(self): - if sys.platform == "win32": - self.confdir = self.home+"/pytrainer" - elif sys.platform == "linux2": - self.confdir = self.home+"/.pytrainer" - else: - print "Unsupported sys.platform: %s." % sys.platform - sys.exit(1) - self.conffile = self.confdir+"/conf.xml" - if not os.path.isdir(self.confdir): - os.mkdir(self.confdir) - - def _setGpxDir(self): - self.gpxdir = self.confdir+"/gpx" - if not os.path.isdir(self.gpxdir): - os.mkdir(self.gpxdir) - - def _setExtensionDir(self): - self.extensiondir = self.confdir+"/extensions" - if not os.path.isdir(self.extensiondir): - os.mkdir(self.extensiondir) - - def _setPluginDir(self): - self.plugindir = self.confdir+"/plugins" - if not os.path.isdir(self.plugindir): - os.mkdir(self.plugindir) - - def getConfFile(self): - if not os.path.isfile(self.conffile): - return False - else: - return self.conffile - - def getValue(self,variable): - method = getattr(self, variable) - return method + print "ERROR system.py not used anymore" + raise Exception Modified: pytrainer/trunk/pytrainer/lib/xmlUtils.py =================================================================== --- pytrainer/trunk/pytrainer/lib/xmlUtils.py 2010-04-11 19:26:32 UTC (rev 560) +++ pytrainer/trunk/pytrainer/lib/xmlUtils.py 2010-04-14 08:33:10 UTC (rev 561) @@ -38,6 +38,7 @@ self._load() def _load(self): + logging.debug("Loading %s" % self.filename) try: self.xmldoc = xml.dom.minidom.parse(self.filename) except: @@ -48,7 +49,7 @@ self.createXMLFile(self,"pytraining",list_item) def getOptions(self): - self._load() + #self._load() root = self.xmldoc.getElementsByTagName("pytraining")[0] list_options = {} list_keys = root.attributes.keys() @@ -74,7 +75,7 @@ self._saveFile(content) def getValue(self,tagname,variable): - self._load() + #self._load() try: root = self.xmldoc.getElementsByTagName(tagname)[0] value = root.attributes[variable].value @@ -83,7 +84,7 @@ return value def getAllValues(self,tagname): - self._load() + #self._load() root = self.xmldoc.getElementsByTagName(tagname) retorno = [] for i in root: @@ -108,79 +109,3 @@ out = open(self.filename, 'w') out.write(xmlcontent) out.close() - - def shortFromGPS(self, gtrnctrFile, getSport=True): - """23.03.2008 - dgranda - Retrieves sport, date and start time from each entry coming from GPS - args: - gtrnctrFile: file with data from GPS file (garmin format) - getSport: indicates if sport info should be added - returns: list with dictionaries (just a list in case of sport is not retrieved) SPORT|DATE_STARTTIME""" - logging.debug('>>') - listTracksGPS = [] - # http://gnosis.cx/publish/programming/parser-benchmarks.png - # Using ElementTree -> http://effbot.org/zone/element-index.htm - # cElementTree -> http://mike.hostetlerhome.com/present_files/pyxml.html - logging.debug('parsing '+gtrnctrFile) - if getSport is True: - logging.debug('Retrieving sport info') - else: - logging.debug('Discarding sport info') - listTracksGPS = [] - tree = xml.etree.cElementTree.parse(gtrnctrFile).getroot() - history = tree.findall(".//History") - for sport in history: - #print "Element: "+sport.tag - if sport.getchildren(): - for child in sport: - #print "\tSport found: "+child.tag - if child.getchildren(): - for entry in child: - logging.debug("Entry found: "+entry.tag) - tracks = entry.findall(".//Track") - num_tracks = len(tracks) - #print 'Tracks found: '+str(num_tracks) - if num_tracks>0: - for track in tracks: - # we are looking for date and time for the first trackpoint - date_time = track.findtext(".//Time") #returns first instance found - track_sport = entry.tag - logging.info('Found: '+track_sport+' | '+date_time) - if getSport is True: - listTracksGPS.append((track_sport,date_time)) - else: - listTracksGPS.append(date_time) - else: - logging.debug("No entry found for "+child.tag) - logging.debug('Retrieved info: '+str(listTracksGPS)) - logging.debug('<<') - return listTracksGPS - - - def getTrackFromDates(self, source_file , entry , isGpx): - """23.03.2008 - dgranda - Retrieves track given sport, date and start time - args: - - source_file: absolute path to source file - - entry: dictionary with SPORT|DATE_START_TIME - - isGpx: 1 if source file is GPX, 0 if garmin format - returns: path to selected entry file""" - logging.debug('>>') - selectedEntry = "" - # 23.03.2008 Only source from garmin files are supported right now (isGpx = 0) - # this is intended to work in the future with variables instead of hardcoded field names - #dom = xml.dom.minidom.parse(source_file) - trks = self.xmldoc.getElementsByTagName("Track") - for trk in trks: - trkpoints = trk.getElementsByTagName("Trackpoint") - # we just need to check first one's date - date_time = trkpoints[0].getElementsByTagName("Time")[0].firstChild.data - if date_time == entry[1]: - #this is the track we are looking for - selectedEntry = "/tmp/track"+date_time - logging.debug('Writing selected track to '+selectedEntry) - f = open(selectedEntry,'w') - f.write(trk.toxml()) - f.close() - logging.debug('<<') - return selectedEntry Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-04-11 19:26:32 UTC (rev 560) +++ pytrainer/trunk/pytrainer/main.py 2010-04-14 08:33:10 UTC (rev 561) @@ -48,88 +48,45 @@ from extensions.googlemaps import Googlemaps from extensions.waypointeditor import WaypointEditor -#from gui.windowextensions import WindowExtensions from gui.windowimportdata import WindowImportdata from gui.windowmain import Main from gui.warning import Warning from lib.date import Date from lib.gpx import Gpx -#from lib.soapUtils import webService from lib.ddbb import DDBB -from lib.xmlUtils import XMLParser -from lib.system import checkConf from lib.heartrate import * class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2" + self.version ="1.7.2_svn#561" 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) - + #Process command line options + self.startup_options = self.get_options() + #Setup logging + self.set_logging(self.startup_options.log_level) logging.debug('>>') self.data_path = data_path self.date = Date() + self.ddbb = None # Checking profile - #TODO configuration is first checked within profile, needs to be centralized - dgranda 2010.04.09 + logging.debug('Checking configuration and profile...') self.profile = Profile(self.data_path,self) - self.profile.isProfileConfigured() - self.windowmain = None - logging.debug('checking configuration...') - 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) #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": + if self.profile.getValue("pytraining","prf_us_system") == "True": #TODO perhaps move to use dict? self.prf_us_system = True else: self.prf_us_system = False - self.ddbb = DDBB(self.configuration) #TODO set this up so other modules can reference this and not have to duplicate this + self.ddbb = DDBB(self.profile) #TODO set this up so other modules can reference this and not have to duplicate this logging.debug('connecting to DDBB') self.ddbb.connect() #Get user's DB version - currentDB_version = self.configuration.getValue("pytraining","DB_version") + currentDB_version = self.profile.getValue("pytraining","DB_version") logging.debug("Current DB version: "+str(currentDB_version)) # DB check can be triggered either via new version (mandatory) or as runtime parameter (--check) - if self.check: # User requested check + if self.startup_options.check: # User requested check self.sanityCheck() elif currentDB_version is None: # No stored DB version - check DB etc self.sanityCheck() @@ -137,23 +94,14 @@ self.sanityCheck() 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.windowmain = Main(data_path,self,self.version, gpxDir=self.profile.gpxdir) 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() - self.waypoint = Waypoint(data_path,self) self.extension = Extension(data_path, self) self.plugins = Plugins(data_path, self) - self.importdata = Importdata(data_path, self, self.configuration) + self.importdata = Importdata(data_path, self, self.profile) self.loadPlugins() self.loadExtensions() self.windowmain.createGraphs(RecordGraph,DayGraph,WeekGraph, MonthGraph,YearGraph,HeartRateGraph) @@ -163,8 +111,44 @@ self.refreshMainSportList() self.windowmain.run() logging.debug('<<') + + + def get_options(self): + ''' + Define usage and accepted options for command line startup - def set_logging_level(self,level): + returns: options - dict with option: value pairs + ''' + 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() + return options + + def set_logging(self,level): + '''Setup rotating log file with customized format''' + PATH = os.environ['HOME']+"/.pytrainer" + if not os.path.exists(PATH): + os.mkdir(PATH) + LOG_FILENAME = PATH + "/log.out" + 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) + self.set_logging_level(self.startup_options.log_level) + + def set_logging_level(self, level): + '''Set level of information written to log''' logging.debug("Setting logger to level: "+ str(level)) logging.getLogger('').setLevel(level) @@ -301,7 +285,7 @@ gpx_laps = None if iter: id_record = selected.get_value(iter,0) - gpxfile = self.conf.getValue("gpxdir")+"/%s.gpx" %id_record + gpxfile = self.profile.gpxdir+"/%s.gpx" %id_record if os.path.isfile(gpxfile): gpx = Gpx(self.data_path,gpxfile) gpx_tracklist = gpx.getTrackList() @@ -318,15 +302,13 @@ if iter: id_record = selected.get_value(iter,0) record_list = self.record.getrecordInfo(id_record) - gpxfile = self.conf.getValue("gpxdir")+"/%s.gpx" %id_record + gpxfile = self.profile.gpxdir+"/%s.gpx" %id_record if os.path.isfile(gpxfile): gpx = Gpx(self.data_path,gpxfile) gpx_tracklist = gpx.getTrackList() self.windowmain.actualize_heartrategraph(gpx_tracklist) - zones = getZones() - filename = self.conf.getValue("conffile") - configuration = XMLParser(filename) - karvonen_method = configuration.getValue("pytraining","prf_hrzones_karvonen") + zones = getZones() #TODO Huh, what is supposed to happen here??? + karvonen_method = self.profile.configuration.getValue("pytraining","prf_hrzones_karvonen") self.windowmain.actualize_hrview(record_list,zones,karvonen_method) logging.debug('<<') @@ -496,8 +478,8 @@ logging.debug('>>') logging.info('Checking database integrity') self.ddbb.checkDBIntegrity() - logging.info('Checking configuration file integrity') - self.profile.checkProfile() + #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)) + self.profile.configuration.setValue("pytraining","DB_version", str(self.DB_version)) logging.debug('<<') Modified: pytrainer/trunk/pytrainer/plugins.py =================================================================== --- pytrainer/trunk/pytrainer/plugins.py 2010-04-11 19:26:32 UTC (rev 560) +++ pytrainer/trunk/pytrainer/plugins.py 2010-04-14 08:33:10 UTC (rev 561) @@ -21,15 +21,15 @@ import logging from lib.xmlUtils import XMLParser -from lib.system import checkConf +#from lib.system import checkConf from gui.windowplugins import WindowPlugins class Plugins: def __init__(self, data_path = None, parent = None): self.data_path=data_path - self.conf = checkConf() - self.parent = parent + #self.conf = checkConf() + self.pytrainer_main = parent def getActivePlugins(self): retorno = [] @@ -61,35 +61,13 @@ pluginMain = getattr(module, plugin_classname) logging.debug('<<') #Only validate files if enabled at startup - if self.parent.validate: + if self.pytrainer_main.startup_options.validate: validate_inputfiles=True print "validating plugin input files enabled" else: validate_inputfiles=False return pluginMain(self, validate_inputfiles) - - - #def runPlugin(self,pathPlugin): - """ - logging.debug('>>') - info = XMLParser(pathPlugin+"/conf.xml") - bin = info.getValue("pytrainer-plugin","executable") - binary = pathPlugin+"/"+bin - params = "" - for opt in self.getPluginConfParams(pathPlugin): - if opt[0]!="status": - params += " --%s %s" %(opt[0],opt[1]) - logging.debug('Executing '+binary+' '+params) - gpxfile = os.popen("%s %s" %(binary,params)).read() - gpxfile = gpxfile.replace("\n","") - gpxfile = gpxfile.replace("\r","") - logging.debug('<<') - if gpxfile == "0": - return False - return gpxfile""" - - def managePlugins(self): pluginsList = self.getPluginsList() windowplugins = WindowPlugins(self.data_path, self) @@ -114,7 +92,7 @@ name = info.getValue("pytrainer-plugin","name") description = info.getValue("pytrainer-plugin","description") code = info.getValue("pytrainer-plugin","plugincode") - plugindir = self.conf.getValue("plugindir") + plugindir = self.pytrainer_main.profile.plugindir if not os.path.isfile(plugindir+"/"+code+"/conf.xml"): status = 0 else: Modified: pytrainer/trunk/pytrainer/profile.py =================================================================== --- pytrainer/trunk/pytrainer/profile.py 2010-04-11 19:26:32 UTC (rev 560) +++ pytrainer/trunk/pytrainer/profile.py 2010-04-14 08:33:10 UTC (rev 561) @@ -17,128 +17,201 @@ #along with this program; if not, write to the Free Software #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -import os +import os, sys import logging -from lib.system import checkConf -from lib.xmlUtils import XMLParser +#from lib.system import checkConf +#from lib.xmlUtils import XMLParser +from lxml import etree from lib.ddbb import DDBB class Profile: def __init__(self, data_path = None, parent = None): logging.debug(">>") - self.parent = parent - self.version = None + self.pytrainer_main = parent self.data_path = data_path - self.conf = checkConf() - self.filename = self.conf.getValue("conffile") - self.configuration = XMLParser(self.filename) - # Checks if configuration file is empty - if self.configuration.xmldoc is None: - logging.error("Seems no data available in local configuration file: "+self.filename+", please check") - logging.error("Fatal error, exiting") - exit(-3) - else: - logging.debug("Configuration retrieved: "+str(self.configuration.getOptions())) + self.xml_tree = None + self.home = None + self.tmpdir = None + self.confdir = None + self.conffile = None + self.gpxdir = None + self.extensiondir = None + self.plugindir = None + #Set configuration parameters - old system.checkConf() + self._setHome() + self._setConfFiles() + self._setTempDir() + self._setExtensionDir() + self._setPluginDir() + self._setGpxDir() + + #Clear temp dir + logging.debug("clearing tmp directory %s" % self.tmpdir) + self._clearTempDir() + + #Profile Options and Defaults + self.profile_options = { + "prf_name":"default", + "prf_gender":"", + "prf_weight":"", + "prf_height":"", + "prf_age":"", + "prf_ddbb":"sqlite", + "prf_ddbbhost":"", + "prf_ddbbname":"", + "prf_ddbbuser":"", + "prf_ddbbpass":"", + "version":"0.0", + "DB_version":"0", + "prf_us_system":"False", + "prf_hrzones_karvonen":"False", + "prf_maxhr":"", + "prf_minhr":"", + "auto_launch_file_selection":"False", + "import_default_tab":"0", + } + + #Parse pytrainer configuration file + self.config_file = self.conffile + self.configuration = self._parse_config_file(self.config_file) + logging.debug("Configuration retrieved: "+str(self.configuration)) + self.pytrainer_main.ddbb = DDBB(self, pytrainer_main=self.pytrainer_main) logging.debug("<<") - def isProfileConfigured(self): - logging.debug(">>") - if self.conf.getConfFile(): - #logging.debug("Profile found. ToDo: check integrity") - #self.checkProfile() - self.configuration = XMLParser(self.filename) - self.ddbb = DDBB(self.configuration) + def _setHome(self): + if sys.platform == "linux2": + variable = 'HOME' + elif sys.platform == "win32": + variable = 'USERPROFILE' else: - logging.debug("No profile found. Creating default one") - self.createDefaultConf() - logging.debug("<<") - return True + print "Unsupported sys.platform: %s." % sys.platform + sys.exit(1) + self.home = os.environ[variable] + + def _setTempDir(self): + self.tmpdir = self.confdir+"/tmp" + if not os.path.isdir(self.tmpdir): + os.mkdir(self.tmpdir) - def createDefaultConf(self): - logging.debug(">>") - conf_options = [ - ("prf_name","default"), - ("prf_gender",""), - ("prf_weight",""), - ("prf_height",""), - ("prf_age",""), - ("prf_ddbb","sqlite"), - ("prf_ddbbhost",""), - ("prf_ddbbname",""), - ("prf_ddbbuser",""), - ("prf_ddbbpass",""), - ("version","0.0"), - ("prf_us_system","False")] - self.setProfile(conf_options) - logging.debug("<<") + def _clearTempDir(self): + """Function to clear out the tmp directory that pytrainer uses + will only remove files + """ + if not os.path.isdir(self.tmpdir): + return + else: + files = os.listdir(self.tmpdir) + for name in files: + fullname = (os.path.join(self.tmpdir, name)) + if os.path.isfile(fullname): + os.remove(os.path.join(self.tmpdir, name)) + + def _setConfFiles(self): + if sys.platform == "win32": + self.confdir = self.home+"/pytrainer" + elif sys.platform == "linux2": + self.confdir = self.home+"/.pytrainer" + else: + print "Unsupported sys.platform: %s." % sys.platform + sys.exit(1) + self.conffile = self.confdir+"/conf.xml" + if not os.path.isdir(self.confdir): + os.mkdir(self.confdir) + + def _setGpxDir(self): + self.gpxdir = self.confdir+"/gpx" + if not os.path.isdir(self.gpxdir): + os.mkdir(self.gpxdir) + + def _setExtensionDir(self): + self.extensiondir = self.confdir+"/extensions" + if not os.path.isdir(self.extensiondir): + os.mkdir(self.extensiondir) + + def _setPluginDir(self): + self.plugindir = self.confdir+"/plugins" + if not os.path.isdir(self.plugindir): + os.mkdir(self.plugindir) - def setVersion(self,version): - logging.debug("--") - self.version = version + def getConfFile(self): + if not os.path.isfile(self.conffile): + return False + else: + return self.conffile - def setProfile(self,list_options): + def _parse_config_file(self, config_file): + ''' + Parse the xml configuration file and convert to a dict + + returns: dict with option as key + ''' + if config_file is None: + logging.error("Configuration file value not set") + elif not os.path.isfile(config_file): + logging.error("Configuration '%s' file does not exist" % config_file) + logging.info("No profile found. Creating default one") + self.setProfile(self.profile_options) + else: + logging.debug("Attempting to parse content from "+ config_file) + try: + self.xml_tree = etree.ElementTree(file=config_file) + #TODO check here for empty file.... + # Checks if configuration file is empty + #if self.configuration.xmldoc is None: + # logging.error("Seems no data available in local configuration file: "+self.filename+", please check") + # logging.error("Fatal error, exiting") + # exit(-3) + #Have a populated xml tree, get pytraining node (root) and convert it to a dict + pytraining_tag = self.xml_tree.getroot() + config = {} + config_needs_update = False + for key, default in self.profile_options.items(): + value = pytraining_tag.get(key) + #If property is not found, set it to the default + if value is None: + config_needs_update = True + value = default + config[key] = value + #Added a property, so update config + if config_needs_update: + self.setProfile(config) + return config + except Exception as e: + logging.error("Error parsing file: %s. Exiting" % config_file) + logging.error(str(e)) + logging.error("Fatal error, exiting") + exit(-3) + + def getValue(self, tag, variable): + if tag != "pytraining": + print "ERROR - pytraining is the only profile tag supported" + return None + elif not self.configuration.has_key(variable): + return None + return self.configuration[variable] + + def setValue(self, tag, variable, value): logging.debug(">>") - logging.debug("Retrieving data from "+ self.filename) - self.configuration = XMLParser(self.filename) - #list_options.append(("version",self.version)) - if not os.path.isfile(self.filename): - self.configuration.createXMLFile("pytraining",list_options) - for option in list_options: - logging.debug("Adding "+option[0]+"|"+option[1]) - self.configuration.setValue("pytraining",option[0],option[1]) - self.ddbb = DDBB(self.configuration) + if tag != "pytraining": + print "ERROR - pytraining is the only profile tag supported" + self.xml_tree.getroot().set(variable, value) logging.debug("<<") - def checkProfile(self): - """ 31.07.2008 - dgranda - Checks if all needed properties are in the configuration file - If not, property is created with default value - args: none - returns: none""" + def setProfile(self,list_options): logging.debug(">>") - logging.debug("Retrieving data from "+ self.filename) - self.configuration = XMLParser(self.filename) - currentList = self.configuration.getOptions() - currentListKeys = currentList.keys() - #logging.debug("Values retrieved from conf file: "+ str(currentList)) - logging.debug("Current keys: "+ str(currentListKeys)) - defaultList = [ - ("prf_name","default"), - ("prf_gender",""), - ("prf_weight",""), - ("prf_height",""), - ("prf_age",""), - ("prf_ddbb","sqlite"), - ("prf_ddbbhost",""), - ("prf_ddbbname",""), - ("prf_ddbbuser",""), - ("prf_ddbbpass",""), - ("prf_us_system","False"), - ("DB_version","0")] - defaultListKeys = [] - for entry in defaultList: - defaultListKeys.append(unicode(entry[0])) - logging.debug("Default values: "+ str(defaultList)) - #logging.debug("Default keys: "+ str(defaultListKeys)) - # Comparing fields - # 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)) - # Adding missing fields if necessary - for field in resultList: - pos = defaultListKeys.index(field) - logging.debug("Adding "+ str(defaultList[pos])) - self.configuration.setValue("pytraining",defaultList[pos][0],defaultList[pos][1]) + for option, value in list_options.items(): + logging.debug("Adding "+option+"|"+value) + self.setValue("pytraining",option,value) + self.xml_tree.write(self.config_file, xml_declaration=True) logging.debug("<<") def getSportList(self): logging.debug("--") - connection = self.ddbb.connect() + connection = self.pytrainer_main.ddbb.connect() if (connection == 1): logging.debug("retrieving sports info") - return self.ddbb.select("sports","name,met,weight,id_sports",None) + return self.pytrainer_main.ddbb.select("sports","name,met,weight,id_sports",None) else: return connection @@ -153,44 +226,45 @@ logging.debug(">>") logging.debug("Adding new sport: "+sport+"|"+weight+"|"+met) sport = [sport,met,weight] - self.ddbb.insert("sports","name,met,weight",sport) - sport_id = self.ddbb.select("sports","id_sports","name=\"%s\"" %(sport)) + self.pytrainer_main.ddbb.insert("sports","name,met,weight",sport) + sport_id = self.pytrainer_main.ddbb.select("sports","id_sports","name=\"%s\"" %(sport)) logging.debug("<<") return sport_id def delSport(self,sport): logging.debug(">>") condition = "name=\"%s\"" %sport - id_sport = self.ddbb.select("sports","id_sports",condition)[0][0] + id_sport = self.pytrainer_main.ddbb.select("sports","id_sports",condition)[0][0] logging.debug("removing records from sport "+ sport + " (id_sport: "+str(id_sport)+")") - self.ddbb.delete("records","sport=\"%d\""%id_sport) - self.ddbb.delete("sports","id_sports=\"%d\""%id_sport) + self.pytrainer_main.ddbb.delete("records","sport=\"%d\""%id_sport) + self.pytrainer_main.ddbb.delete("sports","id_sports=\"%d\""%id_sport) logging.debug("<<") def updateSport(self,oldnamesport,newnamesport,newmetsport,newweightsport): logging.debug("--") - self.ddbb.update("sports","name,met,weight",[newnamesport,newmetsport,newweightsport],"name=\"%s\""%oldnamesport) + self.pytrainer_main.ddbb.update("sports","name,met,weight",[newnamesport,newmetsport,newweightsport],"name=\"%s\""%oldnamesport) def getSportInfo(self,namesport): logging.debug("--") - return self.ddbb.select("sports","name,met,weight","name=\"%s\""%namesport)[0] + return self.pytrainer_main.ddbb.select("sports","name,met,weight","name=\"%s\""%namesport)[0] def build_ddbb(self): logging.debug("--") - self.ddbb.build_ddbb() + self.pytrainer_main.ddbb.build_ddbb() def editProfile(self): logging.debug(">>") from gui.windowprofile import WindowProfile logging.debug("retrieving configuration data") - list_options = self.configuration.getOptions() - profilewindow = WindowProfile(self.data_path, self, pytrainer_main=self.parent) + #Refresh configuration + self.configuration = self._parse_config_file(self.config_file) + profilewindow = WindowProfile(self.data_path, self, pytrainer_main=self.pytrainer_main) logging.debug("setting data values") - profilewindow.setValues(list_options) + profilewindow.setValues(self.configuration) profilewindow.run() logging.debug("<<") def actualize_mainsportlist(self): logging.debug("--") - self.parent.refreshMainSportList() + self.pytrainer_main.refreshMainSportList() Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2010-04-11 19:26:32 UTC (rev 560) +++ pytrainer/trunk/pytrainer/record.py 2010-04-14 08:33:10 UTC (rev 561) @@ -34,17 +34,10 @@ def __init__(self, data_path = None, parent = None): logging.debug('>>') self.parent = parent + self.pytrainer_main = parent self.data_path = data_path logging.debug('setting date...') self.date = Date() - logging.debug('Checking current configuration...') - 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): @@ -64,10 +57,9 @@ def editRecord(self,id_record,list_sport): logging.debug('>>') - #record = self.ddbb.select("records", "*", "id_record=\"%s\"" %id_record) - record = self.ddbb.select("records", "id_record, date, sport, distance, time, beats, average, calories, comments, gpslog, title, upositive, unegative, maxspeed, maxpace, pace, maxbeats, date_time_utc, date_time_local", "id_record=\"%s\"" %id_record) + record = self.pytrainer_main.ddbb.select("records", "id_record, date, sport, distance, time, beats, average, calories, comments, gpslog, title, upositive, unegative, maxspeed, maxpace, pace, maxbeats, date_time_utc, date_time_local", "id_record=\"%s\"" %id_record) logging.debug('retrieving data from DB: '+str(record)) - gpxfile = self.conf.getValue("gpxdir")+"/%d.gpx"%int(id_record) + gpxfile = self.pytrainer_main.profile.gpxdir+"/%d.gpx"%int(id_record) logging.debug('gpx file associated: '+gpxfile) self.recordwindow = WindowRecord(self.data_path, list_sport,self, None, windowTitle=_("Edit Entry")) if os.path.isfile(gpxfile): @@ -82,10 +74,10 @@ 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) + record = self.pytrainer_main.ddbb.delete("records", "id_record=\"%s\"" %id_record) + laps = self.pytrainer_main.ddbb.delete("laps", "record=\"%s\"" %id_record) logging.debug('removed record '+str(id_record)+' (and associated laps) from DB') - gpxfile = self.conf.getValue("gpxdir")+"/%d.gpx"%int(id_record) + gpxfile = self.pytrainer_main.profile.gpxdir+"/%d.gpx"%int(id_record) if os.path.isfile(gpxfile): os.remove(gpxfile) logging.debug('removed gpxfile '+gpxfile) @@ -100,7 +92,7 @@ list_options["rcd_beats"] = 0 #calculate the sport id - sport_id = self.ddbb.select("sports","id_sports","name=\"%s\"" %list_options["rcd_sport"])[0][0] + sport_id = self.pytrainer_main.ddbb.select("sports","id_sports","name=\"%s\"" %list_options["rcd_sport"])[0][0] values= ( list_options["rcd_date"], @@ -167,9 +159,9 @@ return None logging.debug('list_options: '+str(list_options)) cells,values = self._formatRecordNew(list_options) - self.ddbb.insert("records",cells,values) + self.pytrainer_main.ddbb.insert("records",cells,values) logging.debug('DB updated: '+str(cells)+' | '+str(values)) - id_record = self.ddbb.lastRecord("records") + id_record = self.pytrainer_main.ddbb.lastRecord("records") #Create entry(s) for activity in laps table if laps is not None: for lap in laps: @@ -179,13 +171,13 @@ self.insertLaps(lap_keys,lap.values()) gpxOrig = list_options["rcd_gpxfile"] if os.path.isfile(gpxOrig): - gpxDest = self.conf.getValue("gpxdir") + gpxDest = self.pytrainer_main.profile.gpxdir gpxNew = gpxDest+"/%d.gpx"%id_record shutil.move(gpxOrig, gpxNew) logging.debug('Moving '+gpxOrig+' to '+gpxNew) #self.parent.refreshListRecords() logging.debug('<<') - return self.ddbb.lastRecord("records") + return self.pytrainer_main.ddbb.lastRecord("records") def insertNewRecord(self, gpxOrig, entry): #TODO consolidate with insertRecord """29.03.2008 - dgranda @@ -272,7 +264,7 @@ def updateRecord(self, list_options, id_record): logging.debug('>>') - gpxfile = self.conf.getValue("gpxdir")+"/%d.gpx"%int(id_record) + gpxfile = self.pytrainer_main.profile.gpxdir+"/%d.gpx"%int(id_record) gpxOrig = list_options["rcd_gpxfile"] if os.path.isfile(gpxOrig): if gpxfile != gpxOrig: @@ -282,7 +274,7 @@ logging.debug('removing gpxfile') # ein? logging.debug('updating bbdd') #ein? cells,values = self._formatRecord(list_options) - self.ddbb.update("records",cells,values," id_record=%d" %int(id_record)) + self.pytrainer_main.ddbb.update("records",cells,values," id_record=%d" %int(id_record)) self.parent.refreshListView() logging.debug('<<') @@ -298,24 +290,24 @@ def getrecordInfo(self,id_record): logging.debug('--') - return self.ddbb.select("records,sports", + return self.pytrainer_main.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,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", + return self.pytrainer_main.ddbb.select("records,sports", "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('--') - laps = self.ddbb.select("laps", + laps = self.pytraine... [truncated message content] |
From: <jb...@us...> - 2010-04-14 11:11:48
|
Revision: 564 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=564&view=rev Author: jblance Date: 2010-04-14 11:11:42 +0000 (Wed, 14 Apr 2010) Log Message: ----------- Fixes to heartrate graphing after changes to profile and config variables Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/heartrategraph.py pytrainer/trunk/pytrainer/lib/heartrate.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2010-04-14 10:59:25 UTC (rev 563) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-04-14 11:11:42 UTC (rev 564) @@ -141,7 +141,7 @@ def createGraphs(self,RecordGraph,DayGraph,WeekGraph, MonthGraph,YearGraph,HeartRateGraph): self.drawarearecord = RecordGraph(self.record_graph_vbox, self.window1, self.record_combovalue, self.record_combovalue2, self.btnShowLaps, self.tableConfig) - self.drawareaheartrate = HeartRateGraph(self.heartrate_vbox, self.window1, self.heartrate_vbox2) + self.drawareaheartrate = HeartRateGraph(self.heartrate_vbox, self.window1, self.heartrate_vbox2, pytrainer_main=self.pytrainer_main) #self.drawareaday = DayGraph(self.day_vbox, self.day_combovalue) self.day_vbox.hide() self.drawareaweek = WeekGraph(self.weekview, self.window1, self.week_combovalue, self.week_combovalue2) Modified: pytrainer/trunk/pytrainer/heartrategraph.py =================================================================== --- pytrainer/trunk/pytrainer/heartrategraph.py 2010-04-14 10:59:25 UTC (rev 563) +++ pytrainer/trunk/pytrainer/heartrategraph.py 2010-04-14 11:11:42 UTC (rev 564) @@ -23,15 +23,16 @@ import logging class HeartRateGraph: - def __init__(self, vbox = None, window = None, vbox2 = None): + def __init__(self, vbox = None, window = None, vbox2 = None, pytrainer_main = None): logging.debug('>>') self.drawarea = DrawArea(vbox, window) self.drawarea2 = DrawArea(vbox2, window) + self.pytrainer_main = pytrainer_main logging.debug('<<') def drawgraph(self,values): logging.debug('>>') - zones = getZones() + zones = getZones(self.pytrainer_main) #TODO from lib/heartrate.py import - can this file be consolidated? xvalues, yvalues = self.get_values(values) #logging.debug('xvalues: '+str(xvalues)) #logging.debug('yvalues: '+str(yvalues)) Modified: pytrainer/trunk/pytrainer/lib/heartrate.py =================================================================== --- pytrainer/trunk/pytrainer/lib/heartrate.py 2010-04-14 10:59:25 UTC (rev 563) +++ pytrainer/trunk/pytrainer/lib/heartrate.py 2010-04-14 11:11:42 UTC (rev 564) @@ -18,14 +18,14 @@ from xmlUtils import XMLParser -def getZones(): - conf = checkConf() - filename = conf.getValue("conffile") - configuration = XMLParser(filename) - maxhr = int(configuration.getValue("pytraining","prf_maxhr")) - resthr = int(configuration.getValue("pytraining","prf_minhr")) +def getZones(pytrainer_main=None): + #conf = checkConf() + #filename = conf.getValue("conffile") + #configuration = XMLParser(filename) + maxhr = int(pytrainer_main.profile.getValue("pytraining","prf_maxhr")) + resthr = int(pytrainer_main.profile.getValue("pytraining","prf_minhr")) - if configuration.getValue("pytraining","prf_hrzones_karvonen")=="True": + if pytrainer_main.profile.getValue("pytraining","prf_hrzones_karvonen")=="True": #if karvonen method targethr1 = ((maxhr - resthr) * 0.50) + resthr targethr2 = ((maxhr - resthr) * 0.60) + resthr Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-04-14 10:59:25 UTC (rev 563) +++ pytrainer/trunk/pytrainer/main.py 2010-04-14 11:11:42 UTC (rev 564) @@ -59,7 +59,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#563" + self.version ="1.7.2_svn#564" self.DB_version = 3 #Process command line options self.startup_options = self.get_options() @@ -307,8 +307,8 @@ gpx = Gpx(self.data_path,gpxfile) gpx_tracklist = gpx.getTrackList() self.windowmain.actualize_heartrategraph(gpx_tracklist) - zones = getZones() #TODO Huh, what is supposed to happen here??? - karvonen_method = self.profile.configuration.getValue("pytraining","prf_hrzones_karvonen") + zones = getZones(self) #TODO from lib/heartrate.py import - can this file be consolidated? + karvonen_method = self.profile.getValue("pytraining","prf_hrzones_karvonen") self.windowmain.actualize_hrview(record_list,zones,karvonen_method) logging.debug('<<') This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-04-16 10:19:08
|
Revision: 568 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=568&view=rev Author: jblance Date: 2010-04-16 10:19:00 +0000 (Fri, 16 Apr 2010) Log Message: ----------- More fixes after move to global varibles Modified Paths: -------------- pytrainer/trunk/pytrainer/extension.py pytrainer/trunk/pytrainer/extensions/googlemaps.py pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/heartrategraph.py pytrainer/trunk/pytrainer/importdata.py pytrainer/trunk/pytrainer/lib/ddbb.py pytrainer/trunk/pytrainer/lib/heartrate.py pytrainer/trunk/pytrainer/lib/webUtils.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/plugins.py pytrainer/trunk/pytrainer/profile.py pytrainer/trunk/pytrainer/record.py pytrainer/trunk/pytrainer/waypoint.py Removed Paths: ------------- pytrainer/trunk/pytrainer/lib/soapUtils.py Modified: pytrainer/trunk/pytrainer/extension.py =================================================================== --- pytrainer/trunk/pytrainer/extension.py 2010-04-15 10:06:46 UTC (rev 567) +++ pytrainer/trunk/pytrainer/extension.py 2010-04-16 10:19:00 UTC (rev 568) @@ -20,14 +20,12 @@ import logging from lib.xmlUtils import XMLParser -#from lib.system import checkConf from gui.windowextensions import WindowExtensions class Extension: def __init__(self, data_path = None, parent = None): self.data_path=data_path - #self.conf = checkConf() self.parent = parent self.pytrainer_main = parent @@ -77,7 +75,7 @@ def getExtensionConfParams(self,pathExtension): info = XMLParser(pathExtension+"/conf.xml") code = info.getValue("pytrainer-extension","extensioncode") - extensiondir = self.conf.getValue("extensiondir") + extensiondir = self.pytrainer_main.profile.extensiondir params = {} if not os.path.isfile(extensiondir+"/"+code+"/conf.xml"): prefs = info.getAllValues("conf-values") @@ -96,7 +94,7 @@ def setExtensionConfParams(self,pathExtension,savedOptions): info = XMLParser(pathExtension+"/conf.xml") code = info.getValue("pytrainer-extension","extensioncode") - extensiondir = self.conf.getValue("extensiondir")+"/"+code + extensiondir = self.pytrainer_main.profile.extensiondir+"/"+code if not os.path.isdir(extensiondir): os.mkdir(extensiondir) if not os.path.isfile(extensiondir+"/conf.xml"): @@ -114,7 +112,7 @@ def getCodeConfValue(self,code,value): - extensiondir = self.conf.getValue("extensiondir") + extensiondir = self.pytrainer_main.profile.extensiondir info = XMLParser(extensiondir+"/"+code+"/conf.xml") return info.getValue("pytrainer-extension",value) @@ -135,26 +133,4 @@ module = __import__(extension_filename) extensionMain = getattr(module, extension_classname) logging.debug('<<') - return extensionMain(parent=self, pytrainer_main=self.parent, conf_dir=self.conf.getValue("confdir"), options=options) - - #def runExtension(self,pathExtension,id): - #info = XMLParser(pathExtension+"/conf.xml") - #bin = info.getValue("pytrainer-extension","executable") - #extensiontype = info.getValue("pytrainer-extension","type") - #binnary = pathExtension+"/"+bin - #params = "" - #for opt in self.getExtensionConfParams(pathExtension): - # if opt[0]!="status" and opt[1]!="": - # params += "--%s %s " %(opt[0],opt[1]) - #if extensiontype=="record": - # params += "--gpxfile %s/gpx/%s.gpx " %(self.conf.getValue("confdir"),id) - # params += "--idrecord %s " %id - #bin = info.getValue("pytrainer-extension","executable") - #print params - #alert = os.popen("%s %s" %(binnary,params)).read() - - #from gui.warning import Warning - #warning = Warning(self.data_path) - # warning.set_text(alert) - # warning.run() - + return extensionMain(parent=self, pytrainer_main=self.parent, conf_dir=self.pytrainer_main.profile.confdir, options=options) Modified: pytrainer/trunk/pytrainer/extensions/googlemaps.py =================================================================== --- pytrainer/trunk/pytrainer/extensions/googlemaps.py 2010-04-15 10:06:46 UTC (rev 567) +++ pytrainer/trunk/pytrainer/extensions/googlemaps.py 2010-04-16 10:19:00 UTC (rev 568) @@ -21,7 +21,6 @@ import re import logging -#from pytrainer.lib.system import checkConf from pytrainer.lib.gpx import Gpx import pytrainer.lib.points as Points from pytrainer.lib.fileUtils import fileUtils Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2010-04-15 10:06:46 UTC (rev 567) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-04-16 10:19:00 UTC (rev 568) @@ -29,7 +29,6 @@ from aboutdialog import About 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 * @@ -75,7 +74,6 @@ #create the columns for the waypoints treeview column_names=[_("id"),_("Waypoint")] self.create_treeview(self.waypointTreeView,column_names) - #conf = checkConf() self.fileconf = self.pytrainer_main.profile.confdir+"/listviewmenu.xml" if not os.path.isfile(self.fileconf): self._createXmlListView(self.fileconf) Modified: pytrainer/trunk/pytrainer/heartrategraph.py =================================================================== --- pytrainer/trunk/pytrainer/heartrategraph.py 2010-04-15 10:06:46 UTC (rev 567) +++ pytrainer/trunk/pytrainer/heartrategraph.py 2010-04-16 10:19:00 UTC (rev 568) @@ -17,8 +17,6 @@ #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. from gui.drawArea import DrawArea -from lib.system import checkConf -from lib.xmlUtils import XMLParser from lib.heartrate import * import logging @@ -56,4 +54,3 @@ return float(value) except: return float(0) - Modified: pytrainer/trunk/pytrainer/importdata.py =================================================================== --- pytrainer/trunk/pytrainer/importdata.py 2010-04-15 10:06:46 UTC (rev 567) +++ pytrainer/trunk/pytrainer/importdata.py 2010-04-16 10:19:00 UTC (rev 568) @@ -18,9 +18,6 @@ import os -#from lib.xmlUtils import XMLParser -#from lib.system import checkConf - from gui.windowimportdata import WindowImportdata class Importdata: @@ -28,7 +25,6 @@ self.data_path=data_path self.parent = parent self.pytrainer_main = parent - #self.conf = checkConf() self.configuration = config def runImportdata(self): Modified: pytrainer/trunk/pytrainer/lib/ddbb.py =================================================================== --- pytrainer/trunk/pytrainer/lib/ddbb.py 2010-04-15 10:06:46 UTC (rev 567) +++ pytrainer/trunk/pytrainer/lib/ddbb.py 2010-04-16 10:19:00 UTC (rev 568) @@ -22,7 +22,6 @@ import logging import traceback import commands, os -#from system import checkConf from pytrainer.lib.date import Date class DDBB: @@ -35,7 +34,6 @@ else: from sqliteUtils import Sql - #self.conf = checkConf() self.confdir = configuration.confdir self.ddbb_path = "%s/pytrainer.ddbb" %self.confdir Modified: pytrainer/trunk/pytrainer/lib/heartrate.py =================================================================== --- pytrainer/trunk/pytrainer/lib/heartrate.py 2010-04-15 10:06:46 UTC (rev 567) +++ pytrainer/trunk/pytrainer/lib/heartrate.py 2010-04-16 10:19:00 UTC (rev 568) @@ -16,12 +16,7 @@ #along with this program; if not, write to the Free Software #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -from xmlUtils import XMLParser - def getZones(pytrainer_main=None): - #conf = checkConf() - #filename = conf.getValue("conffile") - #configuration = XMLParser(filename) maxhr = int(pytrainer_main.profile.getValue("pytraining","prf_maxhr")) resthr = int(pytrainer_main.profile.getValue("pytraining","prf_minhr")) Deleted: pytrainer/trunk/pytrainer/lib/soapUtils.py =================================================================== --- pytrainer/trunk/pytrainer/lib/soapUtils.py 2010-04-15 10:06:46 UTC (rev 567) +++ pytrainer/trunk/pytrainer/lib/soapUtils.py 2010-04-16 10:19:00 UTC (rev 568) @@ -1,149 +0,0 @@ -# -*- coding: iso-8859-1 -*- - -#Copyright (C) Fiz Vazquez vu...@si... -# vu...@gr... -# Jakinbidea & Grupo Ikusnet Developer - -#This program is free software; you can redistribute it and/or -#modify it under the terms of the GNU General Public License -#as published by the Free Software Foundation; either version 2 -#of the License, or (at your option) any later version. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. - -#You should have received a copy of the GNU General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -import SOAPpy -from pytrainer.lib.ddbb import DDBB -from pytrainer.lib.xmlUtils import XMLParser -from pytrainer.lib.system import checkConf - -from threading import Thread - -class webService(Thread): - def __init__(self,data_path=None,onchangeAction = None,insertNewRecord=None): - system = checkConf() - self.data_path = data_path - self.conffile = "%s/conf.xml" %system.getValue("confdir") - self.server = SOAPpy.ThreadingSOAPServer(("localhost", 8081)) - #self.server = SOAPpy.server.InsecureServer(("localhost", 8081)) - self.server.registerFunction(self.getRecordInfo) - self.server.registerFunction(self.addWaypoint) - self.server.registerFunction(self.updateWaypoint) - self.server.registerFunction(self.getWaypoints) - self.server.registerFunction(self.test) - self.server.registerFunction(self.newRecord) - self.onchangeAction = onchangeAction - self.insertNewRecord = insertNewRecord - Thread.__init__ ( self ) - - def getRecordInfo(self,id_record): - configuration = XMLParser(self.conffile) - ddbb = DDBB(configuration) - ddbb.connect() - recordinfo = ddbb.select("records,sports", - "sports.name,date,distance,time,beats,comments,average,calories,id_record,title,upositive,unegative,maxspeed,maxpace,pace,maxbeats", - "id_record=\"%s\" and records.sport=sports.id_sports" %id_record) - record = recordinfo[0] - info = {} - info["sport"] = record[0] - info["date"] = record[1] - info["distance"] = record[2] - info["time"] = record[3] - info["beats"] = record[4] - info["comments"] = record[5] - info["average"] = record[6] - info["calories"] = record[7] - info["title"] = record[9] - info["upositive"] = record[10] - info["unegative"] = record[11] - info["maxspeed"] = record[12] - info["maxpace"] = record[13] - info["pace"] = record[14] - info["maxbeats"] = record[15] - return info - - def newRecord(self,title=None,distance=None,time=None,upositive=None, unegative=None, bpm=None,calories=None, date=None, comment=None): - #self.insertNewRecord(title,distance,time,upositive,unegative,bpm,calories,date,comment) - #Pasar de la ventana. - #meter el registro en la bbdd y reiniciar la interfaz - from pytrainer.lib.ddbb import DDBB - from pytrainer.lib.xmlUtils import XMLParser - from pytrainer.lib.system import checkConf - conf = checkConf() - filename = conf.getValue("conffile") - configuration = XMLParser(filename) - ddbb = DDBB(configuration) - ddbb.connect() - cells= "date,sport,distance,time,beats,comments,average,calories,title,upositive,unegative" - values=[date,1,distance,time,bpm,comment,float(distance)/(float(time)/3600),calories,title,upositive,unegative] - ddbb.insert("records",cells,values) - return ddbb.lastRecord("records") - - def addWaypoint(self,lon=None,lat=None,name=None,comment=None,sym=None): - configuration = XMLParser(self.conffile) - ddbb = DDBB(configuration) - ddbb.connect() - cells = "lat,lon,comment,name,sym" - values = (lat,lon,comment,name,sym) - ddbb.insert("waypoints",cells,values) - self.onchangeAction(False,0) - return ddbb.lastRecord("waypoints") - - def getWaypoints(self): - configuration = XMLParser(self.conffile) - ddbb = DDBB(configuration) - ddbb.connect() - cells = "lat,lon,comment,name,sym" - return ddbb.select("waypoints","lat,lon,ele,comment,time,name,sym","1=1 order by name") - - def updateWaypoint(self,lon=None,lat=None,name=None,comment=None,sym=None,id_waypoint=None): - if id_waypoint==None: - return "NACK" - c = [] - v = [] - values = [] - if lat: - c.append("lat") - values.append(lat) - if lon: - c.append("lon") - values.append(lon) - if comment: - c.append("comment") - values.append(comment) - if sym: - c.append("sym") - values.append("sym") - cells = "" - count=0 - for i in c: - if count==1: - cells +="," - cells += "%s"%i - count=1 - - configuration = XMLParser(self.conffile) - ddbb = DDBB(configuration) - ddbb.connect() - ddbb.update("waypoints",cells,values," id_waypoint=%d" %int(id_waypoint)) - self.onchangeAction(False,0) - return "ACK" - - def test(self,lon=None,lat=None): - print "Llamando al soap" - return "Hello world!" - - def run(self): - self.server.serve_forever() - - def stop(self): - self._Thread__stop() - self.server.server_close() - - Modified: pytrainer/trunk/pytrainer/lib/webUtils.py =================================================================== --- pytrainer/trunk/pytrainer/lib/webUtils.py 2010-04-15 10:06:46 UTC (rev 567) +++ pytrainer/trunk/pytrainer/lib/webUtils.py 2010-04-16 10:19:00 UTC (rev 568) @@ -16,36 +16,9 @@ #along with this program; if not, write to the Free Software #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer from threading import Thread -from pytrainer.lib.system import checkConf import webbrowser -class MyHandler(BaseHTTPRequestHandler): - def do_GET(self): - self.conf = checkConf() - tmpdir = self.conf.getValue("tmpdir") - f = open(tmpdir+"/waypointeditor.html") - self.send_response(200) - self.send_header('Content-type','text/html') - self.end_headers() - self.wfile.write(f.read()) - f.close() - print "un GET" - return - -class webServer(Thread): - def __init__(self): - self.server = HTTPServer(('localhost', 7988), MyHandler) - Thread.__init__ ( self ) - - def run(self): - #while 1==1: - self.server.serve_forever() - # print "molaaaaa" - # time.sleep(1) - #print "Iniciamos3" - def open_url_in_browser(url): """ Opens a url in the desktop's default browser Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-04-15 10:06:46 UTC (rev 567) +++ pytrainer/trunk/pytrainer/main.py 2010-04-16 10:19:00 UTC (rev 568) @@ -59,7 +59,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#567" + self.version ="1.7.2_svn#568" self.DB_version = 3 #Process command line options self.startup_options = self.get_options() Modified: pytrainer/trunk/pytrainer/plugins.py =================================================================== --- pytrainer/trunk/pytrainer/plugins.py 2010-04-15 10:06:46 UTC (rev 567) +++ pytrainer/trunk/pytrainer/plugins.py 2010-04-16 10:19:00 UTC (rev 568) @@ -21,14 +21,12 @@ import logging from lib.xmlUtils import XMLParser -#from lib.system import checkConf from gui.windowplugins import WindowPlugins class Plugins: def __init__(self, data_path = None, parent = None): self.data_path=data_path - #self.conf = checkConf() self.pytrainer_main = parent def getActivePlugins(self): Modified: pytrainer/trunk/pytrainer/profile.py =================================================================== --- pytrainer/trunk/pytrainer/profile.py 2010-04-15 10:06:46 UTC (rev 567) +++ pytrainer/trunk/pytrainer/profile.py 2010-04-16 10:19:00 UTC (rev 568) @@ -20,8 +20,6 @@ import os, sys import logging -#from lib.system import checkConf -#from lib.xmlUtils import XMLParser from lxml import etree from lib.ddbb import DDBB @@ -38,7 +36,7 @@ self.gpxdir = None self.extensiondir = None self.plugindir = None - #Set configuration parameters - old system.checkConf() + #Set configuration parameters self._setHome() self._setConfFiles() self._setTempDir() Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2010-04-15 10:06:46 UTC (rev 567) +++ pytrainer/trunk/pytrainer/record.py 2010-04-16 10:19:00 UTC (rev 568) @@ -26,7 +26,6 @@ from gui.dialogselecttrack import DialogSelectTrack from lib.ddbb import DDBB from lib.xmlUtils import XMLParser -from lib.system import checkConf from lib.date import Date from lib.gpx import Gpx Modified: pytrainer/trunk/pytrainer/waypoint.py =================================================================== --- pytrainer/trunk/pytrainer/waypoint.py 2010-04-15 10:06:46 UTC (rev 567) +++ pytrainer/trunk/pytrainer/waypoint.py 2010-04-16 10:19:00 UTC (rev 568) @@ -16,10 +16,6 @@ #along with this program; if not, write to the Free Software #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -from lib.ddbb import DDBB -#from lib.system import checkConf -#from lib.xmlUtils import XMLParser - import logging class Waypoint: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-04-16 10:57:26
|
Revision: 569 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=569&view=rev Author: jblance Date: 2010-04-16 10:57:20 +0000 (Fri, 16 Apr 2010) Log Message: ----------- List view updates after edit, import or delete Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/profile.py Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2010-04-16 10:19:00 UTC (rev 568) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-04-16 10:57:20 UTC (rev 569) @@ -968,11 +968,13 @@ def on_classicview_activate(self,widget): self.waypointarea.hide() self.listarea.hide() + self.selected_view = "record" self.classicarea.show() def on_listview_activate(self,widget): self.waypointarea.hide() self.classicarea.hide() + self.selected_view = "listview" self.parent.refreshListView() self.listarea.show() Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-04-16 10:19:00 UTC (rev 568) +++ pytrainer/trunk/pytrainer/main.py 2010-04-16 10:57:20 UTC (rev 569) @@ -59,7 +59,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#568" + self.version ="1.7.2_svn#569" self.DB_version = 3 #Process command line options self.startup_options = self.get_options() @@ -264,6 +264,9 @@ record_list = self.record.getrecordPeriodSport(date_ini, date_end,sport) self.windowmain.actualize_yearview(record_list, year) self.windowmain.actualize_yeargraph(record_list) + elif view=="listview": + logging.debug('list view') + self.refreshListView() else: print "Unknown view %s" % view logging.debug('<<') @@ -322,6 +325,9 @@ def refreshListRecords(self): logging.debug('>>') + #Refresh list view + self.refreshListView() + #Refresh list records date = self.date.getDate() record_list = self.record.getrecordList(date) self.windowmain.actualize_recordTreeView(record_list) Modified: pytrainer/trunk/pytrainer/profile.py =================================================================== --- pytrainer/trunk/pytrainer/profile.py 2010-04-16 10:19:00 UTC (rev 568) +++ pytrainer/trunk/pytrainer/profile.py 2010-04-16 10:57:20 UTC (rev 569) @@ -189,19 +189,23 @@ return None return self.configuration[variable] - def setValue(self, tag, variable, value): + def setValue(self, tag, variable, value, delay_write=False): logging.debug(">>") if tag != "pytraining": print "ERROR - pytraining is the only profile tag supported" - self.xml_tree.getroot().set(variable, value) + logging.debug("Setting %s to %s" % (variable, value)) + self.xml_tree.getroot().set(variable, value) + if not delay_write: + logging.debug("Writting...") + self.xml_tree.write(self.config_file, xml_declaration=True) logging.debug("<<") def setProfile(self,list_options): logging.debug(">>") for option, value in list_options.items(): logging.debug("Adding "+option+"|"+value) - self.setValue("pytraining",option,value) - self.xml_tree.write(self.config_file, xml_declaration=True) + self.setValue("pytraining",option,value,delay_write=True) + self.xml_tree.write(self.config_file, xml_declaration=True) logging.debug("<<") def getSportList(self): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-05-16 10:13:44
|
Revision: 582 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=582&view=rev Author: jblance Date: 2010-05-16 10:13:38 +0000 (Sun, 16 May 2010) Log Message: ----------- New activity class to hold ALL information about an activity and ActivityPool to maintain a pool of activities for quick re-display Modified Paths: -------------- pytrainer/trunk/pytrainer/extensions/googlemaps.py pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/heartrategraph.py pytrainer/trunk/pytrainer/lib/ddbb.py pytrainer/trunk/pytrainer/lib/gpx.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/profile.py pytrainer/trunk/pytrainer/record.py Added Paths: ----------- pytrainer/trunk/pytrainer/activitypool.py pytrainer/trunk/pytrainer/lib/activity.py Removed Paths: ------------- pytrainer/trunk/pytrainer/lib/heartrate.py Added: pytrainer/trunk/pytrainer/activitypool.py =================================================================== --- pytrainer/trunk/pytrainer/activitypool.py (rev 0) +++ pytrainer/trunk/pytrainer/activitypool.py 2010-05-16 10:13:38 UTC (rev 582) @@ -0,0 +1,49 @@ +# -*- coding: iso-8859-1 -*- + +#Copyright (C) Fiz Vazquez vu...@si... + +#This program is free software; you can redistribute it and/or +#modify it under the terms of the GNU General Public License +#as published by the Free Software Foundation; either version 2 +#of the License, or (at your option) any later version. + +#This program is distributed in the hope that it will be useful, +#but WITHOUT ANY WARRANTY; without even the implied warranty of +#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +#GNU General Public License for more details. + +#You should have received a copy of the GNU General Public License +#along with this program; if not, write to the Free Software +#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +import logging + +from lib.activity import Activity + +class ActivityPool: + ''' + Class maintains a pool of activities + size is set at initialisation + ''' + def __init__(self, pytrainer_main = None, size = 1): + logging.debug(">>") + #It is an error to try to initialise with no reference to pytrainer_main + if pytrainer_main is None: + print("Error - must initialise with a reference to the main pytrainer class") + return None + self.pytrainer_main = pytrainer_main + self.pool = {} + self.pool_queue = [] + print("Initialising ActivityPool to size: %d" % size) + logging.debug("<<") + + def get_activity(self, id): + sid = str(id) + if sid in self.pool.keys(): + print("Found activity in pool, returning....") + else: + print("Activity NOT found in pool, initing and returning....") + self.pool[sid] = Activity(pytrainer_main = self.pytrainer_main, id = id) + self.pool_queue.append(sid) + return self.pool[sid] + print("ActivityPool queue length: %d" % len(self.pool_queue)) Modified: pytrainer/trunk/pytrainer/extensions/googlemaps.py =================================================================== --- pytrainer/trunk/pytrainer/extensions/googlemaps.py 2010-05-16 03:00:24 UTC (rev 581) +++ pytrainer/trunk/pytrainer/extensions/googlemaps.py 2010-05-16 10:13:38 UTC (rev 582) @@ -21,10 +21,10 @@ import re import logging -from pytrainer.lib.gpx import Gpx -import pytrainer.lib.points as Points +#from pytrainer.lib.gpx import Gpx +import pytrainer.lib.points as Points from pytrainer.lib.fileUtils import fileUtils -from pytrainer.record import Record +#from pytrainer.record import Record class Googlemaps: def __init__(self, data_path = None, vbox = None, waypoint = None, pytrainer_main=None): @@ -36,12 +36,12 @@ self.moz = gtkmozembed.MozEmbed() vbox.pack_start(self.moz, True, True) vbox.show_all() - self.htmlfile = "%s/index.html" % (self.pytrainer_main.profile.tmpdir) - + self.htmlfile = "%s/index.html" % (self.pytrainer_main.profile.tmpdir) + logging.debug("<<") - - def drawMap(self,id_record): - '''Draw google map + + def drawMap(self,activity): + '''Draw google map create html file using Google API version?? render using embedded Mozilla @@ -56,11 +56,9 @@ levels = [] pointlist = [] polyline = [] - - gpxfile = "%s/%s.gpx" % (self.pytrainer_main.profile.gpxdir, id_record) - if os.path.isfile(gpxfile): - gpx = Gpx(self.data_path,gpxfile) - list_values = gpx.getTrackList() + + list_values = activity.tracks + if list_values != []: if len(list_values) > 0: minlat, minlon = float(list_values[0][4]),float(list_values[0][5]) maxlat=minlat @@ -79,16 +77,12 @@ points = points.replace("\\","\\\\") if self.pytrainer_main.startup_options.gm3: logging.debug("Using Google Maps version 3 API") - #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.pytrainer_main.record.getLaps(id_record) - #"sports.name,date,distance,time,beats,comments,average,calories,id_record,title,upositive,unegative,maxspeed,maxpace,pace,maxbeats" - info = self.pytrainer_main.record.getrecordInfo(id_record) - timeHours = int(info[0][3]) / 3600 - timeMin = (float(info[0][3]) / 3600.0 - timeHours) * 60 + laps = activity.laps + timeHours = int(activity.time) / 3600 + timeMin = (float(activity.time) / 3600.0 - timeHours) * 60 time = "%d%s %02d%s" % (timeHours, _("h"), timeMin, _("min")) - 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 = "<div class='info_content'>%s: %s</div>" % (activity.sport_name, activity.title) + finishinfo = "<div class='info_content'>%s: %s<br>%s: %s%s</div>" % (_("Time"), time, _("Distance"), activity.distance, activity.distance_unit) 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) @@ -101,10 +95,10 @@ self.createErrorHtml() self.moz.load_url("file://%s" % (self.htmlfile)) logging.debug("<<") - + def createHtml_api3(self,polyline, minlat, minlon, maxlat, maxlon, startinfo, finishinfo, laps): ''' - Generate a Google maps html file using the v3 api + Generate a Google maps html file using the v3 api documentation at http://code.google.com/apis/maps/documentation/v3 ''' logging.debug(">>") @@ -165,15 +159,15 @@ var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); var startmarker = new google.maps.Marker({ - position: startlatlng, - map: map, - icon: startimage, - title:"Start"}); + position: startlatlng, + map: map, + icon: startimage, + title:"Start"}); var finishmarker = new google.maps.Marker({ - position: endlatlng, - icon: finishimage, - map: map, + position: endlatlng, + icon: finishimage, + map: map, title:"End"}); \n //Add an infowindows @@ -193,30 +187,30 @@ finishinfo.open(map,finishmarker); });\n''' - #"id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories, lap_number", + #"id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories, lap_number", for lap in laps: - lapNumber = int(lap[9])+1 - elapsedTime = float(lap[2]) + lapNumber = int(lap['lap_number'])+1 + elapsedTime = float(lap['elapsed_time']) elapsedTimeHours = int(elapsedTime/3600) elapsedTimeMins = int((elapsedTime - (elapsedTimeHours * 3600)) / 60) elapsedTimeSecs = elapsedTime - (elapsedTimeHours * 3600) - (elapsedTimeMins * 60) if elapsedTimeHours > 0: - strElapsedTime = "%0.0dh:%0.2dm:%0.2fs" % (elapsedTimeHours, elapsedTimeMins, elapsedTimeSecs) + strElapsedTime = "%0.0dh:%0.2dm:%0.2fs" % (elapsedTimeHours, elapsedTimeMins, elapsedTimeSecs) elif elapsedTimeMins > 0: - strElapsedTime = "%0.0dm:%0.2fs" % (elapsedTimeMins, elapsedTimeSecs) + strElapsedTime = "%0.0dm:%0.2fs" % (elapsedTimeMins, elapsedTimeSecs) else: - strElapsedTime = "%0.0fs" % (elapsedTimeSecs) + strElapsedTime = "%0.0fs" % (elapsedTimeSecs) #process lat and lon for this lap try: - lapLat = float(lap[6]) - lapLon = float(lap[7]) + lapLat = float(lap['end_lat']) + lapLon = float(lap['end_lon']) 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[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 - logging.debug( "Error processing lap "+ str(lapNumber) + " id: " + str(lap[0]) + " (lat,lon) ( " + str(lap[6]) + "," +str (lap[7]) + ")" ) + logging.debug( "Error processing lap "+ str(lap) ) content += ''' @@ -281,7 +275,7 @@ var id = waypoint[5]; var name = waypoint[2]; var description = waypoint[3]; - + var point = new GLatLng(lat,lon); var text = "<b>"+waypoint[2]+"</b><br/>"+waypoint[3]; @@ -295,8 +289,8 @@ icon.iconSize = new GSize(32, 32); icon.iconAnchor = new GPoint(16, 16); icon.infoWindowAnchor = new GPoint(5, 1); - - var markerD = new GMarker(point, {icon:icon, draggable: false}); + + var markerD = new GMarker(point, {icon:icon, draggable: false}); GEvent.addListener(markerD, "click", function() { markerD.openInfoWindowHtml("<b>" + name + "</b><br/>"+description); }); @@ -340,11 +334,11 @@ content += " <body onload=\"load()\" onunload=\"GUnload()\">\n" content += " <div id=\"map\" style=\"width: 520px; height: 480px\"></div>\n" content += " </body>\n" - content += "</html>\n" + content += "</html>\n" file = fileUtils(self.htmlfile,content) file.run() logging.debug("<<") - + def createErrorHtml(self): logging.debug(">>") content = '''<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2010-05-16 03:00:24 UTC (rev 581) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-05-16 10:13:38 UTC (rev 582) @@ -30,7 +30,7 @@ from pytrainer.lib.date import Date from pytrainer.lib.xmlUtils import XMLParser -from pytrainer.lib.gpx import Gpx +#from pytrainer.lib.gpx import Gpx from pytrainer.lib.unitsconversor import * class Main(SimpleGladeApp): @@ -187,102 +187,60 @@ treeview.append_column(column) i+=1 - def actualize_recordview(self,record_list): + def actualize_recordview(self,activity): logging.debug(">>") - if self.pytrainer_main.profile.getValue("pytraining","prf_us_system") == "True": - self.r_distance_unit.set_text(_("miles")) - self.r_speed_unit.set_text(_("miles/h")) - self.r_maxspeed_unit.set_text(_("miles/h")) - self.r_pace_unit.set_text(_("min/mile")) - self.r_maxpace_unit.set_text(_("min/mile")) - self.r_ascent_unit.set_text(_("feet")) - self.r_descent_unit.set_text(_("feet")) - else: - self.r_distance_unit.set_text(_("km")) - self.r_speed_unit.set_text(_("km/h")) - self.r_maxspeed_unit.set_text(_("km/h")) - self.r_pace_unit.set_text(_("min/km")) - self.r_maxpace_unit.set_text(_("min/km")) - self.r_ascent_unit.set_text(_("m")) - self.r_descent_unit.set_text(_("m")) + #Set the units for the activity results, e.g. km, km/h etc + self.r_distance_unit.set_text(activity.distance_unit) + self.r_speed_unit.set_text(activity.speed_unit) + self.r_maxspeed_unit.set_text(activity.speed_unit) + self.r_pace_unit.set_text(activity.pace_unit) + self.r_maxpace_unit.set_text(activity.pace_unit) + self.r_ascent_unit.set_text(activity.height_unit) + self.r_descent_unit.set_text(activity.height_unit) - if len(record_list)>0: - record_list=record_list[0] - + if activity.has_data: self.recordview.set_sensitive(1) - sport = record_list[0] - date = record_list[1] - distance = self.parseFloat(record_list[2]) - average = self.parseFloat(record_list[6]) - calories = self.parseFloat(record_list[7]) - upositive = self.parseFloat(record_list[10]) - unegative = self.parseFloat(record_list[11]) - title = str(record_list[9]) - comments = str(record_list[5]) - pace = self.parseFloat(record_list[14]) #to review - maxspeed = self.parseFloat(record_list[12]) #to review - maxpace = self.parseFloat(record_list[13]) - #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 - 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) - else: #No local time in DB - tmpDateTime = dateutil.parser.parse(date_time_utc) - dateTime = tmpDateTime.astimezone(tzlocal()) #datetime with localtime offset (using value from OS) + dateTime = activity.date_time recordDateTime = dateTime.strftime("%Y-%m-%d %H:%M:%S") recordDate = dateTime.strftime("%x") recordTime = dateTime.strftime("%X") recordDateTimeOffset = dateTime.strftime("%z") - if self.pytrainer_main.profile.getValue("pytraining","prf_us_system") == "True": - self.record_distance.set_text("%0.2f" %km2miles(distance)) - self.record_upositive.set_text("%0.2f" %m2feet(upositive)) - self.record_unegative.set_text("%0.2f" %m2feet(unegative)) - self.record_average.set_text("%0.2f" %km2miles(average)) - self.record_maxspeed.set_text("%0.2f" %km2miles(maxspeed)) - self.record_pace.set_text("%0.2f" %pacekm2miles(pace)) - self.record_maxpace.set_text("%0.2f" %pacekm2miles(maxpace)) + self.record_distance.set_text("%0.2f" %activity.distance) + self.record_upositive.set_text("%0.2f" %activity.upositive) + self.record_unegative.set_text("%0.2f" %activity.unegative) + self.record_average.set_text("%0.2f" %activity.average) + self.record_maxspeed.set_text("%0.2f" %activity.maxspeed) + self.record_pace.set_text("%0.2f" %activity.pace) + self.record_maxpace.set_text("%0.2f" %activity.maxpace) - else: - self.record_distance.set_text("%0.2f" %distance) - self.record_upositive.set_text("%0.2f" %upositive) - self.record_unegative.set_text("%0.2f" %unegative) - self.record_average.set_text("%0.2f" %average) - self.record_maxspeed.set_text("%0.2f" %maxspeed) - self.record_pace.set_text("%0.2f" %pace) - self.record_maxpace.set_text("%0.2f" %maxpace) - - self.record_sport.set_text(sport) + self.record_sport.set_text(activity.sport_name) #self.record_date.set_text(str(date)) self.record_date.set_text(recordDate) self.record_time.set_text(recordTime) - hour,min,sec=self.parent.date.second2time(int(record_list[3])) + hour,min,sec=self.parent.date.second2time(int(activity.time)) self.record_hour.set_text("%d" %hour) self.record_minute.set_text("%02d" %min) self.record_second.set_text("%02d" %sec) - self.record_calories.set_text("%0.0f" %calories) - #self.record_datetime.set_text(recordDateTime) - #self.record_datetime_offset.set_text(recordDateTimeOffset) - self.record_title.set_text(title) + self.record_calories.set_text("%0.0f" %activity.calories) + self.record_title.set_text(activity.title) buffer = self.record_comments.get_buffer() start,end = buffer.get_bounds() - buffer.set_text(comments) + buffer.set_text(activity.comments) else: self.recordview.set_current_page(0) self.recordview.set_sensitive(0) logging.debug(">>") - def actualize_recordgraph(self,record_list,laps=None): + def actualize_recordgraph(self,activity): logging.debug(">>") - self.record_list = record_list - self.laps = laps - if len(record_list)>0: + self.record_list = activity.tracks + self.laps = activity.laps + if len(self.record_list)>0: self.record_vbox.set_sensitive(1) - self.drawarearecord.drawgraph(record_list,laps) + self.drawarearecord.drawgraph(self.record_list,self.laps) else: #Remove graph vboxChildren = self.record_vbox.get_children() @@ -296,13 +254,16 @@ self.record_vbox.set_sensitive(0) logging.debug("<<") - def actualize_heartrategraph(self,record_list): + def actualize_heartrategraph(self,activity): logging.debug(">>") - self.drawareaheartrate.drawgraph(record_list) + self.drawareaheartrate.drawgraph(activity.tracks) logging.debug("<<") - def actualize_hrview(self,record_list,zones,is_karvonen_method): + def actualize_hrview(self,activity): logging.debug(">>") + zones = self.pytrainer_main.profile.getZones() + record_list = activity.tracks + is_karvonen_method = self.pytrainer_main.profile.getValue("pytraining","prf_hrzones_karvonen") if len(record_list)>0: record_list=record_list[0] self.record_zone1.set_text("%s-%s" %(zones[4][0],zones[4][1])) @@ -310,8 +271,8 @@ self.record_zone3.set_text("%s-%s" %(zones[2][0],zones[2][1])) self.record_zone4.set_text("%s-%s" %(zones[1][0],zones[1][1])) self.record_zone5.set_text("%s-%s" %(zones[0][0],zones[0][1])) - beats = self.parseFloat(record_list[4]) - maxbeats = self.parseFloat(record_list[15]) + beats = activity.beats + maxbeats = activity.maxbeats self.record_beats.set_text("%0.2f" %beats) self.record_maxbeats.set_text("%0.2f" %maxbeats) if is_karvonen_method=="True": Modified: pytrainer/trunk/pytrainer/heartrategraph.py =================================================================== --- pytrainer/trunk/pytrainer/heartrategraph.py 2010-05-16 03:00:24 UTC (rev 581) +++ pytrainer/trunk/pytrainer/heartrategraph.py 2010-05-16 10:13:38 UTC (rev 582) @@ -17,7 +17,6 @@ #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. from gui.drawArea import DrawArea -from lib.heartrate import * import logging class HeartRateGraph: @@ -30,7 +29,7 @@ def drawgraph(self,values): logging.debug('>>') - zones = getZones(self.pytrainer_main) #TODO from lib/heartrate.py import - can this file be consolidated? + zones = self.pytrainer_main.profile.getZones() #TODO from lib/heartrate.py import - can this file be consolidated? xvalues, yvalues = self.get_values(values) #logging.debug('xvalues: '+str(xvalues)) #logging.debug('yvalues: '+str(yvalues)) @@ -48,7 +47,7 @@ yvalue.append(value[6]) logging.debug('<<') return xvalue,yvalue - + def getFloatValue(self, value): try: return float(value) Added: pytrainer/trunk/pytrainer/lib/activity.py =================================================================== --- pytrainer/trunk/pytrainer/lib/activity.py (rev 0) +++ pytrainer/trunk/pytrainer/lib/activity.py 2010-05-16 10:13:38 UTC (rev 582) @@ -0,0 +1,181 @@ +# -*- coding: iso-8859-1 -*- + +#Copyright (C) Fiz Vazquez vu...@si... + +#This program is free software; you can redistribute it and/or +#modify it under the terms of the GNU General Public License +#as published by the Free Software Foundation; either version 2 +#of the License, or (at your option) any later version. + +#This program is distributed in the hope that it will be useful, +#but WITHOUT ANY WARRANTY; without even the implied warranty of +#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +#GNU General Public License for more details. + +#You should have received a copy of the GNU General Public License +#along with this program; if not, write to the Free Software +#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +import logging +import os +from lxml import etree +import dateutil.parser +from dateutil.tz import * # for tzutc() + +from pytrainer.lib.gpx import Gpx +from pytrainer.lib.unitsconversor import * + +class Activity: + ''' + Class that knows everything about a particular activity + ''' + def __init__(self, pytrainer_main = None, id = None): + logging.debug(">>") + #It is an error to try to initialise with no reference to pytrainer_main + if pytrainer_main is None: + print("Error - must initialise with a reference to the main pytrainer class") + return None + self.pytrainer_main = pytrainer_main + self.id = id + self.tracks = None + self.laps = None + self.tree = None + self.has_data = False + if self.pytrainer_main.profile.getValue("pytraining","prf_us_system") == "True": + self.us_system = True + else: + self.us_system = False + self._set_units() + self.gpx_file = "%s/%s.gpx" % (self.pytrainer_main.profile.gpxdir, id) + #It is OK to not have a GPX file for an activity - this just limits us to information in the DB + if not os.path.isfile(self.gpx_file): + self.gpx_file = None + logging.debug("No GPX file found for record id: %s" % id) + if self.gpx_file is not None: + self._init_from_gpx_file() + self._init_from_db() + logging.debug("<<") + + def _set_units(self): + if self.us_system: + self.distance_unit = _("miles") + self.speed_unit = _("miles/h") + self.pace_unit = _("min/mile") + self.height_unit = _("feet") + else: + self.distance_unit = _("km") + self.speed_unit = _("km/h") + self.pace_unit = _("min/km") + self.height_unit = _("m") + + def _init_from_gpx_file(self): + ''' + Get activity information from the GPX file + ''' + logging.debug(">>") + #Parse GPX file + self.gpx = Gpx(filename = self.gpx_file) #TODO change GPX code to do less.... + self.tree = self.gpx.tree + self.tracks = self.gpx.getTrackList() #TODO fix + logging.debug("<<") + + def _init_from_db(self): + ''' + Get activity information from the DB + ''' + logging.debug(">>") + #Get base information + db_result = self.pytrainer_main.ddbb.select_dict("records,sports", + ("sports.name","id_sports", "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" %self.id) + if len(db_result) == 1: + dict = db_result[0] + self.sport_name = dict['sports.name'] + self.sport_id = dict['id_sports'] + self.title = dict['title'] + self.date = dict['date'] + self.time = dict['time'] + self.beats = dict['beats'] + self.comments = dict['comments'] + self.calories = dict['calories'] + self.id_record = dict['id_record'] + self.maxbeats = dict['maxbeats'] + #Sort time.... + # ... use local time if available otherwise use date_time_utc and create a local datetime... + self.date_time_local = dict['date_time_local'] + self.date_time_utc = dict['date_time_utc'] + if self.date_time_local is not None: #Have a local time stored in DB + self.date_time = dateutil.parser.parse(self.date_time_local) + else: #No local time in DB + tmpDateTime = dateutil.parser.parse(self.date_time_utc) + self.date_time = tmpDateTime.astimezone(tzlocal()) #datetime with localtime offset (using value from OS) + #Sort data that changes for the US etc + if self.us_system: + self.distance = km2miles(self._float(dict['distance'])) + self.average = km2miles(self._float(dict['average'])) + self.upositive = m2feet(self._float(dict['upositive'])) + self.unegative = m2feet(self._float(dict['unegative'])) + self.maxspeed = km2miles(self._float(dict['maxspeed'])) + self.maxpace = pacekm2miles(self._float(dict['maxpace'])) + self.pace = pacekm2miles(self._float(dict['pace'])) + else: + self.distance = self._float(dict['distance']) + self.average = self._float(dict['average']) + self.upositive = self._float(dict['upositive']) + self.unegative = self._float(dict['unegative']) + self.maxspeed = self._float(dict['maxspeed']) + self.maxpace = self._float(dict['maxpace']) + self.pace = self._float(dict['pace']) + self.has_data = True + else: + raise Exception( "Error - multiple results from DB for id: %s" % self.id ) + #Get lap information + laps = self.pytrainer_main.ddbb.select_dict("laps", + ("id_lap", "record", "elapsed_time", "distance", "start_lat", "start_lon", "end_lat", "end_lon", "calories", "lap_number"), + "record=\"%s\"" % self.id) + if laps is None or laps == [] or len(laps) < 1: #No laps found + logging.debug("No laps in DB for record %d" % self.id) + if self.gpx_file is not None: + laps = self._get_laps_from_gpx() + self.laps = laps + logging.debug("<<") + + def _get_laps_from_gpx(self): + logging.debug(">>") + laps = [] + gpxLaps = self.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) + '''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.pytrainer_main.ddbb.select("laps", + "id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories, lap_number", + "record=\"%s\"" % id_record) + ''' + logging.debug("<<") + return laps + + def _float(self, value): + try: + result = float(value) + except: + result = 0.0 + return result Modified: pytrainer/trunk/pytrainer/lib/ddbb.py =================================================================== --- pytrainer/trunk/pytrainer/lib/ddbb.py 2010-05-16 03:00:24 UTC (rev 581) +++ pytrainer/trunk/pytrainer/lib/ddbb.py 2010-05-16 10:13:38 UTC (rev 582) @@ -33,16 +33,16 @@ from mysqlUtils import Sql else: from sqliteUtils import Sql - + self.confdir = configuration.confdir self.ddbb_path = "%s/pytrainer.ddbb" %self.confdir - + ddbb_host = configuration.getValue("pytraining","prf_ddbbhost") ddbb = configuration.getValue("pytraining","prf_ddbbname") ddbb_user = configuration.getValue("pytraining","prf_ddbbuser") ddbb_pass = configuration.getValue("pytraining","prf_ddbbpass") self.ddbbObject = Sql(ddbb_host,ddbb,ddbb_user,ddbb_pass,configuration) - + def connect(self): #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 @@ -67,16 +67,39 @@ def select(self,table,cells,condition=None): return self.ddbbObject.select(table,cells,condition) + def select_dict(self,table,cells,condition=None): + ''' + Function to query DB + -- inputs + ---- table - string tablename(s) + ---- cells - list of cells to select + ---- condition - string to fit SQL where clause or None + -- returns + ---- list of dicts with cells as keys + ''' + return_value = [] + #Only query db if table and cells are supplied + if table is not None and cells is not None: + cellString = ','.join(cells) #create cell list string + results = self.ddbbObject.select(table,cellString,condition) + for result in results: + dict = {} + #Loop through cells and create dict of results + for i, cell in enumerate(cells): + dict[cell] = result[i] + return_value.append(dict) + return return_value + def insert(self,table,cells,values): self.ddbbObject.insert(table,cells,values) - + def delete(self,table,condition): self.ddbbObject.delete(table,condition) def update(self,table,cells,value,condition): self.ddbbObject.update(table,cells,value,condition) - - def lastRecord(self,table): + + 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) @@ -105,17 +128,17 @@ "gpslog":"varchar(200)", "title":"varchar(200)", "upositive":"float", - "unegative":"float", - "maxspeed":"float", - "maxpace":"float", - "pace":"float", - "maxbeats":"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", + "sports":{ "id_sports":"integer primary key autoincrement", "name":"varchar(100)", - "weight":"float", + "weight":"float", "met":"float", }, "waypoints":{ "id_waypoint":"integer primary key autoincrement", @@ -136,7 +159,7 @@ "start_lon": "float", "end_lat": "float", "end_lon": "float", - "calories": "int", + "calories": "int", }, } try: @@ -152,7 +175,7 @@ logging.debug('Found '+ str(len(tablesDB))+' tables in DB: '+ str(tablesDB)) # Create a compressed copy of current DB - try: + try: self.createDatabaseBackup() except: logging.error('Not able to make a copy of current DB. Printing traceback and exiting') @@ -209,7 +232,7 @@ #date field OK, just update date_time_local logging.debug("Updating record id: %s with date_time_local: %s" % (record[0], date_time_local) ) self.ddbbObject.update("records","date_time_local",[date_time_local], "id_record = %d" %record[0]) - else: #Manual entry? + else: #Manual entry? #For manual entries, the UTC time is the local time #TODO figure out a way to correct this... pass Modified: pytrainer/trunk/pytrainer/lib/gpx.py =================================================================== --- pytrainer/trunk/pytrainer/lib/gpx.py 2010-05-16 03:00:24 UTC (rev 581) +++ pytrainer/trunk/pytrainer/lib/gpx.py 2010-05-16 10:13:38 UTC (rev 582) @@ -21,7 +21,7 @@ import math import re import os - + import time from datetime import datetime import logging @@ -51,6 +51,7 @@ class Gpx: def __init__(self, data_path = None, filename = None, trkname = None): logging.debug(">>") + print("GPX init-ing") global mainNS, timeTag, trackTag, trackPointTag, trackPointTagLast, trackSegTag, elevationTag, nameTag self.data_path = data_path self.filename = filename @@ -93,18 +94,18 @@ trackSegTag = mainNS.substitute(tag="trkseg") elevationTag = mainNS.substitute(tag="ele") nameTag = mainNS.substitute(tag="name") - + logging.debug("getting values...") self.Values = self._getValues() logging.debug("<<") def getMaxValues(self): return self.total_dist, self.total_time, self.maxvel, self.maxhr - + def getDate(self): return self.date - def getTrackRoutes(self): + def getTrackRoutes(self): trks = self.tree.findall(trackTag) tracks = [] retorno = [] @@ -127,10 +128,10 @@ def getDateTime(self, time_): return Date().getDateTime(time_) - + def getUnevenness(self): - return self.upositive,self.unegative - + return self.upositive,self.unegative + def getTrackList(self): return self.Values @@ -169,8 +170,8 @@ 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, stLat, stLon)) return lapInfo - - def _getValues(self): + + def _getValues(self): ''' Migrated to eTree XML processing 26 Nov 2009 - jblance ''' @@ -202,7 +203,7 @@ logging.debug( "No trkpoints found in file") return retorno logging.debug("%d trkpoints in file" % len(trkpoints)) - + date_ = tree.find(timeTag).text #mk_time = self.getDateTime(date_)[0] #UTC Date mk_time = self.getDateTime(date_)[1] #Local Date @@ -221,11 +222,11 @@ if hrResult is not None: hr = int(hrResult.text) len_validhrpoints += 1 - else: + else: hr = 0 #get the cadence (if present) cadResult = trkpoint.find(cadTag) - if cadResult is not None: + if cadResult is not None: cadence = int(cadResult.text) else: cadence = 0 @@ -241,26 +242,26 @@ eleResult = trkpoint.find(elevationTag) if eleResult is not None: ele = eleResult.text - else: + else: ele = None #chequeamos que la altura sea correcta / check that the height is correct if ele is not None: if len(ele)<15: - tmp_alt = int(float(ele)) #Why convert to int? ele are like "156.3515625" + tmp_alt = int(float(ele)) #Why convert to int? ele are like "156.3515625" else: print "ele len >= 15" + ele else: tmp_alt= 0 #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): #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_) - - #Para las vueltas diferentes a la primera / For the returns different from first + + #Para las vueltas diferentes a la primera / For the returns different from first if last_lat is not None: #time_ = tmp_time - last_time #if time_>0: @@ -329,7 +330,7 @@ #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 @@ -343,7 +344,7 @@ self.total_dist = total_dist logging.debug("<<") return retorno - + def _calculate_velocity(self,velocity, arr_velocity, numToAverage): #TODO Check & make generic '''Function to calculate moving average for speed''' arr_velocity.append(velocity) @@ -359,10 +360,10 @@ vel+= v vel /= numToAverage return vel,arr_velocity - + def getStartTimeFromGPX(self, gpxFile): """03.05.2008 - dgranda - Retrieves start time from a given gpx file + Retrieves start time from a given gpx file args: - gpxFile: path to xml file (gpx format) returns: string with start time - 2008-03-22T12:17:43Z Deleted: pytrainer/trunk/pytrainer/lib/heartrate.py =================================================================== --- pytrainer/trunk/pytrainer/lib/heartrate.py 2010-05-16 03:00:24 UTC (rev 581) +++ pytrainer/trunk/pytrainer/lib/heartrate.py 2010-05-16 10:13:38 UTC (rev 582) @@ -1,47 +0,0 @@ -# -*- coding: iso-8859-1 -*- - -#Copyright (C) Fiz Vazquez vu...@si... - -#This program is free software; you can redistribute it and/or -#modify it under the terms of the GNU General Public License -#as published by the Free Software Foundation; either version 2 -#of the License, or (at your option) any later version. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. - -#You should have received a copy of the GNU General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -def getZones(pytrainer_main=None): - maxhr = int(pytrainer_main.profile.getValue("pytraining","prf_maxhr")) - resthr = int(pytrainer_main.profile.getValue("pytraining","prf_minhr")) - - if pytrainer_main.profile.getValue("pytraining","prf_hrzones_karvonen")=="True": - #if karvonen method - targethr1 = ((maxhr - resthr) * 0.50) + resthr - targethr2 = ((maxhr - resthr) * 0.60) + resthr - targethr3 = ((maxhr - resthr) * 0.70) + resthr - targethr4 = ((maxhr - resthr) * 0.80) + resthr - targethr5 = ((maxhr - resthr) * 0.90) + resthr - targethr6 = maxhr - else: - #if not karvonen method - targethr1 = maxhr * 0.50 - targethr2 = maxhr * 0.60 - targethr3 = maxhr * 0.70 - targethr4 = maxhr * 0.80 - targethr5 = maxhr * 0.90 - targethr6 = maxhr - - zone1 = (targethr1,targethr2,"#ffff99",_("Moderate activity")) - zone2 = (targethr2,targethr3,"#ffcc00",_("Weight Control")) - zone3 = (targethr3,targethr4,"#ff9900",_("Aerobic")) - zone4 = (targethr4,targethr5,"#ff6600",_("Anaerobic")) - zone5 = (targethr5,targethr6,"#ff0000",_("VO2 MAX")) - - return zone5,zone4,zone3,zone2,zone1 - Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-05-16 03:00:24 UTC (rev 581) +++ pytrainer/trunk/pytrainer/main.py 2010-05-16 10:13:38 UTC (rev 582) @@ -52,9 +52,9 @@ from gui.windowmain import Main from gui.warning import Warning from lib.date import Date -from lib.gpx import Gpx +#from lib.gpx import Gpx +from activitypool import ActivityPool from lib.ddbb import DDBB -from lib.heartrate import * class pyTrainer: def __init__(self,filename = None, data_path = None): @@ -96,6 +96,7 @@ logging.info('No sanity check requested') self.record = Record(data_path,self) #preparamos la ventana principal + self.activitypool = ActivityPool(self, size=10) self.windowmain = Main(data_path,self,self.version, gpxDir=self.profile.gpxdir) self.date = Date(self.windowmain.calendar) self.waypoint = Waypoint(data_path,self) @@ -241,7 +242,7 @@ logging.debug('day view') record_list = self.record.getrecordList(date_selected) self.windowmain.actualize_dayview(record_list) - selected,iter = self.windowmain.recordTreeView.get_selection().get_selected() + #selected,iter = self.windowmain.recordTreeView.get_selection().get_selected() elif view=="week": logging.debug('week view') date_ini, date_end = self.date.getWeekInterval(date_selected, self.prf_us_system) @@ -253,7 +254,6 @@ date_ini, date_end = self.date.getMonthInterval(date_selected) sport = self.windowmain.getSportSelected() record_list = self.record.getrecordPeriodSport(date_ini, date_end,sport) - #logging.debug('record list: '+record_list) nameMonth, daysInMonth = self.date.getNameMonth(date_selected) self.windowmain.actualize_monthview(record_list, nameMonth) self.windowmain.actualize_monthgraph(record_list, daysInMonth) @@ -275,45 +275,21 @@ def refreshRecordGraphView(self, view): logging.debug('>>') logging.info('Working on '+view+' graph') + selected,iter = self.windowmain.recordTreeView.get_selection().get_selected() + if iter: + id_record = selected.get_value(iter,0) + else: + id_record = None + activity = self.activitypool.get_activity(id_record) if view=="info": - selected,iter = self.windowmain.recordTreeView.get_selection().get_selected() - record_list=[] - if iter: - id_record = selected.get_value(iter,0) - record_list = self.record.getrecordInfo(id_record) - self.windowmain.actualize_recordview(record_list) - + self.windowmain.actualize_recordview(activity) if view=="graphs": - selected,iter = self.windowmain.recordTreeView.get_selection().get_selected() - gpx_tracklist = [] - gpx_laps = None - if iter: - id_record = selected.get_value(iter,0) - gpxfile = self.profile.gpxdir+"/%s.gpx" %id_record - if os.path.isfile(gpxfile): - gpx = Gpx(self.data_path,gpxfile) - gpx_tracklist = gpx.getTrackList() - gpx_laps = self.record.getLaps(id_record) - self.windowmain.actualize_recordgraph(gpx_tracklist, gpx_laps) - + self.windowmain.actualize_recordgraph(activity) if view=="map": self.refreshMapView() - if view=="heartrate": - selected,iter = self.windowmain.recordTreeView.get_selection().get_selected() - gpx_tracklist = [] - record_list=[] - if iter: - id_record = selected.get_value(iter,0) - record_list = self.record.getrecordInfo(id_record) - gpxfile = self.profile.gpxdir+"/%s.gpx" %id_record - if os.path.isfile(gpxfile): - gpx = Gpx(self.data_path,gpxfile) - gpx_tracklist = gpx.getTrackList() - self.windowmain.actualize_heartrategraph(gpx_tracklist) - zones = getZones(self) #TODO from lib/heartrate.py import - can this file be consolidated? - karvonen_method = self.profile.getValue("pytraining","prf_hrzones_karvonen") - self.windowmain.actualize_hrview(record_list,zones,karvonen_method) + self.windowmain.actualize_heartrategraph(activity) + self.windowmain.actualize_hrview(activity) logging.debug('<<') def refreshMapView(self, full_screen=False): @@ -324,8 +300,9 @@ return selected,iter = self.windowmain.recordTreeView.get_selection().get_selected() id_record = selected.get_value(iter,0) + activity = self.activitypool.get_activity(id_record) logging.debug('Trying to show map for record '+str(id_record)) - self.windowmain.actualize_map(id_record, full_screen) + self.windowmain.actualize_map(activity, full_screen) logging.debug('<<') def refreshListRecords(self): Modified: pytrainer/trunk/pytrainer/profile.py =================================================================== --- pytrainer/trunk/pytrainer/profile.py 2010-05-16 03:00:24 UTC (rev 581) +++ pytrainer/trunk/pytrainer/profile.py 2010-05-16 10:13:38 UTC (rev 582) @@ -77,6 +77,7 @@ self.configuration = self._parse_config_file(self.config_file) logging.debug("Configuration retrieved: "+str(self.configuration)) self.pytrainer_main.ddbb = DDBB(self, pytrainer_main=self.pytrainer_main) + self._setZones() logging.debug("<<") def _setHome(self): @@ -134,6 +135,36 @@ if not os.path.isdir(self.plugindir): os.mkdir(self.plugindir) + def _setZones(self): + maxhr = int(self.getValue("pytraining","prf_maxhr")) + resthr = int(self.getValue("pytraining","prf_minhr")) + + if self.getValue("pytraining","prf_hrzones_karvonen")=="True": + #karvonen method + targethr1 = ((maxhr - resthr) * 0.50) + resthr + targethr2 = ((maxhr - resthr) * 0.60) + resthr + targethr3 = ((maxhr - resthr) * 0.70) + resthr + targethr4 = ((maxhr - resthr) * 0.80) + resthr + targethr5 = ((maxhr - resthr) * 0.90) + resthr + targethr6 = maxhr + else: + #not karvonen method + targethr1 = maxhr * 0.50 + targethr2 = maxhr * 0.60 + targethr3 = maxhr * 0.70 + targethr4 = maxhr * 0.80 + targethr5 = maxhr * 0.90 + targethr6 = maxhr + + self.zone1 = (targethr1,targethr2,"#ffff99",_("Moderate activity")) + self.zone2 = (targethr2,targethr3,"#ffcc00",_("Weight Control")) + self.zone3 = (targethr3,targethr4,"#ff9900",_("Aerobic")) + self.zone4 = (targethr4,targethr5,"#ff6600",_("Anaerobic")) + self.zone5 = (targethr5,targethr6,"#ff0000",_("VO2 MAX")) + + def getZones(self): + return self.zone5,self.zone4,self.zone3,self.zone2,self.zone1 + def getConfFile(self): if not os.path.isfile(self.conffile): return False @@ -273,3 +304,4 @@ logging.debug("--") self.pytrainer_main.refreshMainSportList() + Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2010-05-16 03:00:24 UTC (rev 581) +++ pytrainer/trunk/pytrainer/record.py 2010-05-16 10:13:38 UTC (rev 582) @@ -31,7 +31,7 @@ class Record: def __init__(self, data_path = None, parent = None): - logging.debug('>>') + logging.debug('>>') self.parent = parent self.pytrainer_main = parent self.data_path = data_path @@ -44,7 +44,7 @@ self.recordwindow = WindowRecord(self.data_path, list_sport,self, date, title, distance, time, upositive, unegative, bpm, calories, comment) self.recordwindow.run() logging.debug('<<') - + def newMultiRecord(self, activities, list_sport): logging.debug('>>') #activities (activity_id, start_time, distance, duration, sport, gpx_file) @@ -70,7 +70,7 @@ logging.debug('launching window') self.recordwindow.run() logging.debug('<<') - + def removeRecord(self,id_record): logging.debug('>>') record = self.pytrainer_main.ddbb.delete("records", "id_record=\"%s\"" %id_record) @@ -89,7 +89,7 @@ cells= "date,sport,distance,time,beats,comments,average,calories,title,upositive,unegative,maxspeed,maxpace,pace,maxbeats" if (list_options["rcd_beats"] == ""): list_options["rcd_beats"] = 0 - + #calculate the sport id sport_id = self.pytrainer_main.ddbb.select("sports","id_sports","name=\"%s\"" %list_options["rcd_sport"])[0][0] @@ -112,7 +112,7 @@ ) logging.debug('<<') return cells,values - + def _formatRecordNew (self, list_options): """20.07.2008 - dgranda New records handle date_time_utc field which is transparent when updating, so logic method has been splitted @@ -124,7 +124,7 @@ 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 - + #retrieving sport id (adding sport if it doesn't exist yet) sport_id = self.getSportId(list_options["rcd_sport"],add=True) @@ -177,7 +177,7 @@ #self.parent.refreshListRecords() logging.debug('<<') return self.pytrainer_main.ddbb.lastRecord("records") - + def insertNewRecord(self, gpxOrig, entry): #TODO consolidate with insertRecord """29.03.2008 - dgranda Moves GPX file to store destination and updates database @@ -187,11 +187,11 @@ if list_options is None: return None return self.insertRecord(list_options, laps=gpx_laps) - + def lapsFromGPX(self, gpx): logging.debug('>>') laps = [] - gpxLaps = gpx.getLaps() + gpxLaps = gpx.getLaps() for lap in gpxLaps: lap_number = gpxLaps.index(lap) tmp_lap = {} @@ -207,12 +207,12 @@ 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, list of laps + returns: list with fields and values, list of laps """ logging.debug('>>') gpx = Gpx(self.data_path,gpxOrig) @@ -235,7 +235,7 @@ summaryRecord['rcd_comments'] = '' summaryRecord['rcd_title'] = '' summaryRecord['rcd_time'] = time_hhmmss #ToDo: makes no sense to work with arrays - summaryRecord['rcd_distance'] = "%0.2f" %distance + summaryRecord['rcd_distance'] = "%0.2f" %distance if speed == 0: summaryRecord['rcd_pace'] = "0" else: @@ -286,13 +286,15 @@ return float(string) else: return 0 - + def getrecordInfo(self,id_record): logging.debug('--') + if id_record is None or id_record == "": + return [] return self.pytrainer_main.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,date_time_local", "id_record=\"%s\" and records.sport=sports.id_sports" %id_record) - + def getrecordList(self,date): logging.debug('--') return self.pytrainer_main.ddbb.select("records,sports", @@ -301,7 +303,7 @@ def getLaps(self, id_record): logging.debug('--') - laps = self.pytrainer_main.ddbb.select("laps", + laps = self.pytrainer_main.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 @@ -316,17 +318,17 @@ 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.pytrainer_main.ddbb.select("laps", + #Try to get lap info again #TODO? refactor + laps = self.pytrainer_main.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 - + return laps + def insertLaps(self, cells, values): logging.debug('--') logging.debug("Adding lap information: " + ", ".join(map(str, values))) self.pytrainer_main.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" @@ -334,9 +336,9 @@ condition = "date>=\"%s\" and date<=\"%s\" and records.sport=sports.id_sports" %(date_ini,date_end) else: condition = "date>=\"%s\" and date<=\"%s\" and records.sport=sports.id_sports and sports.name=\"%s\"" %(date_ini,date_end, sport) - + return self.pytrainer_main.ddbb.select(tables,"date,distance,time,beats,comments,average,calories,maxspeed,maxbeats, sports.name", condition) - + def getrecordPeriodSport(self,date_ini, date_end,sport): if not sport: tables = "records" @@ -344,7 +346,7 @@ else : tables = "records,sports" condition = "date>\"%s\" and date<\"%s\" and records.sport=sports.id_sports and sports.name=\"%s\"" %(date_ini,date_end,sport) - + return self.pytrainer_main.ddbb.select(tables, "date,distance,time,beats,comments,average,calories,maxspeed,maxbeats", condition) @@ -352,16 +354,16 @@ def getSportMet(self,sport): logging.debug('--') return self.pytrainer_main.ddbb.select("sports","met","name=\"%s\"" %(sport))[0][0] - + def getSportWeight(self,sport): logging.debug('--') return self.pytrainer_main.ddbb.select("sports","weight","name=\"%s\"" %(sport))[0][0] - + def getSportId(self,sport,add=None): """31.08.2008 - dgranda Retrieves id_sports from provided sport. If add is not set to None, sport is added to the system arguments: - sport: sport's name to get id from + sport: sport's name to get id from add: attribute to add or not the sport to db returns: id_sports from provided sport""" logging.debug('>>') @@ -380,12 +382,12 @@ sport_id = self.addNewSport(sport,"0","0") logging.debug('<<') return sport_id - + def addNewSport(self,sport,met,weight): """31.08.2008 - dgranda Copied from Profile class, adds a new sport. arguments: - sport: sport's name + sport: sport's name met: weight: returns: id_sports from new sport""" @@ -396,20 +398,20 @@ sport_id = self.pytrainer_main.ddbb.select("sports","id_sports","name=\"%s\"" %(sport))[0][0] logging.debug("<<") return sport_id - + def getAllrecord(self): logging.debug('--') return self.pytrainer_main.ddbb.select("records", "date,distance,time,beats,comments,average,calories") - + def getAllRecordList(self): logging.debug('--') - return self.pytrainer_main.ddbb.select("records,sports", + return self.pytrainer_main.ddbb.select("records,sports", "date,distance,average,title,sports.name,id_record,time,beats,calories", "sports.id_sports = records.sport order by date desc") - + def getRecordListByCondition(self,condition): logging.debug('--') - return self.pytrainer_main.ddbb.select("records,sports", + return self.pytrainer_main.ddbb.select("records,sports", "date,distance,average,title,sports.name,id_record,time,beats,calories", "sports.id_sports = records.sport and %s" %condition) @@ -427,7 +429,7 @@ day_list.append(record[2]) logging.debug('<<') return day_list - + def actualize_fromgpx(self,gpxfile): #TODO remove? - should never have multiple tracks per GPX file logging.debug('>>') logging.debug('loading file: '+gpxfile) @@ -455,7 +457,7 @@ heartrate = gpx.getHeartRateAverage() date = gpx.getDate() calories = gpx.getCalories() - + self.recordwindow.rcd_date.set_text(date) self.recordwindow.rcd_upositive.set_text(str(upositive)) self.recordwindow.rcd_unegative.set_text(str(unegative)) @@ -470,7 +472,7 @@ self.recordwindow.on_calccalories_clicked(None) self.recordwindow.rcd_maxpace.set_text("%d.%02d" %((3600/maxspeed)/60,(3600/maxspeed)%60)) logging.debug('<<') - + def __actualize_fromgpx(self, gpxfile, name=None): logging.debug('>>') gpx = Gpx(self.data_path,gpxfile,name) @@ -484,7 +486,7 @@ logging.debug('Launching window...') selectrckdialog.run() logging.debug('<<') - + 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)) @@ -500,7 +502,7 @@ def importFromGPX(self, gpxFile, sport): """ Add a record from a valid pytrainer type GPX file - """ + """ logging.debug('>>') entry_id = None if not os.path.isfile(gpxFile): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-05-16 10:29:47
|
Revision: 583 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=583&view=rev Author: jblance Date: 2010-05-16 10:29:41 +0000 (Sun, 16 May 2010) Log Message: ----------- Removed print statements from ActivityPool, implemented last-used-first-out queue and fixed so does not grow past size limit Modified Paths: -------------- pytrainer/trunk/pytrainer/activitypool.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/activitypool.py =================================================================== --- pytrainer/trunk/pytrainer/activitypool.py 2010-05-16 10:13:38 UTC (rev 582) +++ pytrainer/trunk/pytrainer/activitypool.py 2010-05-16 10:29:41 UTC (rev 583) @@ -32,18 +32,27 @@ print("Error - must initialise with a reference to the main pytrainer class") return None self.pytrainer_main = pytrainer_main + self.max_size = size self.pool = {} self.pool_queue = [] - print("Initialising ActivityPool to size: %d" % size) + logging.debug("Initialising ActivityPool to size: %d" % size) logging.debug("<<") def get_activity(self, id): sid = str(id) if sid in self.pool.keys(): - print("Found activity in pool, returning....") + logging.debug("Found activity in pool") + self.pool_queue.remove(sid) + self.pool_queue.append(sid) else: - print("Activity NOT found in pool, initing and returning....") + logging.debug("Activity NOT found in pool") self.pool[sid] = Activity(pytrainer_main = self.pytrainer_main, id = id) self.pool_queue.append(sid) + if len(self.pool_queue) > self.max_size: + sid_to_remove = self.pool_queue.pop(0) + logging.debug("Removing activity: %s" % sid_to_remove) + del self.pool[sid_to_remove] + logging.debug("ActivityPool queue length: %d" % len(self.pool_queue)) + logging.debug("ActivityPool queue: %s" % str(self.pool_queue)) return self.pool[sid] - print("ActivityPool queue length: %d" % len(self.pool_queue)) + Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-05-16 10:13:38 UTC (rev 582) +++ pytrainer/trunk/pytrainer/main.py 2010-05-16 10:29:41 UTC (rev 583) @@ -59,7 +59,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#581" + self.version ="1.7.2_svn#583" self.DB_version = 3 #Process command line options self.startup_options = self.get_options() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-05-16 11:02:15
|
Revision: 584 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=584&view=rev Author: jblance Date: 2010-05-16 11:02:08 +0000 (Sun, 16 May 2010) Log Message: ----------- Fixed error in activity when no id supplied Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/lib/activity.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 2010-05-16 10:29:41 UTC (rev 583) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-05-16 11:02:08 UTC (rev 584) @@ -189,6 +189,11 @@ def actualize_recordview(self,activity): logging.debug(">>") + if activity.id is None: + self.recordview.set_current_page(0) + self.recordview.set_sensitive(0) + logging.debug("<<") + return #Set the units for the activity results, e.g. km, km/h etc self.r_distance_unit.set_text(activity.distance_unit) self.r_speed_unit.set_text(activity.speed_unit) @@ -232,7 +237,7 @@ else: self.recordview.set_current_page(0) self.recordview.set_sensitive(0) - logging.debug(">>") + logging.debug("<<") def actualize_recordgraph(self,activity): logging.debug(">>") Modified: pytrainer/trunk/pytrainer/lib/activity.py =================================================================== --- pytrainer/trunk/pytrainer/lib/activity.py 2010-05-16 10:29:41 UTC (rev 583) +++ pytrainer/trunk/pytrainer/lib/activity.py 2010-05-16 11:02:08 UTC (rev 584) @@ -31,12 +31,15 @@ ''' def __init__(self, pytrainer_main = None, id = None): logging.debug(">>") + self.id = id + #It is an error to try to initialise with no id + if self.id is None: + return #It is an error to try to initialise with no reference to pytrainer_main if pytrainer_main is None: print("Error - must initialise with a reference to the main pytrainer class") - return None + return self.pytrainer_main = pytrainer_main - self.id = id self.tracks = None self.laps = None self.tree = None @@ -149,7 +152,7 @@ for lap in gpxLaps: lap_number = gpxLaps.index(lap) tmp_lap = {} - tmp_lap['record'] = "" + tmp_lap['record'] = self.id tmp_lap['lap_number'] = lap_number tmp_lap['elapsed_time'] = lap[0] tmp_lap['distance'] = lap[4] @@ -159,17 +162,11 @@ tmp_lap['end_lon'] = lap[2] tmp_lap['calories'] = lap[3] laps.append(tmp_lap) - '''if laps is not None: + 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.pytrainer_main.ddbb.select("laps", - "id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories, lap_number", - "record=\"%s\"" % id_record) - ''' + self.pytrainer_main.record.insertLaps(lap_keys,lap.values()) logging.debug("<<") return laps Modified: pytrainer/trunk/pytrainer/lib/gpx.py =================================================================== --- pytrainer/trunk/pytrainer/lib/gpx.py 2010-05-16 10:29:41 UTC (rev 583) +++ pytrainer/trunk/pytrainer/lib/gpx.py 2010-05-16 11:02:08 UTC (rev 584) @@ -150,6 +150,7 @@ #date = tree.findtext(timeTag) #startTime = self.getDateTime(date) laps = tree.findall(lapTag) + logging.debug("Found %d laps" % len(laps)) for lap in laps: endPoint = lap.find(endPointTag) lat = endPoint.get("lat") @@ -169,6 +170,7 @@ 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, stLat, stLon)) + logging.debug("<<") return lapInfo def _getValues(self): Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-05-16 10:29:41 UTC (rev 583) +++ pytrainer/trunk/pytrainer/main.py 2010-05-16 11:02:08 UTC (rev 584) @@ -59,7 +59,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#583" + self.version ="1.7.2_svn#584" self.DB_version = 3 #Process command line options self.startup_options = self.get_options() @@ -280,6 +280,7 @@ id_record = selected.get_value(iter,0) else: id_record = None + view="info" activity = self.activitypool.get_activity(id_record) if view=="info": self.windowmain.actualize_recordview(activity) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-05-18 09:00:07
|
Revision: 585 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=585&view=rev Author: jblance Date: 2010-05-18 09:00:00 +0000 (Tue, 18 May 2010) Log Message: ----------- Thanks to Druzee: New option to choose between google and openstreetmaps for map display, new mapviewer class to allow other map types to be added Modified Paths: -------------- pytrainer/trunk/pytrainer/activitypool.py pytrainer/trunk/pytrainer/extensions/googlemaps.py pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/recordgraph.py Added Paths: ----------- pytrainer/trunk/pytrainer/extensions/mapviewer.py pytrainer/trunk/pytrainer/extensions/osm.py Modified: pytrainer/trunk/pytrainer/activitypool.py =================================================================== --- pytrainer/trunk/pytrainer/activitypool.py 2010-05-16 11:02:08 UTC (rev 584) +++ pytrainer/trunk/pytrainer/activitypool.py 2010-05-18 09:00:00 UTC (rev 585) @@ -17,7 +17,6 @@ #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. import logging - from lib.activity import Activity class ActivityPool: @@ -30,7 +29,7 @@ #It is an error to try to initialise with no reference to pytrainer_main if pytrainer_main is None: print("Error - must initialise with a reference to the main pytrainer class") - return None + return self.pytrainer_main = pytrainer_main self.max_size = size self.pool = {} @@ -42,6 +41,7 @@ sid = str(id) if sid in self.pool.keys(): logging.debug("Found activity in pool") + #Have accessed this activity, place at end of queue self.pool_queue.remove(sid) self.pool_queue.append(sid) else: @@ -55,4 +55,3 @@ logging.debug("ActivityPool queue length: %d" % len(self.pool_queue)) logging.debug("ActivityPool queue: %s" % str(self.pool_queue)) return self.pool[sid] - Modified: pytrainer/trunk/pytrainer/extensions/googlemaps.py =================================================================== --- pytrainer/trunk/pytrainer/extensions/googlemaps.py 2010-05-16 11:02:08 UTC (rev 584) +++ pytrainer/trunk/pytrainer/extensions/googlemaps.py 2010-05-18 09:00:00 UTC (rev 585) @@ -27,17 +27,12 @@ #from pytrainer.record import Record class Googlemaps: - def __init__(self, data_path = None, vbox = None, waypoint = None, pytrainer_main=None): + def __init__(self, data_path = None, waypoint = None, pytrainer_main=None): logging.debug(">>") self.data_path = data_path self.waypoint=waypoint self.pytrainer_main = pytrainer_main - gtkmozembed.set_profile_path("/tmp", "foobar") # http://faq.pygtk.org/index.py?req=show&file=faq19.018.htp #TODO FIX??? - self.moz = gtkmozembed.MozEmbed() - vbox.pack_start(self.moz, True, True) - vbox.show_all() - self.htmlfile = "%s/index.html" % (self.pytrainer_main.profile.tmpdir) - + self.htmlfile = "%s/googlemaps.html" % (self.pytrainer_main.profile.tmpdir) logging.debug("<<") def drawMap(self,activity): @@ -48,10 +43,6 @@ info at http://www.pygtk.org/pygtkmozembed/class-gtkmozembed.html ''' logging.debug(">>") - code = "googlemapsviewer" - extensiondir = self.pytrainer_main.profile.extensiondir+"/"+code - if not os.path.isdir(extensiondir): - os.mkdir(extensiondir) points = [] levels = [] pointlist = [] @@ -93,7 +84,7 @@ self.createErrorHtml() else: self.createErrorHtml() - self.moz.load_url("file://%s" % (self.htmlfile)) + return self.htmlfile logging.debug("<<") def createHtml_api3(self,polyline, minlat, minlon, maxlat, maxlon, startinfo, finishinfo, laps): Added: pytrainer/trunk/pytrainer/extensions/mapviewer.py =================================================================== --- pytrainer/trunk/pytrainer/extensions/mapviewer.py (rev 0) +++ pytrainer/trunk/pytrainer/extensions/mapviewer.py 2010-05-18 09:00:00 UTC (rev 585) @@ -0,0 +1,67 @@ +# -*- coding: iso-8859-1 -*- + +#Copyright (C) Fiz Vazquez vu...@si... + +#This program is free software; you can redistribute it and/or +#modify it under the terms of the GNU General Public License +#as published by the Free Software Foundation; either version 2 +#of the License, or (at your option) any later version. + +#This program is distributed in the hope that it will be useful, +#but WITHOUT ANY WARRANTY; without even the implied warranty of +#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +#GNU General Public License for more details. + +#You should have received a copy of the GNU General Public License +#along with this program; if not, write to the Free Software +#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +import gtkmozembed +import logging +import os + +from pytrainer.lib.fileUtils import fileUtils + +class MapViewer: + def __init__(self, data_path = None, pytrainer_main=None, box=None): + logging.debug(">>") + self.data_path = data_path + self.pytrainer_main = pytrainer_main + if box is None: + logging.debug("Display box (%s) is None" % ( str(box))) + return + self.box = box + gtkmozembed.set_profile_path("/tmp", "foobar") # http://faq.pygtk.org/index.py?req=show&file=faq19.018.htp #TODO FIX??? + self.moz = gtkmozembed.MozEmbed() + self.pack_box() + logging.debug("<<") + + def pack_box(self): + logging.debug(">>") + self.box.pack_start(self.moz, True, True) + self.box.show_all() + logging.debug("<<") + + def display_map(self, htmlfile=None): + logging.debug(">>") + if htmlfile is None: + htmlfile = self.createErrorHtml() + self.moz.load_url("file://%s" % (htmlfile)) + #self.box.show_all() + logging.debug("<<") + + def createErrorHtml(self): + logging.debug(">>") + htmlfile = "%s/error.html" % (self.pytrainer_main.profile.tmpdir) + content = '''<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml"> +<head> +<body> +No HTML file supplied to display +</body> +</html> + ''' + file = fileUtils(htmlfile,content) + file.run() + logging.debug("<<") + return htmlfile Added: pytrainer/trunk/pytrainer/extensions/osm.py =================================================================== --- pytrainer/trunk/pytrainer/extensions/osm.py (rev 0) +++ pytrainer/trunk/pytrainer/extensions/osm.py 2010-05-18 09:00:00 UTC (rev 585) @@ -0,0 +1,230 @@ +# Testing OpenStreetMaps integration +# TODO: store OpenLayers.js locally (1MB file) +# TODO: Add start/finish/lap markers + info popups on click with full details + +import gtkmozembed +import os +import re +import logging + +from pytrainer.lib.gpx import Gpx +import pytrainer.lib.points as Points +from pytrainer.lib.fileUtils import fileUtils +from pytrainer.record import Record + +class Osm: + def __init__(self, data_path = None, waypoint = None, pytrainer_main=None): + logging.debug(">>") + self.data_path = data_path + self.waypoint=waypoint + self.pytrainer_main = pytrainer_main + self.htmlfile = "%s/osm.html" % (self.pytrainer_main.profile.tmpdir) + logging.debug("<<") + + def drawMap(self,activity): + '''Draw osm map + create html file using Open Layers and Open Street Map + render using embedded Mozilla + + info at http://www.pygtk.org/pygtkmozembed/class-gtkmozembed.html + ''' + logging.debug(">>") + points = [] + levels = [] + pointlist = [] + polyline = [] + + list_values = activity.tracks + if list_values != []: + if len(list_values) > 0: + for i in list_values: + lat, lon = float(i[4]), float(i[5]) + pointlist.append((lat,lon)) + polyline.append("[%s, %s]" % (lon, lat)) + points,levels = Points.encodePoints(pointlist) + points = points.replace("\\","\\\\") + laps = activity.laps + timeHours = int(activity.time) / 3600 + timeMin = (float(activity.time) / 3600.0 - timeHours) * 60 + time = "%d%s %02d%s" % (timeHours, _("h"), timeMin, _("min")) + startinfo = "<div class='info_content'>%s: %s</div>" % (activity.sport_name, activity.title) + finishinfo = "<div class='info_content'>%s: %s<br>%s: %s%s</div>" % (_("Time"), time, _("Distance"), activity.distance, activity.distance_unit) + startinfo = startinfo.encode('ascii', 'xmlcharrefreplace') #Encode for html + finishinfo = finishinfo.encode('ascii', 'xmlcharrefreplace') #Encode for html + + self.createHtml_osm(polyline, startinfo, finishinfo, laps) + else: + self.createErrorHtml() + else: + self.createErrorHtml() + #self.moz.load_url("file://%s" % (self.htmlfile)) + return self.htmlfile + logging.debug("<<") + + def createHtml_osm(self, polyline, startinfo, finishinfo, laps): + ''' + Generate OSM map html file using MapLayers + ''' + logging.debug(">> OSM start createHtml") + content = ''' + <html> + <head> + <!-- bring in the OpenLayers javascript library + (here we bring it from the remote site, but you could + easily serve up this javascript yourself) --> + <script src="http://www.openlayers.org/api/OpenLayers.js"></script> + <!-- bring in the OpenStreetMap OpenLayers layers. + Using this hosted file will make sure we are kept up + to date with any necessary changes --> + <script src="http://www.openstreetmap.org/openlayers/OpenStreetMap.js"></script> + + <script type="text/javascript"> + //complex object of type OpenLayers.Map + var map; + + //icons data object + var icons = { + start : { url : "/start.png", coordinates : %s, popupInfo : "%s" }, + finish : { url : "/finish.png", coordinates : %s, popupInfo : "%s" }, + lap : { url : "/lap.png" }, + url : "file://%s/glade", + iconSize : new OpenLayers.Size(30,30) + };''' % (polyline[0], startinfo, polyline[-1], finishinfo, os.path.abspath(self.data_path)) + content+='''\n + function init() { + + // for transforming WGS 1984 to Spherical Mercator Projection + pWGS = new OpenLayers.Projection("EPSG:4326"); + pMP = new OpenLayers.Projection("EPSG:900913"); + + map = new OpenLayers.Map ("map", { + controls:[ + new OpenLayers.Control.Navigation(), + new OpenLayers.Control.PanZoomBar(), + new OpenLayers.Control.LayerSwitcher(), + new OpenLayers.Control.Attribution()], + maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34), + maxResolution: 156543.0399, + numZoomLevels: 19, + units: 'm', + projection: pMP, + displayProjection: pWGS + } ); + + // Track painting style + var trackStyle = { + strokeColor: "#33DDDD", + strokeWidth: 3, + strokeDashstyle: "solid", + strokeOpacity: 0.6, + pointRadius: 6, + }; + + //Build track object + var track = + { + "type":"Feature", + "id":"OpenLayers.Feature.Vector_259", + "properties":{}, + "geometry": + { + "type":"LineString", + "coordinates": + [\n''' + #Insert track points - all but last one + for point in polyline[:-1]: + content+="%s," % (point) + #Insert last point without comma so the javascript syntax stays correct + content+="%s\n" % (polyline[-1]) + content+=''' ] + }, + "crs": + { + "type":"OGC", + "properties": + { + "urn":"urn:ogc:def:crs:OGC:1.3:CRS84" + } + } + } + + //Add open street maps layers + layerMapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik"); + map.addLayer(layerMapnik); + layerTilesAtHome = new OpenLayers.Layer.OSM.Osmarender("Osmarender"); + map.addLayer(layerTilesAtHome); + + //Create vector layer to add the data on to + var vector_layer = new OpenLayers.Layer.Vector(); + vector_layer.setName('Track'); + + var geojson_format = new OpenLayers.Format.GeoJSON(); + var feature = geojson_format.read(track,"Feature"); + + // transform from WGS 1984 to Spherical Mercator Projection + feature.geometry.transform(pWGS, pMP); + + feature.geometry.calculateBounds(); + var vector=new OpenLayers.Feature.Vector(); + vector.geometry = feature.geometry; + vector.style=trackStyle; + + vector_layer.addFeatures(vector); + map.addLayer(vector_layer); + + // Insert start/finish markers + layerMarkers = new OpenLayers.Layer.Markers("Markers"); + var offset = new OpenLayers.Pixel(-(icons.iconSize.w/2), -icons.iconSize.h); + for (var i in icons) { + if (icons[i].coordinates) { + icons[i].icon = new OpenLayers.Icon(icons.url + icons[i].url,icons.iconSize,offset); + icons[i].lonLat = new OpenLayers.LonLat(icons[i].coordinates[0],icons[i].coordinates[1]); + icons[i].lonLat.transform(pWGS,pMP); + icons[i].marker = new OpenLayers.Marker(icons[i].lonLat,icons[i].icon); + icons[i].popup = new OpenLayers.Popup.FramedCloud("Info", + icons[i].lonLat, + null, + icons[i].popupInfo, + icons[i].icon, + true, + null + ); + icons[i].onClick = function(e) { map.addPopup(this.popup); this.popup.show(); } + icons[i].marker.events.register("mousedown", icons[i], function(e) { this.onClick(e)} ) + layerMarkers.addMarker(icons[i].marker); + } + } + map.addLayer(layerMarkers); + + //zoom and center to the track layouts + map.zoomToExtent(feature.geometry.getBounds()); + + } + </script> + + </head> + <!-- body.onload is called once the page is loaded (call the 'init' function) --> + <body onload="init();"> + <!-- define a DIV into which the map will appear. Make it take up the whole window --> + <div style="width:100%; height:100%" id="map"></div> + </body> + </html> + ''' + file = fileUtils(self.htmlfile,content) + file.run() + logging.debug("<<") + + def createErrorHtml(self): + logging.debug(">>") + content = ''' + <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> + <html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml"> + <body> + No Gpx Data + </body> + </html> + ''' + file = fileUtils(self.htmlfile,content) + file.run() + logging.debug("<<") + Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2010-05-16 11:02:08 UTC (rev 584) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-05-18 09:00:00 UTC (rev 585) @@ -31,6 +31,8 @@ from pytrainer.lib.date import Date from pytrainer.lib.xmlUtils import XMLParser #from pytrainer.lib.gpx import Gpx +from pytrainer.extensions.googlemaps import Googlemaps +from pytrainer.extensions.osm import Osm from pytrainer.lib.unitsconversor import * class Main(SimpleGladeApp): @@ -157,9 +159,13 @@ self.drawareamonth = MonthGraph(self.month_vbox, self.window1, self.month_combovalue,self.month_combovalue2) self.drawareayear = YearGraph(self.year_vbox, self.window1, self.year_combovalue,self.year_combovalue2) - def createMap(self,Googlemaps,waypoint): - self.googlemaps = Googlemaps(self.data_path, self.map_vbox,waypoint, pytrainer_main=self.parent) - self.googlemaps_old = Googlemaps(self.data_path, self.map_vbox_old,waypoint, pytrainer_main=self.parent) + def createMap(self,MapViewer,waypoint): + self.waypoint = waypoint + self.mapviewer = MapViewer(self.data_path, pytrainer_main=self.parent, box=self.map_vbox) + self.mapviewer_fs = MapViewer(self.data_path, pytrainer_main=self.parent, box=self.map_vbox_old) + #self.googlemaps = Googlemaps(self.data_path, self.map_vbox,waypoint, pytrainer_main=self.parent) + #self.osm = Osm(self.data_path, self.map_vbox,waypoint, pytrainer_main=self.parent) + #self.googlemaps_old = Googlemaps(self.data_path, self.map_vbox_old,waypoint, pytrainer_main=self.parent) def updateSportList(self,listSport): logging.debug(">>") @@ -367,23 +373,28 @@ self.drawareaday.drawgraph(record_list) logging.debug("<<") - def actualize_map(self,id_record, full_screen=False): + def actualize_map(self,activity, full_screen=False): logging.debug(">>") #Check which type of map viewer to use if self.radiobuttonOSM.get_active(): #Use OSM to draw map logging.debug("Using OSM to draw map....") - self.googlemaps.drawMap(-9999) #TODO placeholder for OSM code + htmlfile = Osm(data_path=self.data_path, waypoint=self.waypoint, pytrainer_main=self.parent).drawMap(activity) elif self.radiobuttonGMap.get_active(): #Use Google to draw map logging.debug("Using Google to draw map") - if full_screen: - self.googlemaps_old.drawMap(id_record) #TODO - sort this to be more generic, maybe pass map target? - else: - self.googlemaps.drawMap(id_record) #TODO - sort this to be more generic, maybe pass map target? + htmlfile = Googlemaps(data_path=self.data_path, waypoint=self.waypoint, pytrainer_main=self.parent).drawMap(activity) else: #Unknown map type... logging.error("Unknown map viewer requested") + htmlfile = self.mapviewer.createErrorHtml() + logging.debug("Displaying htmlfile: %s" % htmlfile) + if full_screen: + logging.debug("Displaying in full screen mode") + self.mapviewer_fs.display_map(htmlfile=htmlfile) + else: + logging.debug("Displaying in embedded mode") + self.mapviewer.display_map(htmlfile=htmlfile) logging.debug("<<") def actualize_weekview(self, record_list, date_ini, date_end): Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-05-16 11:02:08 UTC (rev 584) +++ pytrainer/trunk/pytrainer/main.py 2010-05-18 09:00:00 UTC (rev 585) @@ -45,7 +45,9 @@ from yeargraph import YearGraph from heartrategraph import HeartRateGraph -from extensions.googlemaps import Googlemaps +from extensions.googlemaps import Googlemaps #TODO +from extensions.osm import Osm # +from extensions.mapviewer import MapViewer # from extensions.waypointeditor import WaypointEditor from gui.windowimportdata import WindowImportdata @@ -59,7 +61,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#584" + self.version ="1.7.2_svn#585" self.DB_version = 3 #Process command line options self.startup_options = self.get_options() @@ -106,7 +108,7 @@ self.loadPlugins() self.loadExtensions() self.windowmain.createGraphs(RecordGraph,DayGraph,WeekGraph, MonthGraph,YearGraph,HeartRateGraph) - self.windowmain.createMap(Googlemaps,self.waypoint) + self.windowmain.createMap(MapViewer,self.waypoint) self.windowmain.createWaypointEditor(WaypointEditor,self.waypoint, parent=self) self.windowmain.on_calendar_selected(None) self.refreshMainSportList() Modified: pytrainer/trunk/pytrainer/recordgraph.py =================================================================== --- pytrainer/trunk/pytrainer/recordgraph.py 2010-05-16 11:02:08 UTC (rev 584) +++ pytrainer/trunk/pytrainer/recordgraph.py 2010-05-18 09:00:00 UTC (rev 585) @@ -22,7 +22,7 @@ class RecordGraph: def __init__(self, vbox = None, window = None, combovalue = None, combovalue2 = None, btnShowLaps = None, tableConfig = None): - logging.debug(">>") + logging.debug(">>") self.drawarea = DrawArea(vbox, window) self.combovalue = combovalue self.combovalue2 = combovalue2 @@ -32,7 +32,7 @@ def drawgraph(self,values,laps=None, y1limits=None, y1color=None, y1_linewidth=1): logging.debug(">>") - #Get the config options + #Get the config options for child in self.config_table.get_children(): if child.get_name() == "spinbuttonY1Max": spinbuttonY1Max = child @@ -42,7 +42,7 @@ colorbuttonY1LineColor = child elif child.get_name() == "spinbuttonY1LineWeight": spinbuttonY1LineWeight = child - + xval = [] yval = [] xlab = [] @@ -59,7 +59,7 @@ if laps is not None and showLaps: lapValues = [] lastPoint = 0.0 - for lap in laps: #"id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories", + 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 @@ -69,7 +69,7 @@ if value_selected < 0: self.combovalue.set_active(0) value_selected = 0 - + if value_selected2 < 0: self.combovalue2.set_active(0) value_selected2 = 0 @@ -92,10 +92,10 @@ ylab.append(ylabel) tit.append(title) col.append(color) - + #_color = gtk.gdk.Color(color) colorbuttonY1LineColor.set_color(_color) - + if value_selected2 > 0: value_selected2 = value_selected2-1 xlabel,ylabel,title,color = self.get_value_params(value_selected2) @@ -107,14 +107,14 @@ xlab.append(xlabel) ylab.append(ylabel) tit.append("") - col.append(color) + col.append(color) logging.info("To show: tit: "+str(tit)+" | col: "+str(col)+" | xlab: "+str(xlab)+" | ylab: "+str(ylab)) #self.drawPlot(xvalues,yvalues,xlabel,ylabel,title,color,zones) plot_stats = self.drawarea.drawPlot(xval,yval,xlab,ylab,tit,col,None,lapValues, ylimits=y1limits, y1_linewidth=y1_linewidth) ymin = plot_stats['y1_min'] ymax = plot_stats['y1_max'] y1_linewidth = plot_stats['y1_linewidth'] - + max_yvalue = max(max_yvalue, ymax) min_yvalue = min(min_yvalue, ymin) adjY1Min = gtk.Adjustment(value=ymin, lower=min_yvalue,upper=max_yvalue, step_incr=1, page_incr=10) @@ -124,7 +124,7 @@ spinbuttonY1Min.set_value(ymin) spinbuttonY1Max.set_value(ymax) spinbuttonY1LineWeight.set_value(y1_linewidth) - + logging.debug("<<") def get_value_params(self,value): @@ -161,7 +161,7 @@ yvalue.append(value[7]) logging.debug("<<") return xvalue,yvalue - + def getFloatValue(self, value): try: return float(value) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-05-18 09:41:46
|
Revision: 586 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=586&view=rev Author: jblance Date: 2010-05-18 09:41:39 +0000 (Tue, 18 May 2010) Log Message: ----------- Fix to allow pytrainer to start with empty or missing conf.xml or missing .pytrainer directory Modified Paths: -------------- pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/profile.py Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-05-18 09:00:00 UTC (rev 585) +++ pytrainer/trunk/pytrainer/main.py 2010-05-18 09:41:39 UTC (rev 586) @@ -61,7 +61,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#585" + self.version ="1.7.2_svn#586" self.DB_version = 3 #Process command line options self.startup_options = self.get_options() @@ -472,5 +472,5 @@ #logging.info('Checking configuration file integrity') #self.profile.checkProfile() logging.info('Setting DB version to: ' + str(self.DB_version)) - self.profile.configuration.setValue("pytraining","DB_version", str(self.DB_version)) + self.profile.setValue("pytraining","DB_version", str(self.DB_version)) logging.debug('<<') Modified: pytrainer/trunk/pytrainer/profile.py =================================================================== --- pytrainer/trunk/pytrainer/profile.py 2010-05-18 09:00:00 UTC (rev 585) +++ pytrainer/trunk/pytrainer/profile.py 2010-05-18 09:41:39 UTC (rev 586) @@ -17,8 +17,9 @@ #along with this program; if not, write to the Free Software #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -import os, sys +import os, sys, stat import logging +from StringIO import StringIO from lxml import etree from lib.ddbb import DDBB @@ -136,8 +137,15 @@ os.mkdir(self.plugindir) def _setZones(self): - maxhr = int(self.getValue("pytraining","prf_maxhr")) - resthr = int(self.getValue("pytraining","prf_minhr")) + maxhr = self.getValue("pytraining","prf_maxhr") + resthr = self.getValue("pytraining","prf_minhr") + try: + maxhr = int(self.getValue("pytraining","prf_maxhr")) + resthr = int(self.getValue("pytraining","prf_minhr")) + except Exception as e: + logging.debug(str(e)) + maxhr = 220 + resthr = 65 if self.getValue("pytraining","prf_hrzones_karvonen")=="True": #karvonen method @@ -179,41 +187,46 @@ ''' if config_file is None: logging.error("Configuration file value not set") - elif not os.path.isfile(config_file): + logging.error("Fatal error, exiting") + exit(-3) + if not os.path.isfile(config_file): logging.error("Configuration '%s' file does not exist" % config_file) logging.info("No profile found. Creating default one") self.setProfile(self.profile_options) - else: - logging.debug("Attempting to parse content from "+ config_file) - try: - parser = etree.XMLParser(encoding='UTF8', recover=True) - self.xml_tree = etree.parse(config_file, parser=parser) - #TODO check here for empty file.... - # Checks if configuration file is empty - #if self.configuration.xmldoc is None: - # logging.error("Seems no data available in local configuration file: "+self.filename+", please check") - # logging.error("Fatal error, exiting") - # exit(-3) - #Have a populated xml tree, get pytraining node (root) and convert it to a dict - pytraining_tag = self.xml_tree.getroot() - config = {} - config_needs_update = False - for key, default in self.profile_options.items(): - value = pytraining_tag.get(key) - #If property is not found, set it to the default - if value is None: - config_needs_update = True - value = default - config[key] = value - #Added a property, so update config - if config_needs_update: - self.setProfile(config) - return config - except Exception as e: - logging.error("Error parsing file: %s. Exiting" % config_file) - logging.error(str(e)) - logging.error("Fatal error, exiting") - exit(-3) + if os.stat(config_file)[stat.ST_SIZE] == 0: + logging.error("Configuration '%s' file is empty" % config_file) + logging.info("Creating default profile") + self.setProfile(self.profile_options) + logging.debug("Attempting to parse content from "+ config_file) + try: + parser = etree.XMLParser(encoding='UTF8', recover=True) + self.xml_tree = etree.parse(config_file, parser=parser) + #TODO check here for empty file.... + # Checks if configuration file is empty + #if self.configuration.xmldoc is None: + # logging.error("Seems no data available in local configuration file: "+self.filename+", please check") + # logging.error("Fatal error, exiting") + # exit(-3) + #Have a populated xml tree, get pytraining node (root) and convert it to a dict + pytraining_tag = self.xml_tree.getroot() + config = {} + config_needs_update = False + for key, default in self.profile_options.items(): + value = pytraining_tag.get(key) + #If property is not found, set it to the default + if value is None: + config_needs_update = True + value = default + config[key] = value + #Added a property, so update config + if config_needs_update: + self.setProfile(config) + return config + except Exception as e: + logging.error("Error parsing file: %s. Exiting" % config_file) + logging.error(str(e)) + logging.error("Fatal error, exiting") + exit(-3) def getValue(self, tag, variable): if tag != "pytraining": @@ -228,6 +241,9 @@ if tag != "pytraining": print "ERROR - pytraining is the only profile tag supported" logging.debug("Setting %s to %s" % (variable, value)) + if self.xml_tree is None: + #new config file.... + self.xml_tree = etree.parse(StringIO('''<?xml version='1.0' encoding='UTF-8'?><pytraining />''')) self.xml_tree.getroot().set(variable, value.decode('utf-8')) if not delay_write: logging.debug("Writting...") This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-05-19 08:29:41
|
Revision: 587 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=587&view=rev Author: jblance Date: 2010-05-19 08:29:32 +0000 (Wed, 19 May 2010) Log Message: ----------- Small fix to lap display after gpx/activity changes Modified Paths: -------------- pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/recordgraph.py Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-05-18 09:41:39 UTC (rev 586) +++ pytrainer/trunk/pytrainer/main.py 2010-05-19 08:29:32 UTC (rev 587) @@ -61,7 +61,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#586" + self.version ="1.7.2_svn#587" self.DB_version = 3 #Process command line options self.startup_options = self.get_options() Modified: pytrainer/trunk/pytrainer/recordgraph.py =================================================================== --- pytrainer/trunk/pytrainer/recordgraph.py 2010-05-18 09:41:39 UTC (rev 586) +++ pytrainer/trunk/pytrainer/recordgraph.py 2010-05-19 08:29:32 UTC (rev 587) @@ -59,8 +59,8 @@ if laps is not None and showLaps: lapValues = [] lastPoint = 0.0 - 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 + for lap in laps: + thisPoint = float(lap['distance'])/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-05-23 03:23:35
|
Revision: 589 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=589&view=rev Author: jblance Date: 2010-05-23 03:23:27 +0000 (Sun, 23 May 2010) Log Message: ----------- Add AcivityPool init size to conf.xml - not included as a preference (not sure if it is a good idea to make this GUI changeable) Modified Paths: -------------- pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/profile.py Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-05-22 08:16:25 UTC (rev 588) +++ pytrainer/trunk/pytrainer/main.py 2010-05-23 03:23:27 UTC (rev 589) @@ -45,23 +45,19 @@ from yeargraph import YearGraph from heartrategraph import HeartRateGraph -from extensions.googlemaps import Googlemaps #TODO -from extensions.osm import Osm # -from extensions.mapviewer import MapViewer # +from extensions.mapviewer import MapViewer from extensions.waypointeditor import WaypointEditor - from gui.windowimportdata import WindowImportdata from gui.windowmain import Main from gui.warning import Warning from lib.date import Date -#from lib.gpx import Gpx from activitypool import ActivityPool from lib.ddbb import DDBB class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#587" + self.version ="1.7.2_svn#589" self.DB_version = 3 #Process command line options self.startup_options = self.get_options() @@ -97,8 +93,9 @@ else: logging.info('No sanity check requested') self.record = Record(data_path,self) + pool_size = self.profile.getIntValue("pytraining","activitypool_size", default=1) + self.activitypool = ActivityPool(self, size=pool_size) #preparamos la ventana principal - self.activitypool = ActivityPool(self, size=10) self.windowmain = Main(data_path,self,self.version, gpxDir=self.profile.gpxdir) self.date = Date(self.windowmain.calendar) self.waypoint = Waypoint(data_path,self) Modified: pytrainer/trunk/pytrainer/profile.py =================================================================== --- pytrainer/trunk/pytrainer/profile.py 2010-05-22 08:16:25 UTC (rev 588) +++ pytrainer/trunk/pytrainer/profile.py 2010-05-23 03:23:27 UTC (rev 589) @@ -71,6 +71,7 @@ "import_default_tab":"0", "default_viewer":"0", "window_size":"800, 640", + "activitypool_size": "10", } #Parse pytrainer configuration file @@ -189,11 +190,11 @@ logging.error("Configuration file value not set") logging.error("Fatal error, exiting") exit(-3) - if not os.path.isfile(config_file): + if not os.path.isfile(config_file): #File not found logging.error("Configuration '%s' file does not exist" % config_file) logging.info("No profile found. Creating default one") self.setProfile(self.profile_options) - if os.stat(config_file)[stat.ST_SIZE] == 0: + if os.stat(config_file)[stat.ST_SIZE] == 0: #File is empty logging.error("Configuration '%s' file is empty" % config_file) logging.info("Creating default profile") self.setProfile(self.profile_options) @@ -201,12 +202,6 @@ try: parser = etree.XMLParser(encoding='UTF8', recover=True) self.xml_tree = etree.parse(config_file, parser=parser) - #TODO check here for empty file.... - # Checks if configuration file is empty - #if self.configuration.xmldoc is None: - # logging.error("Seems no data available in local configuration file: "+self.filename+", please check") - # logging.error("Fatal error, exiting") - # exit(-3) #Have a populated xml tree, get pytraining node (root) and convert it to a dict pytraining_tag = self.xml_tree.getroot() config = {} @@ -228,6 +223,22 @@ logging.error("Fatal error, exiting") exit(-3) + def getIntValue(self, tag, variable, default=0): + ''' Function to return conf value as int + returns + -- default if cannot convert to int + -- None if variable not found + ''' + result = self.getValue(tag, variable) + if result is None: + return None + try: + result = int(result) + except Exception as e: + logging.debug(str(e)) + result = default + return result + def getValue(self, tag, variable): if tag != "pytraining": print "ERROR - pytraining is the only profile tag supported" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-05-23 04:24:20
|
Revision: 590 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=590&view=rev Author: jblance Date: 2010-05-23 04:24:14 +0000 (Sun, 23 May 2010) Log Message: ----------- OSM map viewer update from Druzee to add lap markers Modified Paths: -------------- pytrainer/trunk/pytrainer/extensions/osm.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/extensions/osm.py =================================================================== --- pytrainer/trunk/pytrainer/extensions/osm.py 2010-05-23 03:23:27 UTC (rev 589) +++ pytrainer/trunk/pytrainer/extensions/osm.py 2010-05-23 04:24:14 UTC (rev 590) @@ -1,6 +1,6 @@ -# Testing OpenStreetMaps integration +# Open Street Map # TODO: store OpenLayers.js locally (1MB file) -# TODO: Add start/finish/lap markers + info popups on click with full details +# TODO: Add google satelite images layers ? import gtkmozembed import os @@ -16,7 +16,7 @@ def __init__(self, data_path = None, waypoint = None, pytrainer_main=None): logging.debug(">>") self.data_path = data_path - self.waypoint=waypoint + self.waypoint = waypoint self.pytrainer_main = pytrainer_main self.htmlfile = "%s/osm.html" % (self.pytrainer_main.profile.tmpdir) logging.debug("<<") @@ -57,7 +57,6 @@ self.createErrorHtml() else: self.createErrorHtml() - #self.moz.load_url("file://%s" % (self.htmlfile)) return self.htmlfile logging.debug("<<") @@ -65,9 +64,8 @@ ''' Generate OSM map html file using MapLayers ''' - logging.debug(">> OSM start createHtml") - content = ''' - <html> + logging.debug(">>") + content = '''<html> <head> <!-- bring in the OpenLayers javascript library (here we bring it from the remote site, but you could @@ -84,13 +82,44 @@ //icons data object var icons = { - start : { url : "/start.png", coordinates : %s, popupInfo : "%s" }, + iconSize : new OpenLayers.Size(30,30)''' + + # If have laps data insert markers here + try: + lapsContent='' + for lap in laps[:500]: # OpenLayers with firefox is limited to 500 markers -> TODO: Transfer to a constant somewhere ? + lapNumber = int(lap['lap_number'])+1 + elapsedTime = float(lap['elapsed_time']) + elapsedTimeHours = int(elapsedTime/3600) + elapsedTimeMins = int((elapsedTime - (elapsedTimeHours * 3600)) / 60) + elapsedTimeSecs = elapsedTime - (elapsedTimeHours * 3600) - (elapsedTimeMins * 60) + if elapsedTimeHours > 0: + strElapsedTime = "%0.0dh:%0.2dm:%0.2fs" % (elapsedTimeHours, elapsedTimeMins, elapsedTimeSecs) + elif elapsedTimeMins > 0: + strElapsedTime = "%0.0dm:%0.2fs" % (elapsedTimeMins, elapsedTimeSecs) + else: + strElapsedTime = "%0.0fs" % (elapsedTimeSecs) + #process lat and lon for this lap + lapLat = float(lap['end_lat']) + lapLon = float(lap['end_lon']) + #build laps content string + lapsContent+=',\n' + lapsContent+='\t\t\t\t\tlap%d: { url : "/waypoint.png", coordinates : [%f,%f], popupInfo: "%s" }' % \ + (lapNumber, lapLon, lapLat, \ + "<div class='info_content'>End of lap:%d<br>Elapsed time:%s<br>Distance:%0.2f km<br>Calories:%s</div>" % \ + (lapNumber, strElapsedTime, float(lap['distance'])/1000, lap['calories']) + ) + content+=lapsContent + except Exception as e: + # If something breaks here just skip laps data + logging.error('Error formating laps data: ' + str(e)) + # Insert start/finish track markers + content+=''',\n start : { url : "/start.png", coordinates : %s, popupInfo : "%s" }, finish : { url : "/finish.png", coordinates : %s, popupInfo : "%s" }, - lap : { url : "/lap.png" }, - url : "file://%s/glade", - iconSize : new OpenLayers.Size(30,30) - };''' % (polyline[0], startinfo, polyline[-1], finishinfo, os.path.abspath(self.data_path)) - content+='''\n + url : "file://%s/glade"''' \ + % (polyline[0], startinfo, polyline[-1], finishinfo, os.path.abspath(self.data_path)) + + content+='''};\n function init() { // for transforming WGS 1984 to Spherical Mercator Projection @@ -130,13 +159,10 @@ { "type":"LineString", "coordinates": - [\n''' - #Insert track points - all but last one - for point in polyline[:-1]: - content+="%s," % (point) - #Insert last point without comma so the javascript syntax stays correct - content+="%s\n" % (polyline[-1]) - content+=''' ] + [''' + #Insert track points here + content+=",".join(polyline); + content+='''] }, "crs": { Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-05-23 03:23:27 UTC (rev 589) +++ pytrainer/trunk/pytrainer/main.py 2010-05-23 04:24:14 UTC (rev 590) @@ -57,7 +57,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#589" + self.version ="1.7.2_svn#590" self.DB_version = 3 #Process command line options self.startup_options = self.get_options() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-05-26 07:17:21
|
Revision: 591 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=591&view=rev Author: jblance Date: 2010-05-26 07:17:14 +0000 (Wed, 26 May 2010) Log Message: ----------- Minor updates to gpx and activity classes Modified Paths: -------------- pytrainer/trunk/pytrainer/heartrategraph.py pytrainer/trunk/pytrainer/lib/activity.py pytrainer/trunk/pytrainer/lib/gpx.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/heartrategraph.py =================================================================== --- pytrainer/trunk/pytrainer/heartrategraph.py 2010-05-23 04:24:14 UTC (rev 590) +++ pytrainer/trunk/pytrainer/heartrategraph.py 2010-05-26 07:17:14 UTC (rev 591) @@ -29,7 +29,7 @@ def drawgraph(self,values): logging.debug('>>') - zones = self.pytrainer_main.profile.getZones() #TODO from lib/heartrate.py import - can this file be consolidated? + zones = self.pytrainer_main.profile.getZones() xvalues, yvalues = self.get_values(values) #logging.debug('xvalues: '+str(xvalues)) #logging.debug('yvalues: '+str(yvalues)) Modified: pytrainer/trunk/pytrainer/lib/activity.py =================================================================== --- pytrainer/trunk/pytrainer/lib/activity.py 2010-05-23 04:24:14 UTC (rev 590) +++ pytrainer/trunk/pytrainer/lib/activity.py 2010-05-26 07:17:14 UTC (rev 591) @@ -28,6 +28,38 @@ class Activity: ''' Class that knows everything about a particular activity + + tracks - (list) tracklist from gpx + tracklist - (list of dict) trackpoint data from gpx + laps - (list of dict) lap list + tree - (ElementTree) parsed xml of gpx file + us_system - (bool) True: imperial measurement False: metric measurement + distance_unit - (string) unit to use for distance + speed_unit - (string) unit to use for speed + height_unit - (string) unit to use for height + gpx_file - (string) gpx file name + gpx - (Gpx class) actual gpx instance + sport_name - (string) sport name + sport_id - (string) id for sport in sports table + title - (string) title of activity + date - (string) date of activity + time - (int) activity duration in seconds + beats - (int) average heartrate for activity + maxbeats - (int) maximum heartrate for activity + comments - (string) activity comments + calories - (int) calories of activity + id_record - (string) id for activity in records table + date_time_local - (string) date and time of activity in local timezone + date_time_utc - (string) date and time of activity in UTC timezone + date_time - (datetime) date and time of activity in local timezone + distance - (float) activity distance + average - (float) average speed of activity + upositive - (float) height climbed during activity + unegative - (float) height decended during activity + maxspeed - (float) maximum speed obtained during activity + maxpace - (float) maxium pace obtained during activity + pace - (float) average pace for activity + has_data - (bool) true if gpx processed and instance has data populated ''' def __init__(self, pytrainer_main = None, id = None): logging.debug(">>") @@ -77,9 +109,11 @@ ''' logging.debug(">>") #Parse GPX file + print "Activity initing GPX.. ", self.gpx = Gpx(filename = self.gpx_file) #TODO change GPX code to do less.... self.tree = self.gpx.tree - self.tracks = self.gpx.getTrackList() #TODO fix + self.tracks = self.gpx.getTrackList() #TODO fix - this should removed and replaced with self.tracklist functionality + self.tracklist = self.gpx.trkpoints logging.debug("<<") def _init_from_db(self): @@ -99,12 +133,12 @@ self.sport_id = dict['id_sports'] self.title = dict['title'] self.date = dict['date'] - self.time = dict['time'] - self.beats = dict['beats'] + self.time = self._int(dict['time']) + self.beats = self._int(dict['beats']) self.comments = dict['comments'] - self.calories = dict['calories'] + self.calories = self._int(dict['calories']) self.id_record = dict['id_record'] - self.maxbeats = dict['maxbeats'] + self.maxbeats = self._int(dict['maxbeats']) #Sort time.... # ... use local time if available otherwise use date_time_utc and create a local datetime... self.date_time_local = dict['date_time_local'] @@ -176,3 +210,10 @@ except: result = 0.0 return result + + def _int(self, value): + try: + result = int(value) + except: + result = 0 + return result Modified: pytrainer/trunk/pytrainer/lib/gpx.py =================================================================== --- pytrainer/trunk/pytrainer/lib/gpx.py 2010-05-23 04:24:14 UTC (rev 590) +++ pytrainer/trunk/pytrainer/lib/gpx.py 2010-05-26 07:17:14 UTC (rev 591) @@ -57,6 +57,8 @@ self.filename = filename self.trkname = trkname logging.debug(str(data_path)+"|"+str(filename)+"|"+str(trkname)) + self.trkpoints = [] + self.vel_array = [] self.total_dist = 0 self.total_time = 0 self.upositive = 0 @@ -147,8 +149,6 @@ if self.tree is None: return lapInfo tree = self.tree - #date = tree.findtext(timeTag) - #startTime = self.getDateTime(date) laps = tree.findall(lapTag) logging.debug("Found %d laps" % len(laps)) for lap in laps: @@ -213,133 +213,125 @@ waiting_points = [] - for trkpoint in trkpoints: - lat = trkpoint.get("lat") - lon = trkpoint.get("lon") - if lat is None or lat == "" or lon is None or lon == "": - logging.debug("lat or lon is blank") + for i, trkpoint in enumerate(trkpoints): + #Get data from trkpoint + try: + lat = float(trkpoint.get("lat")) + lon = float(trkpoint.get("lon")) + except Exception as e: + logging.debug(str(e)) + lat = lon = None + if lat is None or lat == "" or lat == 0 or lon is None or lon == "" or lon == 0: + logging.debug("lat or lon is blank or zero") continue #get the heart rate value from the gpx extended format file hrResult = trkpoint.find(hrTag) if hrResult is not None: hr = int(hrResult.text) len_validhrpoints += 1 + total_hr += hr #TODO fix + if hr>self.maxhr: + self.maxhr = hr else: - hr = 0 + hr = None #get the cadence (if present) cadResult = trkpoint.find(cadTag) if cadResult is not None: cadence = int(cadResult.text) else: - cadence = 0 + cadence = None #get the time timeResult = trkpoint.find(timeTag) if timeResult is not None: date_ = timeResult.text mk_time = self.getDateTime(date_)[0] time_ = time.mktime(mk_time.timetuple()) #Convert date to seconds + if i == 0: + time_elapsed = 0 + else: + time_elapsed = time_ - self.trkpoints[i-1]['time'] if self.trkpoints[i-1]['time'] is not None else 0 + self.total_time += time_elapsed else: time_ = None + time_elapsed = None #get the elevation eleResult = trkpoint.find(elevationTag) + rel_alt = 0 if eleResult is not None: - ele = eleResult.text + try: + ele = float(eleResult.text) + #Calculate elevation change + if i != 0: + rel_alt = ele - self.trkpoints[i-1]['ele'] if self.trkpoints[i-1]['ele'] is not None else 0 + except Exception as e: + logging.debug(str(e)) + ele = None else: ele = None - #chequeamos que la altura sea correcta / check that the height is correct - if ele is not None: - if len(ele)<15: - tmp_alt = int(float(ele)) #Why convert to int? ele are like "156.3515625" - else: - print "ele len >= 15" + ele + + #Calculate climb or decent amount + #Allow for some 'jitter' in height here + JITTER_VALUE = 0 #Elevation changes less than this value are not counted in +- + if abs(rel_alt) < JITTER_VALUE: + rel_alt = 0 + if rel_alt > 0: + self.upositive += rel_alt + elif rel_alt < 0: + self.unegative -= rel_alt + + #Calculate distance between two points + if i == 0: #First point + dist = None else: - tmp_alt= 0 - #print "tmp_alt:" + str(tmp_alt) + dist = self._distance_between_points(lat1=self.trkpoints[i-1]['lat'], lon1=self.trkpoints[i-1]['lon'], lat2=lat, lon2=lon) - #evitamos los puntos blancos / we avoid the white points - if (float(lat) < -0.000001) or (float(lat) > 0.0000001): - #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_) + #Accumulate distances + if dist is not None: + dist_elapsed += dist #TODO fix + total_dist += dist - #Para las vueltas diferentes a la primera / For the returns different from first - 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)) - #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 - try: - #dist=math.acos(tempnum)*111.302*57.29577951 - 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_ 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: - 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)) + #Calculate speed... + vel = self._calculate_speed(dist, time_elapsed, smoothing_factor=3) + if vel>self.maxvel: + self.maxvel=vel - last_lat = tmp_lat - last_lon = tmp_lon - last_alt = tmp_alt - #last_time = tmp_time - if time_ is not None: - last_time = int(time_) + #The waiting point stuff.... + #This 'fills in' the data for situations where some times are missing from the GPX file + if time_ is not None: + if len(waiting_points) > 0: + 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 = [] + dist_elapsed = 0 + else: + retorno.append((total_dist,ele, self.total_time,vel,lat,lon,hr,cadence)) + dist_elapsed = 0 + else: # time_ is None + waiting_points.append((total_dist, dist_elapsed, ele, self.total_time, lat, lon, hr, cadence)) + #Add to dict of values to trkpoint list + self.trkpoints.append({ 'id': i, + 'lat':lat, + 'lon':lon, + 'hr':hr, + 'cadence':cadence, + 'time':time_, + 'time_since_previous': time_elapsed, + 'time_elapsed': self.total_time, + 'ele':ele, + 'ele_change': rel_alt, + 'distance_from_previous': dist, + 'elapsed_distance': total_dist, + 'velocity':vel, + + }) + + #end of for trkpoint in trkpoints loop + + #Calculate averages etc self.hr_average = 0 if len_validhrpoints > 0: self.hr_average = total_hr/len_validhrpoints @@ -347,29 +339,72 @@ logging.debug("<<") return retorno - def _calculate_velocity(self,velocity, arr_velocity, numToAverage): #TODO Check & make generic + def _distance_between_points(self, lat1, lon1, lat2, lon2): + ''' + Function to calculate the distance between two lat, lon points on the earths surface + + History of this function is unknown.... + -- David "no me mates que esto lo escribi hace anhos" + -- http://faculty.washington.edu/blewis/ocn499/EXER04.htm equation for the distance between 2 points on a spherical earth + -- 0.01745329252 = number of radians in a degree + -- 57.29577951 = 1/0.01745329252 or degrees per radian + requires + - start lat and lon as floats + - finish lat and lon as floats + + returns + - distance between points in kilometers if successful + - None if any error situation occurs + ''' + RADIANS_PER_DEGREE = 0.01745329252 + DEGREES_PER_RADIAN = 57.29577951 + #Check for invalid variables + for var in (lat1, lon1, lat2, lon2): + if var is None or var == 0 or var == "": #TODO Need this?? if (float(lat) < -0.000001) or (float(lat) > 0.0000001): + return None + if type(var) is not type(float()): + return None + #Convert lat and lon from degrees to radians + last_lat = lat1*RADIANS_PER_DEGREE + last_lon = lon1*RADIANS_PER_DEGREE + tmp_lat = lat2*RADIANS_PER_DEGREE + tmp_lon = lon2*RADIANS_PER_DEGREE + #Pasamos la distancia de radianes a metros.. creo / We convert the distance from radians to meters + try: + 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*DEGREES_PER_RADIAN + except Exception as e: + logging.debug(str(e)) + dist=None + return dist + + def _calculate_speed(self, dist_elapsed, time_elapsed, smoothing_factor=3): '''Function to calculate moving average for speed''' - arr_velocity.append(velocity) - if len(arr_velocity)>numToAverage: - arr_velocity.pop(0) - if len(arr_velocity)<numToAverage: + + if dist_elapsed is None or dist_elapsed == 0 or time_elapsed is None or time_elapsed == 0: + velocity = 0 + else: + velocity = (dist_elapsed/time_elapsed) * 3600 # 3600 to convert km/sec to km/hour + self.vel_array.append(velocity) + if len(self.vel_array)>smoothing_factor: + self.vel_array.pop(0) + if len(self.vel_array)<smoothing_factor: #Got too few numbers to average #Pad with duplicates - for x in range(len(arr_velocity), numToAverage): - arr_velocity.append(velocity) + for x in range(len(self.vel_array), smoothing_factor): + self.vel_array.append(velocity) vel = 0 - for v in arr_velocity: + for v in self.vel_array: vel+= v - vel /= numToAverage - return vel,arr_velocity + vel /= smoothing_factor + return vel def getStartTimeFromGPX(self, gpxFile): - """03.05.2008 - dgranda + '''03.05.2008 - dgranda Retrieves start time from a given gpx file args: - gpxFile: path to xml file (gpx format) - returns: string with start time - 2008-03-22T12:17:43Z - """ + returns: tuple (string with start time as UTC timezone - 2008-03-22T12:17:43Z, datetime of time in local timezone) + ''' logging.debug(">>") date_time = self.tree.find(timeTag) #returns first instance found if date_time is None: Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-05-23 04:24:14 UTC (rev 590) +++ pytrainer/trunk/pytrainer/main.py 2010-05-26 07:17:14 UTC (rev 591) @@ -57,7 +57,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#590" + self.version ="1.7.2_svn#591" self.DB_version = 3 #Process command line options self.startup_options = self.get_options() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-05-26 07:29:37
|
Revision: 592 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=592&view=rev Author: jblance Date: 2010-05-26 07:29:31 +0000 (Wed, 26 May 2010) Log Message: ----------- Fix googlemaps lap data display 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 2010-05-26 07:17:14 UTC (rev 591) +++ pytrainer/trunk/pytrainer/extensions/googlemaps.py 2010-05-26 07:29:31 UTC (rev 592) @@ -196,12 +196,13 @@ lapLat = float(lap['end_lat']) lapLon = float(lap['end_lon']) 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[3])/1000, lap[8]) + 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['distance'])/1000, lap['calories']) content += "google.maps.event.addListener(lap%dmarker, 'click', function() { lap%d.open(map,lap%dmarker); });\n" % (lapNumber,lapNumber,lapNumber) - except: + except Exception as e: #Error processing lap lat or lon #dont show this lap logging.debug( "Error processing lap "+ str(lap) ) + logging.debug(str(e)) content += ''' Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-05-26 07:17:14 UTC (rev 591) +++ pytrainer/trunk/pytrainer/main.py 2010-05-26 07:29:31 UTC (rev 592) @@ -57,7 +57,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#591" + self.version ="1.7.2_svn#592" self.DB_version = 3 #Process command line options self.startup_options = self.get_options() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2010-05-26 07:59:33
|
Revision: 593 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=593&view=rev Author: dgranda Date: 2010-05-26 07:59:27 +0000 (Wed, 26 May 2010) Log Message: ----------- Fixed calories missed in heartrate tab 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-05-26 07:29:31 UTC (rev 592) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-05-26 07:59:27 UTC (rev 593) @@ -286,6 +286,7 @@ maxbeats = activity.maxbeats self.record_beats.set_text("%0.2f" %beats) self.record_maxbeats.set_text("%0.2f" %maxbeats) + self.record_calories2.set_text("%0.0f" %activity.calories) if is_karvonen_method=="True": self.record_zonesmethod.set_text(_("Karvonen method")) else: Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-05-26 07:29:31 UTC (rev 592) +++ pytrainer/trunk/pytrainer/main.py 2010-05-26 07:59:27 UTC (rev 593) @@ -57,7 +57,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#592" + self.version ="1.7.2_svn#593" self.DB_version = 3 #Process command line options self.startup_options = self.get_options() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2010-05-27 08:14:57
|
Revision: 596 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=596&view=rev Author: dgranda Date: 2010-05-27 08:14:50 +0000 (Thu, 27 May 2010) Log Message: ----------- Changed default colors for profile and cadence in record graph as they were the same that for heartrate Modified Paths: -------------- pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/recordgraph.py Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-05-26 16:26:52 UTC (rev 595) +++ pytrainer/trunk/pytrainer/main.py 2010-05-27 08:14:50 UTC (rev 596) @@ -57,7 +57,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#593" + self.version ="1.7.2_svn#596" self.DB_version = 3 #Process command line options self.startup_options = self.get_options() Modified: pytrainer/trunk/pytrainer/recordgraph.py =================================================================== --- pytrainer/trunk/pytrainer/recordgraph.py 2010-05-26 16:26:52 UTC (rev 595) +++ pytrainer/trunk/pytrainer/recordgraph.py 2010-05-27 08:14:50 UTC (rev 596) @@ -129,7 +129,7 @@ def get_value_params(self,value): if value == 0: - return _("Distance (km)"),_("Height (m)"),_("Stage Profile"),"#ff0000" + return _("Distance (km)"),_("Height (m)"),_("Stage Profile"),"#000000" if value == 1: return _("Distance (km)"),_("Speed (Km/h)"),_("Speed"),"#00ff00" if value == 2: @@ -137,7 +137,7 @@ if value == 3: return _("Distance (km)"),_("Beats (bpm)"),_("Heart Rate"),"#ff0000" if value == 4: - return _("Distance (km)"),_("Cadence (rpm)"),_("Cadence"),"#ff0000" + return _("Distance (km)"),_("Cadence (rpm)"),_("Cadence"),"#7B3F00" def get_values(self,values, value_selected): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-06-10 09:42:17
|
Revision: 599 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=599&view=rev Author: jblance Date: 2010-06-10 09:42:11 +0000 (Thu, 10 Jun 2010) Log Message: ----------- New classes for holding and altering data to be graphed Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/activity.py Added Paths: ----------- pytrainer/trunk/pytrainer/gui/drawGraph.py pytrainer/trunk/pytrainer/lib/graphdata.py Added: pytrainer/trunk/pytrainer/gui/drawGraph.py =================================================================== --- pytrainer/trunk/pytrainer/gui/drawGraph.py (rev 0) +++ pytrainer/trunk/pytrainer/gui/drawGraph.py 2010-06-10 09:42:11 UTC (rev 599) @@ -0,0 +1,129 @@ +# -*- coding: iso-8859-1 -*- + +#Copyright (C) Fiz Vazquez vu...@si... + +#This program is free software; you can redistribute it and/or +#modify it under the terms of the GNU General Public License +#as published by the Free Software Foundation; either version 2 +#of the License, or (at your option) any later version. + +#This program is distributed in the hope that it will be useful, +#but WITHOUT ANY WARRANTY; without even the implied warranty of +#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +#GNU General Public License for more details. + +#You should have received a copy of the GNU General Public License +#along with this program; if not, write to the Free Software +#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +import matplotlib +#matplotlib.use('GTK') +from matplotlib.figure import Figure +from matplotlib.backends.backend_gtkagg import FigureCanvasGTKAgg as FigureCanvasGTK +#from matplotlib.backends.backend_gtkagg import NavigationToolbar2GTKAgg as NavigationToolbar +import matplotlib.pyplot as plt +#import pylab +import logging + +class DrawGraph: + def __init__(self, parent = None, pytrainer_main = None): + logging.debug('>>') + self.parent = parent + self.pytrainer_main = pytrainer_main + #self.NEARLY_ZERO = 0.0000000000000000000001 + logging.debug('<<') + + def drawPlot(self, datalist = None, box = None): + ''' + Draw a plot style graph + ''' + #data = {'linewidth':3, 'x':(1,2,3), 'y':(3,9,1)} + logging.debug('>>') + if box is None: + logging.error("Must supply a vbox or hbox to display the graph") + return + #Remove existing plot (if any) + for child in box.get_children(): + logging.debug('Removing box child: '+str(child)) + box.remove(child) + if datalist is None: # or len(datalist) == 0: + logging.debug("drawPlot called with no data") + return + #Debug info - to remove + print("drawPlot....") + #print datalist + + #Set up drawing area + figure = plt.figure() + canvas = FigureCanvasGTK(figure) # a gtk.DrawingArea + canvas.show() + + #Plot data + data = datalist + plt.plot(data.x_values, data.y_values, linewidth=data.linewidth, color=data.linecolor ) + #Set axis limits + plt.axis([0, data.max_x_value, data.min_y_value, data.max_y_value]) + #Display title etc + plt.xlabel(data.xlabel) + plt.ylabel(data.ylabel) + #axis.set_xlim(0, data.max_x_value) + #axis.set_ylim(0, data.max_y_value) + + #Display plot + box.pack_start(canvas, True, True) + + return + #(self,xvalues,yvalues,xlabel,ylabel,title,color,zones=None,xzones=None, ylimits=None, y1_linewidth=None): + logging.debug("Type: plot | title: "+str(title)+" | col: "+str(color)+" | xlabel: "+str(xlabel)+" | ylabel: "+str(ylabel)) + logging.debug('xlabel: '+str(xlabel)+' | ylabel: '+str(ylabel)+' | title: '+str(title)) + #self.removeVboxChildren() + i = 0 + for value in xvalues: + if i<1: + axis = figure.add_subplot(111) + line = axis.plot(xvalues[i],yvalues[i], color=color[i]) + if y1_linewidth is not None: + line[0].set_linewidth(y1_linewidth) + linewidth = line[0].get_linewidth() + + axis.grid(True) + for tl in axis.get_yticklabels(): + tl.set_color('%s' %color[i]) + #Draw zones on graph, eg for each lap + if xzones is not None: + for xzone in xzones: + if xzones.index(xzone) % 2: + zonecolor='b' + else: + zonecolor='g' + axis.axvspan(xzone[0], xzone[1], alpha=0.25, facecolor=zonecolor) + maxX = max(xvalues[i]) + if i>=1: + ax2 = axis.twinx() + ax2.plot(xvalues[i], yvalues[i], color=color[i]) + for tl in ax2.get_yticklabels(): + tl.set_color('%s' %color[i]) + maxXt = max(xvalues[i]) + if maxXt > maxX: + maxX = maxXt + axis.set_xlabel(xlabel[i]) + i+=1 + axis.set_xlim(0, maxX) + + if (len(xvalues)>1): + axis.set_title("%s vs %s" %(ylabel[0],ylabel[1])) + else: + axis.set_title("%s" %(ylabel[0])) + + ylim_min, ylim_max = axis.get_ylim() + if ylimits is not None: + logging.debug("Using ylimits: %s" % str(ylimits)) + if ylimits[0] is not None: + ylim_min = ylimits[0] + if ylimits[1] is not None: + ylim_max = ylimits[1] + axis.set_ylim(ylim_min, ylim_max) + + + logging.debug('<<') + return {'y1_min': ylim_min, 'y1_max': ylim_max, 'y1_linewidth': linewidth} Modified: pytrainer/trunk/pytrainer/lib/activity.py =================================================================== --- pytrainer/trunk/pytrainer/lib/activity.py 2010-06-08 16:58:31 UTC (rev 598) +++ pytrainer/trunk/pytrainer/lib/activity.py 2010-06-10 09:42:11 UTC (rev 599) @@ -23,6 +23,7 @@ from dateutil.tz import * # for tzutc() from pytrainer.lib.gpx import Gpx +from pytrainer.lib.graphdata import GraphData from pytrainer.lib.unitsconversor import * class Activity: @@ -89,6 +90,7 @@ if self.gpx_file is not None: self._init_from_gpx_file() self._init_from_db() + self._init_graph_data() logging.debug("<<") def _set_units(self): @@ -204,6 +206,68 @@ logging.debug("<<") return laps + def _init_graph_data(self): + logging.debug(">>") + self.distance_data = {} + self.time_data = {} + #Profile + title=_("Elevation v Distance") + xlabel="%s (%s)" % (_('Distance'), self.distance_unit) + ylabel="%s (%s)" % (_('Elevation'), self.height_unit) + self.distance_data['elevation'] = GraphData(title=title, xlabel=xlabel, ylabel=ylabel) + title=_("Elevation v Time") + xlabel=_("Time (hours)") + self.time_data['elevation'] = GraphData(title=title,xlabel=xlabel, ylabel=ylabel) + #Speed + title=_("Speed v Distance") + xlabel="%s (%s)" % (_('Distance'), self.distance_unit) + ylabel="%s (%s)" % (_('Speed'), self.speed_unit) + self.distance_data['speed'] = GraphData(title=title, xlabel=xlabel, ylabel=ylabel) + #Pace + title=_("Pace v Distance") + xlabel="%s (%s)" % (_('Distance'), self.distance_unit) + ylabel="%s (%s)" % (_('Pace'), self.pace_unit) + self.distance_data['pace'] = GraphData(title=title, xlabel=xlabel, ylabel=ylabel) + #Heartrate + title=_("Heart Rate v Distance") + xlabel="%s (%s)" % (_('Distance'), self.distance_unit) + ylabel="%s (%s)" % (_('Heart Rate'), _('bpm')) + self.distance_data['hr'] = GraphData(title=title, xlabel=xlabel, ylabel=ylabel) + #Cadence + title=_("Cadence v Distance") + xlabel="%s (%s)" % (_('Distance'), self.distance_unit) + ylabel="%s (%s)" % (_('Cadence'), _('rpm')) + self.distance_data['cadence'] = GraphData(title=title, xlabel=xlabel, ylabel=ylabel) + for track in self.tracklist: + try: + pace = 60/track['velocity'] + except: + pace = 0 + if self.us_system: + self.distance_data['elevation'].addPoints(x=km2miles(track['elapsed_distance']), y=m2feet(track['ele'])) + self.distance_data['speed'].addPoints(x=km2miles(track['elapsed_distance']), y=km2miles(track['velocity'])) + self.distance_data['pace'].addPoints(x=km2miles(track['elapsed_distance']), y=pacekm2miles(pace)) + self.distance_data['hr'].addPoints(x=km2miles(track['elapsed_distance']), y=track['hr']) + self.distance_data['cadence'].addPoints(x=km2miles(track['elapsed_distance']), y=track['cadence']) + self.time_data['elevation'].addPoints(x=track['time_elapsed'], y=m2feet(track['ele'])) + else: + self.distance_data['elevation'].addPoints(x=track['elapsed_distance'], y=track['ele']) + self.distance_data['speed'].addPoints(x=track['elapsed_distance'], y=track['velocity']) + self.distance_data['pace'].addPoints(x=track['elapsed_distance'], y=pace) + self.distance_data['hr'].addPoints(x=track['elapsed_distance'], y=track['hr']) + self.distance_data['cadence'].addPoints(x=track['elapsed_distance'], y=track['cadence']) + self.time_data['elevation'].addPoints(x=track['time_elapsed'], y=track['ele']) + #Remove data with no values + for item in self.distance_data.keys(): + if len(self.distance_data[item]) == 0: + print "No values for %s. Removing...." % item + del self.distance_data[item] + for item in self.time_data.keys(): + if len(self.time_data[item]) == 0: + print "No values for %s. Removing...." % item + del self.time_data[item] + logging.debug("<<") + def _float(self, value): try: result = float(value) Added: pytrainer/trunk/pytrainer/lib/graphdata.py =================================================================== --- pytrainer/trunk/pytrainer/lib/graphdata.py (rev 0) +++ pytrainer/trunk/pytrainer/lib/graphdata.py 2010-06-10 09:42:11 UTC (rev 599) @@ -0,0 +1,63 @@ +# -*- coding: iso-8859-1 -*- + +#Copyright (C) Fiz Vazquez vu...@si... + +#This program is free software; you can redistribute it and/or +#modify it under the terms of the GNU General Public License +#as published by the Free Software Foundation; either version 2 +#of the License, or (at your option) any later version. + +#This program is distributed in the hope that it will be useful, +#but WITHOUT ANY WARRANTY; without even the implied warranty of +#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +#GNU General Public License for more details. + +#You should have received a copy of the GNU General Public License +#along with this program; if not, write to the Free Software +#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +import logging + +class GraphData: + ''' + Class to hold data and formating for graphing via matplotlib + ''' + def __init__(self, title=None, ylabel=None, xlabel=None): + logging.debug('>>') + self.title = title + self.ylabel = ylabel + self.xlabel = xlabel + self.x_values = [] + self.y_values = [] + self.linewidth = 1 + self.linecolor = '#ff0000' + self.max_x_value = None + self.min_x_value = None + self.max_y_value = None + self.min_y_value = None + logging.debug('<<') + + def __len__(self): + if self.x_values is None: + return None + return len(self.x_values) + + def addPoints(self, x=None, y=None): + if x is None or y is None: + logging.debug("Must supply both x and y data points, got x:'%s' y:'%s'" % (str(x), str(y))) + return + #print('Adding point: %s %s' % (str(x), str(y))) + self.x_values.append(x) + self.y_values.append(y) + if x > self.max_x_value: + self.max_x_value = x + if self.min_x_value is None or x < self.min_x_value: + self.min_x_value = x + if y > self.max_y_value: + self.max_y_value = y + if self.min_y_value is None or y < self.min_y_value: + self.min_y_value = y + + + + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-07-05 08:36:33
|
Revision: 600 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=600&view=rev Author: jblance Date: 2010-07-05 08:36:27 +0000 (Mon, 05 Jul 2010) Log Message: ----------- Fixes to units handling to change from metric to US without restart Modified Paths: -------------- pytrainer/trunk/pytrainer/activitypool.py pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/lib/graphdata.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/profile.py Modified: pytrainer/trunk/pytrainer/activitypool.py =================================================================== --- pytrainer/trunk/pytrainer/activitypool.py 2010-06-10 09:42:11 UTC (rev 599) +++ pytrainer/trunk/pytrainer/activitypool.py 2010-07-05 08:36:27 UTC (rev 600) @@ -37,6 +37,13 @@ logging.debug("Initialising ActivityPool to size: %d" % size) logging.debug("<<") + def clear_pool(self): + logging.debug(">>") + logging.debug("Clearing ActivityPool") + self.pool = {} + self.pool_queue = [] + logging.debug("<<") + def get_activity(self, id): sid = str(id) if sid in self.pool.keys(): Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2010-06-10 09:42:11 UTC (rev 599) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-07-05 08:36:27 UTC (rev 600) @@ -35,6 +35,15 @@ from pytrainer.extensions.osm import Osm from pytrainer.lib.unitsconversor import * +from pytrainer.recordgraph import RecordGraph +from pytrainer.daygraph import DayGraph +from pytrainer.weekgraph import WeekGraph +from pytrainer.monthgraph import MonthGraph +from pytrainer.yeargraph import YearGraph +from pytrainer.heartrategraph import HeartRateGraph +from pytrainer.extensions.mapviewer import MapViewer +from pytrainer.extensions.waypointeditor import WaypointEditor + class Main(SimpleGladeApp): def __init__(self, data_path = None, parent = None, version = None, gpxDir = None): def url_hook(dialog, url): @@ -97,6 +106,13 @@ else: self.radiobuttonGMap.set_active(1) + def setup(self): + self.createGraphs(RecordGraph,DayGraph,WeekGraph, MonthGraph,YearGraph,HeartRateGraph) + self.createMap(MapViewer,self.pytrainer_main.waypoint) + self.createWaypointEditor(WaypointEditor,self.pytrainer_main.waypoint, parent=self.pytrainer_main) + page = self.notebook.get_current_page() + self.on_page_change(None,None,page) + def set_unified_import(self, status=False): self.menu_importdata.set_sensitive(status) self.parent.testimport = status Modified: pytrainer/trunk/pytrainer/lib/graphdata.py =================================================================== --- pytrainer/trunk/pytrainer/lib/graphdata.py 2010-06-10 09:42:11 UTC (rev 599) +++ pytrainer/trunk/pytrainer/lib/graphdata.py 2010-07-05 08:36:27 UTC (rev 600) @@ -44,7 +44,7 @@ def addPoints(self, x=None, y=None): if x is None or y is None: - logging.debug("Must supply both x and y data points, got x:'%s' y:'%s'" % (str(x), str(y))) + #logging.debug("Must supply both x and y data points, got x:'%s' y:'%s'" % (str(x), str(y))) return #print('Adding point: %s %s' % (str(x), str(y))) self.x_values.append(x) Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-06-10 09:42:11 UTC (rev 599) +++ pytrainer/trunk/pytrainer/main.py 2010-07-05 08:36:27 UTC (rev 600) @@ -38,15 +38,15 @@ from importdata import Importdata from plugins import Plugins from profile import Profile -from recordgraph import RecordGraph -from daygraph import DayGraph -from weekgraph import WeekGraph -from monthgraph import MonthGraph -from yeargraph import YearGraph -from heartrategraph import HeartRateGraph +#from recordgraph import RecordGraph +#from daygraph import DayGraph +#from weekgraph import WeekGraph +#from monthgraph import MonthGraph +#from yeargraph import YearGraph +#from heartrategraph import HeartRateGraph -from extensions.mapviewer import MapViewer -from extensions.waypointeditor import WaypointEditor +#from extensions.mapviewer import MapViewer +#from extensions.waypointeditor import WaypointEditor from gui.windowimportdata import WindowImportdata from gui.windowmain import Main from gui.warning import Warning @@ -57,7 +57,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#598" + self.version ="1.7.2_svn#600" self.DB_version = 3 #Process command line options self.startup_options = self.get_options() @@ -72,10 +72,10 @@ self.profile = Profile(self.data_path,self) self.windowmain = None - if self.profile.getValue("pytraining","prf_us_system") == "True": #TODO perhaps move to use dict? - self.prf_us_system = True - else: - self.prf_us_system = False + #if self.profile.getValue("pytraining","prf_us_system") == "True": #TODO perhaps move to use dict? + # self.prf_us_system = True + #else: + # self.prf_us_system = False self.ddbb = DDBB(self.profile) logging.debug('connecting to DDBB') self.ddbb.connect() @@ -104,9 +104,10 @@ self.importdata = Importdata(data_path, self, self.profile) self.loadPlugins() self.loadExtensions() - self.windowmain.createGraphs(RecordGraph,DayGraph,WeekGraph, MonthGraph,YearGraph,HeartRateGraph) - self.windowmain.createMap(MapViewer,self.waypoint) - self.windowmain.createWaypointEditor(WaypointEditor,self.waypoint, parent=self) + self.windowmain.setup() + #self.windowmain.createGraphs(RecordGraph,DayGraph,WeekGraph, MonthGraph,YearGraph,HeartRateGraph) + #self.windowmain.createMap(MapViewer,self.waypoint) + #self.windowmain.createWaypointEditor(WaypointEditor,self.waypoint, parent=self) self.windowmain.on_calendar_selected(None) self.refreshMainSportList() self.windowmain.run() @@ -244,7 +245,7 @@ #selected,iter = self.windowmain.recordTreeView.get_selection().get_selected() elif view=="week": logging.debug('week view') - date_ini, date_end = self.date.getWeekInterval(date_selected, self.prf_us_system) + date_ini, date_end = self.date.getWeekInterval(date_selected, self.profile.prf_us_system) sport = self.windowmain.getSportSelected() record_list = self.record.getrecordPeriod(date_ini, date_end, sport) self.windowmain.actualize_weekview(record_list, date_ini, date_end) @@ -456,6 +457,8 @@ def editProfile(self): logging.debug('>>') self.profile.editProfile() + self.activitypool.clear_pool() + self.windowmain.setup() logging.debug('<<') def sanityCheck(self): Modified: pytrainer/trunk/pytrainer/profile.py =================================================================== --- pytrainer/trunk/pytrainer/profile.py 2010-06-10 09:42:11 UTC (rev 599) +++ pytrainer/trunk/pytrainer/profile.py 2010-07-05 08:36:27 UTC (rev 600) @@ -216,6 +216,8 @@ #Added a property, so update config if config_needs_update: self.setProfile(config) + #Set shorthand var for units of measurement + self.prf_us_system = True if config["prf_us_system"] == "True" else False return config except Exception as e: logging.error("Error parsing file: %s. Exiting" % config_file) @@ -325,6 +327,7 @@ logging.debug("setting data values") profilewindow.setValues(self.configuration) profilewindow.run() + self.configuration = self._parse_config_file(self.config_file) logging.debug("<<") def actualize_mainsportlist(self): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-07-05 09:42:21
|
Revision: 603 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=603&view=rev Author: jblance Date: 2010-07-05 09:42:15 +0000 (Mon, 05 Jul 2010) Log Message: ----------- Fix for pressing ESC during file open dialog Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/dialogs.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/gui/dialogs.py =================================================================== --- pytrainer/trunk/pytrainer/gui/dialogs.py 2010-07-05 09:27:38 UTC (rev 602) +++ pytrainer/trunk/pytrainer/gui/dialogs.py 2010-07-05 09:42:15 UTC (rev 603) @@ -1,6 +1,6 @@ #!/usr/bin/env python -#Copyright (C) +#Copyright (C) #This program is free software; you can redistribute it and/or #modify it under the terms of the GNU General Public License @@ -23,7 +23,8 @@ class fileChooserDialog(): def __init__(self, title = "Choose a file", multiple = False): - dialog = gtk.FileChooserDialog(title, None, gtk.FILE_CHOOSER_ACTION_OPEN,(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK)) + self.inputfiles = None + dialog = gtk.FileChooserDialog(title, None, gtk.FILE_CHOOSER_ACTION_OPEN,(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK)) dialog.set_default_response(gtk.RESPONSE_OK) dialog.set_select_multiple(multiple) response = dialog.run() Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-07-05 09:27:38 UTC (rev 602) +++ pytrainer/trunk/pytrainer/main.py 2010-07-05 09:42:15 UTC (rev 603) @@ -49,7 +49,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#601" + self.version ="1.7.2_svn#603" self.DB_version = 3 #Process command line options self.startup_options = self.get_options() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-09-10 01:55:19
|
Revision: 610 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=610&view=rev Author: jblance Date: 2010-09-10 01:55:13 +0000 (Fri, 10 Sep 2010) Log Message: ----------- Minor fixes to stop errors when an activity does not have any GPX data associated with it Modified Paths: -------------- pytrainer/trunk/pytrainer/extensions/googlemaps.py pytrainer/trunk/pytrainer/extensions/osm.py pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/lib/activity.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/extensions/googlemaps.py =================================================================== --- pytrainer/trunk/pytrainer/extensions/googlemaps.py 2010-08-26 03:46:42 UTC (rev 609) +++ pytrainer/trunk/pytrainer/extensions/googlemaps.py 2010-09-10 01:55:13 UTC (rev 610) @@ -49,39 +49,36 @@ polyline = [] list_values = activity.tracks - if list_values != []: - if len(list_values) > 0: - minlat, minlon = float(list_values[0][4]),float(list_values[0][5]) - maxlat=minlat - maxlon=minlon - for i in list_values: - lat, lon = float(i[4]), float(i[5]) - minlat = min(minlat, lat) - maxlat = max(maxlat, lat) - minlon = min(minlon, lon) - maxlon = max(maxlon, lon) - pointlist.append((lat,lon)) - polyline.append("new google.maps.LatLng(%s, %s)" % (lat, lon)) - logging.debug("minlat: %s, maxlat: %s" % (minlat, maxlat)) - logging.debug("minlon: %s, maxlon: %s" % (minlon, maxlon)) - points,levels = Points.encodePoints(pointlist) - points = points.replace("\\","\\\\") - if self.pytrainer_main.startup_options.gm3: - logging.debug("Using Google Maps version 3 API") - laps = activity.laps - timeHours = int(activity.time) / 3600 - timeMin = (float(activity.time) / 3600.0 - timeHours) * 60 - time = "%d%s %02d%s" % (timeHours, _("h"), timeMin, _("min")) - startinfo = "<div class='info_content'>%s: %s</div>" % (activity.sport_name, activity.title) - finishinfo = "<div class='info_content'>%s: %s<br>%s: %s%s</div>" % (_("Time"), time, _("Distance"), activity.distance, activity.distance_unit) - 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) - else: - logging.debug("Using Google Maps version 2 API") - self.createHtml(points,levels,pointlist[0]) + if list_values is not None and list_values != [] and len(list_values) > 0: + minlat, minlon = float(list_values[0][4]),float(list_values[0][5]) + maxlat=minlat + maxlon=minlon + for i in list_values: + lat, lon = float(i[4]), float(i[5]) + minlat = min(minlat, lat) + maxlat = max(maxlat, lat) + minlon = min(minlon, lon) + maxlon = max(maxlon, lon) + pointlist.append((lat,lon)) + polyline.append("new google.maps.LatLng(%s, %s)" % (lat, lon)) + logging.debug("minlat: %s, maxlat: %s" % (minlat, maxlat)) + logging.debug("minlon: %s, maxlon: %s" % (minlon, maxlon)) + points,levels = Points.encodePoints(pointlist) + points = points.replace("\\","\\\\") + if self.pytrainer_main.startup_options.gm3: + logging.debug("Using Google Maps version 3 API") + laps = activity.laps + timeHours = int(activity.time) / 3600 + timeMin = (float(activity.time) / 3600.0 - timeHours) * 60 + time = "%d%s %02d%s" % (timeHours, _("h"), timeMin, _("min")) + startinfo = "<div class='info_content'>%s: %s</div>" % (activity.sport_name, activity.title) + finishinfo = "<div class='info_content'>%s: %s<br>%s: %s%s</div>" % (_("Time"), time, _("Distance"), activity.distance, activity.distance_unit) + 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) else: - self.createErrorHtml() + logging.debug("Using Google Maps version 2 API") + self.createHtml(points,levels,pointlist[0]) else: self.createErrorHtml() return self.htmlfile Modified: pytrainer/trunk/pytrainer/extensions/osm.py =================================================================== --- pytrainer/trunk/pytrainer/extensions/osm.py 2010-08-26 03:46:42 UTC (rev 609) +++ pytrainer/trunk/pytrainer/extensions/osm.py 2010-09-10 01:55:13 UTC (rev 610) @@ -35,26 +35,23 @@ polyline = [] list_values = activity.tracks - if list_values != []: - if len(list_values) > 0: - for i in list_values: - lat, lon = float(i[4]), float(i[5]) - pointlist.append((lat,lon)) - polyline.append("[%s, %s]" % (lon, lat)) - points,levels = Points.encodePoints(pointlist) - points = points.replace("\\","\\\\") - laps = activity.laps - timeHours = int(activity.time) / 3600 - timeMin = (float(activity.time) / 3600.0 - timeHours) * 60 - time = "%d%s %02d%s" % (timeHours, _("h"), timeMin, _("min")) - startinfo = "<div class='info_content'>%s: %s</div>" % (activity.sport_name, activity.title) - finishinfo = "<div class='info_content'>%s: %s<br>%s: %s%s</div>" % (_("Time"), time, _("Distance"), activity.distance, activity.distance_unit) - startinfo = startinfo.encode('ascii', 'xmlcharrefreplace') #Encode for html - finishinfo = finishinfo.encode('ascii', 'xmlcharrefreplace') #Encode for html + if list_values is not None and list_values != [] and len(list_values) > 0: + for i in list_values: + lat, lon = float(i[4]), float(i[5]) + pointlist.append((lat,lon)) + polyline.append("[%s, %s]" % (lon, lat)) + points,levels = Points.encodePoints(pointlist) + points = points.replace("\\","\\\\") + laps = activity.laps + timeHours = int(activity.time) / 3600 + timeMin = (float(activity.time) / 3600.0 - timeHours) * 60 + time = "%d%s %02d%s" % (timeHours, _("h"), timeMin, _("min")) + startinfo = "<div class='info_content'>%s: %s</div>" % (activity.sport_name, activity.title) + finishinfo = "<div class='info_content'>%s: %s<br>%s: %s%s</div>" % (_("Time"), time, _("Distance"), activity.distance, activity.distance_unit) + startinfo = startinfo.encode('ascii', 'xmlcharrefreplace') #Encode for html + finishinfo = finishinfo.encode('ascii', 'xmlcharrefreplace') #Encode for html - self.createHtml_osm(polyline, startinfo, finishinfo, laps) - else: - self.createErrorHtml() + self.createHtml_osm(polyline, startinfo, finishinfo, laps) else: self.createErrorHtml() return self.htmlfile Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2010-08-26 03:46:42 UTC (rev 609) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-09-10 01:55:13 UTC (rev 610) @@ -270,7 +270,7 @@ logging.debug(">>") self.record_list = activity.tracks self.laps = activity.laps - if len(self.record_list)>0: + if self.record_list is not None and len(self.record_list)>0: self.record_vbox.set_sensitive(1) self.drawarearecord.drawgraph(self.record_list,self.laps) else: @@ -288,7 +288,11 @@ def actualize_heartrategraph(self,activity): logging.debug(">>") - self.drawareaheartrate.drawgraph(activity.tracks) + if activity.tracks is not None and len(activity.tracks)>0: + self.heartrate_vbox_.set_sensitive(1) + self.drawareaheartrate.drawgraph(activity.tracks) + else: + self.heartrate_vbox_.set_sensitive(0) logging.debug("<<") def actualize_hrview(self,activity): @@ -296,7 +300,7 @@ zones = self.pytrainer_main.profile.getZones() record_list = activity.tracks is_karvonen_method = self.pytrainer_main.profile.getValue("pytraining","prf_hrzones_karvonen") - if len(record_list)>0: + if record_list is not None and len(record_list)>0: record_list=record_list[0] self.record_zone1.set_text("%s-%s" %(zones[4][0],zones[4][1])) self.record_zone2.set_text("%s-%s" %(zones[3][0],zones[3][1])) @@ -312,8 +316,8 @@ self.record_zonesmethod.set_text(_("Karvonen method")) else: self.record_zonesmethod.set_text(_("Percentages method")) - else: - self.recordview.set_sensitive(0) + #else: + # self.recordview.set_sensitive(0) logging.debug("<<") def actualize_dayview(self,record_list): @@ -471,7 +475,10 @@ tbeats = tbeats/time_in_min else: tbeats = 0 - average = (km/(time/3600)) + if km > 0: + average = (km/(time/3600)) + else: + average = 0 if maxspeed > 0: #maxpace = 60/maxspeed @@ -546,7 +553,10 @@ tbeats = tbeats/time_in_min else: tbeats = 0 - average = (km/(time/3600)) + if km > 0: + average = (km/(time/3600)) + else: + average = 0 if maxspeed > 0: #maxpace = 60/maxspeed @@ -606,7 +616,10 @@ tbeats = tbeats/time_in_min else: tbeats = 0 - average = (km/(time/3600)) + if km > 0: + average = (km/(time/3600)) + else: + average = 0 if maxspeed > 0: #maxpace = 60/maxspeed Modified: pytrainer/trunk/pytrainer/lib/activity.py =================================================================== --- pytrainer/trunk/pytrainer/lib/activity.py 2010-08-26 03:46:42 UTC (rev 609) +++ pytrainer/trunk/pytrainer/lib/activity.py 2010-09-10 01:55:13 UTC (rev 610) @@ -77,6 +77,7 @@ return self.pytrainer_main = pytrainer_main self.tracks = None + self.tracklist = None self.laps = None self.tree = None self.has_data = False @@ -214,6 +215,10 @@ logging.debug(">>") self.distance_data = {} self.time_data = {} + if self.tracklist is None: + logging.debug("No tracklist in activity") + logging.debug("<<") + return #Profile title=_("Elevation v Distance") xlabel="%s (%s)" % (_('Distance'), self.distance_unit) Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-08-26 03:46:42 UTC (rev 609) +++ pytrainer/trunk/pytrainer/main.py 2010-09-10 01:55:13 UTC (rev 610) @@ -49,7 +49,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#609" + self.version ="1.7.2_svn#610" self.DB_version = 3 #Process command line options self.startup_options = self.get_options() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |