You can subscribe to this list here.
2008 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(1) |
Nov
|
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2009 |
Jan
|
Feb
(1) |
Mar
(15) |
Apr
(20) |
May
(2) |
Jun
(9) |
Jul
(3) |
Aug
(2) |
Sep
(17) |
Oct
(16) |
Nov
(38) |
Dec
(40) |
2010 |
Jan
(51) |
Feb
(11) |
Mar
(24) |
Apr
(31) |
May
(24) |
Jun
(3) |
Jul
(9) |
Aug
(1) |
Sep
(29) |
Oct
(33) |
Nov
(81) |
Dec
(6) |
2011 |
Jan
(2) |
Feb
(4) |
Mar
(13) |
Apr
(4) |
May
(24) |
Jun
(4) |
Jul
(19) |
Aug
(46) |
Sep
(10) |
Oct
(28) |
Nov
(31) |
Dec
|
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: <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: <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-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-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: <dg...@us...> - 2010-05-22 08:16:31
|
Revision: 588 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=588&view=rev Author: dgranda Date: 2010-05-22 08:16:25 +0000 (Sat, 22 May 2010) Log Message: ----------- Updated ES localization Modified Paths: -------------- pytrainer/trunk/locale/es/LC_MESSAGES/pytrainer.mo pytrainer/trunk/locale/es/LC_MESSAGES/pytrainer_es.po Modified: pytrainer/trunk/locale/es/LC_MESSAGES/pytrainer.mo =================================================================== (Binary files differ) Modified: pytrainer/trunk/locale/es/LC_MESSAGES/pytrainer_es.po =================================================================== --- pytrainer/trunk/locale/es/LC_MESSAGES/pytrainer_es.po 2010-05-19 08:29:32 UTC (rev 587) +++ pytrainer/trunk/locale/es/LC_MESSAGES/pytrainer_es.po 2010-05-22 08:16:25 UTC (rev 588) @@ -7,8 +7,8 @@ msgstr "" "Project-Id-Version: pytrainer 1.7.2\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-04-11 19:56+0200\n" -"PO-Revision-Date: 2010-04-11 19:59+0100\n" +"POT-Creation-Date: 2010-05-22 10:05+0200\n" +"PO-Revision-Date: 2010-05-22 10:14+0100\n" "Last-Translator: David Garcia Granda <dg...@gm...>\n" "Language-Team: Spanish <es...@li...>\n" "MIME-Version: 1.0\n" @@ -35,7 +35,7 @@ #: glade/extensions.glade:82 #: glade/plugins.glade:144 -#: glade/profile.glade:744 +#: glade/profile.glade:803 msgid "Name:" msgstr "Nombre:" @@ -46,7 +46,7 @@ #: glade/extensions.glade:110 #: glade/plugins.glade:86 -#: glade/pytrainer.glade:4728 +#: glade/pytrainer.glade:5386 msgid "Description:" msgstr "<b>Descripción:</b>" @@ -198,7 +198,7 @@ #: glade/newrecord.glade:560 #: glade/newrecord.glade:698 #: glade/newrecord.glade:959 -#: glade/profile.glade:1404 +#: glade/profile.glade:1459 msgid "Calculate" msgstr "Calcular" @@ -208,16 +208,6 @@ #: glade/newrecord.glade:281 #: glade/newrecord.glade:308 -#: glade/pytrainer.glade:833 -#: glade/pytrainer.glade:855 -#: glade/pytrainer.glade:2038 -#: glade/pytrainer.glade:2060 -#: glade/pytrainer.glade:2651 -#: glade/pytrainer.glade:2673 -#: glade/pytrainer.glade:3276 -#: glade/pytrainer.glade:3298 -#: glade/pytrainer.glade:3976 -#: glade/pytrainer.glade:3998 msgid ":" msgstr ":" @@ -226,8 +216,6 @@ msgstr "Fecha:" #: glade/newrecord.glade:406 -#: glade/pytrainer.glade:2843 -#: glade/pytrainer.glade:3468 msgid " " msgstr " " @@ -240,7 +228,7 @@ msgstr "12:00:00" #: glade/newrecord.glade:488 -#: glade/profile.glade:1442 +#: glade/profile.glade:1497 msgid "<b>General</b>" msgstr "<b>General:</b>" @@ -293,7 +281,7 @@ msgstr "Pulsaciones" #: glade/newrecord.glade:903 -#: pytrainer/gui/windowmain.py:755 +#: pytrainer/gui/windowmain.py:744 #: pytrainer/monthgraph.py:77 #: pytrainer/yeargraph.py:78 #: pytrainer/weekgraph.py:123 @@ -336,116 +324,130 @@ msgid "Preferences" msgstr "Preferencias" -#: glade/profile.glade:43 +#: glade/profile.glade:37 msgid "Metric system" msgstr "Sistema métrico" -#: glade/profile.glade:57 +#: glade/profile.glade:53 msgid "U.S. customary units" msgstr "Sistema americano" -#: glade/profile.glade:79 +#: glade/profile.glade:74 msgid "<b>System of Measurement</b>" msgstr "<b>Sistema de medida</b>" -#: glade/profile.glade:115 +#: glade/profile.glade:103 +#: glade/pytrainer.glade:1954 +msgid "Google" +msgstr "Google" + +#: glade/profile.glade:118 +#: glade/pytrainer.glade:1937 +msgid "Open Street Map" +msgstr "Open Street Map" + +#: glade/profile.glade:140 +msgid "<b>Default Map Viewer</b>" +msgstr "<b>Mapa por defecto</b>" + +#: glade/profile.glade:176 msgid "Database type:" msgstr "Tipo de base de datos" -#: glade/profile.glade:126 +#: glade/profile.glade:187 msgid "Database host:" msgstr "Servidor base de datos" -#: glade/profile.glade:152 +#: glade/profile.glade:213 msgid "Database name:" msgstr "Nombre base de datos" -#: glade/profile.glade:191 +#: glade/profile.glade:252 msgid "Database user:" msgstr "Usuario base de datos" -#: glade/profile.glade:206 +#: glade/profile.glade:267 msgid "Database pass:" msgstr "Contraseña base de datos" -#: glade/profile.glade:257 +#: glade/profile.glade:318 msgid "<b>Database</b>" msgstr "<b>Base de datos:</b>" -#: glade/profile.glade:293 +#: glade/profile.glade:354 msgid "Use this port for internal connections: " msgstr "Use este puerto para conexiones internas" -#: glade/profile.glade:318 +#: glade/profile.glade:379 msgid "<small><b>Note:</b> Change this only if you know what you are doing</small>" msgstr "<small><b>Nota:</b> cambie esto solamente si sabe lo que hace</small>" -#: glade/profile.glade:336 +#: glade/profile.glade:397 msgid "<b>Port Connnection</b>" msgstr "<b>Puerto de conexión:</b>" -#: glade/profile.glade:355 +#: glade/profile.glade:416 msgid "General" msgstr "General" -#: glade/profile.glade:384 +#: glade/profile.glade:445 msgid "User name:" msgstr "Nombre de usuario:" -#: glade/profile.glade:395 +#: glade/profile.glade:456 msgid "Gender:" msgstr "Género:" -#: glade/profile.glade:422 +#: glade/profile.glade:483 msgid "Height:" msgstr "Altura:" -#: glade/profile.glade:462 +#: glade/profile.glade:523 msgid "Date of birth:" msgstr "Fecha de nacimiento:" -#: glade/profile.glade:535 +#: glade/profile.glade:596 msgid "Weight:" msgstr "Peso:" -#: glade/profile.glade:557 +#: glade/profile.glade:618 msgid "<b>Athlete Details</b>" msgstr "<b>Datos personales</b>" -#: glade/profile.glade:572 +#: glade/profile.glade:633 msgid "Athlete" msgstr "Atleta" -#: glade/profile.glade:687 +#: glade/profile.glade:747 msgid "<b>Sport List</b>" msgstr "<b>Lista de deportes</b>" -#: glade/profile.glade:699 +#: glade/profile.glade:759 msgid "llist" msgstr "lista" -#: glade/profile.glade:755 +#: glade/profile.glade:814 msgid "M.E.T.:" msgstr "M.E.T.:" -#: glade/profile.glade:782 +#: glade/profile.glade:841 msgid "Extra Weight:" msgstr "Peso extra:" -#: glade/profile.glade:818 -#: glade/profile.glade:1171 +#: glade/profile.glade:877 +#: glade/profile.glade:1227 msgid "More information on determining yor M.E.T sport coefficient on Wikipedia" msgstr "Más información sobre el coeficiente M.E.T. en Wikipedia" -#: glade/profile.glade:900 +#: glade/profile.glade:959 msgid "<b>Add New Sport</b>" msgstr "<b>Añadir nuevo deporte</b>" -#: glade/profile.glade:915 +#: glade/profile.glade:974 msgid "new" msgstr "nuevo" -#: glade/profile.glade:948 +#: glade/profile.glade:1005 msgid "" "Deleting a sport removes associated records.\n" "Continue?" @@ -453,94 +455,88 @@ "Si borra un deporte elimina sus registros asociados.\n" "¿Desea continuar?" -#: glade/profile.glade:1030 +#: glade/profile.glade:1087 msgid "<b>Delete Sport</b>" msgstr "<b>Borrar deporte</b>" -#: glade/profile.glade:1041 -#: glade/pytrainer.glade:1884 -#: glade/pytrainer.glade:4857 -msgid "label-2147483648" -msgstr " " - -#: glade/profile.glade:1062 +#: glade/profile.glade:1119 msgid "delete" msgstr "borrar" -#: glade/profile.glade:1096 +#: glade/profile.glade:1152 msgid "Name" msgstr "Nombre" -#: glade/profile.glade:1119 +#: glade/profile.glade:1175 msgid "M.E.T." msgstr "M.E.T." -#: glade/profile.glade:1146 -#: pytrainer/gui/windowprofile.py:71 +#: glade/profile.glade:1202 +#: pytrainer/gui/windowprofile.py:56 msgid "Extra Weight" msgstr "Peso extra" -#: glade/profile.glade:1252 +#: glade/profile.glade:1308 msgid "<b>Edit Sport</b>" msgstr "<b>Editar deporte</b>" -#: glade/profile.glade:1263 +#: glade/profile.glade:1319 msgid "<b>lalaal</b>" msgstr "<b>lalaal</b>" -#: glade/profile.glade:1285 +#: glade/profile.glade:1341 msgid "edit" msgstr "editar" -#: glade/profile.glade:1301 +#: glade/profile.glade:1357 msgid "Sports" msgstr "Deportes" -#: glade/profile.glade:1335 +#: glade/profile.glade:1390 msgid "Maximum heart rate:" msgstr "Pulsaciones máximas:" -#: glade/profile.glade:1346 +#: glade/profile.glade:1401 msgid "Resting heart rate:" msgstr "Pulsaciones en reposo:" -#: glade/profile.glade:1391 +#: glade/profile.glade:1446 msgid "<small><b>Note:</b> Maximum heart rate is calculated by subtracting the number 220 minus your age. </small>" msgstr "<small><b>Nota:</b> el número máximo de pulsaciones se calcula con la siguiente fórmula: 220 menos su edad. </small>" -#: glade/profile.glade:1478 +#: glade/profile.glade:1533 msgid "<small><b>NOTE:</b> in order to use the Karvonen method you must cover the Resting hr field.</small>" msgstr "<small><b>Nota:</b> rellene todos los campos relativos a pulsaciones si usa el método Karvonen</small>" -#: glade/profile.glade:1491 +#: glade/profile.glade:1546 msgid "Percentages based method" msgstr "Basado en porcentajes" -#: glade/profile.glade:1507 -#: pytrainer/gui/windowmain.py:308 +#: glade/profile.glade:1562 +#: pytrainer/gui/windowmain.py:290 msgid "Karvonen method" msgstr "Karvonen" -#: glade/profile.glade:1528 +#: glade/profile.glade:1583 msgid "Select how to calculate your heart rate zones." msgstr "Seleccione cómo calcular las zonas de frecuencia cardiaca" -#: glade/profile.glade:1567 +#: glade/profile.glade:1622 msgid "<b>Heart Rate Zones</b>" msgstr "<b>Zonas de frecuencia cardiaca</b>" -#: glade/profile.glade:1589 -#: pytrainer/recordgraph.py:120 -#: pytrainer/heartrategraph.py:38 +#: glade/profile.glade:1644 +#: pytrainer/recordgraph.py:138 +#: pytrainer/heartrategraph.py:36 #: pytrainer/daygraph.py:56 msgid "Heart Rate" msgstr "Pulsaciones" -#: glade/profile.glade:1616 +#: glade/profile.glade:1670 msgid "Log Level" msgstr "Nivel de log" -#: glade/profile.glade:1624 +#: glade/profile.glade:1678 msgid "" "Error\n" "Warning\n" @@ -552,74 +548,62 @@ "Información\n" "Depuración" -#: glade/profile.glade:1642 +#: glade/profile.glade:1696 msgid "<small>What level of detail is written to the log?</small>" msgstr "<small>¿Qué nivel de detalle existe en el fichero de log?</small>" -#: glade/profile.glade:1656 +#: glade/profile.glade:1710 msgid "Validate" msgstr "Validar" -#: glade/profile.glade:1665 -msgid "--valid" -msgstr "--valid" - -#: glade/profile.glade:1686 +#: glade/profile.glade:1740 msgid "<small>Do the plugins attempt to validate the input file before processing?</small>" msgstr "<small>¿Intentan los plugins validar el fichero de entrada antes de procesarlo?</small>" -#: glade/profile.glade:1702 +#: glade/profile.glade:1756 msgid "Check" msgstr "Comprobación" -#: glade/profile.glade:1711 -msgid "--check" -msgstr "--check" - -#: glade/profile.glade:1731 +#: glade/profile.glade:1785 msgid "<small>Was a configuration and database check requested?</small>" msgstr "<small>¿Existió una petición para comprobar la configuración y la base de datos?</small>" -#: glade/profile.glade:1747 +#: glade/profile.glade:1801 msgid "Googlemaps v3" msgstr "Googlemaps v3" -#: glade/profile.glade:1757 -msgid "--gmaps2*" -msgstr "--gmaps2*" - -#: glade/profile.glade:1779 +#: glade/profile.glade:1833 msgid "<small>Is the Googlemaps API version 3 in use?</small>" msgstr "<small>¿Se usa la versión 3 de la API de Googlemaps?</small>" -#: glade/profile.glade:1795 +#: glade/profile.glade:1849 msgid "Unified Import" msgstr "Importar" -#: glade/profile.glade:1804 -msgid "--testimport" -msgstr "--testimport" - -#: glade/profile.glade:1825 +#: glade/profile.glade:1879 msgid "<small>Is the Unified Importer active?</small>" msgstr "<small>¿Está habilitado el importador unificado?</small>" -#: glade/profile.glade:1850 +#: glade/profile.glade:1895 +msgid "Equipment handling" +msgstr "Gestión de equipamiento" + +#: glade/profile.glade:1924 +msgid "<small>Want to track equipment?</small>" +msgstr "<small>¿Control de equipamiento?</small>" + +#: glade/profile.glade:1949 msgid "<small>This screen shows the state of command line configurable options for pytrainer. These options can be changed here which will affect the current instance of pytrainer, they will not be remembered next time though</small>" msgstr "<small>Esta pantalla muestra el estado de las opciones que se pueden configurar mediante línea de comandos para PyTrainer. Los cambios que se hagan únicamente tendrán efecto en la presente ejecución de pytrainer y no serán recordados en el futuro</small>" -#: glade/profile.glade:1866 +#: glade/profile.glade:1965 msgid "<small>* Note Googlemaps API version 3 is on by default, use --gmaps2 to switch it off</small>" msgstr "<small>* Se usa por defecto la versión 3 de la API de Googlemaps, utilice --gmaps2 para desactivarla</small>" -#: glade/profile.glade:1882 +#: glade/profile.glade:1981 msgid "Startup Parameters" msgstr "Configuración inicio" -#: glade/pytrainer.glade:7 -msgid "window1" -msgstr "Ventana1" - #: glade/pytrainer.glade:24 msgid "_File" msgstr "_Archivo" @@ -656,175 +640,133 @@ msgid "_Help" msgstr "_Ayuda" -#: glade/pytrainer.glade:276 -#: pytrainer/gui/windowmain.py:65 -#: pytrainer/gui/windowmain.py:68 -#: pytrainer/gui/windowmain.py:751 +#: glade/pytrainer.glade:275 +#: pytrainer/gui/windowmain.py:75 +#: pytrainer/gui/windowmain.py:78 +#: pytrainer/gui/windowmain.py:740 #: pytrainer/gui/windowimportdata.py:333 #: pytrainer/gui/windowrecord.py:147 -#: pytrainer/gui/windowprofile.py:71 +#: pytrainer/gui/windowprofile.py:56 msgid "Sport" msgstr "Deporte" -#: glade/pytrainer.glade:288 +#: glade/pytrainer.glade:287 msgid "All Sports" msgstr "Todos los deportes" -#: glade/pytrainer.glade:395 +#: glade/pytrainer.glade:393 msgid "<b>Sport:</b>" msgstr "<b>Deporte:</b>" -#: glade/pytrainer.glade:407 -#: glade/pytrainer.glade:2013 -#: glade/pytrainer.glade:2626 -#: glade/pytrainer.glade:3251 -#: glade/pytrainer.glade:3952 +#: glade/pytrainer.glade:405 +#: glade/pytrainer.glade:2657 +#: glade/pytrainer.glade:3268 +#: glade/pytrainer.glade:3891 +#: glade/pytrainer.glade:4590 msgid "<b>Duration:</b>" msgstr "<b>Duración:</b>" -#: glade/pytrainer.glade:422 -#: glade/pytrainer.glade:2103 -#: glade/pytrainer.glade:2705 -#: glade/pytrainer.glade:3330 -#: glade/pytrainer.glade:4054 +#: glade/pytrainer.glade:420 +#: glade/pytrainer.glade:2747 +#: glade/pytrainer.glade:3347 +#: glade/pytrainer.glade:3970 +#: glade/pytrainer.glade:4692 msgid "<b>Speed:</b>" msgstr "<b>Velocidad:</b>" -#: glade/pytrainer.glade:436 -#: glade/pytrainer.glade:2271 -#: glade/pytrainer.glade:2900 -#: glade/pytrainer.glade:3525 -#: glade/pytrainer.glade:4149 +#: glade/pytrainer.glade:434 +#: glade/pytrainer.glade:2915 +#: glade/pytrainer.glade:3542 +#: glade/pytrainer.glade:4165 +#: glade/pytrainer.glade:4787 msgid "<b>Pace:</b>" msgstr "<b>Ritmo:</b>" -#: glade/pytrainer.glade:450 +#: glade/pytrainer.glade:448 msgid "<b>Ascent:</b>" msgstr "<b>Ascenso:</b>" -#: glade/pytrainer.glade:464 +#: glade/pytrainer.glade:462 msgid "<b>Calories:</b>" msgstr "<b>Calorías: </b>" -#: glade/pytrainer.glade:478 +#: glade/pytrainer.glade:476 msgid "<b>Comments:</b>" msgstr "<b>Comentarios:</b>" -#: glade/pytrainer.glade:493 -#: glade/pytrainer.glade:890 -#: glade/pytrainer.glade:2133 -#: glade/pytrainer.glade:2166 -#: glade/pytrainer.glade:2735 -#: glade/pytrainer.glade:2828 -#: glade/pytrainer.glade:3360 -#: glade/pytrainer.glade:3453 -#: glade/pytrainer.glade:4084 -#: glade/pytrainer.glade:4100 -#: pytrainer/gui/windowmain.py:192 -#: pytrainer/gui/windowmain.py:193 -#: pytrainer/gui/windowmain.py:328 -#: pytrainer/gui/windowmain.py:329 -#: pytrainer/gui/windowmain.py:432 -#: pytrainer/gui/windowmain.py:433 -#: pytrainer/gui/windowmain.py:510 -#: pytrainer/gui/windowmain.py:511 -msgid "km/h" -msgstr "Km/h" - -#: glade/pytrainer.glade:509 -#: glade/pytrainer.glade:721 -#: glade/pytrainer.glade:2286 -#: glade/pytrainer.glade:2318 -#: glade/pytrainer.glade:2931 -#: glade/pytrainer.glade:2947 -#: glade/pytrainer.glade:3556 -#: glade/pytrainer.glade:3572 -#: glade/pytrainer.glade:4181 -#: glade/pytrainer.glade:4197 -#: pytrainer/gui/windowmain.py:194 -#: pytrainer/gui/windowmain.py:195 -#: pytrainer/gui/windowmain.py:330 -#: pytrainer/gui/windowmain.py:331 -#: pytrainer/gui/windowmain.py:434 -#: pytrainer/gui/windowmain.py:435 -#: pytrainer/gui/windowmain.py:512 -#: pytrainer/gui/windowmain.py:513 -msgid "min/km" -msgstr "min/km" - -#: glade/pytrainer.glade:525 -#: glade/pytrainer.glade:752 -#: pytrainer/gui/windowmain.py:196 -#: pytrainer/gui/windowmain.py:197 -#: pytrainer/gui/windowmain.py:1047 -#: pytrainer/gui/windowmain.py:1049 -msgid "m" -msgstr "m" - -#: glade/pytrainer.glade:613 +#: glade/pytrainer.glade:611 msgid "<b>Date:</b>" msgstr "<b>Fecha:</b>" -#: glade/pytrainer.glade:627 -#: glade/pytrainer.glade:1999 -#: glade/pytrainer.glade:2612 -#: glade/pytrainer.glade:3237 -#: glade/pytrainer.glade:3938 +#: glade/pytrainer.glade:625 +#: glade/pytrainer.glade:2643 +#: glade/pytrainer.glade:3254 +#: glade/pytrainer.glade:3877 +#: glade/pytrainer.glade:4576 msgid "<b>Distance:</b>" msgstr "<b>Distancia:</b>" -#: glade/pytrainer.glade:644 +#: glade/pytrainer.glade:642 msgid "<b>Max Speed</b>" msgstr "<b>Pico velocidad:</b>" -#: glade/pytrainer.glade:660 -#: glade/pytrainer.glade:2301 -#: glade/pytrainer.glade:2914 -#: glade/pytrainer.glade:3539 -#: glade/pytrainer.glade:4164 +#: glade/pytrainer.glade:658 +#: glade/pytrainer.glade:2945 +#: glade/pytrainer.glade:3556 +#: glade/pytrainer.glade:4179 +#: glade/pytrainer.glade:4802 msgid "<b>Max Pace:</b>" msgstr "<b>Pico ritmo:</b>" -#: glade/pytrainer.glade:676 +#: glade/pytrainer.glade:674 msgid "<b>Descent:</b>" msgstr "<b>Descenso:</b>" -#: glade/pytrainer.glade:768 -#: glade/pytrainer.glade:2211 -#: glade/pytrainer.glade:2780 -#: glade/pytrainer.glade:3405 -#: glade/pytrainer.glade:3864 +#: glade/pytrainer.glade:766 +#: glade/pytrainer.glade:2855 +#: glade/pytrainer.glade:3422 +#: glade/pytrainer.glade:4045 +#: glade/pytrainer.glade:4502 msgid "Cal" msgstr "Cal" -#: glade/pytrainer.glade:807 -#: glade/pytrainer.glade:1973 -#: glade/pytrainer.glade:2586 -#: glade/pytrainer.glade:3211 -#: glade/pytrainer.glade:4041 +#: glade/pytrainer.glade:805 +#: glade/pytrainer.glade:2617 +#: glade/pytrainer.glade:3228 +#: glade/pytrainer.glade:3851 +#: glade/pytrainer.glade:4679 msgid "Km" msgstr "km" -#: glade/pytrainer.glade:824 -#: glade/pytrainer.glade:844 -#: glade/pytrainer.glade:867 -#: glade/pytrainer.glade:2028 -#: glade/pytrainer.glade:2049 -#: glade/pytrainer.glade:2071 -#: glade/pytrainer.glade:2662 -#: glade/pytrainer.glade:2684 -#: glade/pytrainer.glade:3287 -#: glade/pytrainer.glade:3309 -#: glade/pytrainer.glade:3987 -#: glade/pytrainer.glade:4009 -msgid "00" -msgstr "00" +#: glade/pytrainer.glade:888 +#: glade/pytrainer.glade:2777 +#: glade/pytrainer.glade:2810 +#: glade/pytrainer.glade:3377 +#: glade/pytrainer.glade:3470 +#: glade/pytrainer.glade:4000 +#: glade/pytrainer.glade:4093 +#: glade/pytrainer.glade:4722 +#: glade/pytrainer.glade:4738 +#: pytrainer/gui/windowmain.py:307 +#: pytrainer/gui/windowmain.py:308 +#: pytrainer/gui/windowmain.py:424 +#: pytrainer/gui/windowmain.py:425 +#: pytrainer/gui/windowmain.py:499 +#: pytrainer/gui/windowmain.py:500 +#: pytrainer/lib/activity.py:70 +msgid "km/h" +msgstr "Km/h" -#: glade/pytrainer.glade:1041 +#: glade/pytrainer.glade:1039 msgid " <b>Title:</b>" msgstr "<b>Título:</b>" -#: glade/pytrainer.glade:1098 +#: glade/pytrainer.glade:1089 +#: pytrainer/gui/windowmain.py:836 +msgid "Show graph display options" +msgstr "Mostrar opciones del gráfico" + +#: glade/pytrainer.glade:1107 msgid "" "Profile\n" "Speed\n" @@ -837,14 +779,14 @@ "Ritmo\n" "Pulsaciones" -#: glade/pytrainer.glade:1113 -#: glade/pytrainer.glade:3121 -#: glade/pytrainer.glade:3746 -#: glade/pytrainer.glade:4370 +#: glade/pytrainer.glade:1122 +#: glade/pytrainer.glade:3762 +#: glade/pytrainer.glade:4385 +#: glade/pytrainer.glade:5007 msgid "Versus" msgstr "contra" -#: glade/pytrainer.glade:1124 +#: glade/pytrainer.glade:1133 msgid "" "None\n" "Profile\n" @@ -859,130 +801,197 @@ "Ritmo\n" "Pulsaciones\n" -#: glade/pytrainer.glade:1141 +#: glade/pytrainer.glade:1188 +msgid "<small>Graph Display Options</small>" +msgstr "<small>Opciones de visualización gráfica</small>" + +#: glade/pytrainer.glade:1213 +#: glade/pytrainer.glade:1428 +#: glade/pytrainer.glade:1648 +msgid "<small>Limits</small>" +msgstr "<small>Límites</small>" + +#: glade/pytrainer.glade:1225 +#: glade/pytrainer.glade:1440 +#: glade/pytrainer.glade:1694 +msgid "<small>Min</small>" +msgstr "<small>Mín</small>" + +#: glade/pytrainer.glade:1237 +#: glade/pytrainer.glade:1452 +#: glade/pytrainer.glade:1706 +msgid "<small>Max</small>" +msgstr "<small>Máx</small>" + +#: glade/pytrainer.glade:1286 +#: glade/pytrainer.glade:1508 +msgid "<small>Color</small>" +msgstr "<small>Color</small>" + +#: glade/pytrainer.glade:1317 +#: glade/pytrainer.glade:1521 +msgid "<small>Weight</small>" +msgstr "<small>Peso</small>" + +#: glade/pytrainer.glade:1347 +msgid "Y1" +msgstr "Y1" + +#: glade/pytrainer.glade:1358 +#: glade/pytrainer.glade:1569 +msgid "<small>Smoothing</small>" +msgstr "<small>Suavizado</small>" + +#: glade/pytrainer.glade:1498 +msgid "Y2" +msgstr "Y2" + +#: glade/pytrainer.glade:1638 +msgid "X" +msgstr "X" + +#: glade/pytrainer.glade:1719 +msgid "<small>Distance</small>" +msgstr "<small>Distancia</small>" + +#: glade/pytrainer.glade:1748 +msgid "<small>Time</small>" +msgstr "<small>Tiempo</small>" + +#: glade/pytrainer.glade:1809 msgid "Show Laps" msgstr "Mostras vueltas" -#: glade/pytrainer.glade:1199 -msgid "<small>Y Axis</small>" -msgstr "<small>Eje vertical (Y)</small>" - -#: glade/pytrainer.glade:1248 -msgid "<small>Graph Display Options</small>" -msgstr "<small>Opciones de visualización gráfica</small>" - -#: glade/pytrainer.glade:1258 +#: glade/pytrainer.glade:1848 msgid "Reset Graph" msgstr "Resetear" -#: glade/pytrainer.glade:1262 -msgid "Reset Graph display to original settings" -msgstr "Volver a la configuración por defecto de la visualización gráfica" +#: glade/pytrainer.glade:1910 +msgid "Redraw Map" +msgstr "Mapa original" -#: glade/pytrainer.glade:1381 +#: glade/pytrainer.glade:1926 +msgid "<small>Display map using:</small>" +msgstr "<small>Opciones de visualización de mapas:</small>" + +#: glade/pytrainer.glade:2028 msgid "<b>Beats:</b>" msgstr "<b>Pulsaciones:</b>" -#: glade/pytrainer.glade:1393 -#: glade/pytrainer.glade:2181 -#: glade/pytrainer.glade:2750 -#: glade/pytrainer.glade:3375 -#: glade/pytrainer.glade:3834 +#: glade/pytrainer.glade:2040 +#: glade/pytrainer.glade:2825 +#: glade/pytrainer.glade:3392 +#: glade/pytrainer.glade:4015 +#: glade/pytrainer.glade:4472 msgid "<b>Calories: </b>" msgstr "<b>Calorías: </b>" -#: glade/pytrainer.glade:1407 -#: glade/pytrainer.glade:2333 -#: glade/pytrainer.glade:2978 -#: glade/pytrainer.glade:3603 -#: glade/pytrainer.glade:4212 +#: glade/pytrainer.glade:2054 +#: glade/pytrainer.glade:2977 +#: glade/pytrainer.glade:3620 +#: glade/pytrainer.glade:4243 +#: glade/pytrainer.glade:4850 msgid "<b>Max Beats:</b>" msgstr "<b>Pico pulsaciones:</b>" -#: glade/pytrainer.glade:1421 +#: glade/pytrainer.glade:2068 msgid "<b>HR Zones Method:</b>" msgstr "<b>Método de cálculo:</b>" -#: glade/pytrainer.glade:1436 +#: glade/pytrainer.glade:2083 msgid "<b>HR Zone5:</b>" msgstr "<b>Máximo esfuerzo:</b>" -#: glade/pytrainer.glade:1451 -#: glade/pytrainer.glade:1650 +#: glade/pytrainer.glade:2098 +#: glade/pytrainer.glade:2297 msgid " bpm" msgstr "ppm" -#: glade/pytrainer.glade:1467 +#: glade/pytrainer.glade:2114 msgid " Cal" msgstr "Cal" -#: glade/pytrainer.glade:1525 +#: glade/pytrainer.glade:2172 msgid "<b>HR Zone4:</b>" msgstr "<b>Anaeróbica:</b>" -#: glade/pytrainer.glade:1541 +#: glade/pytrainer.glade:2188 msgid "<b>HR Zone3:</b>" msgstr "<b>Aeróbica:</b>" -#: glade/pytrainer.glade:1557 +#: glade/pytrainer.glade:2204 msgid "<b>HR Zone2:</b>" msgstr "<b>Quemagrasas:</b>" -#: glade/pytrainer.glade:1573 +#: glade/pytrainer.glade:2220 msgid "<b>HR Zone1:</b>" msgstr "<b>Recuperación:</b>" -#: glade/pytrainer.glade:1675 -#: glade/pytrainer.glade:1687 -#: glade/pytrainer.glade:1702 -#: glade/pytrainer.glade:1717 -#: glade/pytrainer.glade:1732 -#: glade/pytrainer.glade:2256 -#: glade/pytrainer.glade:2350 -#: glade/pytrainer.glade:2885 -#: glade/pytrainer.glade:2963 -#: glade/pytrainer.glade:3510 -#: glade/pytrainer.glade:3588 -#: glade/pytrainer.glade:3909 -#: glade/pytrainer.glade:4116 +#: glade/pytrainer.glade:2322 +#: glade/pytrainer.glade:2334 +#: glade/pytrainer.glade:2349 +#: glade/pytrainer.glade:2364 +#: glade/pytrainer.glade:2379 +#: glade/pytrainer.glade:2900 +#: glade/pytrainer.glade:2994 +#: glade/pytrainer.glade:3527 +#: glade/pytrainer.glade:3605 +#: glade/pytrainer.glade:4150 +#: glade/pytrainer.glade:4228 +#: glade/pytrainer.glade:4547 +#: glade/pytrainer.glade:4754 msgid "bpm" msgstr "ppm" -#: glade/pytrainer.glade:1777 +#: glade/pytrainer.glade:2424 msgid " <b>Heart Rate:</b>" msgstr "<b>Pulsaciones:</b>" -#: glade/pytrainer.glade:1905 -msgid "label-2147483647" -msgstr " " - -#: glade/pytrainer.glade:1939 +#: glade/pytrainer.glade:2584 msgid "Record" msgstr "Registro" -#: glade/pytrainer.glade:2149 -#: glade/pytrainer.glade:2796 -#: glade/pytrainer.glade:3421 -#: glade/pytrainer.glade:4132 +#: glade/pytrainer.glade:2793 +#: glade/pytrainer.glade:3438 +#: glade/pytrainer.glade:4061 +#: glade/pytrainer.glade:4770 msgid "<b>Max Speed:</b>" msgstr "<b>Velocidad máxima:</b>" -#: glade/pytrainer.glade:2226 -#: glade/pytrainer.glade:2855 -#: glade/pytrainer.glade:3480 -#: glade/pytrainer.glade:3879 +#: glade/pytrainer.glade:2870 +#: glade/pytrainer.glade:3497 +#: glade/pytrainer.glade:4120 +#: glade/pytrainer.glade:4517 msgid "<b>Beats avg:</b>" msgstr "<b>Media pulsaciones:</b>" -#: glade/pytrainer.glade:2440 +#: glade/pytrainer.glade:2930 +#: glade/pytrainer.glade:2962 +#: glade/pytrainer.glade:3573 +#: glade/pytrainer.glade:3589 +#: glade/pytrainer.glade:4196 +#: glade/pytrainer.glade:4212 +#: glade/pytrainer.glade:4819 +#: glade/pytrainer.glade:4835 +#: pytrainer/gui/windowmain.py:309 +#: pytrainer/gui/windowmain.py:310 +#: pytrainer/gui/windowmain.py:426 +#: pytrainer/gui/windowmain.py:427 +#: pytrainer/gui/windowmain.py:501 +#: pytrainer/gui/windowmain.py:502 +#: pytrainer/lib/activity.py:71 +msgid "min/km" +msgstr "min/km" + +#: glade/pytrainer.glade:3084 msgid " <b>Date:</b>" msgstr "<b>Fecha:</b>" -#: glade/pytrainer.glade:2484 +#: glade/pytrainer.glade:3127 msgid "Value" msgstr "Valor" -#: glade/pytrainer.glade:2495 +#: glade/pytrainer.glade:3138 msgid "" "Stage Profile\n" "Stage Velocity\n" @@ -992,23 +1001,17 @@ "Velocidad de Etapa\n" "Perfil/Velocidad de Etapa" -#: glade/pytrainer.glade:2551 +#: glade/pytrainer.glade:3194 msgid "Day" msgstr "Día" -#: glade/pytrainer.glade:2641 -#: glade/pytrainer.glade:3266 -#: glade/pytrainer.glade:3966 -msgid "000" -msgstr "000" - -#: glade/pytrainer.glade:3054 +#: glade/pytrainer.glade:3696 msgid " <b>Week:</b>" msgstr "<b>Semana:</b>" -#: glade/pytrainer.glade:3106 -#: glade/pytrainer.glade:3731 -#: glade/pytrainer.glade:4355 +#: glade/pytrainer.glade:3747 +#: glade/pytrainer.glade:4370 +#: glade/pytrainer.glade:4992 msgid "" "Distance\n" "Time\n" @@ -1022,9 +1025,9 @@ "Velocidad media\n" "Calorías" -#: glade/pytrainer.glade:3132 -#: glade/pytrainer.glade:3757 -#: glade/pytrainer.glade:4381 +#: glade/pytrainer.glade:3773 +#: glade/pytrainer.glade:4396 +#: glade/pytrainer.glade:5018 msgid "" "None\n" "Distance\n" @@ -1040,51 +1043,47 @@ "Velocidad media\n" "Calorías" -#: glade/pytrainer.glade:3176 +#: glade/pytrainer.glade:3817 msgid "Week" msgstr "Semana" -#: glade/pytrainer.glade:3679 +#: glade/pytrainer.glade:4319 msgid " <b>Month:</b>" msgstr "<b>Mes:</b>" -#: glade/pytrainer.glade:3800 +#: glade/pytrainer.glade:4439 msgid "Month" msgstr "Mes" -#: glade/pytrainer.glade:4303 +#: glade/pytrainer.glade:4941 msgid " <b>Year:</b>" msgstr "<b>Año:</b>" -#: glade/pytrainer.glade:4424 +#: glade/pytrainer.glade:5061 msgid "Year" msgstr "Año" -#: glade/pytrainer.glade:4447 -msgid "label154" -msgstr " " +#: glade/pytrainer.glade:5084 +msgid "Equipment" +msgstr "Equipamiento" -#: glade/pytrainer.glade:4467 +#: glade/pytrainer.glade:5126 msgid "<b>Title:</b>" msgstr "<b>Título:</b>" -#: glade/pytrainer.glade:4490 +#: glade/pytrainer.glade:5149 msgid "Search" msgstr "Buscar" -#: glade/pytrainer.glade:4517 +#: glade/pytrainer.glade:5176 msgid "Columns" msgstr "Columnas" -#: glade/pytrainer.glade:4573 -msgid "label155" -msgstr " " - -#: glade/pytrainer.glade:4657 +#: glade/pytrainer.glade:5315 msgid "Type:" msgstr "Tipo:" -#: glade/pytrainer.glade:4670 +#: glade/pytrainer.glade:5328 msgid "" "Font\n" "Restaurant\n" @@ -1096,30 +1095,22 @@ "Mirador\n" "Cumbre" -#: glade/pytrainer.glade:4686 +#: glade/pytrainer.glade:5344 msgid "Latitude: " msgstr "<b>Latitud:</b>" -#: glade/pytrainer.glade:4700 +#: glade/pytrainer.glade:5358 msgid " Name:" msgstr "Nombre:" -#: glade/pytrainer.glade:4712 +#: glade/pytrainer.glade:5370 msgid "Longitude:" msgstr "<b>Longitud:</b>" -#: glade/pytrainer.glade:4804 +#: glade/pytrainer.glade:5462 msgid "<b> Waypoint: </b>" msgstr "<b> Waypoint: </b>" -#: glade/pytrainer.glade:4885 -msgid "label162" -msgstr " " - -#: glade/pytrainer.glade:4972 -msgid "label163" -msgstr " " - #: glade/selecttrackdialog.glade:7 msgid "Select track record" msgstr "Seleccione uno de los tracks" @@ -1129,117 +1120,122 @@ msgid "Warning" msgstr "Advertencia" -#: pytrainer/gui/windowmain.py:65 -#: pytrainer/gui/windowmain.py:68 -#: pytrainer/gui/windowmain.py:72 +#: pytrainer/gui/windowmain.py:75 +#: pytrainer/gui/windowmain.py:78 +#: pytrainer/gui/windowmain.py:82 msgid "id" msgstr "id" -#: pytrainer/gui/windowmain.py:65 +#: pytrainer/gui/windowmain.py:75 msgid "Start" msgstr "Comienzo" -#: pytrainer/gui/windowmain.py:65 +#: pytrainer/gui/windowmain.py:75 msgid "Kilometer" msgstr "Kilómetros" -#: pytrainer/gui/windowmain.py:68 -#: pytrainer/gui/windowmain.py:748 +#: pytrainer/gui/windowmain.py:78 +#: pytrainer/gui/windowmain.py:737 msgid "Title" msgstr "Título" -#: pytrainer/gui/windowmain.py:68 -#: pytrainer/gui/windowmain.py:749 +#: pytrainer/gui/windowmain.py:78 +#: pytrainer/gui/windowmain.py:738 #: pytrainer/gui/dialogselecttrack.py:40 msgid "Date" msgstr "Fecha" -#: pytrainer/gui/windowmain.py:68 -#: pytrainer/gui/windowmain.py:750 +#: pytrainer/gui/windowmain.py:78 +#: pytrainer/gui/windowmain.py:739 #: pytrainer/gui/windowimportdata.py:333 #: pytrainer/gui/windowrecord.py:147 -#: pytrainer/extensions/googlemaps.py:93 +#: pytrainer/extensions/googlemaps.py:76 +#: pytrainer/extensions/osm.py:51 msgid "Distance" msgstr "Distancia" -#: pytrainer/gui/windowmain.py:68 -#: pytrainer/gui/windowmain.py:752 -#: pytrainer/extensions/googlemaps.py:93 +#: pytrainer/gui/windowmain.py:78 +#: pytrainer/gui/windowmain.py:741 +#: pytrainer/extensions/googlemaps.py:76 +#: pytrainer/extensions/osm.py:51 msgid "Time" msgstr "Tiempo" -#: pytrainer/gui/windowmain.py:68 -#: pytrainer/gui/windowmain.py:753 +#: pytrainer/gui/windowmain.py:78 +#: pytrainer/gui/windowmain.py:742 msgid "Beats" msgstr "Pulsaciones" -#: pytrainer/gui/windowmain.py:68 -#: pytrainer/gui/windowmain.py:754 +#: pytrainer/gui/windowmain.py:78 +#: pytrainer/gui/windowmain.py:743 msgid "Average" msgstr "Media" -#: pytrainer/gui/windowmain.py:72 +#: pytrainer/gui/windowmain.py:82 msgid "Waypoint" msgstr "Waypoint" -#: pytrainer/gui/windowmain.py:183 -#: pytrainer/gui/windowmain.py:321 -#: pytrainer/gui/windowmain.py:425 -#: pytrainer/gui/windowmain.py:503 +#: pytrainer/gui/windowmain.py:292 +msgid "Percentages method" +msgstr "basado en porcentajes" + +#: pytrainer/gui/windowmain.py:300 +#: pytrainer/gui/windowmain.py:417 +#: pytrainer/gui/windowmain.py:492 +#: pytrainer/lib/activity.py:64 msgid "miles" msgstr "millas" -#: pytrainer/gui/windowmain.py:184 -#: pytrainer/gui/windowmain.py:185 -#: pytrainer/gui/windowmain.py:322 -#: pytrainer/gui/windowmain.py:323 -#: pytrainer/gui/windowmain.py:426 -#: pytrainer/gui/windowmain.py:427 -#: pytrainer/gui/windowmain.py:504 -#: pytrainer/gui/windowmain.py:505 +#: pytrainer/gui/windowmain.py:301 +#: pytrainer/gui/windowmain.py:302 +#: pytrainer/gui/windowmain.py:418 +#: pytrainer/gui/windowmain.py:419 +#: pytrainer/gui/windowmain.py:493 +#: pytrainer/gui/windowmain.py:494 +#: pytrainer/lib/activity.py:65 msgid "miles/h" msgstr "millas/h" -#: pytrainer/gui/windowmain.py:186 -#: pytrainer/gui/windowmain.py:187 -#: pytrainer/gui/windowmain.py:324 -#: pytrainer/gui/windowmain.py:325 -#: pytrainer/gui/windowmain.py:428 -#: pytrainer/gui/windowmain.py:429 -#: pytrainer/gui/windowmain.py:506 -#: pytrainer/gui/windowmain.py:507 +#: pytrainer/gui/windowmain.py:303 +#: pytrainer/gui/windowmain.py:304 +#: pytrainer/gui/windowmain.py:420 +#: pytrainer/gui/windowmain.py:421 +#: pytrainer/gui/windowmain.py:495 +#: pytrainer/gui/windowmain.py:496 +#: pytrainer/lib/activity.py:66 msgid "min/mile" msgstr "min/milla" -#: pytrainer/gui/windowmain.py:188 -#: pytrainer/gui/windowmain.py:189 -msgid "feet" -msgstr "pies" - -#: pytrainer/gui/windowmain.py:191 -#: pytrainer/gui/windowmain.py:327 -#: pytrainer/gui/windowmain.py:431 -#: pytrainer/gui/windowmain.py:509 -#: pytrainer/extensions/googlemaps.py:93 +#: pytrainer/gui/windowmain.py:306 +#: pytrainer/gui/windowmain.py:423 +#: pytrainer/gui/windowmain.py:498 +#: pytrainer/lib/activity.py:69 msgid "km" msgstr "Km" -#: pytrainer/gui/windowmain.py:310 -msgid "Percentages method" -msgstr "basado en porcentajes" +#: pytrainer/gui/windowmain.py:832 +msgid "Hide graph display options" +msgstr "Ocultar configuración de visualización gráfica" -#: pytrainer/gui/windowmain.py:1041 +#: pytrainer/gui/windowmain.py:1081 msgid "lap" msgstr "vuelta" -#: pytrainer/gui/windowmain.py:1047 +#: pytrainer/gui/windowmain.py:1087 #: pytrainer/gui/drawArea.py:143 -#: pytrainer/extensions/googlemaps.py:91 +#: pytrainer/extensions/googlemaps.py:74 +#: pytrainer/extensions/osm.py:49 msgid "h" msgstr "h" -#: pytrainer/gui/windowmain.py:1047 -#: pytrainer/gui/windowmain.py:1049 +#: pytrainer/gui/windowmain.py:1087 +#: pytrainer/gui/windowmain.py:1089 +#: pytrainer/lib/activity.py:72 +msgid "m" +msgstr "m" + +#: pytrainer/gui/windowmain.py:1087 +#: pytrainer/gui/windowmain.py:1089 msgid "s" msgstr "s" @@ -1382,7 +1378,8 @@ msgstr "Fichero %s seleccionado desconocido o no soportado" #: pytrainer/gui/drawArea.py:144 -#: pytrainer/extensions/googlemaps.py:91 +#: pytrainer/extensions/googlemaps.py:74 +#: pytrainer/extensions/osm.py:49 msgid "min" msgstr "min" @@ -1390,15 +1387,15 @@ msgid "GPX File" msgstr "Archivo GPX" -#: pytrainer/gui/windowprofile.py:53 +#: pytrainer/gui/windowprofile.py:38 msgid "Male" msgstr "Varón" -#: pytrainer/gui/windowprofile.py:54 +#: pytrainer/gui/windowprofile.py:39 msgid "Female" msgstr "Mujer" -#: pytrainer/gui/windowprofile.py:71 +#: pytrainer/gui/windowprofile.py:56 msgid "MET" msgstr "M.E.T." @@ -1411,13 +1408,13 @@ msgid "OK" msgstr "Ok" -#: pytrainer/recordgraph.py:114 -#: pytrainer/recordgraph.py:116 -#: pytrainer/recordgraph.py:118 -#: pytrainer/recordgraph.py:120 -#: pytrainer/recordgraph.py:122 +#: pytrainer/recordgraph.py:132 +#: pytrainer/recordgraph.py:134 +#: pytrainer/recordgraph.py:136 +#: pytrainer/recordgraph.py:138 +#: pytrainer/recordgraph.py:140 #: pytrainer/monthgraph.py:69 -#: pytrainer/heartrategraph.py:38 +#: pytrainer/heartrategraph.py:36 #: pytrainer/yeargraph.py:70 #: pytrainer/daygraph.py:52 #: pytrainer/daygraph.py:54 @@ -1426,74 +1423,78 @@ msgid "Distance (km)" msgstr "Distancia (Km)" -#: pytrainer/recordgraph.py:114 +#: pytrainer/recordgraph.py:132 #: pytrainer/daygraph.py:52 msgid "Height (m)" msgstr "Altura (m)" -#: pytrainer/recordgraph.py:114 +#: pytrainer/recordgraph.py:132 #: pytrainer/daygraph.py:52 msgid "Stage Profile" msgstr "Perfil de Etapa" -#: pytrainer/recordgraph.py:116 +#: pytrainer/recordgraph.py:134 msgid "Speed (Km/h)" msgstr "Velocidad (km/h)" -#: pytrainer/recordgraph.py:116 +#: pytrainer/recordgraph.py:134 msgid "Speed" msgstr "Velocidad" -#: pytrainer/recordgraph.py:118 +#: pytrainer/recordgraph.py:136 msgid "Pace (min/km)" msgstr "Ritmo (min/km)" -#: pytrainer/recordgraph.py:118 +#: pytrainer/recordgraph.py:136 msgid "Pace" msgstr "Ritmo" -#: pytrainer/recordgraph.py:120 -#: pytrainer/heartrategraph.py:38 +#: pytrainer/recordgraph.py:138 +#: pytrainer/heartrategraph.py:36 #: pytrainer/daygraph.py:56 msgid "Beats (bpm)" msgstr "Media pulsaciones (ppm)" -#: pytrainer/recordgraph.py:122 +#: pytrainer/recordgraph.py:140 msgid "Cadence (rpm)" msgstr "Cadencia (rpm)" -#: pytrainer/recordgraph.py:122 +#: pytrainer/recordgraph.py:140 msgid "Cadence" msgstr "Cadence" -#: pytrainer/lib/gpx.py:119 -msgid "No Name" -msgstr "Sin nombre" - -#: pytrainer/lib/gpx.py:126 -msgid "No Data" -msgstr "Sin datos" - -#: pytrainer/lib/heartrate.py:46 +#: pytrainer/profile.py:167 msgid "Moderate activity" msgstr "Actividad moderada" -#: pytrainer/lib/heartrate.py:47 +#: pytrainer/profile.py:168 msgid "Weight Control" msgstr "Control de peso" -#: pytrainer/lib/heartrate.py:48 +#: pytrainer/profile.py:169 msgid "Aerobic" msgstr "Aeróbico" -#: pytrainer/lib/heartrate.py:49 +#: pytrainer/profile.py:170 msgid "Anaerobic" msgstr "Anaeróbico" -#: pytrainer/lib/heartrate.py:50 +#: pytrainer/profile.py:171 msgid "VO2 MAX" msgstr "VO2 máximo" +#: pytrainer/lib/gpx.py:117 +msgid "No Name" +msgstr "Sin nombre" + +#: pytrainer/lib/gpx.py:124 +msgid "No Data" +msgstr "Sin datos" + +#: pytrainer/lib/activity.py:67 +msgid "feet" +msgstr "pies" + #: pytrainer/monthgraph.py:69 #: pytrainer/monthgraph.py:71 #: pytrainer/monthgraph.py:73 @@ -1545,11 +1546,11 @@ msgid "Daily Calories" msgstr "Calorías diarias" -#: pytrainer/record.py:72 +#: pytrainer/record.py:63 msgid "Edit Entry" msgstr "Editar entrada" -#: pytrainer/record.py:453 +#: pytrainer/record.py:446 msgid "pyTrainer can't import data from your gpx file" msgstr "pyTrainer no puede importar datos de tu fichero gpx" @@ -1581,7 +1582,7 @@ msgid "Monthly Calories" msgstr "Calorías mensuales" -#: pytrainer/waypoint.py:94 +#: pytrainer/waypoint.py:87 msgid "The gpx file seems to be a several days records. Perhaps you will need to edit your gpx file" msgstr "Parece que el archivo gpx contiene actividades de varios días. Probablemente necesites editarlo" @@ -1593,43 +1594,43 @@ msgid "Velocity" msgstr "Velocidad" -#: pytrainer/main.py:452 +#: pytrainer/main.py:425 msgid "Delete this database entry?" msgstr "¿Borrar esta entrada de la base de datos?" -#: pytrainer/main.py:466 +#: pytrainer/main.py:439 msgid "Delete this waypoint?" msgstr "¿Borrar este waypoint?" -#: import/file_gpxplus.py:45 +#: import/file_gpxplus.py:41 msgid "GPS eXchange file" msgstr "Fichero de intercambio GPS" -#: import/file_kml20.py:50 +#: import/file_kml20.py:47 msgid "Geodistance kml version 2.0 file" msgstr "Fichero kml v2.0" -#: import/file_garmintcxv1.py:46 +#: import/file_garmintcxv1.py:45 msgid "Garmin training center database file version 1" msgstr "Versión 1 del fichero Garmin training center database" -#: import/tool_gpsbabel.py:38 +#: import/tool_gpsbabel.py:37 msgid "GPSBabel" msgstr "GPSBabel" -#: import/tool_garmintools.py:38 +#: import/tool_garmintools.py:37 msgid "Garmintools" msgstr "Garmintools" -#: import/tool_gant.py:38 +#: import/tool_gant.py:37 msgid "Gant" msgstr "Gant" -#: import/file_garmintools.py:48 +#: import/file_garmintools.py:44 msgid "Garmin tools dump file" msgstr "Fichero de volcado de datos de Garmintools" -#: import/file_garmintcxv2.py:45 +#: import/file_garmintcxv2.py:43 msgid "Garmin training center database file version 2" msgstr "Versión 2 del fichero Garmin training center database" @@ -1663,3 +1664,53 @@ msgid "Please add any additional information for this upload" msgstr "Por favor indique información adicional para este envío" +#: extensions/wordpress/wordpress.py:42 +msgid "Posting to Wordpress blog" +msgstr "Subir a blog de Wordpress" + +#: extensions/wordpress/wordpress.py:44 +msgid "Wordpress Extension Processing" +msgstr "Procesando extensión Wordpress" + +#: extensions/wordpress/wordpress.py:137 +msgid "Wordpress Extension Upload Complete" +msgstr "Envío completo a Wordpress" + +#~ msgid "label-2147483648" +#~ msgstr " " + +#~ msgid "--valid" +#~ msgstr "--valid" + +#~ msgid "--check" +#~ msgstr "--check" + +#~ msgid "--gmaps2*" +#~ msgstr "--gmaps2*" + +#~ msgid "--testimport" +#~ msgstr "--testimport" + +#~ msgid "window1" +#~ msgstr "Ventana1" + +#~ msgid "00" +#~ msgstr "00" + +#~ msgid "label-2147483647" +#~ msgstr " " + +#~ msgid "000" +#~ msgstr "000" + +#~ msgid "label154" +#~ msgstr " " + +#~ msgid "label155" +#~ msgstr " " + +#~ msgid "label162" +#~ msgstr " " + +#~ msgid "label163" +#~ msgstr " " 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-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-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-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-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 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 03:00:30
|
Revision: 581 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=581&view=rev Author: jblance Date: 2010-05-16 03:00:24 +0000 (Sun, 16 May 2010) Log Message: ----------- PyTrainer window remembers size between restarts Modified Paths: -------------- pytrainer/trunk/glade/pytrainer.glade pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/profile.py Modified: pytrainer/trunk/glade/pytrainer.glade =================================================================== --- pytrainer/trunk/glade/pytrainer.glade 2010-05-16 02:16:10 UTC (rev 580) +++ pytrainer/trunk/glade/pytrainer.glade 2010-05-16 03:00:24 UTC (rev 581) @@ -7,6 +7,7 @@ <property name="title">window1</property> <property name="icon">logo_mini.png</property> <signal name="destroy" handler="quit"/> + <signal name="configure_event" handler="on_window1_configure_event"/> <child> <widget class="GtkNotebook" id="notebook7"> <property name="visible">True</property> Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2010-05-16 02:16:10 UTC (rev 580) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-05-16 03:00:24 UTC (rev 581) @@ -63,6 +63,11 @@ self.menublocking = 0 self.selected_view="day" self.window1.set_title ("pyTrainer %s" % self.version) + try: + width, height = self.pytrainer_main.profile.getValue("pytraining","window_size").split(',') + self.window1.resize(int(width), int(height)) + except: + pass self.record_list = [] #create the columns for the listdayrecord column_names=[_("id"),_("Start"), _("Sport"),_("Kilometer")] @@ -83,17 +88,17 @@ #Disable import menu item unless specified on startup self.set_unified_import(self.testimport) - + #Set correct map viewer if self.pytrainer_main.profile.getValue("pytraining","default_viewer") == "1": self.radiobuttonOSM.set_active(1) else: self.radiobuttonGMap.set_active(1) - + def set_unified_import(self, status=False): self.menu_importdata.set_sensitive(status) self.parent.testimport = status - + def _createXmlListView(self,file): menufile = XMLParser(file) savedOptions = [] @@ -106,13 +111,13 @@ savedOptions.append(("time","False")) savedOptions.append(("beats","False")) savedOptions.append(("calories","False")) - menufile.createXMLFile("listviewmenu",savedOptions) + menufile.createXMLFile("listviewmenu",savedOptions) def removeImportPlugin(self, plugin): for widget in self.menuitem1_menu: if widget.get_name() == plugin[1]: self.menuitem1_menu.remove(widget) - + def removeExtension(self, extension): for widget in self.recordbuttons_hbox: if widget.get_name() == extension[1]: @@ -151,12 +156,12 @@ self.drawareaweek = WeekGraph(self.weekview, self.window1, self.week_combovalue, self.week_combovalue2) 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 updateSportList(self,listSport): + def updateSportList(self,listSport): logging.debug(">>") liststore = self.sportlist.get_model() if self.sportlist.get_active() is not 0: @@ -181,7 +186,7 @@ column.set_sort_column_id(i) treeview.append_column(column) i+=1 - + def actualize_recordview(self,record_list): logging.debug(">>") if self.pytrainer_main.profile.getValue("pytraining","prf_us_system") == "True": @@ -203,7 +208,7 @@ if len(record_list)>0: record_list=record_list[0] - + self.recordview.set_sensitive(1) sport = record_list[0] date = record_list[1] @@ -219,7 +224,7 @@ 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 + #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 @@ -231,7 +236,7 @@ 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)) @@ -240,7 +245,7 @@ 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)) - + else: self.record_distance.set_text("%0.2f" %distance) self.record_upositive.set_text("%0.2f" %upositive) @@ -249,7 +254,7 @@ 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_date.set_text(str(date)) self.record_date.set_text(recordDate) @@ -290,7 +295,7 @@ self.record_vbox.remove(child) self.record_vbox.set_sensitive(0) logging.debug("<<") - + def actualize_heartrategraph(self,record_list): logging.debug(">>") self.drawareaheartrate.drawgraph(record_list) @@ -354,12 +359,12 @@ maxspeed = self.parseFloat(record[9]) if record[10] > maxbeats: maxbeats = self.parseFloat(record[10]) - + if self.pytrainer_main.profile.getValue("pytraining","prf_us_system") == "True": distance = km2miles(distance) maxspeed = km2miles(maxspeed) - - if tbeats > 0: + + if tbeats > 0: tbeats = tbeats/(timeinseconds/60/60) if distance > 0: average = distance/(timeinseconds/60/60) @@ -367,7 +372,7 @@ maxpace = "%d.%02d" %((3600/maxspeed)/60,(3600/maxspeed)%60) if average > 0: pace = "%d.%02d" %((3600/average)/60,(3600/average)%60) - + self.dayview.set_sensitive(1) self.day_distance.set_text("%0.2f" %distance) hour,min,sec=self.parent.date.second2time(timeinseconds) @@ -382,11 +387,11 @@ self.day_maxpace.set_text(maxpace) self.day_calories.set_text("%0.0f" %calories) self.day_topic.set_text(str(record[1])) - + else: self.dayview.set_sensitive(0) logging.debug("<<") - + def actualize_daygraph(self,record_list): logging.debug(">>") if len(record_list)>0: @@ -395,14 +400,14 @@ self.day_vbox.set_sensitive(0) self.drawareaday.drawgraph(record_list) logging.debug("<<") - + def actualize_map(self,id_record, 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 + self.googlemaps.drawMap(-9999) #TODO placeholder for OSM code elif self.radiobuttonGMap.get_active(): #Use Google to draw map logging.debug("Using Google to draw map") @@ -414,7 +419,7 @@ #Unknown map type... logging.error("Unknown map viewer requested") logging.debug("<<") - + def actualize_weekview(self, record_list, date_ini, date_end): logging.debug(">>") date_s = datetime.datetime.strptime(date_ini, "%Y-%m-%d") @@ -430,7 +435,7 @@ pace = "0.00" maxpace = "0.00" maxbeats = 0 - + 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")) @@ -458,24 +463,24 @@ maxspeed = self.parseFloat(record[7]) if record[8] > maxbeats: maxbeats = self.parseFloat(record[8]) - + if self.pytrainer_main.profile.getValue("pytraining","prf_us_system") == "True": km = km2miles(km) maxspeed = km2miles(maxspeed) - + if time_in_min > 0: - tbeats = tbeats/time_in_min + tbeats = tbeats/time_in_min else: tbeats = 0 average = (km/(time/3600)) - + if maxspeed > 0: #maxpace = 60/maxspeed maxpace = "%d.%02d" %((3600/maxspeed)/60,(3600/maxspeed)%60) if average > 0: #pace = 60/average pace = "%d.%02d" %((3600/average)/60,(3600/average)%60) - + self.weeka_distance.set_text("%0.2f" %km) hour,min,sec = self.parent.date.second2time(time) self.weeka_hour.set_text("%d" %hour) @@ -505,7 +510,7 @@ pace = "0.00" maxpace = "0.00" maxbeats = 0 - + 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")) @@ -518,7 +523,7 @@ self.m_maxspeed_unit.set_text(_("km/h")) self.m_pace_unit.set_text(_("min/km")) self.m_maxpace_unit.set_text(_("min/km")) - + if num_records>0: for record in record_list: km += self.parseFloat(record[1]) @@ -533,24 +538,24 @@ maxspeed = self.parseFloat(record[7]) if record[8] > maxbeats: maxbeats = self.parseFloat(record[8]) - + if self.pytrainer_main.profile.getValue("pytraining","prf_us_system") == "True": km = km2miles(km) maxspeed = km2miles(maxspeed) - + if time_in_min > 0: - tbeats = tbeats/time_in_min + tbeats = tbeats/time_in_min else: tbeats = 0 average = (km/(time/3600)) - + if maxspeed > 0: #maxpace = 60/maxspeed maxpace = "%d.%02d" %((3600/maxspeed)/60,(3600/maxspeed)%60) if average > 0: #pace = 60/average pace = "%d.%02d" %((3600/average)/60,(3600/average)%60) - + self.montha_distance.set_text("%0.2f" %km) hour,min,sec = self.parent.date.second2time(time) self.montha_hour.set_text("%d" %hour) @@ -572,7 +577,7 @@ logging.debug(">>") self.drawareamonth.drawgraph(record_list, daysInMonth) logging.debug("<<") - + def actualize_yearview(self,record_list, year): logging.debug(">>") self.year_date.set_text("%d" %int(year)) @@ -599,11 +604,11 @@ if record[8] > maxbeats: maxbeats = self.parseFloat(record[8]) if time_in_min > 0: - tbeats = tbeats/time_in_min + tbeats = tbeats/time_in_min else: tbeats = 0 average = (km/(time/3600)) - + if maxspeed > 0: #maxpace = 60/maxspeed maxpace = "%d.%02d" %((3600/maxspeed)/60,(3600/maxspeed)%60) @@ -628,7 +633,7 @@ self.yearview.set_sensitive(0) self.drawareayear.drawgraph([]) logging.debug("<<") - + def actualize_yeargraph(self,record_list): logging.debug(">>") self.drawareayear.drawgraph(record_list) @@ -718,7 +723,7 @@ 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() @@ -733,8 +738,8 @@ 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) @@ -749,7 +754,7 @@ id_waypoint=selected.get_value(iter,0) self.parent.refreshWaypointView(id_waypoint) return False - + def on_listareasearch_clicked(self,widget): lisOpt = { _("Title"):"title", @@ -759,12 +764,12 @@ _("Time"):"time", _("Beats"):"beats", _("Average"):"average", - _("Calories"):"calories" + _("Calories"):"calories" } search_string = self.lsa_searchvalue.get_text() #ddbb_field = lisOpt[self.lsa_searchoption.get_active_text()] - self.parent.searchListView("title like '%"+search_string+"%'") - + self.parent.searchListView("title like '%"+search_string+"%'") + def create_menulist(self,column_names): i=0 for name in column_names: @@ -775,7 +780,7 @@ self.menulistviewOptions.append(item) i+=1 self.menulistviewOptions.show_all() - + def on_menulistview_activate(self,widget,widget2,widget_position): listMenus = { 0:"title", @@ -786,7 +791,7 @@ 5:"beats", 6:"average", 7:"calories" } - + items = self.menulistviewOptions.get_children() if items[widget_position-1].get_active(): newValue = "False" @@ -795,7 +800,7 @@ menufile = XMLParser(self.fileconf) menufile.setValue("listviewmenu",listMenus[widget_position-1],newValue) self.showAllRecordTreeViewColumns() - + def showAllRecordTreeViewColumns(self): menufile = XMLParser(self.fileconf) listMenus = { @@ -823,10 +828,10 @@ if numcolumn != 0 and self.menublocking != 1: menuItems[numcolumn-1].set_active(visible) self.menublocking = 1 - + def createWaypointEditor(self,WaypointEditor,waypoint, parent=None): self.waypointeditor = WaypointEditor(self.data_path, self.waypointvbox,waypoint,parent) - + def zoom_graph(self, y1limits=None, y1color=None, y1_linewidth=1): logging.debug(">>") logging.debug("Reseting graph Y axis with ylimits: %s" % str(y1limits) ) @@ -836,35 +841,40 @@ ###################### ## Lista de eventos ## ###################### - + + def on_window1_configure_event(self, widget, event): + #print widget #window widget + #print event # resize event + self.size = self.window1.get_size() + def on_buttonShowOptions_clicked(self, widget): position_set = self.hpaned1.get_property('position-set') if position_set: #Currently not showing options - show them self.hpaned1.set_property('position-set', False) - self.buttonShowOptions.set_tooltip_text(_('Hide graph display options') ) + self.buttonShowOptions.set_tooltip_text(_('Hide graph display options') ) else: #Hide options self.hpaned1.set_position(0) - self.buttonShowOptions.set_tooltip_text(_('Show graph display options') ) + self.buttonShowOptions.set_tooltip_text(_('Show graph display options') ) logging.debug('Position: %d' % self.hpaned1.get_position() ) logging.debug('Position set: %s' % self.hpaned1.get_property('position-set') ) - + def on_buttonRedrawMap_clicked(self, widget): logging.debug('on_buttonRedrawMap_clicked') self.parent.refreshMapView() - + def on_radiobuttonMap_toggled(self, widget): #Ignore the deselected toggle event if widget.get_active() == False: return logging.debug( 'on_radiobuttonMap_toggled '+ widget.get_name()+ ' activated') self.parent.refreshMapView() - + def on_hpaned1_move_handle(self, widget): print "Handler" print widget - + def on_spinbuttonY1_value_changed(self, widget): y1min = self.spinbuttonY1Min.get_value() y1max = self.spinbuttonY1Max.get_value() @@ -876,7 +886,7 @@ y1min -= 1 self.y1_limits=(y1min, y1max) self.zoom_graph(y1limits=self.y1_limits, y1color=self.y1_color, y1_linewidth=self.y1_linewidth) - + def on_buttonResetGraph_clicked(self, widget): #self.zoom_graph() #Reset stored values @@ -884,13 +894,13 @@ self.y1_color = None self.y1_linewidth = 1 self.zoom_graph() - + def on_colorbuttonY1LineColor_color_set(self, widget): y1color = widget.get_color() cs = y1color.to_string() self.y1_color = cs[0:3] + cs[5:7] + cs[9:11] self.drawarearecord.drawgraph(self.record_list,self.laps, y1limits=self.y1_limits, y1color=self.y1_color, y1_linewidth=self.y1_linewidth) - + def on_spinbuttonY1LineWeight_value_changed(self, widget): self.y1_linewidth = self.spinbuttonY1LineWeight.get_value_as_int() self.drawarearecord.drawgraph(self.record_list,self.laps, y1limits=self.y1_limits, y1color=self.y1_color, y1_linewidth=self.y1_linewidth) @@ -904,19 +914,19 @@ selected,iter = self.recordTreeView.get_selection().get_selected() id_record = selected.get_value(iter,0) self.parent.removeRecord(id_record) - + def on_export_csv_activate(self,widget): self.parent.exportCsv() - + def on_newrecord_clicked(self,widget): self.parent.newRecord() - + def on_edituser_activate(self,widget): self.parent.editProfile() - + def on_calendar_doubleclick(self,widget): self.parent.newRecord() - + def on_sportlist_changed(self,widget): logging.debug("--") if self.sportlist.get_active() != self.activeSport: @@ -924,7 +934,7 @@ self.parent.refreshGraphView(self.selected_view) else: logging.debug("on_sportlist_changed called with no change") - + def on_page_change(self,widget,gpointer,page): logging.debug("--") if page == 0: @@ -938,7 +948,7 @@ elif page == 4: self.selected_view="year" self.parent.refreshGraphView(self.selected_view) - + def on_recordpage_change(self,widget,gpointer,page): if page == 0: selected_view="info" @@ -949,12 +959,12 @@ elif page == 3: selected_view="heartrate" self.parent.refreshRecordGraphView(selected_view) - + def on_showmap_clicked(self,widget): self.infoarea.hide() self.maparea.show() self.parent.refreshMapView(full_screen=True) - + def on_hidemap_clicked(self,widget): self.maparea.hide() self.infoarea.show() @@ -962,11 +972,11 @@ def on_btnShowLaps_toggled(self,widget): logging.debug("--") self.parent.refreshGraphView(self.selected_view) - + def on_day_combovalue_changed(self,widget): logging.debug("--") self.parent.refreshGraphView(self.selected_view) - + def on_week_combovalue_changed(self,widget): logging.debug("--") self.parent.refreshGraphView(self.selected_view) @@ -974,11 +984,11 @@ def on_month_combovalue_changed(self,widget): logging.debug("--") self.parent.refreshGraphView(self.selected_view) - + def on_year_combovalue_changed(self,widget): logging.debug("--") self.parent.refreshGraphView(self.selected_view) - + def on_calendar_selected(self,widget): logging.debug("--") if self.block: @@ -997,7 +1007,7 @@ self.selected_view="month" self.parent.refreshListRecords() self.parent.refreshGraphView(self.selected_view) - + def on_calendar_next_year(self,widget): logging.debug("--") self.block = True @@ -1005,20 +1015,20 @@ self.selected_view="year" self.parent.refreshListRecords() self.parent.refreshGraphView(self.selected_view) - + 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() - + def on_waypointsview_activate(self,widget): self.listarea.hide() self.classicarea.hide() @@ -1027,14 +1037,14 @@ def on_menu_importdata_activate(self,widget): self.parent.importData() - + def on_extensions_activate(self,widget): self.parent.editExtensions() def on_gpsplugins_activate(self,widget): self.parent.editGpsPlugins() #hasta aqui revisado - + def on_allRecordTreeView_button_press(self, treeview, event): logging.debug(">>") #print "on_allRecordTreeView_" @@ -1059,7 +1069,7 @@ self.parent.refreshGraphView("record") logging.debug("<<") return False - + def actualize_recordTreeView(self, record_list): logging.debug(">>") iterOne = False @@ -1070,7 +1080,7 @@ gobject.TYPE_STRING, #Distance object) for i in record_list: - #Get lap info + #Get lap info id_record = i[8] laps = self.parent.record.getLaps(id_record) iter = store.append(None) @@ -1090,12 +1100,12 @@ ) if laps is not None: for lap in laps: - #"id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories, lap_number", - lapNumber = "%s%d" % ( _("lap"), int(lap[9])+1 ) + #"id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories, lap_number", + lapNumber = "%s%d" % ( _("lap"), int(lap[9])+1 ) distance = "%0.2f" % (float(lap[3]) / 1000.0) timeHours = int(float(lap[2]) / 3600) timeMin = int((float(lap[2]) / 3600.0 - timeHours) * 60) - timeSec = float(lap[2]) - (timeHours * 3600) - (timeMin * 60) + timeSec = float(lap[2]) - (timeHours * 3600) - (timeMin * 60) if timeHours > 0: duration = "%d%s%02d%s%02d%s" % (timeHours, _("h"), timeMin, _("m"), timeSec, _("s")) else: @@ -1114,7 +1124,7 @@ self.recordTreeView.get_selection().select_iter(iterOne) logging.debug("<<") #if len(record_list)>0: - + def parseFloat(self,string): try: return float(string) @@ -1140,6 +1150,9 @@ return None def quit(self, *args): + window_size = "%d, %d" % self.size + + self.pytrainer_main.profile.setValue("pytraining","window_size", window_size) self.parent.quit() #sys.exit("Exit!") #self.parent.webservice.stop() @@ -1149,7 +1162,7 @@ self.notebook.set_current_page(2) self.selected_view="year" self.actualize_yearview() - + def on_recordTree_clicked(self,widget,num,num2): selected,iter = self.recordTreeView.get_selection().get_selected() self.parent.editRecord(selected.get_value(iter,0)) @@ -1164,16 +1177,16 @@ desc = self.waypoint_description.get_text() sym = self.waypoint_type.get_active_text() self.parent.updateWaypoint(id_waypoint,lat,lon,name,desc,sym) - + def on_removewaypoint_clicked(self,widget): selected,iter = self.waypointTreeView.get_selection().get_selected() id_waypoint = selected.get_value(iter,0) self.parent.removeWaypoint(id_waypoint) def on_hrpiebutton_clicked(self,widget): - self.heartrate_vbox2.show() - self.heartrate_vbox.hide() - + self.heartrate_vbox2.show() + self.heartrate_vbox.hide() + def on_hrplotbutton_clicked(self,widget): - self.heartrate_vbox.show() - self.heartrate_vbox2.hide() + self.heartrate_vbox.show() + self.heartrate_vbox2.hide() Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-05-16 02:16:10 UTC (rev 580) +++ pytrainer/trunk/pytrainer/main.py 2010-05-16 03:00:24 UTC (rev 581) @@ -57,9 +57,9 @@ from lib.heartrate import * class pyTrainer: - def __init__(self,filename = None, data_path = None): + def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#580" + self.version ="1.7.2_svn#581" self.DB_version = 3 #Process command line options self.startup_options = self.get_options() @@ -80,18 +80,18 @@ self.prf_us_system = False self.ddbb = DDBB(self.profile) logging.debug('connecting to DDBB') - self.ddbb.connect() + self.ddbb.connect() #Get user's 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) + # DB check can be triggered either via new version (mandatory) or as runtime parameter (--check) if self.startup_options.check: # User requested check - self.sanityCheck() + self.sanityCheck() elif currentDB_version is None: # No stored DB version - check DB etc - self.sanityCheck() + self.sanityCheck() elif self.DB_version > int(currentDB_version): # DB version expected is newer than user's version - check DB etc - self.sanityCheck() + self.sanityCheck() else: logging.info('No sanity check requested') self.record = Record(data_path,self) @@ -108,19 +108,19 @@ self.windowmain.createMap(Googlemaps,self.waypoint) self.windowmain.createWaypointEditor(WaypointEditor,self.waypoint, parent=self) self.windowmain.on_calendar_selected(None) - self.refreshMainSportList() + self.refreshMainSportList() self.windowmain.run() - logging.debug('<<') + logging.debug('<<') - + def get_options(self): ''' Define usage and accepted options for command line startup - + returns: options - dict with option: value pairs ''' usage = '''usage: %prog [options] - + For more help on valid options try: %prog -h ''' parser = OptionParser(usage=usage) @@ -147,13 +147,13 @@ 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) - def quit(self): + def quit(self): logging.debug('--') logging.info("Exit!") #self.webservice.stop() @@ -171,7 +171,7 @@ txtbutton = self.plugins.loadPlugin(plugin) self.windowmain.addImportPlugin(txtbutton) logging.debug('<<') - + def loadExtensions(self): logging.debug('>>') activeextensions = self.extension.getActiveExtensions() @@ -188,8 +188,8 @@ self.pluginClass = self.plugins.importClass(pathPlugin) pluginFiles = self.pluginClass.run() if pluginFiles is not None: - logging.debug("Plugin returned %d files" % (len(pluginFiles)) ) - #process returned GPX files + logging.debug("Plugin returned %d files" % (len(pluginFiles)) ) + #process returned GPX files for (pluginFile, sport) in pluginFiles: if os.path.isfile(pluginFile): logging.info('File exists. Size: %d. Sport: %s' % (os.path.getsize(pluginFile), sport)) @@ -213,13 +213,13 @@ # alert = self.extension.runExtension(pathExtension,id) logging.debug('<<') - + def refreshMainSportList(self): logging.debug('>>') listSport = self.profile.getSportList() self.windowmain.updateSportList(listSport) logging.debug('<<') - + def refreshGraphView(self, view, sport=None): logging.debug('>>') if self.windowmain is None: @@ -271,7 +271,7 @@ else: print "Unknown view %s" % view logging.debug('<<') - + def refreshRecordGraphView(self, view): logging.debug('>>') logging.info('Working on '+view+' graph') @@ -315,7 +315,7 @@ karvonen_method = self.profile.getValue("pytraining","prf_hrzones_karvonen") self.windowmain.actualize_hrview(record_list,zones,karvonen_method) logging.debug('<<') - + def refreshMapView(self, full_screen=False): logging.debug('>>') if self.windowmain is None: @@ -345,19 +345,19 @@ record_list = self.record.getAllRecordList() self.windowmain.actualize_listview(record_list) logging.debug('<<') - + def refreshWaypointView(self,default_waypoint=None,redrawmap=1): logging.debug('>>') waypoint_list = self.waypoint.getAllWaypoints() self.windowmain.actualize_waypointview(waypoint_list,default_waypoint,redrawmap) logging.debug('<<') - + def searchListView(self,condition): logging.debug('>>') record_list = self.record.getRecordListByCondition(condition) self.windowmain.actualize_listview(record_list) logging.debug('<<') - + def editExtensions(self): logging.debug('>>') before = self.extension.getActiveExtensions() @@ -375,8 +375,8 @@ self.setMenuPlugins(activeplugins_before, activeplugins_after) self.refreshListRecords() self.refreshGraphView(self.windowmain.selected_view) - logging.debug('<<') - + logging.debug('<<') + def editGpsPlugins(self): logging.debug('>>') activeplugins_before = self.plugins.getActivePlugins() @@ -385,7 +385,7 @@ #Need to check for plugins that have been disabled (were active and now are not) self.setMenuPlugins(activeplugins_before, activeplugins_after) logging.debug('<<') - + def setMenuPlugins(self, activeplugins_before, activeplugins_after): logging.debug('>>') #Need to check for plugins that have been disabled (were active and now are not) @@ -401,7 +401,7 @@ txtbutton = self.plugins.loadPlugin(plugin) self.windowmain.addImportPlugin(txtbutton) logging.debug('<<') - + def setExtensions(self, before, after): logging.debug('>>') #Need to check for extensions that have been disabled (were active and now are not) @@ -449,7 +449,7 @@ warning.run() self.refreshListRecords() logging.debug('<<') - + def removeWaypoint(self,id_waypoint, confirm = False): logging.debug('>>') if confirm: @@ -468,14 +468,14 @@ self.waypoint.updateWaypoint(id_waypoint,lat,lon,name,desc,sym) self.refreshWaypointView(id_waypoint) logging.debug('<<') - + def exportCsv(self): logging.debug('>>') from save import Save save = Save(self.data_path, self.record) save.run() - logging.debug('<<') - + logging.debug('<<') + def editProfile(self): logging.debug('>>') self.profile.editProfile() @@ -483,7 +483,7 @@ def sanityCheck(self): """23.11.2009 - dgranda - Checks database and configuration file + Checks database and configuration file args: none returns: none""" logging.debug('>>') Modified: pytrainer/trunk/pytrainer/profile.py =================================================================== --- pytrainer/trunk/pytrainer/profile.py 2010-05-16 02:16:10 UTC (rev 580) +++ pytrainer/trunk/pytrainer/profile.py 2010-05-16 03:00:24 UTC (rev 581) @@ -36,18 +36,18 @@ self.gpxdir = None self.extensiondir = None self.plugindir = None - #Set configuration parameters + #Set configuration parameters 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", @@ -69,6 +69,7 @@ "auto_launch_file_selection":"False", "import_default_tab":"0", "default_viewer":"0", + "window_size":"800, 640", } #Parse pytrainer configuration file @@ -87,7 +88,7 @@ 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): @@ -105,7 +106,7 @@ 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" @@ -117,17 +118,17 @@ 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): @@ -142,7 +143,7 @@ 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: @@ -170,10 +171,10 @@ value = pytraining_tag.get(key) #If property is not found, set it to the default if value is None: - config_needs_update = True + config_needs_update = True value = default config[key] = value - #Added a property, so update config + #Added a property, so update config if config_needs_update: self.setProfile(config) return config @@ -182,7 +183,7 @@ 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" @@ -190,12 +191,12 @@ elif not self.configuration.has_key(variable): return None return self.configuration[variable] - + def setValue(self, tag, variable, value, delay_write=False): logging.debug(">>") if tag != "pytraining": print "ERROR - pytraining is the only profile tag supported" - logging.debug("Setting %s to %s" % (variable, value)) + logging.debug("Setting %s to %s" % (variable, value)) self.xml_tree.getroot().set(variable, value.decode('utf-8')) if not delay_write: logging.debug("Writting...") @@ -207,7 +208,7 @@ for option, value in list_options.items(): logging.debug("Adding "+option+"|"+value) self.setValue("pytraining",option,value,delay_write=True) - self.xml_tree.write(self.config_file, xml_declaration=True, encoding='UTF-8') + self.xml_tree.write(self.config_file, xml_declaration=True, encoding='UTF-8') logging.debug("<<") def getSportList(self): @@ -223,7 +224,7 @@ """31.08.2008 - dgranda It adds a new sport. arguments: - sport: sport's name + sport: sport's name met: weight: returns: id_sports from new sport""" @@ -234,7 +235,7 @@ 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 @@ -243,15 +244,15 @@ 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.pytrainer_main.ddbb.update("sports","name,met,weight",[newnamesport,newmetsport,newweightsport],"name=\"%s\""%oldnamesport) - + def getSportInfo(self,namesport): logging.debug("--") return self.pytrainer_main.ddbb.select("sports","name,met,weight","name=\"%s\""%namesport)[0] - + def build_ddbb(self): logging.debug("--") self.pytrainer_main.ddbb.build_ddbb() @@ -267,7 +268,7 @@ profilewindow.setValues(self.configuration) profilewindow.run() logging.debug("<<") - + def actualize_mainsportlist(self): logging.debug("--") self.pytrainer_main.refreshMainSportList() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-05-16 02:16:17
|
Revision: 580 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=580&view=rev Author: jblance Date: 2010-05-16 02:16:10 +0000 (Sun, 16 May 2010) Log Message: ----------- Update plugins and import to write GPX files as UTF8 instead of ASCII Modified Paths: -------------- pytrainer/trunk/import/file_garmintcxv1.py pytrainer/trunk/import/file_garmintcxv2.py pytrainer/trunk/import/file_garmintools.py pytrainer/trunk/import/file_gpxplus.py pytrainer/trunk/plugins/garmin-hr/garminhr.py pytrainer/trunk/plugins/garmin-hr-file/garminhrfile.py pytrainer/trunk/plugins/garmin-tcxv2/garmin-tcxv2.py pytrainer/trunk/plugins/garmintools/garmintools.py pytrainer/trunk/plugins/garmintools_full/garmintools_full.py pytrainer/trunk/plugins/googleearth/main.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/import/file_garmintcxv1.py =================================================================== --- pytrainer/trunk/import/file_garmintcxv1.py 2010-05-16 01:36:52 UTC (rev 579) +++ pytrainer/trunk/import/file_garmintcxv1.py 2010-05-16 02:16:10 UTC (rev 580) @@ -84,17 +84,17 @@ distance = "" index = "%d:%d" % (self.activities.index((sport, activities)), activities.index(activity)) self.activitiesSummary.append( (index, - inDatabase, - startTime[1].strftime("%Y-%m-%dT%H:%M:%S"), - distance , - str(duration), + inDatabase, + startTime[1].strftime("%Y-%m-%dT%H:%M:%S"), + distance , + str(duration), sport, ) ) #print self.activitiesSummary return True except: #Not valid file - return False + return False return False def getActivities(self, tree): @@ -160,5 +160,5 @@ #xml_doc = etree.parse(filename) xml_doc = activity result_tree = transform(xml_doc) - result_tree.write(gpxfile, xml_declaration=True) + result_tree.write(gpxfile, xml_declaration=True, encoding='UTF-8') Modified: pytrainer/trunk/import/file_garmintcxv2.py =================================================================== --- pytrainer/trunk/import/file_garmintcxv2.py 2010-05-16 01:36:52 UTC (rev 579) +++ pytrainer/trunk/import/file_garmintcxv2.py 2010-05-16 02:16:10 UTC (rev 580) @@ -162,5 +162,5 @@ #xml_doc = etree.parse(filename) xml_doc = activity result_tree = transform(xml_doc) - result_tree.write(gpxfile, xml_declaration=True) + result_tree.write(gpxfile, xml_declaration=True, encoding='UTF-8') Modified: pytrainer/trunk/import/file_garmintools.py =================================================================== --- pytrainer/trunk/import/file_garmintools.py 2010-05-16 01:36:52 UTC (rev 579) +++ pytrainer/trunk/import/file_garmintools.py 2010-05-16 02:16:10 UTC (rev 580) @@ -69,10 +69,10 @@ distance, duration = self.getDetails(xmldoc, startTime) distance = distance / 1000.0 self.activitiesSummary.append( (0, - indatabase, - startTime[1].strftime("%Y-%m-%dT%H:%M:%S"), - "%0.2f" % distance , - str(duration), + indatabase, + startTime[1].strftime("%Y-%m-%dT%H:%M:%S"), + "%0.2f" % distance , + str(duration), sport, ) ) return True @@ -80,7 +80,7 @@ #Not garmintools dump file return False return False - + def getDateTime(self, time_): return Date().getDateTime(time_) @@ -154,5 +154,5 @@ xslt_doc = etree.parse(self.data_path+"/translate_garmintools.xsl") transform = etree.XSLT(xslt_doc) result_tree = transform(tree) - result_tree.write(gpxfile, xml_declaration=True) + result_tree.write(gpxfile, xml_declaration=True, encoding='UTF-8') Modified: pytrainer/trunk/import/file_gpxplus.py =================================================================== --- pytrainer/trunk/import/file_gpxplus.py 2010-05-16 01:36:52 UTC (rev 579) +++ pytrainer/trunk/import/file_gpxplus.py 2010-05-16 02:16:10 UTC (rev 580) @@ -62,10 +62,10 @@ duration = self.getDetails(xmldoc, startTime) distance = "" self.activitiesSummary.append( (0, - indatabase, - startTime[1].strftime("%Y-%m-%dT%H:%M:%S"), - distance , - str(duration), + indatabase, + startTime[1].strftime("%Y-%m-%dT%H:%M:%S"), + distance , + str(duration), sport, ) ) return True @@ -73,7 +73,7 @@ #Not gpx file return False return False - + def getDateTime(self, time_): return Date().getDateTime(time_) @@ -122,5 +122,5 @@ return sport, gpxFile def createGPXfile(self, gpxfile, tree): - tree.write(gpxfile, xml_declaration=True) + tree.write(gpxfile, xml_declaration=True, encoding='UTF-8') Modified: pytrainer/trunk/plugins/garmin-hr/garminhr.py =================================================================== --- pytrainer/trunk/plugins/garmin-hr/garminhr.py 2010-05-16 01:36:52 UTC (rev 579) +++ pytrainer/trunk/plugins/garmin-hr/garminhr.py 2010-05-16 02:16:10 UTC (rev 580) @@ -63,10 +63,10 @@ #TODO Remove Zenity below outgps = commands.getstatusoutput("gpsbabel -t -i garmin -f %s -o gtrnctr -F %s | zenity --progress --pulsate --text='Loading Data' auto-close" % (self.input_dev, gpsbabelOutputFile) ) if outgps[0]==0: - if outgps[1] == "Found no Garmin USB devices.": # check localizations + if outgps[1] == "Found no Garmin USB devices.": # check localizations logging.error ("GPSBabel found no Garmin USB devices") os.popen("zenity --error --text='GPSBabel found no Garmin USB devices'"); - pass + pass else: #gpsbabel worked - now process file... if self.valid_input_file(gpsbabelOutputFile): for (sport, tracks) in self.getTracks(gpsbabelOutputFile): @@ -156,7 +156,7 @@ logging.debug("Error no time found in track") return False else: - time = timeElement.text + time = timeElement.text #comparing date and start time (sport may have been changed in DB after import) if self.pytrainer_main.ddbb.select("records","*","date_time_utc=\"%s\"" % (time)): logging.debug("Not importing track for time %s" % (time)) @@ -170,7 +170,7 @@ xslt_doc = etree.parse(self.data_path+"/translate.xsl") transform = etree.XSLT(xslt_doc) result_tree = transform(track) - result_tree.write(gpxfile, xml_declaration=True) + result_tree.write(gpxfile, xml_declaration=True, encoding='UTF-8') Modified: pytrainer/trunk/plugins/garmin-hr-file/garminhrfile.py =================================================================== --- pytrainer/trunk/plugins/garmin-hr-file/garminhrfile.py 2010-05-16 01:36:52 UTC (rev 579) +++ pytrainer/trunk/plugins/garmin-hr-file/garminhrfile.py 2010-05-16 02:16:10 UTC (rev 580) @@ -1,7 +1,7 @@ #!/usr/bin/env python # -*- coding: iso-8859-1 -*- -#Copyright (C) +#Copyright (C) #Based on plugin by Fiz Vazquez vu...@si... @@ -102,7 +102,7 @@ logging.debug("Error no time found in track") return False else: - time = timeElement.text + time = timeElement.text #comparing date and start time (sport may have been changed in DB after import) if self.pytrainer_main.ddbb.select("records","*","date_time_utc=\"%s\"" % (time)): logging.debug("Not importing track for time %s" % (time)) @@ -132,4 +132,4 @@ xslt_doc = etree.parse(self.data_path+"/translate.xsl") transform = etree.XSLT(xslt_doc) result_tree = transform(track) - result_tree.write(gpxfile, xml_declaration=True) + result_tree.write(gpxfile, xml_declaration=True, encoding='UTF-8') Modified: pytrainer/trunk/plugins/garmin-tcxv2/garmin-tcxv2.py =================================================================== --- pytrainer/trunk/plugins/garmin-tcxv2/garmin-tcxv2.py 2010-05-16 01:36:52 UTC (rev 579) +++ pytrainer/trunk/plugins/garmin-tcxv2/garmin-tcxv2.py 2010-05-16 02:16:10 UTC (rev 580) @@ -59,9 +59,9 @@ for activity in activities: if not self.inDatabase(activity): sport = self.getSport(activity) - gpxfile = "%s/garmin-tcxv2-%d.gpx" % (self.tmpdir, len(importfiles)) + gpxfile = "%s/garmin-tcxv2-%d.gpx" % (self.tmpdir, len(importfiles)) self.createGPXfile(gpxfile, activity) - importfiles.append((gpxfile, sport)) + importfiles.append((gpxfile, sport)) else: logging.debug("File:%s activity %d already in database. Skipping import." % (filename, activities.index(activity)) ) else: @@ -121,4 +121,4 @@ #xml_doc = etree.parse(filename) xml_doc = activity result_tree = transform(xml_doc) - result_tree.write(gpxfile, xml_declaration=True) + result_tree.write(gpxfile, xml_declaration=True, encoding='UTF-8') Modified: pytrainer/trunk/plugins/garmintools/garmintools.py =================================================================== --- pytrainer/trunk/plugins/garmintools/garmintools.py 2010-05-16 01:36:52 UTC (rev 579) +++ pytrainer/trunk/plugins/garmintools/garmintools.py 2010-05-16 02:16:10 UTC (rev 580) @@ -67,9 +67,9 @@ tree = etree.parse(fileString) if not self.inDatabase(tree): sport = self.getSport(tree) - gpxfile = "%s/garmintools-%d.gpx" % (self.tmpdir, len(importfiles)) + gpxfile = "%s/garmintools-%d.gpx" % (self.tmpdir, len(importfiles)) self.createGPXfile(gpxfile, tree) - importfiles.append((gpxfile, sport)) + importfiles.append((gpxfile, sport)) else: logging.debug("%s already in database. Skipping import." % (filename,) ) else: @@ -129,5 +129,5 @@ xslt_doc = etree.parse(self.data_path+"/translate.xsl") transform = etree.XSLT(xslt_doc) result_tree = transform(tree) - result_tree.write(gpxfile, xml_declaration=True) + result_tree.write(gpxfile, xml_declaration=True, encoding='UTF-8') Modified: pytrainer/trunk/plugins/garmintools_full/garmintools_full.py =================================================================== --- pytrainer/trunk/plugins/garmintools_full/garmintools_full.py 2010-05-16 01:36:52 UTC (rev 579) +++ pytrainer/trunk/plugins/garmintools_full/garmintools_full.py 2010-05-16 02:16:10 UTC (rev 580) @@ -81,7 +81,7 @@ if numError >= 0: #TODO Remove Zenity below outgps = commands.getstatusoutput("garmin_save_runs | zenity --progress --pulsate --text='Loading Data' auto-close") - if outgps[0]==0: + if outgps[0]==0: # now we should have a lot of gmn (binary) files under $GARMIN_SAVE_RUNS foundFiles = self.searchFiles(self.tmpdir, "gmn") logging.info("Retrieved "+str(len(foundFiles))+" entries from GPS device") @@ -109,7 +109,7 @@ if numError == -1: os.popen("zenity --error --text='No Garmin device found\nCheck your configuration'"); elif numError == -2: - os.popen("zenity --error --text='Can not find garmintools binaries\nCheck your configuration'") + os.popen("zenity --error --text='Can not find garmintools binaries\nCheck your configuration'") else: #No garmin device found #TODO Remove Zenity below os.popen("zenity --error --text='Can not handle Garmin device (wrong module loaded)\nCheck your configuration'"); @@ -150,7 +150,7 @@ #if not self.inDatabase(tree, filename): if not self.entryExists(tree, filename): sport = self.getSport(tree) - gpxfile = "%s/garmintools-%d.gpx" % (self.tmpdir, len(importfiles)) + gpxfile = "%s/garmintools-%d.gpx" % (self.tmpdir, len(importfiles)) self.createGPXfile(gpxfile, tree) importfiles.append((gpxfile, sport)) else: @@ -208,7 +208,7 @@ stringStartDate = stringStartUTC[0:10] for entry in listStringStartUTC: #logging.debug("start: "+str(startDatetime)+" | entry: "+str(entry)+" | gap: "+str(datetimePlusDelta)) - if entry[0] is not None: + if entry[0] is not None: if str(entry[0]).startswith(stringStartDate): deltaGap = timedelta(seconds=gap) datetimeStartUTC = datetime.strptime(stringStartUTC,"%Y-%m-%dT%H:%M:%SZ") @@ -220,7 +220,7 @@ break else: if (stringStartUTC,) in listStringStartUTC: # strange way to store results from DB - found = True + found = True logging.debug("<<") return found @@ -252,7 +252,7 @@ xslt_doc = etree.parse(self.data_path+"/translate.xsl") transform = etree.XSLT(xslt_doc) result_tree = transform(tree) - result_tree.write(gpxfile, xml_declaration=True) + result_tree.write(gpxfile, xml_declaration=True, encoding='UTF-8') def dumpBinaries(self, listFiles): logging.debug(">>") Modified: pytrainer/trunk/plugins/googleearth/main.py =================================================================== --- pytrainer/trunk/plugins/googleearth/main.py 2010-05-16 01:36:52 UTC (rev 579) +++ pytrainer/trunk/plugins/googleearth/main.py 2010-05-16 02:16:10 UTC (rev 580) @@ -43,7 +43,7 @@ if self.valid_input_file(filename): if not self.inDatabase(filename): sport = self.getSport(filename) #TODO Fix sport determination - gpxfile = "%s/googleearth-%d.gpx" % (self.tmpdir, len(importfiles)) + gpxfile = "%s/googleearth-%d.gpx" % (self.tmpdir, len(importfiles)) outgps = commands.getstatusoutput("gpsbabel -t -i kml -f %s -o gpx -F %s" % (filename, gpxfile) ) #self.createGPXfile(gpxfile, filename) #TODO Fix processing so not dependant on the broken gpsbabel importfiles.append((gpxfile, sport)) @@ -66,7 +66,7 @@ #from pytrainer.lib.xmlValidation import xmlValidator #validator = xmlValidator() #return validator.validateXSL(filename, xslfile) - + def inDatabase(self, filename): """ Function to determine if a given file has already been imported into the database only compares date and start time (sport may have been changed in DB after import) @@ -76,11 +76,11 @@ # return True #else: return False - + def getSport(self, filename): #TODO Fix sport determination return "Run" - + def detailsFromKML(self, filename): """ Function to return the first time element from a KML file """ #TODO @@ -91,7 +91,7 @@ # return None #else: # return timeElement.text - + def createGPXfile(self, gpxfile, filename): ''' Function to transform a GPSBabel kml file to a valid GPX+ file ''' @@ -99,5 +99,5 @@ xslt_doc = etree.parse(self.data_path+"/translate.xsl") transform = etree.XSLT(xslt_doc) result_tree = transform(filename) - result_tree.write(gpxfile, xml_declaration=True) + result_tree.write(gpxfile, xml_declaration=True, encoding='UTF-8') Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-05-16 01:36:52 UTC (rev 579) +++ pytrainer/trunk/pytrainer/main.py 2010-05-16 02:16:10 UTC (rev 580) @@ -59,7 +59,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#579" + self.version ="1.7.2_svn#580" 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 01:36:58
|
Revision: 579 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=579&view=rev Author: jblance Date: 2010-05-16 01:36:52 +0000 (Sun, 16 May 2010) Log Message: ----------- Graph options changes - add button to show options, move show laps to options Modified Paths: -------------- pytrainer/trunk/glade/pytrainer.glade pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/glade/pytrainer.glade =================================================================== --- pytrainer/trunk/glade/pytrainer.glade 2010-05-15 07:15:15 UTC (rev 578) +++ pytrainer/trunk/glade/pytrainer.glade 2010-05-16 01:36:52 UTC (rev 579) @@ -1081,11 +1081,23 @@ <property name="border_width">5</property> <property name="spacing">8</property> <child> - <widget class="GtkLabel" id="label162"> + <widget class="GtkButton" id="buttonShowOptions"> <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip" translatable="yes">Show graph display options</property> + <signal name="clicked" handler="on_buttonShowOptions_clicked"/> + <child> + <widget class="GtkImage" id="image4"> + <property name="visible">True</property> + <property name="stock">gtk-preferences</property> + </widget> + </child> </widget> <packing> - <property name="position">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> </packing> </child> <child> @@ -1100,7 +1112,7 @@ </widget> <packing> <property name="expand">False</property> - <property name="position">1</property> + <property name="position">2</property> </packing> </child> <child> @@ -1111,7 +1123,7 @@ <packing> <property name="expand">False</property> <property name="fill">False</property> - <property name="position">2</property> + <property name="position">3</property> </packing> </child> <child> @@ -1129,29 +1141,11 @@ <packing> <property name="expand">False</property> <property name="fill">False</property> - <property name="position">3</property> - </packing> - </child> - <child> - <widget class="GtkCheckButton" id="btnShowLaps"> - <property name="label" translatable="yes">Show Laps</property> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="receives_default">False</property> - <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_btnShowLaps_toggled"/> - </widget> - <packing> <property name="position">4</property> </packing> </child> <child> - <widget class="GtkLabel" id="label-2147483645"> - <property name="visible">True</property> - </widget> - <packing> - <property name="position">5</property> - </packing> + <placeholder/> </child> <child> <widget class="GtkButton" id="button27"> @@ -1169,7 +1163,8 @@ <packing> <property name="expand">False</property> <property name="fill">False</property> - <property name="position">6</property> + <property name="pack_type">end</property> + <property name="position">0</property> </packing> </child> </widget> @@ -1408,7 +1403,7 @@ </widget> <packing> <property name="expand">False</property> - <property name="position">1</property> + <property name="position">2</property> </packing> </child> <child> @@ -1619,7 +1614,7 @@ </widget> <packing> <property name="expand">False</property> - <property name="position">2</property> + <property name="position">3</property> </packing> </child> <child> @@ -1798,6 +1793,56 @@ </packing> </child> <child> + <widget class="GtkHBox" id="hbox5"> + <property name="visible">True</property> + <child> + <widget class="GtkLabel" id="label16"> + <property name="visible">True</property> + </widget> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <widget class="GtkCheckButton" id="btnShowLaps"> + <property name="label" translatable="yes">Show Laps</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_btnShowLaps_toggled"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label17"> + <property name="visible">True</property> + </widget> + <packing> + <property name="position">2</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">5</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label18"> + <property name="visible">True</property> + </widget> + <packing> + <property name="position">6</property> + </packing> + </child> + <child> <widget class="GtkButton" id="buttonResetGraph"> <property name="label" translatable="yes">Reset Graph</property> <property name="visible">True</property> @@ -1811,7 +1856,7 @@ <property name="expand">False</property> <property name="fill">False</property> <property name="pack_type">end</property> - <property name="position">3</property> + <property name="position">1</property> </packing> </child> </widget> Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2010-05-15 07:15:15 UTC (rev 578) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-05-16 01:36:52 UTC (rev 579) @@ -837,6 +837,19 @@ ## Lista de eventos ## ###################### + def on_buttonShowOptions_clicked(self, widget): + position_set = self.hpaned1.get_property('position-set') + if position_set: + #Currently not showing options - show them + self.hpaned1.set_property('position-set', False) + self.buttonShowOptions.set_tooltip_text(_('Hide graph display options') ) + else: + #Hide options + self.hpaned1.set_position(0) + self.buttonShowOptions.set_tooltip_text(_('Show graph display options') ) + logging.debug('Position: %d' % self.hpaned1.get_position() ) + logging.debug('Position set: %s' % self.hpaned1.get_property('position-set') ) + def on_buttonRedrawMap_clicked(self, widget): logging.debug('on_buttonRedrawMap_clicked') self.parent.refreshMapView() Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-05-15 07:15:15 UTC (rev 578) +++ pytrainer/trunk/pytrainer/main.py 2010-05-16 01:36:52 UTC (rev 579) @@ -59,7 +59,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#578" + self.version ="1.7.2_svn#579" 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-15 07:15:22
|
Revision: 578 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=578&view=rev Author: jblance Date: 2010-05-15 07:15:15 +0000 (Sat, 15 May 2010) Log Message: ----------- Modifications to support OSM as a map viewer - added preference to chose default, changes to map screen to allow viewer selection. OSM not implemented yet Modified Paths: -------------- pytrainer/trunk/glade/profile.glade pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/gui/windowprofile.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/profile.py Modified: pytrainer/trunk/glade/profile.glade =================================================================== --- pytrainer/trunk/glade/profile.glade 2010-05-15 06:05:28 UTC (rev 577) +++ pytrainer/trunk/glade/profile.glade 2010-05-15 07:15:15 UTC (rev 578) @@ -10,7 +10,6 @@ <child> <widget class="GtkVBox" id="vbox4"> <property name="visible">True</property> - <property name="orientation">vertical</property> <child> <widget class="GtkNotebook" id="notebook3"> <property name="visible">True</property> @@ -20,7 +19,6 @@ <child> <widget class="GtkVBox" id="vbox24"> <property name="visible">True</property> - <property name="orientation">vertical</property> <child> <widget class="GtkFrame" id="frame14"> <property name="visible">True</property> @@ -32,12 +30,8 @@ <property name="visible">True</property> <property name="left_padding">12</property> <child> - <widget class="GtkTable" id="table19"> + <widget class="GtkHBox" id="hbox2"> <property name="visible">True</property> - <property name="border_width">5</property> - <property name="n_columns">2</property> - <property name="column_spacing">5</property> - <property name="row_spacing">5</property> <child> <widget class="GtkRadioButton" id="prf_metric_system"> <property name="label" translatable="yes">Metric system</property> @@ -45,11 +39,13 @@ <property name="can_focus">True</property> <property name="receives_default">False</property> <property name="use_underline">True</property> + <property name="active">True</property> <property name="draw_indicator">True</property> </widget> <packing> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="expand">False</property> + <property name="padding">5</property> + <property name="position">0</property> </packing> </child> <child> @@ -63,10 +59,9 @@ <property name="group">prf_metric_system</property> </widget> <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="expand">False</property> + <property name="padding">5</property> + <property name="position">1</property> </packing> </child> </widget> @@ -91,6 +86,72 @@ </packing> </child> <child> + <widget class="GtkFrame" id="frameDefaultMapViewer"> + <property name="visible">True</property> + <property name="border_width">5</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <widget class="GtkAlignment" id="alignment2"> + <property name="visible">True</property> + <property name="left_padding">12</property> + <child> + <widget class="GtkHBox" id="hbox1"> + <property name="visible">True</property> + <child> + <widget class="GtkRadioButton" id="radiobuttonDefaultGMap"> + <property name="label" translatable="yes">Google</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <widget class="GtkRadioButton" id="radiobuttonDefaultOSM"> + <property name="label" translatable="yes">Open Street Map</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="draw_indicator">True</property> + <property name="group">radiobuttonDefaultGMap</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <placeholder/> + </child> + </widget> + </child> + </widget> + </child> + <child> + <widget class="GtkLabel" id="labelDefaultMapViewer"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>Default Map Viewer</b></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="type">label_item</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <child> <widget class="GtkFrame" id="frame13"> <property name="visible">True</property> <property name="border_width">5</property> @@ -174,7 +235,7 @@ <child> <widget class="GtkComboBoxEntry" id="prf_ddbb"> <property name="visible">True</property> - <property name="items" translatable="no"></property> + <property name="items"></property> <signal name="changed" handler="on_prf_ddbb_changed"/> </widget> <packing> @@ -265,7 +326,7 @@ <packing> <property name="expand">False</property> <property name="fill">False</property> - <property name="position">1</property> + <property name="position">2</property> </packing> </child> <child> @@ -344,7 +405,7 @@ <packing> <property name="expand">False</property> <property name="fill">False</property> - <property name="position">2</property> + <property name="position">3</property> </packing> </child> </widget> @@ -404,7 +465,7 @@ <child> <widget class="GtkComboBoxEntry" id="prf_gender"> <property name="visible">True</property> - <property name="items" translatable="no"></property> + <property name="items"></property> </widget> <packing> <property name="left_attach">1</property> @@ -596,7 +657,6 @@ <widget class="GtkVBox" id="sportlist_"> <property name="visible">True</property> <property name="border_width">5</property> - <property name="orientation">vertical</property> <child> <widget class="GtkScrolledWindow" id="sportScrollWindow"> <property name="height_request">170</property> @@ -717,7 +777,6 @@ <widget class="GtkVBox" id="addsport_"> <property name="visible">True</property> <property name="border_width">5</property> - <property name="orientation">vertical</property> <child> <widget class="GtkTable" id="table18"> <property name="visible">True</property> @@ -934,14 +993,12 @@ <widget class="GtkVBox" id="deletesport_"> <property name="visible">True</property> <property name="border_width">5</property> - <property name="orientation">vertical</property> <child> <placeholder/> </child> <child> <widget class="GtkVBox" id="vbox17"> <property name="visible">True</property> - <property name="orientation">vertical</property> <child> <widget class="GtkLabel" id="label144"> <property name="visible">True</property> @@ -1038,7 +1095,7 @@ </child> <child> <widget class="GtkLabel" id="sportnamedel"> - <property name="label" translatable="no">label-2147483648</property> + <property name="label">label-2147483648</property> </widget> <packing> <property name="expand">False</property> @@ -1081,7 +1138,6 @@ <widget class="GtkVBox" id="editsport_"> <property name="visible">True</property> <property name="border_width">5</property> - <property name="orientation">vertical</property> <child> <widget class="GtkTable" id="table17"> <property name="visible">True</property> @@ -1309,7 +1365,6 @@ <child> <widget class="GtkVBox" id="vbox25"> <property name="visible">True</property> - <property name="orientation">vertical</property> <child> <widget class="GtkFrame" id="frame17"> <property name="visible">True</property> @@ -1597,7 +1652,6 @@ <child> <widget class="GtkVBox" id="vbox_startup_params"> <property name="visible">True</property> - <property name="orientation">vertical</property> <child> <widget class="GtkAlignment" id="alignment1"> <property name="visible">True</property> @@ -1662,7 +1716,7 @@ </child> <child> <widget class="GtkCheckButton" id="checkbuttonValidate"> - <property name="label" translatable="no">--valid</property> + <property name="label">--valid</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> @@ -1708,7 +1762,7 @@ </child> <child> <widget class="GtkCheckButton" id="checkbuttonCheck"> - <property name="label" translatable="no">--check</property> + <property name="label">--check</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> @@ -1754,7 +1808,7 @@ </child> <child> <widget class="GtkCheckButton" id="checkbuttonGM3"> - <property name="label" translatable="no">--gmaps2*</property> + <property name="label">--gmaps2*</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> @@ -1801,7 +1855,7 @@ </child> <child> <widget class="GtkCheckButton" id="checkbuttonUnifiedImport"> - <property name="label" translatable="no">--testimport</property> + <property name="label">--testimport</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> @@ -1847,7 +1901,7 @@ </child> <child> <widget class="GtkCheckButton" id="checkbuttonEquip"> - <property name="label" translatable="no">--equip</property> + <property name="label">--equip</property> <property name="visible">True</property> <property name="sensitive">False</property> <property name="can_focus">False</property> Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2010-05-15 06:05:28 UTC (rev 577) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-05-15 07:15:15 UTC (rev 578) @@ -85,8 +85,10 @@ self.set_unified_import(self.testimport) #Set correct map viewer - #self.radiobuttonOSM.set_active(0) - self.radiobuttonGMap.set_active(1) + if self.pytrainer_main.profile.getValue("pytraining","default_viewer") == "1": + self.radiobuttonOSM.set_active(1) + else: + self.radiobuttonGMap.set_active(1) def set_unified_import(self, status=False): self.menu_importdata.set_sensitive(status) @@ -398,18 +400,19 @@ logging.debug(">>") #Check which type of map viewer to use if self.radiobuttonOSM.get_active(): - map_view = "OSM" + #Use OSM to draw map + logging.debug("Using OSM to draw map....") + self.googlemaps.drawMap(-9999) #TODO placeholder for OSM code elif self.radiobuttonGMap.get_active(): - map_view = "GMAP" + #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? else: - map_view = "GMAP" - print map_view - - if full_screen: - self.googlemaps_old.drawMap(id_record) - else: - - self.googlemaps.drawMap(id_record) + #Unknown map type... + logging.error("Unknown map viewer requested") logging.debug("<<") def actualize_weekview(self, record_list, date_ini, date_end): @@ -835,7 +838,7 @@ ###################### def on_buttonRedrawMap_clicked(self, widget): - print 'on_buttonRedrawMap_clicked' + logging.debug('on_buttonRedrawMap_clicked') self.parent.refreshMapView() def on_radiobuttonMap_toggled(self, widget): Modified: pytrainer/trunk/pytrainer/gui/windowprofile.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowprofile.py 2010-05-15 06:05:28 UTC (rev 577) +++ pytrainer/trunk/pytrainer/gui/windowprofile.py 2010-05-15 07:15:15 UTC (rev 578) @@ -32,22 +32,6 @@ self.data_path = data_path SimpleGladeApp.__init__(self, data_path+glade_path, root, domain) self.conf_options = parent.profile_options - ''''self.conf_options = [ - "prf_name", - "prf_gender", - "prf_weight", - "prf_height", - "prf_age", - "prf_ddbb", - "prf_ddbbhost", - "prf_ddbbname", - "prf_ddbbuser", - "prf_ddbbpass", - "prf_maxhr", - "prf_minhr", - "prf_hrzones_karvonen", - "prf_us_system" - ]''' def new(self): self.gender_options = { @@ -64,7 +48,7 @@ for i in self.gender_options: self.prf_gender.insert_text(i,self.gender_options[i]) - #hacemos lo propio para el combobox ddbb + #hacemos lo propio para el combobox ddbb for i in self.ddbb_type: self.prf_ddbb.insert_text(i,self.ddbb_type[i]) @@ -73,55 +57,66 @@ for column_index, column_name in enumerate(column_names): column = gtk.TreeViewColumn(column_name, gtk.CellRendererText(), text=column_index) column.set_resizable(True) - self.sportTreeView.append_column(column) - + self.sportTreeView.append_column(column) def setValues(self,list_options): for i in self.conf_options.keys(): if not list_options.has_key(i): + print 'no list options for: ' + i continue - try: - var = getattr(self,i) - except AttributeError as e: - continue - if i != "prf_gender" and i != "prf_ddbb" and i !="prf_hrzones_karvonen" and i!="prf_us_system": - var.set_text(list_options[i]) - elif i == "prf_hrzones_karvonen" or i == "prf_us_system": - if list_options[i]=="True": - var.set_active(True) - elif i == "prf_gender": - for j in self.gender_options: - if self.gender_options[j]==list_options[i]: - var.set_active(j) - elif i == "prf_ddbb": - for j in self.ddbb_type: - if self.ddbb_type[j]==list_options[i]: - var.set_active(j) - if j==0: - self._ddbb_value_deactive() - else: - self._ddbb_value_active() + if i == "default_viewer": + if list_options[i] == "1": + logging.debug("Setting defult map viewer to OSM") + self.radiobuttonDefaultOSM.set_active(1) + else: + logging.debug("Setting defult map viewer to Google") + self.radiobuttonDefaultGMap.set_active(1) + else: + try: + var = getattr(self,i) + except AttributeError as e: + continue + if i == "prf_hrzones_karvonen" or i == "prf_us_system": + if list_options[i]=="True": + var.set_active(True) + elif i == "prf_gender": + for j in self.gender_options: + if self.gender_options[j]==list_options[i]: + var.set_active(j) + elif i == "prf_ddbb": + for j in self.ddbb_type: + if self.ddbb_type[j]==list_options[i]: + var.set_active(j) + if j==0: + self._ddbb_value_deactive() + else: + self._ddbb_value_active() + else: + var.set_text(list_options[i]) + def saveOptions(self): list_options = {} for i in self.conf_options.keys(): - try: - var = getattr(self,i) - except AttributeError as e: - continue - if i != "prf_gender" and i != "prf_ddbb" and i != "prf_hrzones_karvonen" and i != "prf_us_system": - #list_options.append((i,var.get_text())) - list_options[i] = var.get_text() - elif i == "prf_hrzones_karvonen" or i == "prf_us_system": - if var.get_active(): - #list_options.append((i,"True")) - list_options[i] = "True" + if i == "default_viewer": + if self.radiobuttonDefaultOSM.get_active(): + list_options[i] = "1" else: - #list_options.append((i,"False")) - list_options[i] = "False" + list_options[i] = "0" else: - #list_options.append((i,var.get_active_text())) - list_options[i] = var.get_active_text() + try: + var = getattr(self,i) + except AttributeError as e: + continue + if i == "prf_hrzones_karvonen" or i == "prf_us_system": + if var.get_active(): + list_options[i] = "True" + else: + list_options[i] = "False" + elif i == "prf_gender" or i == "prf_ddbb": + list_options[i] = var.get_active_text() + else: + list_options[i] = var.get_text() self.parent.setProfile(list_options) def on_calendar_clicked(self,widget): Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-05-15 06:05:28 UTC (rev 577) +++ pytrainer/trunk/pytrainer/main.py 2010-05-15 07:15:15 UTC (rev 578) @@ -59,7 +59,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#577" + self.version ="1.7.2_svn#578" self.DB_version = 3 #Process command line options self.startup_options = self.get_options() @@ -318,6 +318,10 @@ def refreshMapView(self, full_screen=False): logging.debug('>>') + if self.windowmain is None: + logging.debug('Called before windowmain initialisation') + logging.debug('<<') + return selected,iter = self.windowmain.recordTreeView.get_selection().get_selected() id_record = selected.get_value(iter,0) logging.debug('Trying to show map for record '+str(id_record)) Modified: pytrainer/trunk/pytrainer/profile.py =================================================================== --- pytrainer/trunk/pytrainer/profile.py 2010-05-15 06:05:28 UTC (rev 577) +++ pytrainer/trunk/pytrainer/profile.py 2010-05-15 07:15:15 UTC (rev 578) @@ -68,6 +68,7 @@ "prf_minhr":"", "auto_launch_file_selection":"False", "import_default_tab":"0", + "default_viewer":"0", } #Parse pytrainer configuration file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-05-15 06:05:34
|
Revision: 577 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=577&view=rev Author: jblance Date: 2010-05-15 06:05:28 +0000 (Sat, 15 May 2010) Log Message: ----------- Update to wordpress extension to upload using XML POST - committing changes made with Brian to get extension working Modified Paths: -------------- pytrainer/trunk/extensions/wordpress/wordpress.py pytrainer/trunk/extensions/wordpress/wordpresslib.py pytrainer/trunk/glade/pytrainer.glade pytrainer/trunk/pytrainer/extensions/googlemaps.py pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/extensions/wordpress/wordpress.py =================================================================== --- pytrainer/trunk/extensions/wordpress/wordpress.py 2010-05-06 09:44:19 UTC (rev 576) +++ pytrainer/trunk/extensions/wordpress/wordpress.py 2010-05-15 06:05:28 UTC (rev 577) @@ -1,10 +1,31 @@ -#!/usr/bin/env python -from optparse import OptionParser +# -*- 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 os import sys +import shutil +import logging -import wordpresslib -import googlemaps +import gtk +import httplib2 + +import wordpresslib #TODO remove need for this library +import googlemaps #TODO remove this separate googlemaps class import pytrainer.lib.points as Points from pytrainer.lib.date import Date @@ -17,56 +38,122 @@ self.conf_dir = conf_dir def run(self, id): + #Show user something is happening + msg = _("Posting to Wordpress blog") + md = gtk.MessageDialog(self.pytrainer_main.windowmain.window1, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO, gtk.BUTTONS_NONE, msg) + md.set_title(_("Wordpress Extension Processing")) + md.set_modal(True) + md.show() + while gtk.events_pending(): # This allows the GUI to update + gtk.main_iteration() # before completion of this entire action + logging.debug("before request posting") options = self.options self.wordpressurl = options["wordpressurl"] self.user = options["wordpressuser"] self.password = options["wordpresspass"] - self.gpxfile = "%s/gpx/%s.gpx " %(self.conf_dir,id) + self.gpxfile = "%s/gpx/%s.gpx" %(self.conf_dir,id) self.googlekey = options["googlekey"] self.idrecord = id #options.idrecord self.wordpresscategory = options["wordpresscategory"] - print self.wordpressurl, self.user, self.password, self.gpxfile, self.googlekey, self.googlekey, self.idrecord, self.wordpresscategory - + debug_msg = "%s, %s, %s, %s, %s, %s" % (self.wordpressurl, self.user, self.gpxfile, self.googlekey, self.idrecord, self.wordpresscategory) + logging.debug(debug_msg) try: - self.wp = wordpresslib.WordPressClient(self.wordpressurl, self.user, self.password) + self.wp = wordpresslib.WordPressClient(self.wordpressurl, self.user, self.password) #TODO remove need for wordpresslib?? self.error = False except: self.error = True self.log = "Url, user or pass are incorrect. Please, check your configuration" self.loadRecordInfo() - blog_title = self.createTitle() - blog_category = self.createCategory() + if self.title is None: + self.title = "No Title" + blog_route = self.createRoute() + blog_body = self.createBody() + blog_table = self.createTable() + blog_figureHR = self.createFigureHR() + blog_figureStage = self.createFigureStage() + blog_foot = self.createFoot() + + self.description = "<![CDATA["+blog_body+blog_table+blog_route+blog_figureHR+blog_figureStage+blog_foot+"]]>" + xmlstuff = '''<methodCall> +<methodName>metaWeblog.newPost</methodName> +<params> +<param> +<value> +<string>MyBlog</string> +</value> +</param> +<param> +<value>%s</value> +</param> +<param> +<value> +<string>%s</string> +</value> +</param> +<param> +<struct> +<member> +<name>categories</name> +<value> +<array> +<data> +<value>%s</value> +</data> +</array> +</value> +</member> +<member> +<name>description</name> +<value>%s</value> +</member> +<member> +<name>title</name> +<value>%s</value> +</member> +</struct> +</param> +<param> + <value> + <boolean>1</boolean> + </value> +</param> +</params> +</methodCall> +''' % (self.user, self.password, self.wordpresscategory, self.description, self.title) - if self.error == False: - blog_route = self.createRoute() - blog_body = self.createBody() - blog_table = self.createTable() - blog_figureHR = self.createFigureHR() - blog_figureStage = self.createFigureStage() - blog_foot = self.createFoot() - self.wp.selectBlog(0) - - post = wordpresslib.WordPressPost() - post.title = blog_title - post.description = blog_body+blog_table+blog_route+blog_figureHR+blog_figureStage+blog_foot - post.categories = blog_category - idNewPost = self.wp.newPost(post, True) - print "The post has been submited" #TODO Notification to user - + #POST request to Wordpress blog + h = httplib2.Http() + res, content = h.request(self.wordpressurl, 'POST', body=xmlstuff) + logging.debug("after request posting") + logging.debug("Got response status: %s, reason: %s, content: %s" % (res.status, res.reason, content)) + if res.reason == 'OK': + res_msg = "Successfully posted to Wordpress." else: - print self.log + res_msg = "Some error occured\nGot a status %s, reason %s\nContent was: %s" % (res.status, res.reason, content) + #Close 'Please wait' dialog + md.destroy() + #Show the user the result + md = gtk.MessageDialog(self.pytrainer_main.windowmain.window1, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, res_msg) + md.set_title(_("Wordpress Extension Upload Complete")) + md.set_modal(False) + md.run() + md.destroy() def createRoute(self): + gpxpath = "/tmp/gpstrace.gpx.txt" htmlpath = "/tmp/index.html" #TODO fix to use correct tmp dir - kmlpath = "/tmp/gps.kml" #TODO fix to use correct tmp dir + kmlpath = "/tmp/gps.kml.txt" #TODO fix to use correct tmp dir description_route = '' if os.path.isfile(self.gpxfile): + #copy gpx file to new name + shutil.copy(self.gpxfile, gpxpath) #create the html file googlemaps.drawMap(self.gpxfile,self.googlekey,htmlpath) #TODO fix to use main googlemaps and remove extensions copy #create the kml file os.system("gpsbabel -t -i gpx -f %s -o kml,points=0,line_color=ff0000ff -F %s" %(self.gpxfile,kmlpath)) #TODO fix to remove gpsbabel - gfile = self.wp.newMediaObject(self.gpxfile) + #gfile = self.wp.newMediaObject(self.gpxfile) + gfile = self.wp.newMediaObject(gpxpath) hfile = self.wp.newMediaObject(htmlpath) kfile = self.wp.newMediaObject(kmlpath) Modified: pytrainer/trunk/extensions/wordpress/wordpresslib.py =================================================================== --- pytrainer/trunk/extensions/wordpress/wordpresslib.py 2010-05-06 09:44:19 UTC (rev 576) +++ pytrainer/trunk/extensions/wordpress/wordpresslib.py 2010-05-15 06:05:28 UTC (rev 577) @@ -56,6 +56,7 @@ import xmlrpclib import datetime import time +import logging class WordPressException(exceptions.Exception): """Custom exception for WordPress client operations @@ -223,7 +224,7 @@ """ blogContent = { 'title' : post.title, - 'description' : post.description + 'description' : "<![CDATA["+post.description+"]]>" } # add categories @@ -237,6 +238,8 @@ # insert new post idNewPost = int(self._server.metaWeblog.newPost(self.blogId, self.user, self.password, blogContent, 0)) + logging.debug("idNewPost: %d" % idNewPost) + logging.debug(blogContent) # set categories for new post self.setPostCategories(idNewPost, categories) Modified: pytrainer/trunk/glade/pytrainer.glade =================================================================== --- pytrainer/trunk/glade/pytrainer.glade 2010-05-06 09:44:19 UTC (rev 576) +++ pytrainer/trunk/glade/pytrainer.glade 2010-05-15 06:05:28 UTC (rev 577) @@ -4,7 +4,7 @@ <!-- interface-naming-policy toplevel-contextual --> <widget class="GtkWindow" id="window1"> <property name="visible">True</property> - <property name="title" translatable="no">window1</property> + <property name="title">window1</property> <property name="icon">logo_mini.png</property> <signal name="destroy" handler="quit"/> <child> @@ -14,7 +14,6 @@ <child> <widget class="GtkVBox" id="infoarea"> <property name="visible">True</property> - <property name="orientation">vertical</property> <child> <widget class="GtkMenuBar" id="menubar1"> <property name="visible">True</property> @@ -264,7 +263,6 @@ <child> <widget class="GtkVBox" id="framework"> <property name="visible">True</property> - <property name="orientation">vertical</property> <child> <widget class="GtkHBox" id="hbox8"> <property name="visible">True</property> @@ -337,7 +335,6 @@ <widget class="GtkVBox" id="vbox22"> <property name="visible">True</property> <property name="border_width">10</property> - <property name="orientation">vertical</property> <child> <widget class="GtkTable" id="table13"> <property name="visible">True</property> @@ -490,7 +487,7 @@ <property name="visible">True</property> <property name="xalign">0</property> <property name="xpad">5</property> - <property name="label" translatable="no">km/h</property> + <property name="label">km/h</property> </widget> <packing> <property name="left_attach">5</property> @@ -506,7 +503,7 @@ <property name="visible">True</property> <property name="xalign">0</property> <property name="xpad">5</property> - <property name="label" translatable="no">min/km</property> + <property name="label">min/km</property> </widget> <packing> <property name="left_attach">5</property> @@ -522,7 +519,7 @@ <property name="visible">True</property> <property name="xalign">0</property> <property name="xpad">5</property> - <property name="label" translatable="no">m</property> + <property name="label">m</property> </widget> <packing> <property name="left_attach">5</property> @@ -718,7 +715,7 @@ <property name="visible">True</property> <property name="xalign">0</property> <property name="xpad">5</property> - <property name="label" translatable="no">min/km</property> + <property name="label">min/km</property> </widget> <packing> <property name="left_attach">2</property> @@ -749,7 +746,7 @@ <property name="visible">True</property> <property name="xalign">0</property> <property name="xpad">5</property> - <property name="label" translatable="no">m</property> + <property name="label">m</property> </widget> <packing> <property name="left_attach">2</property> @@ -821,7 +818,7 @@ <widget class="GtkLabel" id="record_hour"> <property name="visible">True</property> <property name="xalign">1</property> - <property name="label" translatable="no">00</property> + <property name="label">00</property> </widget> <packing> <property name="position">0</property> @@ -830,7 +827,7 @@ <child> <widget class="GtkLabel" id="label11132"> <property name="visible">True</property> - <property name="label" translatable="no">:</property> + <property name="label">:</property> </widget> <packing> <property name="expand">False</property> @@ -841,7 +838,7 @@ <child> <widget class="GtkLabel" id="record_minute"> <property name="visible">True</property> - <property name="label" translatable="no">00</property> + <property name="label">00</property> </widget> <packing> <property name="expand">False</property> @@ -852,7 +849,7 @@ <child> <widget class="GtkLabel" id="label11133"> <property name="visible">True</property> - <property name="label" translatable="no">:</property> + <property name="label">:</property> </widget> <packing> <property name="expand">False</property> @@ -864,7 +861,7 @@ <widget class="GtkLabel" id="record_second"> <property name="visible">True</property> <property name="xalign">1</property> - <property name="label" translatable="no">00</property> + <property name="label">00</property> </widget> <packing> <property name="expand">False</property> @@ -1078,7 +1075,6 @@ <child> <widget class="GtkVBox" id="record_vbox"> <property name="visible">True</property> - <property name="orientation">vertical</property> <child> <widget class="GtkHBox" id="hbox30"> <property name="visible">True</property> @@ -1190,7 +1186,6 @@ <child> <widget class="GtkVBox" id="vboxGraphYConfig"> <property name="visible">True</property> - <property name="orientation">vertical</property> <child> <widget class="GtkLabel" id="labelGraphConfig"> <property name="visible">True</property> @@ -1828,7 +1823,6 @@ <child> <widget class="GtkVBox" id="record_graph_vbox"> <property name="visible">True</property> - <property name="orientation">vertical</property> <child> <placeholder/> </child> @@ -1860,12 +1854,90 @@ </packing> </child> <child> - <widget class="GtkVBox" id="map_vbox"> + <widget class="GtkVBox" id="maparea_vbox"> <property name="visible">True</property> - <property name="orientation">vertical</property> <child> - <placeholder/> + <widget class="GtkHBox" id="hbox4"> + <property name="visible">True</property> + <child> + <widget class="GtkButton" id="buttonRedrawMap"> + <property name="label" translatable="yes">Redraw Map</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <signal name="clicked" handler="on_buttonRedrawMap_clicked"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">3</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="labelMapDisplayType"> + <property name="visible">True</property> + <property name="xalign">1</property> + <property name="label" translatable="yes"><small>Display map using:</small></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="padding">5</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> + <child> + <widget class="GtkRadioButton" id="radiobuttonOSM"> + <property name="label" translatable="yes">Open Street Map</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="draw_indicator">True</property> + <property name="group">radiobuttonGMap</property> + <signal name="toggled" handler="on_radiobuttonMap_toggled"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkRadioButton" id="radiobuttonGMap"> + <property name="label" translatable="yes">Google</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_radiobuttonMap_toggled"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> </child> + <child> + <widget class="GtkVBox" id="map_vbox"> + <property name="visible">True</property> + <child> + <placeholder/> + </child> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> </widget> <packing> <property name="position">2</property> @@ -1885,7 +1957,6 @@ <child> <widget class="GtkVBox" id="heartrate_vbox_"> <property name="visible">True</property> - <property name="orientation">vertical</property> <child> <widget class="GtkFrame" id="frame11"> <property name="visible">True</property> @@ -2402,7 +2473,6 @@ <child> <widget class="GtkVBox" id="heartrate_vbox"> <property name="visible">True</property> - <property name="orientation">vertical</property> <child> <placeholder/> </child> @@ -2411,7 +2481,7 @@ <child> <widget class="GtkLabel" id="label-8"> <property name="visible">True</property> - <property name="label" translatable="no">label-2147483648</property> + <property name="label">label-2147483648</property> </widget> <packing> <property name="tab_fill">False</property> @@ -2420,7 +2490,6 @@ </child> <child> <widget class="GtkVBox" id="heartrate_vbox2"> - <property name="orientation">vertical</property> <child> <placeholder/> </child> @@ -2432,7 +2501,7 @@ <child> <widget class="GtkLabel" id="label-9"> <property name="visible">True</property> - <property name="label" translatable="no">label-2147483647</property> + <property name="label">label-2147483647</property> </widget> <packing> <property name="position">1</property> @@ -2476,7 +2545,6 @@ <child> <widget class="GtkVBox" id="dayview"> <property name="visible">True</property> - <property name="orientation">vertical</property> <child> <widget class="GtkFrame" id="frame1"> <property name="visible">True</property> @@ -2555,7 +2623,7 @@ <widget class="GtkLabel" id="day_hour"> <property name="visible">True</property> <property name="xalign">1</property> - <property name="label" translatable="no">00</property> + <property name="label">00</property> </widget> <packing> <property name="fill">False</property> @@ -2565,7 +2633,7 @@ <child> <widget class="GtkLabel" id="label77"> <property name="visible">True</property> - <property name="label" translatable="no">:</property> + <property name="label">:</property> </widget> <packing> <property name="expand">False</property> @@ -2576,7 +2644,7 @@ <child> <widget class="GtkLabel" id="day_minute"> <property name="visible">True</property> - <property name="label" translatable="no">00</property> + <property name="label">00</property> </widget> <packing> <property name="expand">False</property> @@ -2587,7 +2655,7 @@ <child> <widget class="GtkLabel" id="label78"> <property name="visible">True</property> - <property name="label" translatable="no">:</property> + <property name="label">:</property> </widget> <packing> <property name="expand">False</property> @@ -2598,7 +2666,7 @@ <child> <widget class="GtkLabel" id="day_second"> <property name="visible">True</property> - <property name="label" translatable="no">00</property> + <property name="label">00</property> </widget> <packing> <property name="expand">False</property> @@ -3002,7 +3070,6 @@ <child> <widget class="GtkVBox" id="day_vbox"> <property name="visible">True</property> - <property name="orientation">vertical</property> <child> <widget class="GtkHBox" id="hbox41"> <property name="visible">True</property> @@ -3089,7 +3156,6 @@ <child> <widget class="GtkVBox" id="weekview"> <property name="visible">True</property> - <property name="orientation">vertical</property> <child> <widget class="GtkFrame" id="frame4"> <property name="visible">True</property> @@ -3168,7 +3234,7 @@ <widget class="GtkLabel" id="weeka_hour"> <property name="visible">True</property> <property name="xalign">1</property> - <property name="label" translatable="no">000</property> + <property name="label">000</property> </widget> <packing> <property name="fill">False</property> @@ -3178,7 +3244,7 @@ <child> <widget class="GtkLabel" id="label108"> <property name="visible">True</property> - <property name="label" translatable="no">:</property> + <property name="label">:</property> </widget> <packing> <property name="expand">False</property> @@ -3189,7 +3255,7 @@ <child> <widget class="GtkLabel" id="weeka_minute"> <property name="visible">True</property> - <property name="label" translatable="no">00</property> + <property name="label">00</property> </widget> <packing> <property name="expand">False</property> @@ -3200,7 +3266,7 @@ <child> <widget class="GtkLabel" id="label109"> <property name="visible">True</property> - <property name="label" translatable="no">:</property> + <property name="label">:</property> </widget> <packing> <property name="expand">False</property> @@ -3211,7 +3277,7 @@ <child> <widget class="GtkLabel" id="weeka_second"> <property name="visible">True</property> - <property name="label" translatable="no">00</property> + <property name="label">00</property> </widget> <packing> <property name="expand">False</property> @@ -3370,7 +3436,7 @@ <widget class="GtkLabel" id="label110"> <property name="visible">True</property> <property name="xalign">0</property> - <property name="label" translatable="no"> </property> + <property name="label"> </property> </widget> <packing> <property name="left_attach">2</property> @@ -3616,7 +3682,6 @@ <child> <widget class="GtkVBox" id="week_vbox"> <property name="visible">True</property> - <property name="orientation">vertical</property> <child> <widget class="GtkHBox" id="hbox19"> <property name="visible">True</property> @@ -3714,7 +3779,6 @@ <child> <widget class="GtkVBox" id="monthview"> <property name="visible">True</property> - <property name="orientation">vertical</property> <child> <widget class="GtkFrame" id="frame2"> <property name="visible">True</property> @@ -3793,7 +3857,7 @@ <widget class="GtkLabel" id="montha_hour"> <property name="visible">True</property> <property name="xalign">1</property> - <property name="label" translatable="no">000</property> + <property name="label">000</property> </widget> <packing> <property name="fill">False</property> @@ -3803,7 +3867,7 @@ <child> <widget class="GtkLabel" id="label5"> <property name="visible">True</property> - <property name="label" translatable="no">:</property> + <property name="label">:</property> </widget> <packing> <property name="expand">False</property> @@ -3814,7 +3878,7 @@ <child> <widget class="GtkLabel" id="montha_minute"> <property name="visible">True</property> - <property name="label" translatable="no">00</property> + <property name="label">00</property> </widget> <packing> <property name="expand">False</property> @@ -3825,7 +3889,7 @@ <child> <widget class="GtkLabel" id="label6"> <property name="visible">True</property> - <property name="label" translatable="no">:</property> + <property name="label">:</property> </widget> <packing> <property name="expand">False</property> @@ -3836,7 +3900,7 @@ <child> <widget class="GtkLabel" id="montha_second"> <property name="visible">True</property> - <property name="label" translatable="no">00</property> + <property name="label">00</property> </widget> <packing> <property name="expand">False</property> @@ -3995,7 +4059,7 @@ <widget class="GtkLabel" id="label10"> <property name="visible">True</property> <property name="xalign">0</property> - <property name="label" translatable="no"> </property> + <property name="label"> </property> </widget> <packing> <property name="left_attach">2</property> @@ -4008,7 +4072,6 @@ <property name="visible">True</property> <property name="xalign">0</property> <property name="label" translatable="yes"><b>Beats avg:</b></property> - <property name="use_markup">True</property> </widget> <packing> @@ -4242,7 +4305,6 @@ <child> <widget class="GtkVBox" id="month_vbox"> <property name="visible">True</property> - <property name="orientation">vertical</property> <child> <widget class="GtkHBox" id="hbox3"> <property name="visible">True</property> @@ -4339,7 +4401,6 @@ <child> <widget class="GtkVBox" id="yearview"> <property name="visible">True</property> - <property name="orientation">vertical</property> <child> <widget class="GtkFrame" id="frame7"> <property name="visible">True</property> @@ -4494,7 +4555,7 @@ <child> <widget class="GtkLabel" id="yeara_hour"> <property name="visible">True</property> - <property name="label" translatable="no">000</property> + <property name="label">000</property> </widget> <packing> <property name="fill">False</property> @@ -4504,7 +4565,7 @@ <child> <widget class="GtkLabel" id="label126"> <property name="visible">True</property> - <property name="label" translatable="no">:</property> + <property name="label">:</property> </widget> <packing> <property name="expand">False</property> @@ -4515,7 +4576,7 @@ <child> <widget class="GtkLabel" id="yeara_minute"> <property name="visible">True</property> - <property name="label" translatable="no">00</property> + <property name="label">00</property> </widget> <packing> <property name="expand">False</property> @@ -4526,7 +4587,7 @@ <child> <widget class="GtkLabel" id="label127"> <property name="visible">True</property> - <property name="label" translatable="no">:</property> + <property name="label">:</property> </widget> <packing> <property name="expand">False</property> @@ -4537,7 +4598,7 @@ <child> <widget class="GtkLabel" id="yeara_second"> <property name="visible">True</property> - <property name="label" translatable="no">00</property> + <property name="label">00</property> </widget> <packing> <property name="expand">False</property> @@ -4866,7 +4927,6 @@ <child> <widget class="GtkVBox" id="year_vbox"> <property name="visible">True</property> - <property name="orientation">vertical</property> <child> <widget class="GtkHBox" id="hbox20"> <property name="visible">True</property> @@ -4964,7 +5024,6 @@ <widget class="GtkVBox" id="equipview"> <property name="visible">True</property> <property name="sensitive">False</property> - <property name="orientation">vertical</property> <child> <placeholder/> </child> @@ -4999,7 +5058,7 @@ <child> <widget class="GtkLabel" id="label154"> <property name="visible">True</property> - <property name="label" translatable="no">label154</property> + <property name="label">label154</property> </widget> <packing> <property name="tab_fill">False</property> @@ -5009,7 +5068,6 @@ <child> <widget class="GtkVBox" id="listarea"> <property name="visible">True</property> - <property name="orientation">vertical</property> <child> <widget class="GtkHBox" id="hbox36"> <property name="height_request">43</property> @@ -5125,7 +5183,7 @@ <child> <widget class="GtkLabel" id="llllll"> <property name="visible">True</property> - <property name="label" translatable="no">label155</property> + <property name="label">label155</property> </widget> <packing> <property name="position">1</property> @@ -5136,7 +5194,6 @@ <child> <widget class="GtkVBox" id="waypointarea"> <property name="visible">True</property> - <property name="orientation">vertical</property> <child> <widget class="GtkFrame" id="frame10"> <property name="visible">True</property> @@ -5409,7 +5466,7 @@ <child> <widget class="GtkLabel" id="label-46"> <property name="visible">True</property> - <property name="label" translatable="no">label-2147483648</property> + <property name="label">label-2147483648</property> </widget> <packing> <property name="position">2</property> @@ -5437,7 +5494,7 @@ <child> <widget class="GtkLabel" id="label14"> <property name="visible">True</property> - <property name="label" translatable="no">label162</property> + <property name="label">label162</property> </widget> <packing> <property name="tab_fill">False</property> @@ -5447,7 +5504,6 @@ <child> <widget class="GtkVBox" id="maparea"> <property name="visible">True</property> - <property name="orientation">vertical</property> <child> <widget class="GtkHBox" id="hbox31"> <property name="visible">True</property> @@ -5497,7 +5553,6 @@ <child> <widget class="GtkVBox" id="map_vbox_old"> <property name="visible">True</property> - <property name="orientation">vertical</property> <child> <placeholder/> </child> @@ -5524,7 +5579,7 @@ <child> <widget class="GtkLabel" id="label163"> <property name="visible">True</property> - <property name="label" translatable="no">label163</property> + <property name="label">label163</property> </widget> <packing> <property name="position">1</property> Modified: pytrainer/trunk/pytrainer/extensions/googlemaps.py =================================================================== --- pytrainer/trunk/pytrainer/extensions/googlemaps.py 2010-05-06 09:44:19 UTC (rev 576) +++ pytrainer/trunk/pytrainer/extensions/googlemaps.py 2010-05-15 06:05:28 UTC (rev 577) @@ -216,7 +216,7 @@ except: #Error processing lap lat or lon #dont show this lap - print "Error processing lap "+ str(lapNumber) + " id: " + str(lap[0]) + " (lat,lon) ( " + str(lap[6]) + "," +str (lap[7]) + ")" + logging.debug( "Error processing lap "+ str(lapNumber) + " id: " + str(lap[0]) + " (lat,lon) ( " + str(lap[6]) + "," +str (lap[7]) + ")" ) content += ''' Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2010-05-06 09:44:19 UTC (rev 576) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-05-15 06:05:28 UTC (rev 577) @@ -83,6 +83,10 @@ #Disable import menu item unless specified on startup self.set_unified_import(self.testimport) + + #Set correct map viewer + #self.radiobuttonOSM.set_active(0) + self.radiobuttonGMap.set_active(1) def set_unified_import(self, status=False): self.menu_importdata.set_sensitive(status) @@ -392,9 +396,19 @@ def actualize_map(self,id_record, full_screen=False): logging.debug(">>") + #Check which type of map viewer to use + if self.radiobuttonOSM.get_active(): + map_view = "OSM" + elif self.radiobuttonGMap.get_active(): + map_view = "GMAP" + else: + map_view = "GMAP" + print map_view + if full_screen: self.googlemaps_old.drawMap(id_record) else: + self.googlemaps.drawMap(id_record) logging.debug("<<") @@ -820,6 +834,17 @@ ## Lista de eventos ## ###################### + def on_buttonRedrawMap_clicked(self, widget): + print 'on_buttonRedrawMap_clicked' + self.parent.refreshMapView() + + def on_radiobuttonMap_toggled(self, widget): + #Ignore the deselected toggle event + if widget.get_active() == False: + return + logging.debug( 'on_radiobuttonMap_toggled '+ widget.get_name()+ ' activated') + self.parent.refreshMapView() + def on_hpaned1_move_handle(self, widget): print "Handler" print widget Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-05-06 09:44:19 UTC (rev 576) +++ pytrainer/trunk/pytrainer/main.py 2010-05-15 06:05:28 UTC (rev 577) @@ -59,7 +59,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#573" + self.version ="1.7.2_svn#577" self.DB_version = 3 #Process command line options self.startup_options = self.get_options() @@ -78,7 +78,7 @@ self.prf_us_system = True else: self.prf_us_system = False - self.ddbb = DDBB(self.profile) #TODO set this up so other modules can reference this and not have to duplicate this + self.ddbb = DDBB(self.profile) logging.debug('connecting to DDBB') self.ddbb.connect() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-05-06 09:44:25
|
Revision: 576 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=576&view=rev Author: jblance Date: 2010-05-06 09:44:19 +0000 (Thu, 06 May 2010) Log Message: ----------- Change profile to correctly write UTF8 encoding in conf file Modified Paths: -------------- pytrainer/trunk/pytrainer/profile.py Modified: pytrainer/trunk/pytrainer/profile.py =================================================================== --- pytrainer/trunk/pytrainer/profile.py 2010-05-05 17:06:15 UTC (rev 575) +++ pytrainer/trunk/pytrainer/profile.py 2010-05-06 09:44:19 UTC (rev 576) @@ -198,7 +198,7 @@ self.xml_tree.getroot().set(variable, value.decode('utf-8')) if not delay_write: logging.debug("Writting...") - self.xml_tree.write(self.config_file, xml_declaration=True) + self.xml_tree.write(self.config_file, xml_declaration=True, encoding='UTF-8') logging.debug("<<") def setProfile(self,list_options): @@ -206,7 +206,7 @@ for option, value in list_options.items(): logging.debug("Adding "+option+"|"+value) self.setValue("pytraining",option,value,delay_write=True) - self.xml_tree.write(self.config_file, xml_declaration=True) + self.xml_tree.write(self.config_file, xml_declaration=True, encoding='UTF-8') logging.debug("<<") def getSportList(self): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2010-05-05 17:06:21
|
Revision: 575 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=575&view=rev Author: dgranda Date: 2010-05-05 17:06:15 +0000 (Wed, 05 May 2010) Log Message: ----------- Converting bytes into string to allow extended characters - encoded in utf-8 - to be written to xml file Modified Paths: -------------- pytrainer/trunk/pytrainer/profile.py Modified: pytrainer/trunk/pytrainer/profile.py =================================================================== --- pytrainer/trunk/pytrainer/profile.py 2010-05-02 10:20:25 UTC (rev 574) +++ pytrainer/trunk/pytrainer/profile.py 2010-05-05 17:06:15 UTC (rev 575) @@ -153,7 +153,7 @@ else: logging.debug("Attempting to parse content from "+ config_file) try: - parser = etree.XMLParser(encoding='UTF8') + 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 @@ -195,7 +195,7 @@ if tag != "pytraining": print "ERROR - pytraining is the only profile tag supported" logging.debug("Setting %s to %s" % (variable, value)) - self.xml_tree.getroot().set(variable, value) + self.xml_tree.getroot().set(variable, value.decode('utf-8')) if not delay_write: logging.debug("Writting...") self.xml_tree.write(self.config_file, xml_declaration=True) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-05-02 10:20:32
|
Revision: 574 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=574&view=rev Author: jblance Date: 2010-05-02 10:20:25 +0000 (Sun, 02 May 2010) Log Message: ----------- Changes to config file parsing to allow non-ascii chars Modified Paths: -------------- pytrainer/trunk/pytrainer/profile.py Modified: pytrainer/trunk/pytrainer/profile.py =================================================================== --- pytrainer/trunk/pytrainer/profile.py 2010-05-01 08:49:28 UTC (rev 573) +++ pytrainer/trunk/pytrainer/profile.py 2010-05-02 10:20:25 UTC (rev 574) @@ -153,7 +153,8 @@ else: logging.debug("Attempting to parse content from "+ config_file) try: - self.xml_tree = etree.ElementTree(file=config_file) + parser = etree.XMLParser(encoding='UTF8') + 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: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2010-05-01 08:49:34
|
Revision: 573 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=573&view=rev Author: dgranda Date: 2010-05-01 08:49:28 +0000 (Sat, 01 May 2010) Log Message: ----------- Restoring quit handler in glade files and making some labels non translatable Modified Paths: -------------- pytrainer/trunk/glade/profile.glade pytrainer/trunk/glade/pytrainer.glade pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/glade/profile.glade =================================================================== --- pytrainer/trunk/glade/profile.glade 2010-04-30 13:56:48 UTC (rev 572) +++ pytrainer/trunk/glade/profile.glade 2010-05-01 08:49:28 UTC (rev 573) @@ -6,6 +6,7 @@ <property name="visible">True</property> <property name="title" translatable="yes">Preferences</property> <property name="icon">logo_mini.png</property> + <signal name="destroy" handler="quit"/> <child> <widget class="GtkVBox" id="vbox4"> <property name="visible">True</property> @@ -173,7 +174,7 @@ <child> <widget class="GtkComboBoxEntry" id="prf_ddbb"> <property name="visible">True</property> - <property name="items" translatable="yes"></property> + <property name="items" translatable="no"></property> <signal name="changed" handler="on_prf_ddbb_changed"/> </widget> <packing> @@ -403,7 +404,7 @@ <child> <widget class="GtkComboBoxEntry" id="prf_gender"> <property name="visible">True</property> - <property name="items" translatable="yes"></property> + <property name="items" translatable="no"></property> </widget> <packing> <property name="left_attach">1</property> @@ -1037,7 +1038,7 @@ </child> <child> <widget class="GtkLabel" id="sportnamedel"> - <property name="label" translatable="yes">label-2147483648</property> + <property name="label" translatable="no">label-2147483648</property> </widget> <packing> <property name="expand">False</property> @@ -1661,7 +1662,7 @@ </child> <child> <widget class="GtkCheckButton" id="checkbuttonValidate"> - <property name="label" translatable="yes">--valid</property> + <property name="label" translatable="no">--valid</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> @@ -1707,7 +1708,7 @@ </child> <child> <widget class="GtkCheckButton" id="checkbuttonCheck"> - <property name="label" translatable="yes">--check</property> + <property name="label" translatable="no">--check</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> @@ -1753,7 +1754,7 @@ </child> <child> <widget class="GtkCheckButton" id="checkbuttonGM3"> - <property name="label" translatable="yes">--gmaps2*</property> + <property name="label" translatable="no">--gmaps2*</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> @@ -1800,7 +1801,7 @@ </child> <child> <widget class="GtkCheckButton" id="checkbuttonUnifiedImport"> - <property name="label" translatable="yes">--testimport</property> + <property name="label" translatable="no">--testimport</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> @@ -1846,7 +1847,7 @@ </child> <child> <widget class="GtkCheckButton" id="checkbuttonEquip"> - <property name="label" translatable="yes">--equip</property> + <property name="label" translatable="no">--equip</property> <property name="visible">True</property> <property name="sensitive">False</property> <property name="can_focus">False</property> Modified: pytrainer/trunk/glade/pytrainer.glade =================================================================== --- pytrainer/trunk/glade/pytrainer.glade 2010-04-30 13:56:48 UTC (rev 572) +++ pytrainer/trunk/glade/pytrainer.glade 2010-05-01 08:49:28 UTC (rev 573) @@ -6,6 +6,7 @@ <property name="visible">True</property> <property name="title" translatable="no">window1</property> <property name="icon">logo_mini.png</property> + <signal name="destroy" handler="quit"/> <child> <widget class="GtkNotebook" id="notebook7"> <property name="visible">True</property> Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-04-30 13:56:48 UTC (rev 572) +++ pytrainer/trunk/pytrainer/main.py 2010-05-01 08:49:28 UTC (rev 573) @@ -59,7 +59,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#571" + self.version ="1.7.2_svn#573" 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-04-30 13:56:54
|
Revision: 572 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=572&view=rev Author: dgranda Date: 2010-04-30 13:56:48 +0000 (Fri, 30 Apr 2010) Log Message: ----------- Adding empty equipment tab and making some labels not elegible for localization purposes Modified Paths: -------------- pytrainer/trunk/glade/pytrainer.glade Modified: pytrainer/trunk/glade/pytrainer.glade =================================================================== --- pytrainer/trunk/glade/pytrainer.glade 2010-04-30 08:52:15 UTC (rev 571) +++ pytrainer/trunk/glade/pytrainer.glade 2010-04-30 13:56:48 UTC (rev 572) @@ -4,9 +4,8 @@ <!-- interface-naming-policy toplevel-contextual --> <widget class="GtkWindow" id="window1"> <property name="visible">True</property> - <property name="title" translatable="yes">window1</property> + <property name="title" translatable="no">window1</property> <property name="icon">logo_mini.png</property> - <signal name="destroy" handler="quit"/> <child> <widget class="GtkNotebook" id="notebook7"> <property name="visible">True</property> @@ -490,7 +489,7 @@ <property name="visible">True</property> <property name="xalign">0</property> <property name="xpad">5</property> - <property name="label" translatable="yes">km/h</property> + <property name="label" translatable="no">km/h</property> </widget> <packing> <property name="left_attach">5</property> @@ -506,7 +505,7 @@ <property name="visible">True</property> <property name="xalign">0</property> <property name="xpad">5</property> - <property name="label" translatable="yes">min/km</property> + <property name="label" translatable="no">min/km</property> </widget> <packing> <property name="left_attach">5</property> @@ -522,7 +521,7 @@ <property name="visible">True</property> <property name="xalign">0</property> <property name="xpad">5</property> - <property name="label" translatable="yes">m</property> + <property name="label" translatable="no">m</property> </widget> <packing> <property name="left_attach">5</property> @@ -718,7 +717,7 @@ <property name="visible">True</property> <property name="xalign">0</property> <property name="xpad">5</property> - <property name="label" translatable="yes">min/km</property> + <property name="label" translatable="no">min/km</property> </widget> <packing> <property name="left_attach">2</property> @@ -749,7 +748,7 @@ <property name="visible">True</property> <property name="xalign">0</property> <property name="xpad">5</property> - <property name="label" translatable="yes">m</property> + <property name="label" translatable="no">m</property> </widget> <packing> <property name="left_attach">2</property> @@ -821,7 +820,7 @@ <widget class="GtkLabel" id="record_hour"> <property name="visible">True</property> <property name="xalign">1</property> - <property name="label" translatable="yes">00</property> + <property name="label" translatable="no">00</property> </widget> <packing> <property name="position">0</property> @@ -830,7 +829,7 @@ <child> <widget class="GtkLabel" id="label11132"> <property name="visible">True</property> - <property name="label" translatable="yes">:</property> + <property name="label" translatable="no">:</property> </widget> <packing> <property name="expand">False</property> @@ -841,7 +840,7 @@ <child> <widget class="GtkLabel" id="record_minute"> <property name="visible">True</property> - <property name="label" translatable="yes">00</property> + <property name="label" translatable="no">00</property> </widget> <packing> <property name="expand">False</property> @@ -852,7 +851,7 @@ <child> <widget class="GtkLabel" id="label11133"> <property name="visible">True</property> - <property name="label" translatable="yes">:</property> + <property name="label" translatable="no">:</property> </widget> <packing> <property name="expand">False</property> @@ -864,7 +863,7 @@ <widget class="GtkLabel" id="record_second"> <property name="visible">True</property> <property name="xalign">1</property> - <property name="label" translatable="yes">00</property> + <property name="label" translatable="no">00</property> </widget> <packing> <property name="expand">False</property> @@ -1571,15 +1570,6 @@ </packing> </child> <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> <widget class="GtkLabel" id="labelY2LineSmoothing"> <property name="visible">True</property> <property name="sensitive">False</property> @@ -1611,6 +1601,15 @@ <property name="y_options">GTK_SHRINK</property> </packing> </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> </widget> </child> </widget> @@ -1751,12 +1750,6 @@ </packing> </child> <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> <widget class="GtkLabel" id="labelXAxisTime"> <property name="visible">True</property> <property name="xalign">1</property> @@ -1785,6 +1778,12 @@ <property name="x_options">GTK_EXPAND</property> </packing> </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> </widget> </child> </widget> @@ -2411,7 +2410,7 @@ <child> <widget class="GtkLabel" id="label-8"> <property name="visible">True</property> - <property name="label" translatable="yes">label-2147483648</property> + <property name="label" translatable="no">label-2147483648</property> </widget> <packing> <property name="tab_fill">False</property> @@ -2432,7 +2431,7 @@ <child> <widget class="GtkLabel" id="label-9"> <property name="visible">True</property> - <property name="label" translatable="yes">label-2147483647</property> + <property name="label" translatable="no">label-2147483647</property> </widget> <packing> <property name="position">1</property> @@ -2555,7 +2554,7 @@ <widget class="GtkLabel" id="day_hour"> <property name="visible">True</property> <property name="xalign">1</property> - <property name="label" translatable="yes">00</property> + <property name="label" translatable="no">00</property> </widget> <packing> <property name="fill">False</property> @@ -2565,7 +2564,7 @@ <child> <widget class="GtkLabel" id="label77"> <property name="visible">True</property> - <property name="label" translatable="yes">:</property> + <property name="label" translatable="no">:</property> </widget> <packing> <property name="expand">False</property> @@ -2576,7 +2575,7 @@ <child> <widget class="GtkLabel" id="day_minute"> <property name="visible">True</property> - <property name="label" translatable="yes">00</property> + <property name="label" translatable="no">00</property> </widget> <packing> <property name="expand">False</property> @@ -2587,7 +2586,7 @@ <child> <widget class="GtkLabel" id="label78"> <property name="visible">True</property> - <property name="label" translatable="yes">:</property> + <property name="label" translatable="no">:</property> </widget> <packing> <property name="expand">False</property> @@ -2598,7 +2597,7 @@ <child> <widget class="GtkLabel" id="day_second"> <property name="visible">True</property> - <property name="label" translatable="yes">00</property> + <property name="label" translatable="no">00</property> </widget> <packing> <property name="expand">False</property> @@ -3168,7 +3167,7 @@ <widget class="GtkLabel" id="weeka_hour"> <property name="visible">True</property> <property name="xalign">1</property> - <property name="label" translatable="yes">000</property> + <property name="label" translatable="no">000</property> </widget> <packing> <property name="fill">False</property> @@ -3178,7 +3177,7 @@ <child> <widget class="GtkLabel" id="label108"> <property name="visible">True</property> - <property name="label" translatable="yes">:</property> + <property name="label" translatable="no">:</property> </widget> <packing> <property name="expand">False</property> @@ -3189,7 +3188,7 @@ <child> <widget class="GtkLabel" id="weeka_minute"> <property name="visible">True</property> - <property name="label" translatable="yes">00</property> + <property name="label" translatable="no">00</property> </widget> <packing> <property name="expand">False</property> @@ -3200,7 +3199,7 @@ <child> <widget class="GtkLabel" id="label109"> <property name="visible">True</property> - <property name="label" translatable="yes">:</property> + <property name="label" translatable="no">:</property> </widget> <packing> <property name="expand">False</property> @@ -3211,7 +3210,7 @@ <child> <widget class="GtkLabel" id="weeka_second"> <property name="visible">True</property> - <property name="label" translatable="yes">00</property> + <property name="label" translatable="no">00</property> </widget> <packing> <property name="expand">False</property> @@ -3370,7 +3369,7 @@ <widget class="GtkLabel" id="label110"> <property name="visible">True</property> <property name="xalign">0</property> - <property name="label" translatable="yes"> </property> + <property name="label" translatable="no"> </property> </widget> <packing> <property name="left_attach">2</property> @@ -3793,7 +3792,7 @@ <widget class="GtkLabel" id="montha_hour"> <property name="visible">True</property> <property name="xalign">1</property> - <property name="label" translatable="yes">000</property> + <property name="label" translatable="no">000</property> </widget> <packing> <property name="fill">False</property> @@ -3803,7 +3802,7 @@ <child> <widget class="GtkLabel" id="label5"> <property name="visible">True</property> - <property name="label" translatable="yes">:</property> + <property name="label" translatable="no">:</property> </widget> <packing> <property name="expand">False</property> @@ -3814,7 +3813,7 @@ <child> <widget class="GtkLabel" id="montha_minute"> <property name="visible">True</property> - <property name="label" translatable="yes">00</property> + <property name="label" translatable="no">00</property> </widget> <packing> <property name="expand">False</property> @@ -3825,7 +3824,7 @@ <child> <widget class="GtkLabel" id="label6"> <property name="visible">True</property> - <property name="label" translatable="yes">:</property> + <property name="label" translatable="no">:</property> </widget> <packing> <property name="expand">False</property> @@ -3836,7 +3835,7 @@ <child> <widget class="GtkLabel" id="montha_second"> <property name="visible">True</property> - <property name="label" translatable="yes">00</property> + <property name="label" translatable="no">00</property> </widget> <packing> <property name="expand">False</property> @@ -3995,7 +3994,7 @@ <widget class="GtkLabel" id="label10"> <property name="visible">True</property> <property name="xalign">0</property> - <property name="label" translatable="yes"> </property> + <property name="label" translatable="no"> </property> </widget> <packing> <property name="left_attach">2</property> @@ -4008,6 +4007,7 @@ <property name="visible">True</property> <property name="xalign">0</property> <property name="label" translatable="yes"><b>Beats avg:</b></property> + <property name="use_markup">True</property> </widget> <packing> @@ -4493,7 +4493,7 @@ <child> <widget class="GtkLabel" id="yeara_hour"> <property name="visible">True</property> - <property name="label" translatable="yes">000</property> + <property name="label" translatable="no">000</property> </widget> <packing> <property name="fill">False</property> @@ -4503,7 +4503,7 @@ <child> <widget class="GtkLabel" id="label126"> <property name="visible">True</property> - <property name="label" translatable="yes">:</property> + <property name="label" translatable="no">:</property> </widget> <packing> <property name="expand">False</property> @@ -4514,7 +4514,7 @@ <child> <widget class="GtkLabel" id="yeara_minute"> <property name="visible">True</property> - <property name="label" translatable="yes">00</property> + <property name="label" translatable="no">00</property> </widget> <packing> <property name="expand">False</property> @@ -4525,7 +4525,7 @@ <child> <widget class="GtkLabel" id="label127"> <property name="visible">True</property> - <property name="label" translatable="yes">:</property> + <property name="label" translatable="no">:</property> </widget> <packing> <property name="expand">False</property> @@ -4536,7 +4536,7 @@ <child> <widget class="GtkLabel" id="yeara_second"> <property name="visible">True</property> - <property name="label" translatable="yes">00</property> + <property name="label" translatable="no">00</property> </widget> <packing> <property name="expand">False</property> @@ -4959,6 +4959,30 @@ <property name="type">tab</property> </packing> </child> + <child> + <widget class="GtkVBox" id="equipview"> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="orientation">vertical</property> + <child> + <placeholder/> + </child> + </widget> + <packing> + <property name="position">5</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label15"> + <property name="sensitive">False</property> + <property name="label" translatable="yes">Equipment</property> + </widget> + <packing> + <property name="position">5</property> + <property name="tab_fill">False</property> + <property name="type">tab</property> + </packing> + </child> </widget> <packing> <property name="position">1</property> @@ -4974,7 +4998,7 @@ <child> <widget class="GtkLabel" id="label154"> <property name="visible">True</property> - <property name="label" translatable="yes">label154</property> + <property name="label" translatable="no">label154</property> </widget> <packing> <property name="tab_fill">False</property> @@ -5100,7 +5124,7 @@ <child> <widget class="GtkLabel" id="llllll"> <property name="visible">True</property> - <property name="label" translatable="yes">label155</property> + <property name="label" translatable="no">label155</property> </widget> <packing> <property name="position">1</property> @@ -5384,7 +5408,7 @@ <child> <widget class="GtkLabel" id="label-46"> <property name="visible">True</property> - <property name="label" translatable="yes">label-2147483648</property> + <property name="label" translatable="no">label-2147483648</property> </widget> <packing> <property name="position">2</property> @@ -5412,7 +5436,7 @@ <child> <widget class="GtkLabel" id="label14"> <property name="visible">True</property> - <property name="label" translatable="yes">label162</property> + <property name="label" translatable="no">label162</property> </widget> <packing> <property name="tab_fill">False</property> @@ -5499,7 +5523,7 @@ <child> <widget class="GtkLabel" id="label163"> <property name="visible">True</property> - <property name="label" translatable="yes">label163</property> + <property name="label" translatable="no">label163</property> </widget> <packing> <property name="position">1</property> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2010-04-30 08:52:24
|
Revision: 571 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=571&view=rev Author: dgranda Date: 2010-04-30 08:52:15 +0000 (Fri, 30 Apr 2010) Log Message: ----------- Start building interface to enable equipment handling Modified Paths: -------------- pytrainer/trunk/glade/profile.glade pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/glade/profile.glade =================================================================== --- pytrainer/trunk/glade/profile.glade 2010-04-17 14:02:34 UTC (rev 570) +++ pytrainer/trunk/glade/profile.glade 2010-04-30 08:52:15 UTC (rev 571) @@ -6,7 +6,6 @@ <property name="visible">True</property> <property name="title" translatable="yes">Preferences</property> <property name="icon">logo_mini.png</property> - <signal name="destroy" handler="gtk_main_quit"/> <child> <widget class="GtkVBox" id="vbox4"> <property name="visible">True</property> @@ -1605,7 +1604,7 @@ <child> <widget class="GtkTable" id="table1"> <property name="visible">True</property> - <property name="n_rows">5</property> + <property name="n_rows">6</property> <property name="n_columns">3</property> <child> <widget class="GtkLabel" id="labelLogLevel"> @@ -1832,6 +1831,51 @@ <property name="bottom_attach">5</property> </packing> </child> + <child> + <widget class="GtkLabel" id="labelEquip"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="xpad">5</property> + <property name="ypad">5</property> + <property name="label" translatable="yes">Equipment handling</property> + </widget> + <packing> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + </packing> + </child> + <child> + <widget class="GtkCheckButton" id="checkbuttonEquip"> + <property name="label" translatable="yes">--equip</property> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can_focus">False</property> + <property name="receives_default">False</property> + <property name="draw_indicator">True</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + <property name="x_padding">10</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="labelEquipDescription"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="xpad">5</property> + <property name="label" translatable="yes"><small>Want to track equipment?</small></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + </packing> + </child> </widget> </child> </widget> Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-04-17 14:02:34 UTC (rev 570) +++ pytrainer/trunk/pytrainer/main.py 2010-04-30 08:52:15 UTC (rev 571) @@ -59,7 +59,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#569" + self.version ="1.7.2_svn#571" self.DB_version = 3 #Process command line options self.startup_options = self.get_options() @@ -124,7 +124,7 @@ 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.set_defaults(log_level=logging.ERROR, validate=False, gm3=True, testimport=False, equip=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") @@ -132,6 +132,7 @@ 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") + parser.add_option("--equip", action="store_false", dest="equip", help="EXPERIMENTAL: enable equipment management") (options, args) = parser.parse_args() return options This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2010-04-17 14:02:42
|
Revision: 570 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=570&view=rev Author: dgranda Date: 2010-04-17 14:02:34 +0000 (Sat, 17 Apr 2010) Log Message: ----------- French localization update on behalf of Pierre Modified Paths: -------------- pytrainer/trunk/locale/fr/LC_MESSAGES/pytrainer.mo pytrainer/trunk/locale/fr/LC_MESSAGES/pytrainer_fr.po Modified: pytrainer/trunk/locale/fr/LC_MESSAGES/pytrainer.mo =================================================================== (Binary files differ) Modified: pytrainer/trunk/locale/fr/LC_MESSAGES/pytrainer_fr.po =================================================================== --- pytrainer/trunk/locale/fr/LC_MESSAGES/pytrainer_fr.po 2010-04-16 10:57:20 UTC (rev 569) +++ pytrainer/trunk/locale/fr/LC_MESSAGES/pytrainer_fr.po 2010-04-17 14:02:34 UTC (rev 570) @@ -9,8 +9,8 @@ msgstr "" "Project-Id-Version: pytrainer_fr\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-01-23 11:17+0100\n" -"PO-Revision-Date: 2010-01-23 11:21+0100\n" +"POT-Creation-Date: 2010-04-12 08:56+0200\n" +"PO-Revision-Date: 2010-04-12 08:57+0100\n" "Last-Translator: Pierre Gaigé <pg...@fr...>\n" "Language-Team: <fr...@li...>\n" "MIME-Version: 1.0\n" @@ -21,1021 +21,1301 @@ "X-Poedit-Language: French\n" "X-Poedit-Country: FRANCE\n" -#: glade/pytrainer.glade.h:1 -#: glade/newrecord.glade.h:1 -msgid " " -msgstr " " +#: glade/calendar.glade:7 +msgid "Calendar" +msgstr "Calendrier" -#: glade/pytrainer.glade.h:2 -msgid " <b>Date:</b>" -msgstr " <b>Date:</b>" +#: glade/extensions.glade:9 +#: glade/pytrainer.glade:162 +msgid "Extensions" +msgstr "Extensions" -#: glade/pytrainer.glade.h:3 -msgid " <b>Heart Rate:</b>" -msgstr " <b>Fréquence Cardiaque:</b>" +#: glade/extensions.glade:54 +msgid "<b>Extension Details</b>" +msgstr "<b>Détail des Extensions</b>" -#: glade/pytrainer.glade.h:4 -msgid " <b>Month:</b>" -msgstr " <b>Mois:</b>" +#: glade/extensions.glade:67 +msgid "name-entry" +msgstr "" -#: glade/pytrainer.glade.h:5 -msgid " <b>Title:</b>" -msgstr " <b>Titre:</b>" +#: glade/extensions.glade:82 +#: glade/plugins.glade:144 +#: glade/profile.glade:744 +msgid "Name:" +msgstr "Nom:" -#: glade/pytrainer.glade.h:6 -msgid " <b>Week:</b>" -msgstr "<b>Semaine:</b>" +#: glade/extensions.glade:96 +#: glade/plugins.glade:115 +msgid "Status:" +msgstr "Statut:" -#: glade/pytrainer.glade.h:7 -msgid " <b>Year:</b>" -msgstr " <b>Année:</b>" +#: glade/extensions.glade:110 +#: glade/plugins.glade:86 +#: glade/pytrainer.glade:4728 +msgid "Description:" +msgstr "Description:" -#: glade/pytrainer.glade.h:8 -msgid " Cal" -msgstr " Cal" +#: glade/extensions.glade:124 +#: glade/plugins.glade:100 +msgid "status-entry" +msgstr "" -#: glade/pytrainer.glade.h:9 -msgid " Name:" -msgstr "Nom:" +#: glade/extensions.glade:139 +#, fuzzy +msgid "description-entry" +msgstr "Description:" -#: glade/pytrainer.glade.h:10 -msgid " _Classic View" -msgstr "_Vue classique" +#: glade/importdata.glade:7 +#: glade/importdata.glade:329 +msgid "Import" +msgstr "Importer" -#: glade/pytrainer.glade.h:11 -msgid " _List View" -msgstr "_Vue en liste" +#: glade/importdata.glade:37 +msgid "" +"Test 1\n" +"Test 2" +msgstr "" -#: glade/pytrainer.glade.h:12 -msgid " _Waypoints Editor" -msgstr "_Vue d'édition des Points de Localisation" +#: glade/importdata.glade:47 +msgid "<b>Select your GPS device</b>" +msgstr "<b>Sélectionnez votre périphérique GPS</b>" -#: glade/pytrainer.glade.h:13 -msgid " bpm" -msgstr " bpm" +#: glade/importdata.glade:65 +msgid "Import from GPS Device is not yet implemented" +msgstr "Import à partir du périphérique GPS pas encore implémenté" -#: glade/pytrainer.glade.h:14 -msgid "00" -msgstr "" +#: glade/importdata.glade:94 +msgid "<b>Tools</b>" +msgstr "<b>Outils:</b>" -#: glade/pytrainer.glade.h:15 -msgid "000" -msgstr "" +#: glade/importdata.glade:113 +msgid "Rescan" +msgstr "Re-scan" -#: glade/pytrainer.glade.h:16 -#: glade/newrecord.glade.h:2 -msgid ":" -msgstr ":" +#: glade/importdata.glade:117 +msgid "Rescan system for available tools" +msgstr "Re-scan le système pour trouver les outils disponibles" -#: glade/pytrainer.glade.h:17 -msgid "<b> Waypoint: </b>" -msgstr "<b> Point de localisation:</b>" +#: glade/importdata.glade:170 +msgid "<b>Import from GPS Device</b>" +msgstr "<b>Importer à partir du périphérique GPS</b>" -#: glade/pytrainer.glade.h:18 -msgid "<b>Ascent:</b>" -msgstr "<b>Dénivelé Pos.:</b>" +#: glade/importdata.glade:225 +msgid "Remove selected files and the associated activities" +msgstr "Supprimer les fichiers et les activités associées" -#: glade/pytrainer.glade.h:19 -msgid "<b>Beats avg:</b>" -msgstr "<b>FC Moy:</b>" +#: glade/importdata.glade:243 +msgid "Add files to import activities from" +msgstr "Ajouter des fichiers pour récupérer les activités" -#: glade/pytrainer.glade.h:20 -msgid "<b>Beats:</b>" -msgstr "<b>FC Moy:</b>" +#: glade/importdata.glade:268 +msgid "<b>Add file(s) to import activities from</b>" +msgstr "<b>Ajouter des fichiers pour récupérer les activités</b>" -#: glade/pytrainer.glade.h:21 -msgid "<b>Calories: </b>" -msgstr "<b>Calories:</b>" +#: glade/importdata.glade:311 +msgid "<b>Select activities to import</b>" +msgstr "<b>Sélectionnez une activité à importer</b>" -#: glade/pytrainer.glade.h:22 -msgid "<b>Calories:</b>" -msgstr "<b>Calories:</b>" +#: glade/importdata.glade:334 +msgid "Import selected activities" +msgstr "Importer les activités selectionnées" -#: glade/pytrainer.glade.h:23 -msgid "<b>Comments:</b>" -msgstr "<b>Commentaires:</b>" +#: glade/importdata.glade:351 +msgid "Close Import dialog" +msgstr "Fermer la fenêtre d'import" -#: glade/pytrainer.glade.h:24 -msgid "<b>Date Time:</b>" -msgstr "<b>Temps:</b>" +#: glade/importdata.glade:391 +msgid "<b>Import from File</b>" +msgstr "<b>Importer à partir d'un fichier</b>" -#: glade/pytrainer.glade.h:25 -msgid "<b>Date:</b>" -msgstr "<b>Date:</b>" +#: glade/importdata.glade:470 +msgid "<b>Plugins</b>" +msgstr "<b>Plugins</b>" -#: glade/pytrainer.glade.h:26 -msgid "<b>Descent:</b>" -msgstr "<b>Dénivelé Nég.:</b>" +#: glade/importdata.glade:499 +msgid "Import from GPS Device" +msgstr "Importer à partir du périphérique GPS" -#: glade/pytrainer.glade.h:27 -msgid "<b>Distance:</b>" -msgstr "<b>Distance:</b>" +#: glade/importdata.glade:518 +msgid "Import from File" +msgstr "Importer à partir d'un fichier" -#: glade/pytrainer.glade.h:28 -msgid "<b>Duration:</b>" -msgstr "<b>Durée:</b>" +#: glade/importdata.glade:533 +msgid "Launch 'File Select' on start" +msgstr "Lancer 'Fichier ouvrir' au démarrage" -#: glade/pytrainer.glade.h:29 -msgid "<b>Extension Details</b>" -msgstr "<b>Détail des Extensions</b>" +#: glade/importdata.glade:538 +msgid "Automatically start the file selection dialog" +msgstr "Démarre automatiquement le sélecteur de fichiers" -#: glade/pytrainer.glade.h:30 -msgid "<b>HR Zone1:</b>" -msgstr "<b>Zone FC1:</b>" +#: glade/importdata.glade:554 +#: glade/plugins.glade:9 +msgid "Plugins" +msgstr "Plugins" -#: glade/pytrainer.glade.h:31 -msgid "<b>HR Zone2:</b>" -msgstr "<b>Zone FC2:</b>" +#: glade/importdata.glade:580 +msgid "<b>Default to Tab</b>" +msgstr "<b>Onglet par défaut</b>" -#: glade/pytrainer.glade.h:32 -msgid "<b>HR Zone3:</b>" -msgstr "<b>Zone FC3:</b>" +#: glade/importdata.glade:603 +msgid "Reset" +msgstr "Réinitialiser" -#: glade/pytrainer.glade.h:33 -msgid "<b>HR Zone4:</b>" -msgstr "<b>Zone FC4:</b>" +#: glade/importdata.glade:619 +msgid "Save" +msgstr "Sauvegarder" -#: glade/pytrainer.glade.h:34 -msgid "<b>HR Zone5:</b>" -msgstr "<b>Zone FC5:</b>" +#: glade/importdata.glade:678 +msgid "<b>Options</b>" +msgstr "<b>Options</b>" -#: glade/pytrainer.glade.h:35 -msgid "<b>HR Zones Method:</b>" -msgstr "<b>Calcul des zones de FC :</b>" +#: glade/newrecord.glade:7 +msgid "New Entry" +msgstr "Nouvelle entrée" -#: glade/pytrainer.glade.h:36 -msgid "<b>Max Beats:</b>" -msgstr "<b>FC Max:</b>" +#: glade/newrecord.glade:63 +msgid "Title:" +msgstr "Titre:" -#: glade/pytrainer.glade.h:37 -msgid "<b>Max Pace:</b>" -msgstr "<b>Cad. Max:</b>" +#: glade/newrecord.glade:87 +msgid "GPX File:" +msgstr "Fichier GPX:" -#: glade/pytrainer.glade.h:38 -msgid "<b>Max Speed:</b>" -msgstr "<b>Vit. Max:</b>" +#: glade/newrecord.glade:131 +msgid "Calculate Values" +msgstr "Calculer les Valeurs" -#: glade/pytrainer.glade.h:39 -msgid "<b>Max Speed</b>" -msgstr "<b>Vit. Max:</b>" +#: glade/newrecord.glade:151 +msgid "Sport:" +msgstr "Sport:" -#: glade/pytrainer.glade.h:40 -msgid "<b>Pace:</b>" -msgstr "<b>Cadence:</b>" +#: glade/newrecord.glade:186 +msgid "<b>Main</b>" +msgstr "<b>Principal:</b>" -#: glade/pytrainer.glade.h:41 -msgid "<b>Plugin Details</b>" -msgstr "<b>Détail du plugin</b>" +#: glade/newrecord.glade:223 +msgid "Distance (Km):" +msgstr "Distance (km):" -#: glade/pytrainer.glade.h:42 -msgid "<b>Speed:</b>" +#: glade/newrecord.glade:232 +#: glade/newrecord.glade:357 +#: glade/newrecord.glade:560 +#: glade/newrecord.glade:698 +#: glade/newrecord.glade:959 +#: glade/profile.glade:1404 +msgid "Calculate" +msgstr "Calculer" + +#: glade/newrecord.glade:250 +msgid "Duration:" +msgstr "Durée" + +#: glade/newrecord.glade:281 +#: glade/newrecord.glade:308 +#: glade/pytrainer.glade:833 +#: glade/pytrainer.glade:855 +#: glade/pytrainer.glade:2038 +#: glade/pytrainer.glade:2060 +#: glade/pytrainer.glade:2651 +#: glade/pytrainer.glade:2673 +#: glade/pytrainer.glade:3276 +#: glade/pytrainer.glade:3298 +#: glade/pytrainer.glade:3976 +#: glade/pytrainer.glade:3998 +msgid ":" +msgstr ":" + +#: glade/newrecord.glade:378 +msgid "Date:" +msgstr "Date:" + +#: glade/newrecord.glade:406 +#: glade/pytrainer.glade:2843 +#: glade/pytrainer.glade:3468 +msgid " " +msgstr " " + +#: glade/newrecord.glade:447 +msgid "Start Time:" +msgstr "Début:" + +#: glade/newrecord.glade:463 +msgid "12:00:00" +msgstr "" + +#: glade/newrecord.glade:488 +#: glade/profile.glade:1442 +msgid "<b>General</b>" +msgstr "<b>Général:</b>" + +#: glade/newrecord.glade:524 +msgid "Max (km/h):" +msgstr "Max (km/h):" + +#: glade/newrecord.glade:549 +msgid "Average (km/h)" +msgstr "Vitesse moy. (km/h)" + +#: glade/newrecord.glade:595 +msgid "<b>Speed</b>" msgstr "<b>Vitesse:</b>" -#: glade/pytrainer.glade.h:43 -msgid "<b>Sport:</b>" -msgstr "<b>Sport:</b>" +#: glade/newrecord.glade:614 +msgid "Quick Entry" +msgstr "Entrée Rapide" -#: glade/pytrainer.glade.h:44 -msgid "<b>Title:</b>" -msgstr "<b>Titre:</b>" +#: glade/newrecord.glade:647 +msgid "Max (min/km):" +msgstr "Max (min/km)" -#: glade/pytrainer.glade.h:45 -msgid "All Sports" -msgstr "Tous les Sports" +#: glade/newrecord.glade:673 +msgid "Pace (min/km):" +msgstr "Cadence (min/km)" -#: glade/pytrainer.glade.h:46 -msgid "Cal" -msgstr "Cal" +#: glade/newrecord.glade:719 +msgid "<b>Pace</b>" +msgstr "<b>Cadence:</b>" -#: glade/pytrainer.glade.h:47 -msgid "Calendar" -msgstr "Calendrier" +#: glade/newrecord.glade:755 +msgid "Ascent:" +msgstr "Dénivelé Pos.:" -#: glade/pytrainer.glade.h:48 -msgid "Columns" -msgstr "Colonnes" +#: glade/newrecord.glade:781 +msgid "Descent:" +msgstr "Dénivelé Nég.:" -#: glade/pytrainer.glade.h:49 -msgid "Day" -msgstr "Jour" +#: glade/newrecord.glade:814 +msgid "<b>Accumulated Altitude Change</b>" +msgstr " <b>Dénivelé Cumulé:</b> " -#: glade/pytrainer.glade.h:50 -msgid "Description:" +#: glade/newrecord.glade:851 +msgid "Max (bpm):" +msgstr "Max (bpm):" + +#: glade/newrecord.glade:863 +msgid "Heart rate:" +msgstr "Fréquence Cardiaque:" + +#: glade/newrecord.glade:903 +#: pytrainer/gui/windowmain.py:755 +#: pytrainer/monthgraph.py:77 +#: pytrainer/weekgraph.py:123 +#: pytrainer/yeargraph.py:78 +msgid "Calories" +msgstr "Calories" + +#: glade/newrecord.glade:932 +msgid "<small><b>Note:</b> In order to calculate the calories you must set the sport MET (in Preferences->Sport) </small>" +msgstr "<small><b>Note:</b> Afin de calculer les calories vous devez renseigner le coefficient M.E.T. pour votre sport (menu Préférences->Sport) </small>" + +#: glade/newrecord.glade:1006 +msgid "<b>Heart Rate</b>" +msgstr "<b>Fréquence Cardiaque:</b>" + +#: glade/newrecord.glade:1028 +msgid "Advanced" +msgstr "Avancé" + +#: glade/newrecord.glade:1080 +msgid "<b>Comments</b>" +msgstr "<b>Commentaires</b>" + +#: glade/newrecord.glade:1095 +msgid "Comments" +msgstr "Commentaires" + +#: glade/plugins.glade:53 +msgid "<b>Plugin Details</b>" +msgstr "<b>Détail du plugin</b>" + +#: glade/plugins.glade:68 +#, fuzzy +msgid "description-entry " msgstr "Description:" -#: glade/pytrainer.glade.h:51 -msgid "" -"Distance\n" -"Time\n" -"Average Heart Rate\n" -"Average Speed\n" -"Calories" +#: glade/plugins.glade:129 +msgid "nameEntry" msgstr "" -"Distance\n" -"Durée\n" -"FC moyenne\n" -"Vitesse moyenne\n" -"Calories" -#: glade/pytrainer.glade.h:56 -msgid "Edit Record" -msgstr "Éditer un enregistrement" +#: glade/profile.glade:7 +msgid "Preferences" +msgstr "Préférences" -#: glade/pytrainer.glade.h:57 -msgid "Extensions" -msgstr "Extensions" +#: glade/profile.glade:43 +msgid "Metric system" +msgstr "Système Métrique" -#: glade/pytrainer.glade.h:58 -msgid "" -"Font\n" -"Restaurant\n" -"Scenic Area\n" -"Summit" -msgstr "" -"Point d'eau\n" -"Restaurant\n" -"Vue Panoramique\n" -"Sommet" +#: glade/profile.glade:57 +msgid "U.S. customary units" +msgstr "Unités U.S." -#: glade/pytrainer.glade.h:62 -msgid "GPS Device Plugins" -msgstr "Plugins pour les Périphériques GPS" +#: glade/profile.glade:79 +msgid "<b>System of Measurement</b>" +msgstr "<b>Système de Mesure</b>" -#: glade/pytrainer.glade.h:63 -msgid "Km" -msgstr "km" +#: glade/profile.glade:115 +msgid "Database type:" +msgstr "Type de Base de Données:" -#: glade/pytrainer.glade.h:64 -msgid "Latitude: " -msgstr "Latitude:" +#: glade/profile.glade:126 +msgid "Database host:" +msgstr "Hôte de la Base de Données:" -#: glade/pytrainer.glade.h:65 -msgid "Longitude:" -msgstr " Longitude:" +#: glade/profile.glade:152 +msgid "Database name:" +msgstr "Nom de la Base de Données:" -#: glade/pytrainer.glade.h:66 -msgid "Month" -msgstr "Mois" +#: glade/profile.glade:191 +msgid "Database user:" +msgstr "Utilisateur de la Base de Données:" -#: glade/pytrainer.glade.h:67 -#: glade/profile.glade.h:38 -msgid "Name:" -msgstr "Nom:" +#: glade/profile.glade:206 +msgid "Database pass:" +msgstr "Mot de passe de la Base de Données:" -#: glade/pytrainer.glade.h:68 -msgid "" -"None\n" -"Distance\n" -"Time\n" -"Average Heart Rate\n" -"Average Speed\n" -"Calories" -msgstr "" -"Null\n" -"Distance\n" -"Durée\n" -"FC moyenne\n" -"Vitesse moyenne\n" -"Calories" +#: glade/profile.glade:257 +msgid "<b>Database</b>" +msgstr "<b>Base de données</b>" -#: glade/pytrainer.glade.h:74 -msgid "" -"None\n" -"Profile\n" -"Speed\n" -"Pace\n" -"Heart Rate\n" -"Cadence\n" -msgstr "" -"Null\n" -"Profil\n" -"Vitesse\n" -"Cadence\n" -"Fréquence Cardiaque\n" -"Rythme\n" +#: glade/profile.glade:293 +msgid "Use this port for internal connections: " +msgstr "Utiliser ce port pour les connexions internes:" -#: glade/pytrainer.glade.h:81 -msgid "Plugins" -msgstr "Plugins" +#: glade/profile.glade:318 +msgid "<small><b>Note:</b> Change this only if you know what you are doing</small>" +msgstr "<small><b>Note:</b> Changez cette valeur uniquement si vous savez ce que vous faites</small>" -#: glade/pytrainer.glade.h:82 -msgid "" -"Profile\n" -"Speed\n" -"Pace\n" -"Heart Rate\n" -"Cadence" -msgstr "" -"Profil\n" -"Vitesse\n" -"Cadence\n" -"Fréquence Cardiaque\n" -"Rythme" +#: glade/profile.glade:336 +msgid "<b>Port Connnection</b>" +msgstr "<b>Port de Connexion:</b>" -#: glade/pytrainer.glade.h:87 -msgid "Record" -msgstr "Enregistrement" +#: glade/profile.glade:355 +msgid "General" +msgstr "Général" -#: glade/pytrainer.glade.h:88 -msgid "Search" -msgstr "Rechercher" +#: glade/profile.glade:384 +msgid "User name:" +msgstr "Nom d'Utilisateur:" -#: glade/pytrainer.glade.h:89 -msgid "Select track record" -msgstr "Sélectionnez un Circuit" +#: glade/profile.glade:395 +msgid "Gender:" +msgstr "Sexe:" -#: glade/pytrainer.glade.h:90 -msgid "Show Laps" -msgstr "Montrer les tours" +#: glade/profile.glade:422 +msgid "Height:" +msgstr "Taille:" -#: glade/pytrainer.glade.h:91 -msgid "Show graph in classic view" -msgstr "Montrer le graphe dans la vue classique" +#: glade/profile.glade:462 +msgid "Date of birth:" +msgstr "Date de Naissance:" -#: glade/pytrainer.glade.h:92 -#: pytrainer/gui/windowprofile.py:69 -#: pytrainer/gui/windowmain.py:63 -#: pytrainer/gui/windowmain.py:66 -#: pytrainer/gui/windowmain.py:715 -#: pytrainer/gui/windowimportdata.py:255 -msgid "Sport" -msgstr "Sport" +#: glade/profile.glade:535 +msgid "Weight:" +msgstr "Poids:" -#: glade/pytrainer.glade.h:93 -msgid "" -"Stage Profile\n" -"Stage Velocity\n" -"Stage Profile/velocity" +#: glade/profile.glade:557 +msgid "<b>Athlete Details</b>" +msgstr "<b>Détail de l'Athlète</b>" + +#: glade/profile.glade:572 +msgid "Athlete" +msgstr "Athlète" + +#: glade/profile.glade:687 +msgid "<b>Sport List</b>" +msgstr "<b>Liste des Sports</b>" + +#: glade/profile.glade:699 +msgid "llist" msgstr "" -"Profil de la sortie\n" -"Vitesse de la sortie\n" -"Profil de la sortie/Vitesse" -#: glade/pytrainer.glade.h:96 -msgid "Status:" -msgstr "Statut:" +#: glade/profile.glade:755 +msgid "M.E.T.:" +msgstr "M.E.T.:" -#: glade/pytrainer.glade.h:97 -msgid "Tools" -msgstr "Outils" +#: glade/profile.glade:782 +msgid "Extra Weight:" +msgstr "Poids Additionnel:" -#: glade/pytrainer.glade.h:98 -msgid "Type:" -msgstr "Type:" +#: glade/profile.glade:818 +#: glade/profile.glade:1171 +msgid "More information on determining yor M.E.T sport coefficient on Wikipedia" +msgstr "Plus d'information pour déterminer le coefficient M.E.T du sport sur Wikipedia" -#: glade/pytrainer.glade.h:99 -msgid "Value" -msgstr "Valeur" +#: glade/profile.glade:900 +msgid "<b>Add New Sport</b>" +msgstr "<b>Ajouter un Sport</b>" -#: glade/pytrainer.glade.h:100 -msgid "Versus" +#: glade/profile.glade:915 +msgid "new" +msgstr "nouveau" + +#: glade/profile.glade:948 +msgid "" +"Deleting a sport removes associated records.\n" +"Continue?" msgstr "" +"Détruire un sport supprime les enregistrements associés.\n" +"Continuer?" -#: glade/pytrainer.glade.h:101 -msgid "Week" -msgstr "Semaine" +#: glade/profile.glade:1030 +msgid "<b>Delete Sport</b>" +msgstr "<b>Supprimer un Sport</b>" -#: glade/pytrainer.glade.h:102 -msgid "Year" -msgstr "Année" +#: glade/profile.glade:1041 +#: glade/pytrainer.glade:1884 +#: glade/pytrainer.glade:4857 +msgid "label-2147483648" +msgstr "label-2147483648" -#: glade/pytrainer.glade.h:103 -msgid "_Edit" -msgstr "_Édition" +#: glade/profile.glade:1062 +msgid "delete" +msgstr "supprimer" -#: glade/pytrainer.glade.h:104 -msgid "_Export as Text Separated by Commas" -msgstr "_Exporter un Fichier Texte séparé par des virgules" +#: glade/profile.glade:1096 +msgid "Name" +msgstr "Nom" -#: glade/pytrainer.glade.h:105 -msgid "_File" -msgstr "_Fichier" +#: glade/profile.glade:1119 +msgid "M.E.T." +msgstr "M.E.T." -#: glade/pytrainer.glade.h:106 -msgid "_Help" -msgstr "_Aide" +#: glade/profile.glade:1146 +#: pytrainer/gui/windowprofile.py:71 +msgid "Extra Weight" +msgstr "Poids Additionnel" -#: glade/pytrainer.glade.h:107 -msgid "_Import" -msgstr "" +#: glade/profile.glade:1252 +msgid "<b>Edit Sport</b>" +msgstr "<b>Éditer un sport</b>" -#: glade/pytrainer.glade.h:108 -msgid "_View" -msgstr "_Vue" +#: glade/profile.glade:1263 +msgid "<b>lalaal</b>" +msgstr "<b>Base de données</b>" -#: glade/pytrainer.glade.h:109 -msgid "bpm" -msgstr "bpm" +#: glade/profile.glade:1285 +msgid "edit" +msgstr "édition" -#: glade/pytrainer.glade.h:110 -#, fuzzy -msgid "description-entry" -msgstr "Description:" +#: glade/profile.glade:1301 +msgid "Sports" +msgstr "Sports" -#: glade/pytrainer.glade.h:111 -#, fuzzy -msgid "description-entry " -msgstr "Description:" +#: glade/profile.glade:1335 +msgid "Maximum heart rate:" +msgstr "Fréquence Cardiaque Maximale:" -#: glade/pytrainer.glade.h:112 -#: pytrainer/gui/windowmain.py:177 -#: pytrainer/gui/windowmain.py:178 -#: pytrainer/gui/windowmain.py:311 -#: pytrainer/gui/windowmain.py:312 -#: pytrainer/gui/windowmain.py:411 -#: pytrainer/gui/windowmain.py:412 -#: pytrainer/gui/windowmain.py:489 -#: pytrainer/gui/windowmain.py:490 -msgid "km/h" -msgstr "km/h" +#: glade/profile.glade:1346 +msgid "Resting heart rate:" +msgstr "Fréquence Cardiaque au Repos:" -#: glade/pytrainer.glade.h:113 -#, fuzzy -msgid "label-2147483647" -msgstr "label-2147483648" +#: glade/profile.glade:1391 +msgid "<small><b>Note:</b> Maximum heart rate is calculated by subtracting the number 220 minus your age. </small>" +msgstr "<small><b>Note:</b> Le calcul de votre fréquence cardiaque maximale est effectué grâce à la formule 220 moins votre âge. </small>" -#: glade/pytrainer.glade.h:114 -#: glade/profile.glade.h:50 -msgid "label-2147483648" -msgstr "label-2147483648" +#: glade/profile.glade:1478 +msgid "<small><b>NOTE:</b> in order to use the Karvonen method you must cover the Resting hr field.</small>" +msgstr "<small><b>Note:</b> Afin d'utiliser la méthode de Karvonen vous devez obligatoirement renseigner le champ «Fréquence Cardiaque au Repos».</small>" -#: glade/pytrainer.glade.h:115 -#: pytrainer/gui/windowmain.py:181 -#: pytrainer/gui/windowmain.py:182 -#: pytrainer/gui/windowmain.py:1022 -#: pytrainer/gui/windowmain.py:1024 -msgid "m" -msgstr "m" +#: glade/profile.glade:1491 +msgid "Percentages based method" +msgstr "Méthode basée sur des pourcentages" -#: glade/pytrainer.glade.h:116 -#: pytrainer/gui/windowmain.py:179 -#: pytrainer/gui/windowmain.py:180 -#: pytrainer/gui/windowmain.py:313 -#: pytrainer/gui/windowmain.py:314 -#: pytrainer/gui/windowmain.py:413 -#: pytrainer/gui/windowmain.py:414 -#: pytrainer/gui/windowmain.py:491 -#: pytrainer/gui/windowmain.py:492 -msgid "min/km" -msgstr "min/km" +#: glade/profile.glade:1507 +#: pytrainer/gui/windowmain.py:308 +msgid "Karvonen method" +msgstr "Méthode de Karvonen" -#: glade/pytrainer.glade.h:117 -msgid "name-entry" -msgstr "" +#: glade/profile.glade:1528 +msgid "Select how to calculate your heart rate zones." +msgstr "Sélectionnez la méthode appropriée pour définir les zones cardiaque." -#: glade/pytrainer.glade.h:118 -msgid "nameEntry" +#: glade/profile.glade:1567 +msgid "<b>Heart Rate Zones</b>" +msgstr "<b>Zones Cardiaque:</b>" + +#: glade/profile.glade:1589 +#: pytrainer/daygraph.py:56 +#: pytrainer/recordgraph.py:120 +#: pytrainer/heartrategraph.py:38 +msgid "Heart Rate" +msgstr "Fréquence Cardiaque" + +#: glade/profile.glade:1616 +msgid "Log Level" +msgstr "Niveau de Log" + +#: glade/profile.glade:1624 +msgid "" +"Error\n" +"Warning\n" +"Info\n" +"Debug" msgstr "" +"Erreur\n" +"Attention\n" +"Info\n" +"Debug" -#: glade/pytrainer.glade.h:119 -msgid "status-entry" +#: glade/profile.glade:1642 +msgid "<small>What level of detail is written to the log?</small>" +msgstr "<small>Niveau de détail du fichier log?</small>" + +#: glade/profile.glade:1656 +msgid "Validate" +msgstr "Valider" + +#: glade/profile.glade:1665 +msgid "--valid" msgstr "" -#: glade/newrecord.glade.h:3 -msgid "<b>Accumulated Altitude Change</b>" -msgstr " <b>Dénivelé Cumulé:</b> " +#: glade/profile.glade:1686 +msgid "<small>Do the plugins attempt to validate the input file before processing?</small>" +msgstr "<small>Le plugin doit-il essayer de valider le fichier d'entrée avant d'effectuer le traitement?</small>" -#: glade/newrecord.glade.h:4 -msgid "<b>Comments</b>" -msgstr "<b>Commentaires</b>" +#: glade/profile.glade:1702 +msgid "Check" +msgstr "Vérifier" -#: glade/newrecord.glade.h:5 -#: glade/profile.glade.h:6 -msgid "<b>General</b>" -msgstr "<b>Général:</b>" +#: glade/profile.glade:1711 +msgid "--check" +msgstr "" -#: glade/newrecord.glade.h:6 -msgid "<b>Heart Rate</b>" -msgstr "<b>Fréquence Cardiaque:</b>" +#: glade/profile.glade:1731 +msgid "<small>Was a configuration and database check requested?</small>" +msgstr "<small>La vérification de la configuration et de la base de données est-elle activée?</small>" -#: glade/newrecord.glade.h:7 -msgid "<b>Main</b>" -msgstr "<b>Principal:</b>" +#: glade/profile.glade:1747 +msgid "Googlemaps v3" +msgstr "" -#: glade/newrecord.glade.h:8 -msgid "<b>Pace</b>" -msgstr "<b>Cadence:</b>" +#: glade/profile.glade:1757 +msgid "--gmaps2*" +msgstr "" -#: glade/newrecord.glade.h:9 -msgid "<b>Velocity</b>" -msgstr "<b>Vitesse</b>" +#: glade/profile.glade:1779 +msgid "<small>Is the Googlemaps API version 3 in use?</small>" +msgstr "<small>Googlemaps utilise t-il l'API version 3?</small>" -#: glade/newrecord.glade.h:10 -msgid "<small><b>Note:</b> In order to calculate the calories you must set the sport MET (in Preferences->Sport) </small>" -msgstr "<small><b>Note:</b> Afin de calculer les calories vous devez renseigner le coefficient M.E.T. pour votre sport (menu Préférences->Sport) </small>" +#: glade/profile.glade:1795 +msgid "Unified Import" +msgstr "Import unifié" -#: glade/newrecord.glade.h:11 -msgid "Advanced" -msgstr "Avancé" +#: glade/profile.glade:1804 +msgid "--testimport" +msgstr "" -#: glade/newrecord.glade.h:12 -msgid "Ascent:" -msgstr "Dénivelé Pos.:" +#: glade/profile.glade:1825 +msgid "<small>Is the Unified Importer active?</small>" +msgstr "<small>L'import unifié est-il activé?</small>" -#: glade/newrecord.glade.h:13 -#: glade/profile.glade.h:16 -msgid "Calculate" -msgstr "Calculer" +#: glade/profile.glade:1850 +msgid "<small>This screen shows the state of command line configurable options for pytrainer. These options can be changed here which will affect the current instance of pytrainer, they will not be remembered next time though</small>" +msgstr "<small>Cet écran montre l'état des options configurables de la ligne de commande de pytrainer. Ces options peuvent être changées ici pour la session en cours, elles ne seront toutefois pas conservées au prochain démarrage.</small>" -#: glade/newrecord.glade.h:14 -msgid "Calculate Values" -msgstr "Calculer les Valeurs" +#: glade/profile.glade:1866 +msgid "<small>* Note Googlemaps API version 3 is on by default, use --gmaps2 to switch it off</small>" +msgstr "<small>* Notez que l'API version 3 de Googlemaps est activée par défaut, utilisez --gmaps2 pour la déactiver</small>" -#: glade/newrecord.glade.h:15 -#: pytrainer/gui/windowmain.py:719 -#: pytrainer/monthgraph.py:77 -#: pytrainer/weekgraph.py:123 -#: pytrainer/yeargraph.py:78 -msgid "Calories" -msgstr "Calories" +#: glade/profile.glade:1882 +msgid "Startup Parameters" +msgstr "Paramètres de démarrage" -#: glade/newrecord.glade.h:16 -msgid "Comments" -msgstr "Commentaires" +#: glade/pytrainer.glade:7 +msgid "window1" +msgstr "fenêtre1" -#: glade/newrecord.glade.h:17 -msgid "Date:" -msgstr "Date:" +#: glade/pytrainer.glade:24 +msgid "_File" +msgstr "_Fichier" -#: glade/newrecord.glade.h:18 -msgid "Descent:" -msgstr "Dénivelé Nég.:" +#: glade/pytrainer.glade:93 +msgid "_Edit" +msgstr "_Édition" -#: glade/newrecord.glade.h:19 -msgid "Distance (Km):" -msgstr "Distance (km):" +#: glade/pytrainer.glade:113 +msgid "_View" +msgstr "_Vue" -#: glade/newrecord.glade.h:20 -msgid "Duration:" -msgstr "Durée" +#: glade/pytrainer.glade:120 +msgid " _Classic View" +msgstr "_Vue classique" -#: glade/newrecord.glade.h:21 -msgid "GPX File:" -msgstr "Fichier GPX:" +#: glade/pytrainer.glade:130 +msgid " _List View" +msgstr "_Vue en liste" -#: glade/newrecord.glade.h:22 -msgid "Heart rate:" -msgstr "Fréquence Cardiaque:" +#: glade/pytrainer.glade:140 +msgid " _Waypoints Editor" +msgstr "_Vue d'édition des Points de Localisation" -#: glade/newrecord.glade.h:23 -msgid "Max (bpm):" -msgstr "Max (bpm):" +#: glade/pytrainer.glade:154 +msgid "Tools" +msgstr "Outils" -#: glade/newrecord.glade.h:24 -msgid "Max (km/h):" -msgstr "Max (km/h):" +#: glade/pytrainer.glade:171 +msgid "GPS Device Plugins" +msgstr "Plugins pour les Périphériques GPS" -#: glade/newrecord.glade.h:25 -msgid "Max (min/km):" -msgstr "Max (min/km)" +#: glade/pytrainer.glade:184 +msgid "_Help" +msgstr "_Aide" -#: glade/newrecord.glade.h:26 -msgid "New Entry" -msgstr "Nouvelle entrée" +#: glade/pytrainer.glade:276 +#: pytrainer/gui/windowprofile.py:71 +#: pytrainer/gui/windowmain.py:65 +#: pytrainer/gui/windowmain.py:68 +#: pytrainer/gui/windowmain.py:751 +#: pytrainer/gui/windowrecord.py:147 +#: pytrainer/gui/windowimportdata.py:333 +msgid "Sport" +msgstr "Sport" -#: glade/newrecord.glade.h:27 -msgid "Pace (min/km):" -msgstr "Cadence (min/km)" +#: glade/pytrainer.glade:288 +msgid "All Sports" +msgstr "Tous les Sports" -#: glade/newrecord.glade.h:28 -msgid "Quick Entry" -msgstr "Entrée Rapide" +#: glade/pytrainer.glade:395 +msgid "<b>Sport:</b>" +msgstr "<b>Sport:</b>" -#: glade/newrecord.glade.h:29 -msgid "Sport:" -msgstr "Sport:" +#: glade/pytrainer.glade:407 +#: glade/pytrainer.glade:2013 +#: glade/pytrainer.glade:2626 +#: glade/pytrainer.glade:3251 +#: glade/pytrainer.glade:3952 +msgid "<b>Duration:</b>" +msgstr "<b>Durée:</b>" -#: glade/newrecord.glade.h:30 -msgid "Start Time:" -msgstr "Début:" +#: glade/pytrainer.glade:422 +#: glade/pytrainer.glade:2103 +#: glade/pytrainer.glade:2705 +#: glade/pytrainer.glade:3330 +#: glade/pytrainer.glade:4054 +msgid "<b>Speed:</b>" +msgstr "<b>Vitesse:</b>" -#: glade/newrecord.glade.h:31 -msgid "Title:" -msgstr "Titre:" +#: glade/pytrainer.glade:436 +#: glade/pytrainer.glade:2271 +#: glade/pytrainer.glade:2900 +#: glade/pytrainer.glade:3525 +#: glade/pytrainer.glade:4149 +msgid "<b>Pace:</b>" +msgstr "<b>Cadence:</b>" -#: glade/newrecord.glade.h:32 -msgid "Velocity (km/h)" -msgstr "Vitesse (km/h)" +#: glade/pytrainer.glade:450 +msgid "<b>Ascent:</b>" +msgstr "<b>Dénivelé Pos.:</b>" -#: glade/importdata.glade.h:1 -msgid "<b>Default to Tab</b>" -msgstr "<b>Onglet par défaut</b>" +#: glade/pytrainer.glade:464 +msgid "<b>Calories:</b>" +msgstr "<b>Calories:</b>" -#: glade/importdata.glade.h:2 -msgid "<b>Import from File</b>" -msgstr "<b>Importer à partir d'un fichier</b>" +#: glade/pytrainer.glade:478 +msgid "<b>Comments:</b>" +msgstr "<b>Commentaires:</b>" -#: glade/importdata.glade.h:3 -msgid "<b>Import from GPS Device</b>" -msgstr "<b>Importer à partir du périphérique GPS</b>" +#: glade/pytrainer.glade:493 +#: glade/pytrainer.glade:890 +#: glade/pytrainer.glade:2133 +#: glade/pytrainer.glade:2166 +#: glade/pytrainer.glade:2735 +#: glade/pytrainer.glade:2828 +#: glade/pytrainer.glade:3360 +#: glade/pytrainer.glade:3453 +#: glade/pytrainer.glade:4084 +#: glade/pytrainer.glade:4100 +#: pytrainer/gui/windowmain.py:192 +#: pytrainer/gui/windowmain.py:193 +#: pytrainer/gui/windowmain.py:328 +#: pytrainer/gui/windowmain.py:329 +#: pytrainer/gui/windowmain.py:432 +#: pytrainer/gui/windowmain.py:433 +#: pytrainer/gui/windowmain.py:510 +#: pytrainer/gui/windowmain.py:511 +msgid "km/h" +msgstr "km/h" -#: glade/importdata.glade.h:4 -msgid "<b>Options</b>" -msgstr "<b>Options</b>" +#: glade/pytrainer.glade:509 +#: glade/pytrainer.glade:721 +#: glade/pytrainer.glade:2286 +#: glade/pytrainer.glade:2318 +#: glade/pytrainer.glade:2931 +#: glade/pytrainer.glade:2947 +#: glade/pytrainer.glade:3556 +#: glade/pytrainer.glade:3572 +#: glade/pytrainer.glade:4181 +#: glade/pytrainer.glade:4197 +#: pytrainer/gui/windowmain.py:194 +#: pytrainer/gui/windowmain.py:195 +#: pytrainer/gui/windowmain.py:330 +#: pytrainer/gui/windowmain.py:331 +#: pytrainer/gui/windowmain.py:434 +#: pytrainer/gui/windowmain.py:435 +#: pytrainer/gui/windowmain.py:512 +#: pytrainer/gui/windowmain.py:513 +msgid "min/km" +msgstr "min/km" -#: glade/importdata.glade.h:5 -msgid "<b>Plugins</b>" -msgstr "<b>Plugins</b>" +#: glade/pytrainer.glade:525 +#: glade/pytrainer.glade:752 +#: pytrainer/gui/windowmain.py:196 +#: pytrainer/gui/windowmain.py:197 +#: pytrainer/gui/windowmain.py:1047 +#: pytrainer/gui/windowmain.py:1049 +msgid "m" +msgstr "m" -#: glade/importdata.glade.h:6 -msgid "<b>Select Activities to Import</b>" -msgstr "<b>Sélectionnez une activité à importer</b>" +#: glade/pytrainer.glade:613 +msgid "<b>Date:</b>" +msgstr "<b>Date:</b>" -#: glade/importdata.glade.h:7 -msgid "<b>Select a file to import</b>" -msgstr "<b>Sélectionnez un fichier à importer</b>" +#: glade/pytrainer.glade:627 +#: glade/pytrainer.glade:1999 +#: glade/pytrainer.glade:2612 +#: glade/pytrainer.glade:3237 +#: glade/pytrainer.glade:3938 +msgid "<b>Distance:</b>" +msgstr "<b>Distance:</b>" -#: glade/importdata.glade.h:8 -msgid "<b>Select your GPS device</b>" -msgstr "<b>Sélectionnez votre périphérique GPS</b>" +#: glade/pytrainer.glade:644 +msgid "<b>Max Speed</b>" +msgstr "<b>Vit. Max:</b>" -#: glade/importdata.glade.h:9 -msgid "<b>Tools</b>" -msgstr "<b>Outils:</b>" +#: glade/pytrainer.glade:660 +#: glade/pytrainer.glade:2301 +#: glade/pytrainer.glade:2914 +#: glade/pytrainer.glade:3539 +#: glade/pytrainer.glade:4164 +msgid "<b>Max Pace:</b>" +msgstr "<b>Cad. Max:</b>" -#: glade/importdata.glade.h:10 -msgid "Clear" -msgstr "Effacer" +#: glade/pytrainer.glade:676 +msgid "<b>Descent:</b>" +msgstr "<b>Dénivelé Nég.:</b>" -#: glade/importdata.glade.h:11 -msgid "Import" -msgstr "Importer" +#: glade/pytrainer.glade:768 +#: glade/pytrainer.glade:2211 +#: glade/pytrainer.glade:2780 +#: glade/pytrainer.glade:3405 +#: glade/pytrainer.glade:3864 +msgid "Cal" +msgstr "Cal" -#: glade/importdata.glade.h:12 -msgid "Import from File" -msgstr "Importer à partir d'un fichier" +#: glade/pytrainer.glade:807 +#: glade/pytrainer.glade:1973 +#: glade/pytrainer.glade:2586 +#: glade/pytrainer.glade:3211 +#: glade/pytrainer.glade:4041 +msgid "Km" +msgstr "km" -#: glade/importdata.glade.h:13 -msgid "Import from GPS Device" -msgstr "Importer à partir du périphérique GPS" +#: glade/pytrainer.glade:824 +#: glade/pytrainer.glade:844 +#: glade/pytrainer.glade:867 +#: glade/pytrainer.glade:2028 +#: glade/pytrainer.glade:2049 +#: glade/pytrainer.glade:2071 +#: glade/pytrainer.glade:2662 +#: glade/pytrainer.glade:2684 +#: glade/pytrainer.glade:3287 +#: glade/pytrainer.glade:3309 +#: glade/pytrainer.glade:3987 +#: glade/pytrainer.glade:4009 +msgid "00" +msgstr "" -#: glade/importdata.glade.h:14 -msgid "Rescan" +#: glade/pytrainer.glade:1041 +msgid " <b>Title:</b>" +msgstr " <b>Titre:</b>" + +#: glade/pytrainer.glade:1098 +msgid "" +"Profile\n" +"Speed\n" +"Pace\n" +"Heart Rate\n" +"Cadence" msgstr "" +"Profil\n" +"Vitesse\n" +"Cadence\n" +"Fréquence Cardiaque\n" +"Rythme" -#: glade/importdata.glade.h:15 -msgid "Rescan system for available tools" +#: glade/pytrainer.glade:1113 +#: glade/pytrainer.glade:3121 +#: glade/pytrainer.glade:3746 +#: glade/pytrainer.glade:4370 +msgid "Versus" msgstr "" -#: glade/importdata.glade.h:16 -msgid "Reset" -msgstr "Réinitialiser" - -#: glade/importdata.glade.h:17 -msgid "Save" -msgstr "Sauvegarder" - -#: glade/importdata.glade.h:18 +#: glade/pytrainer.glade:1124 msgid "" -"Test 1\n" -"Test 2" +"None\n" +"Profile\n" +"Speed\n" +"Pace\n" +"Heart Rate\n" +"Cadence\n" msgstr "" +"Null\n" +"Profil\n" +"Vitesse\n" +"Cadence\n" +"Fréquence Cardiaque\n" +"Rythme\n" -#: glade/warning.glade.h:1 -msgid "Warning" -msgstr "Attention" +#: glade/pytrainer.glade:1141 +msgid "Show Laps" +msgstr "Montrer les tours" -#: glade/profile.glade.h:1 -msgid "<b>Add New Sport</b>" -msgstr "<b>Ajouter un Sport</b>" +#: glade/pytrainer.glade:1199 +msgid "<small>Y Axis</small>" +msgstr "<small>Axe Y</small>" -#: glade/profile.glade.h:2 -msgid "<b>Athlete Details</b>" -msgstr "<b>Détail de l'Athlète</b>" +#: glade/pytrainer.glade:1248 +msgid "<small>Graph Display Options</small>" +msgstr "<small>Options d'affichage des graphiques</small>" -#: glade/profile.glade.h:3 -msgid "<b>Database</b>" -msgstr "<b>Base de données</b>" +#: glade/pytrainer.glade:1258 +msgid "Reset Graph" +msgstr "Réinitialiser le Graphe" -#: glade/profile.glade.h:4 -msgid "<b>Delete Sport</b>" -msgstr "<b>Supprimer un Sport</b>" +#: glade/pytrainer.glade:1262 +msgid "Reset Graph display to original settings" +msgstr "Revenir aux réglages initiaux pour l'affichage du graphe " -#: glade/profile.glade.h:5 -msgid "<b>Edit Sport</b>" -msgstr "<b>Éditer un sport</b>" +#: glade/pytrainer.glade:1381 +msgid "<b>Beats:</b>" +msgstr "<b>FC Moy:</b>" -#: glade/profile.glade.h:7 -msgid "<b>Heart Rate Zones</b>" -msgstr "<b>Zones Cardiaque:</b>" +#: glade/pytrainer.glade:1393 +#: glade/pytrainer.glade:2181 +#: glade/pytrainer.glade:2750 +#: glade/pytrainer.glade:3375 +#: glade/pytrainer.glade:3834 +msgid "<b>Calories: </b>" +msgstr "<b>Calories:</b>" -#: glade/profile.glade.h:8 -msgid "<b>Port Connnection</b>" -msgstr "<b>Port de Connexion:</b>" +#: glade/pytrainer.glade:1407 +#: glade/pytrainer.glade:2333 +#: glade/pytrainer.glade:2978 +#: glade/pytrainer.glade:3603 +#: glade/pytrainer.glade:4212 +msgid "<b>Max Beats:</b>" +msgstr "<b>FC Max:</b>" -#: glade/profile.glade.h:9 -msgid "<b>Sport List</b>" -msgstr "<b>Liste des Sports</b>" +#: glade/pytrainer.glade:1421 +msgid "<b>HR Zones Method:</b>" +msgstr "<b>Calcul des zones de FC :</b>" -#: glade/profile.glade.h:10 -msgid "<b>System of Measurement</b>" -msgstr "<b>Système de Mesure</b>" +#: glade/pytrainer.glade:1436 +msgid "<b>HR Zone5:</b>" +msgstr "<b>Zone FC5:</b>" -#: glade/profile.glade.h:11 -msgid "<b>lalaal</b>" -msgstr "<b>Base de données</b>" +#: glade/pytrainer.glade:1451 +#: glade/pytrainer.glade:1650 +msgid " bpm" +msgstr " bpm" -#: glade/profile.glade.h:12 -msgid "<small><b>NOTE:</b> in order to use the Karvonen method you must cover the Resting hr field.</small>" -msgstr "<small><b>Note:</b> Afin d'utiliser la méthode de Karvonen vous devez obligatoirement renseigner le champ «Fréquence Cardiaque au Repos».</small>" +#: glade/pytrainer.glade:1467 +msgid " Cal" +msgstr " Cal" -#: glade/profile.glade.h:13 -msgid "<small><b>Note:</b> Change this only if you know what you are doing</small>" -msgstr "<small><b>Note:</b> Changez cette valeur uniquement si vous savez ce que vous faites</small>" +#: glade/pytrainer.glade:1525 +msgid "<b>HR Zone4:</b>" +msgstr "<b>Zone FC4:</b>" -#: glade/profile.glade.h:14 -msgid "<small><b>Note:</b> Maximum heart rate is calculated by subtracting the number 220 minus your age. </small>" -msgstr "<small><b>Note:</b> Le calcul de votre fréquence cardiaque maximale est effectué grâce à la formule 220 moins votre âge. </small>" +#: glade/pytrainer.glade:1541 +msgid "<b>HR Zone3:</b>" +msgstr "<b>Zone FC3:</b>" -#: glade/profile.glade.h:15 -msgid "Athlete" -msgstr "Athlète" +#: glade/pytrainer.glade:1557 +msgid "<b>HR Zone2:</b>" +msgstr "<b>Zone FC2:</b>" -#: glade/profile.glade.h:17 -msgid "Database host:" -msgstr "Hôte de la Base de Données:" +#: glade/pytrainer.glade:1573 +msgid "<b>HR Zone1:</b>" +msgstr "<b>Zone FC1:</b>" -#: glade/profile.glade.h:18 -msgid "Database name:" -msgstr "Nom de la Base de Données:" +#: glade/pytrainer.glade:1675 +#: glade/pytrainer.glade:1687 +#: glade/pytrainer.glade:1702 +#: glade/pytrainer.glade:1717 +#: glade/pytrainer.glade:1732 +#: glade/pytrainer.glade:2256 +#: glade/pytrainer.glade:2350 +#: glade/pytrainer.glade:2885 +#: glade/pytrainer.glade:2963 +#: glade/pytrainer.glade:3510 +#: glade/pytrainer.glade:3588 +#: glade/pytrainer.glade:3909 +#: glade/pytrainer.glade:4116 +msgid "bpm" +msgstr "bpm" -#: glade/profile.glade.h:19 -msgid "Database pass:" -msgstr "Mot de passe de la Base de Données:" +#: glade/pytrainer.glade:1777 +msgid " <b>Heart Rate:</b>" +msgstr " <b>Fréquence Cardiaque:</b>" -#: glade/profile.glade.h:20 -msgid "Database type:" -msgstr "Type de Base de Données:" +#: glade/pytrainer.glade:1905 +#, fuzzy +msgid "label-2147483647" +msgstr "label-2147483648" -#: glade/profile.glade.h:21 -msgid "Database user:" -msgstr "Utilisateur de la Base de Données:" +#: glade/pytrainer.glade:1939 +msgid "Record" +msgstr "Enregistrement" -#: glade/profile.glade.h:22 -msgid "Date of birth:" -msgstr "Date de Naissance:" +#: glade/pytrainer.glade:2149 +#: glade/pytrainer.glade:2796 +#: glade/pytrainer.glade:3421 +#: glade/pytrainer.glade:4132 +msgid "<b>Max Speed:</b>" +msgstr "<b>Vit. Max:</b>" -#: glade/profile.glade.h:23 +#: glade/pytrainer.glade:2226 +#: glade/pytrainer.glade:2855 +#: glade/pytrainer.glade:3480 +#: glade/pytrainer.glade:3879 +msgid "<b>Beats avg:</b>" +msgstr "<b>FC Moy:</b>" + +#: glade/pytrainer.glade:2440 +msgid " <b>Date:</b>" +msgstr " <b>Date:</b>" + +#: glade/pytrainer.glade:2484 +msgid "Value" +msgstr "Valeur" + +#: glade/pytrainer.glade:2495 msgid "" -"Deleting a sport removes associated records.\n" -"Continue?" +"Stage Profile\n" +"Stage Velocity\n" +"Stage Profile/velocity" msgstr "" -"Détruire un sport supprime les enregistrements associés.\n" -"Continuer?" +"Profil de la sortie\n" +"Vitesse de la sortie\n" +"Profil de la sortie/Vitesse" -#: glade/profile.glade.h:25 -#: pytrainer/gui/windowprofile.py:69 -msgid "Extra Weight" -msgstr "Poids Additionnel" +#: glade/pytrainer.glade:2551 +msgid "Day" +msgstr "Jour" -#: glade/profile.glade.h:26 -msgid "Extra Weight:" -msgstr "Poids Additionnel:" +#: glade/pytrainer.glade:2641 +#: glade/pytrainer.glade:3266 +#: glade/pytrainer.glade:3966 +msgid "000" +msgstr "" -#: glade/profile.glade.h:27 -msgid "Gender:" -msgstr "Sexe:" +#: glade/pytrainer.glade:3054 +msgid " <b>Week:</b>" +msgstr "<b>Semaine:</b>" -#: glade/profile.glade.h:28 -msgid "General" -msgstr "Général" +#: glade/pytrainer.glade:3106 +#: glade/pytrainer.glade:3731 +#: glade/pytrainer.glade:4355 +msgid "" +"Distance\n" +"Time\n" +"Average Heart Rate\n" +"Average Speed\n" +"Calories" +msgstr "" +"Distance\n" +"Durée\n" +"FC moyenne\n" +"Vitesse moyenne\n" +"Calories" -#: glade/profile.glade.h:29 -#: pytrainer/daygraph.py:56 -#: pytrainer/recordgraph.py:99 -#: pytrainer/heartrategraph.py:38 -msgid "Heart Rate" -msgstr "Fréquence Cardiaque" +#: glade/pytrainer.glade:3132 +#: glade/pytrainer.glade:3757 +#: glade/pytrainer.glade:4381 +msgid "" +"None\n" +"Distance\n" +"Time\n" +"Average Heart Rate\n" +"Average Speed\n" +"Calories" +msgstr "" +"Null\n" +"Distance\n" +"Durée\n" +"FC moyenne\n" +"Vitesse moyenne\n" +"Calories" -#: glade/profile.glade.h:30 -msgid "Height:" -msgstr "Taille:" +#: glade/pytrainer.glade:3176 +msgid "Week" +msgstr "Semaine" -#: glade/profile.glade.h:31 -#: pytrainer/gui/windowmain.py:291 -msgid "Karvonen method" -msgstr "Méthode de Karvonen" +#: glade/pytrainer.glade:3679 +msgid " <b>Month:</b>" +msgstr " <b>Mois:</b>" -#: glade/profile.glade.h:32 -msgid "M.E.T." -msgstr "M.E.T." +#: glade/pytrainer.glade:3800 +msgid "Month" +msgstr "Mois" -#: glade/profile.glade.h:33 -msgid "M.E.T.:" -msgstr "M.E.T.:" +#: glade/pytrainer.glade:4303 +msgid " <b>Year:</b>" +msgstr " <b>Année:</b>" -#: glade/profile.glade.h:34 -msgid "Maximum heart rate:" -msgstr "Fréquence Cardiaque Maximale:" +#: glade/pytrainer.glade:4424 +msgid "Year" +msgstr "Année" -#: glade/profile.glade.h:35 -msgid "Metric system" -msgstr "Système Métrique" +#: glade/pytrainer.glade:4447 +msgid "label154" +msgstr "label154" -#: glade/profile.glade.h:36 -msgid "More information on determining yor M.E.T sport coefficient on Wikipedia" -msgstr "Plus d'information pour déterminer le coefficient M.E.T du sport sur Wikipedia" +#: glade/pytrainer.glade:4467 +msgid "<b>Title:</b>" +msgstr "<b>Titre:</b>" -#: glade/profile.glade.h:37 -msgid "Name" -msgstr "Nom" +#: glade/pytrainer.glade:4490 +msgid "Search" +msgstr "Rechercher" -#: glade/profile.glade.h:39 -msgid "Percentages based method" -msgstr "Méthode basée sur des pourcentages" +#: glade/pytrainer.glade:4517 +msgid "Columns" +msgstr "Colonnes" -#: glade/profile.glade.h:40 -msgid "Preferences" -msgstr "Préférences" +#: glade/pytrainer.glade:4573 +msgid "label155" +msgstr "label155" -#: glade/profile.glade.h:41 -msgid "Resting heart rate:" -msgstr "Fréquence Cardiaque au Repos:" +#: glade/pytrainer.glade:4657 +msgid "Type:" +msgstr "Type:" -#: glade/profile.glade.h:42 -msgid "Select how to calculate your heart rate zones." -msgstr "Sélectionnez la méthode appropriée pour définir les zones cardiaque." +#: glade/pytrainer.glade:4670 +msgid "" +"Font\n" +"Restaurant\n" +"Scenic Area\n" +"Summit" +msgstr "" +"Point d'eau\n" +"Restaurant\n" +"Vue Panoramique\n" +"Sommet" -#: glade/profile.glade.h:43 -msgid "Sports" -msgstr "Sports" +#: glade/pytrainer.glade:4686 +msgid "Latitude: " +msgstr "Latitude:" -#: glade/profile.glade.h:44 -msgid "U.S. customary units" -msgstr "Unités U.S." +#: glade/pytrainer.glade:4700 +msgid " Name:" +msgstr "Nom:" -#: glade/profile.glade.h:45 -msgid "Use this port for internal connections: " -msgstr "Utiliser ce port pour les connexions internes:" +#: glade/pytrainer.glade:4712 +msgid "Longitude:" +msgstr " Longitude:" -#: glade/profile.glade.h:46 -msgid "User name:" -msgstr "Nom d'Utilisateur:" +#: glade/pytrainer.glade:4804 +msgid "<b> Waypoint: </b>" +msgstr "<b> Point de localisation:</b>" -#: glade/profile.glade.h:47 -msgid "Weight:" -msgstr "Poids:" +#: glade/pytrainer.glade:4885 +msgid "label162" +msgstr "label162" -#: glade/profile.glade.h:48 -msgid "delete" -msgstr "supprimer" +#: glade/pytrainer.glade:4972 +msgid "label163" +msgstr "label163" -#: glade/profile.glade.h:49 -msgid "edit" -msgstr "édition" +#: glade/selecttrackdialog.glade:7 +msgid "Select track record" +msgstr "Sélectionnez un Circuit" -#: glade/profile.glade.h:51 -msgid "llist" +#: glade/warning.glade:7 +#: glade/warning.glade:38 +msgid "Warning" +msgstr "Attention" + +#: extensions/openstreetmap/openstreetmap.py:27 +msgid "Must have username and password configured" +msgstr "Un nom d'utilisateur et un mot de passe doivent être configurés" + +#: extensions/openstreetmap/openstreetmap.py:29 +msgid "Openstreetmap Extension Error" +msgstr "Erreur d'extension Openstreetmap" + +#: extensions/openstreetmap/openstreetmap.py:66 +msgid "" +"Posting GPX trace to Openstreetmap\n" +"\n" +"Please wait this could take several minutes" msgstr "" +"Envoi de la trace GPX vers Openstreetmap\n" +"\n" +"Merci d'attendre la fin du processus qui peut prendre quelques minutes" -#: glade/profile.glade.h:52 -msgid "new" -msgstr "nouveau" +#: extensions/openstreetmap/openstreetmap.py:68 +msgid "Openstreetmap Extension Processing" +msgstr "Traitement de l'extension Openstreetmap" -#: pytrainer/gui/windowprofile.py:51 +#: extensions/openstreetmap/openstreetmap.py:86 +msgid "Openstreetmap Extension Upload Complete" +msgstr "Chargement sur Openstreetmap effectué" + +#: extensions/openstreetmap/openstreetmap.py:96 +msgid "Please add any additional information for this upload" +msgstr "Merci de Compléter les informations pour ce chargement" + +#: pytrainer/gui/windowprofile.py:53 msgid "Male" msgstr "Homme" -#: pytrainer/gui/windowprofile.py:52 +#: pytrainer/gui/windowprofile.py:54 msgid "Female" msgstr "Femme" -#: pytrainer/gui/windowprofile.py:69 +#: pytrainer/gui/windowprofile.py:71 msgid "MET" msgstr "MET" -#: pytrainer/gui/windowplugins.py:70 -#: pytrainer/gui/windowplugins.py:97 -#: pytrainer/gui/windowextensions.py:70 +#: pytrainer/gui/windowplugins.py:69 +#: pytrainer/gui/windowplugins.py:96 +#: pytrainer/gui/windowextensions.py:72 +#: pytrainer/gui/windowimportdata.py:542 msgid "Enable" msgstr "Activé" -#: pytrainer/gui/windowplugins.py:72 -#: pytrainer/gui/windowplugins.py:96 -#: pytrainer/gui/windowextensions.py:72 +#: pytrainer/gui/windowplugins.py:71 +#: pytrainer/gui/windowplugins.py:95 +#: pytrainer/gui/windowextensions.py:70 +#: pytrainer/gui/windowimportdata.py:541 msgid "Disable" msgstr "Désactivé" -#: pytrainer/gui/windowplugins.py:81 +#: pytrainer/gui/windowplugins.py:80 #: pytrainer/gui/windowextensions.py:81 +#: pytrainer/gui/windowimportdata.py:526 #, python-format msgid "%s settings" msgstr "" -#: pytrainer/gui/windowplugins.py:104 +#: pytrainer/gui/windowplugins.py:103 +#: pytrainer/gui/windowimportdata.py:549 msgid "Ok" msgstr "Ok" -#: pytrainer/gui/windowmain.py:63 -#: pytrainer/gui/windowmain.py:66 -#: pytrainer/gui/windowmain.py:70 +#: pytrainer/gui/windowmain.py:65 +#: pytrainer/gui/windowmain.py:68 +#: pytrainer/gui/windowmain.py:72 msgid "id" msgstr "id" -#: pytrainer/gui/windowmain.py:63 +#: pytrainer/gui/windowmain.py:65 msgid "Start" msgstr "Début" -#: pytrainer/gui/windowmain.py:63 +#: pytrainer/gui/windowmain.py:65 msgid "Kilometer" msgstr "Kilomètres" -#: pytrainer/gui/windowmain.py:66 -#: pytrainer/gui/windowmain.py:712 +#: pytrainer/gui/windowmain.py:68 +#: pytrainer/gui/windowmain.py:748 msgid "Title" msgstr "Titre" -#: pytrainer/gui/windowmain.py:66 -#: pytrainer/gui/windowmain.py:713 +#: pytrainer/gui/windowmain.py:68 +#: pytrainer/gui/windowmain.py:749 #: pytrainer/gui/dialogselecttrack.py:40 msgid "Date" msgstr "Date" -#: pytrainer/gui/windowmain.py:66 -#: pytrainer/gui/windowmain.py:714 -#: pytrainer/gui/windowimportdata.py:255 -#: pytrainer/extensions/googlemaps.py:91 +#: pytrainer/gui/windowmain.py:68 +#: pytrainer/gui/windowmain.py:750 +#: pytrainer/gui/windowrecord.py:147 +#: pytrainer/gui/windowimportdata.py:333 +#: pytrainer/extensions/googlemaps.py:93 msgid "Distance" msgstr "Distance" -#: pytrainer/gui/windowmain.py:66 -#: pytrainer/gui/windowmain.py:716 -#: pytrainer/extensions/googlemaps.py:91 +#: pytrainer/gui/windowmain.py:68 +#: pytrainer/gui/windowmain.py:752 +#: pytrainer/extensions/googlemaps.py:93 msgid "Time" msgstr "Temps" -#: pytrainer/gui/windowmain.py:66 -#: pytrainer/gui/windowmain.py:717 +#: pytrainer/gui/windowmain.py:68 +#: pytrainer/gui/windowmain.py:753 msgid "Beats" msgstr "Pulsations" -#: pytrainer/gui/windowmain.py:66 -#: pytrainer/gui/windowmain.py:718 +#: pytrainer/gui/windowmain.py:68 +#: pytrainer/gui/windowmain.py:754 msgid "Average" msgstr "Moyenne" -#: pytrainer/gui/windowmain.py:70 +#: pytrainer/gui/windowmain.py:72 msgid "Waypoint" msgstr "Point de Localisation" -#: pytrainer/gui/windowmain.py:168 -#: pytrainer/gui/windowmain.py:304 -#: pytrainer/gui/windowmain.py:404 -#: pytrainer/gui/windowmain.py:482 +#: pytrainer/gui/windowmain.py:183 +#: pytrainer/gui/windowmain.py:321 +#: pytrainer/gui/windowmain.py:425 +#: pytrainer/gui/windowmain.py:503 msgid "miles" msgstr "miles" -#: pytrainer/gui/windowmain.py:169 -#: pytrainer/gui/windowmain.py:170 -#: pytrainer/gui/windowmain.py:305 -#: pytrainer/gui/windowmain.py:306 -#: pytrainer/gui/windowmain.py:405 -#: pytrainer/gui/windowmain.py:406 -#: pytrainer/gui/windowmain.py:483 -#: pytrainer/gui/windowmain.py:484 +#: pytrainer/gui/windowmain.py:184 +#: pytrainer/gui/windowmain.py:185 +#: pytrainer/gui/windowmain.py:322 +#: pytrainer/gui/windowmain.py:323 +#: pytrainer/gui/windowmain.py:426 +#: pytrainer/gui/windowmain.py:427 +#: pytrainer/gui/windowmain.py:504 +#: pytrainer/gui/windowmain.py:505 msgid "miles/h" msgstr "" -#: pytrainer/gui/windowmain.py:171 -#: pytrainer/gui/windowmain.py:172 -#: pytrainer/gui/windowmain.py:307 -#: pytrainer/gui/windowmain.py:308 -#: pytrainer/gui/windowmain.py:407 -#: pytrainer/gui/windowmain.py:408 -#: pytrainer/gui/windowmain.py:485 -#: pytrainer/gui/windowmain.py:486 +#: pytrainer/gui/windowmain.py:186 +#: pytrainer/gui/windowmain.py:187 +#: pytrainer/gui/windowmain.py:324 +#: pytrainer/gui/windowmain.py:325 +#: pytrainer/gui/windowmain.py:428 +#: pytrainer/gui/windowmain.py:429 +#: pytrainer/gui/windowmain.py:506 +#: pytrainer/gui/windowmain.py:507 msgid "min/mile" msgstr "min/mile" -#: pytrainer/gui/windowmain.py:173 -#: pytrainer/gui/windowmain.py:174 +#: pytrainer/gui/windowmain.py:188 +#: pytrainer/gui/windowmain.py:189 msgid "feet" msgstr "pieds" -#: pytrainer/gui/windowmain.py:176 -#: pytrainer/gui/windowmain.py:310 -#: pytrainer/gui/windowmain.py:410 -#: pytrainer/gui/windowmain.py:488 -#: pytrainer/extensions/googlemaps.py:91 +#: pytrainer/gui/windowmain.py:191 +#: pytrainer/gui/windowmain.py:327 +#: pytrainer/gui/windowmain.py:431 +#: pytrainer/gui/windowmain.py:509 +#: pytrainer/extensions/googlemaps.py:93 msgid "km" msgstr "km" -#: pytrainer/gui/windowmain.py:293 +#: pytrainer/gui/windowmain.py:310 msgid "Percentages method" msgstr "Méthode basée sur des pourcentages" -#: pytrainer/gui/windowmain.py:1016 +#: pytrainer/gui/windowmain.py:1041 msgid "lap" msgstr "tour " -#: pytrainer/gui/windowmain.py:1022 +#: pytrainer/gui/windowmain.py:1047 #: pytrainer/gui/drawArea.py:143 -#: pytrainer/extensions/googlemaps.py:89 +#: pytrainer/extensions/googlemaps.py:91 msgid "h" msgstr "" -#: pytrainer/gui/windowmain.py:1022 -#: pytrainer/gui/windowmain.py:1024 +#: pytrainer/gui/windowmain.py:1047 +#: pytrainer/gui/windowmain.py:1049 msgid "s" msgstr "" @@ -1044,91 +1324,136 @@ msgstr "Nom du Circuit" #: pytrainer/gui/drawArea.py:144 -#: pytrainer/extensions/googlemaps.py:89 +#: pytrainer/extensions/googlemaps.py:91 msgid "min" msgstr "min" -#: pytrainer/gui/windowextensions.py:104 -#: pytrainer/gui/windowextensions.py:117 +#: pytrainer/gui/windowrecord.py:147 +#: pytrainer/gui/windowimportdata.py:333 +msgid "Start Time" +msgstr "Heure de début" + +#: pytrainer/gui/windowrecord.py:147 +#: pytrainer/gui/windowimportdata.py:333 +msgid "Duration" +msgstr "Durée" + +#: pytrainer/gui/windowrecord.py:147 +msgid "GPX File" +msgstr "Fichier GPX" + +#: pytrainer/gui/windowextensions.py:112 +#: pytrainer/gui/windowextensions.py:125 msgid "OK" msgstr "OK" -#: pytrainer/gui/windowimportdata.py:82 +#: pytrainer/gui/windowimportdata.py:110 msgid "No file selected" msgstr "Pas de fichier sélectionné" -#: pytrainer/gui/windowimportdata.py:189 +#: pytrainer/gui/windowimportdata.py:155 +msgid "Configure" +msgstr "Configurer" + +#: pytrainer/gui/windowimportdata.py:156 +msgid "Run" +msgstr "" + +#: pytrainer/gui/windowimportdata.py:164 +msgid "Disabled" +msgstr "Désactivé" + +#: pytrainer/gui/windowimportdata.py:166 +msgid "Enabled" +msgstr "Activé" + +#: pytrainer/gui/windowimportdata.py:233 msgid "GPS device found" msgstr "Périphérique GPS trouvé" -#: pytrainer/gui/windowimportdata.py:192 +#: pytrainer/gui/windowimportdata.py:236 msgid "GPS device <b>not</b> found" msgstr "Périphérique GPS <b>non</b> trouvé" -#: pytrainer/gui/windowimportdata.py:199 +#: pytrainer/gui/windowimportdata.py:243 msgid "This tool was not found on the system" msgstr "Cet outil n'est pas installé sur votre système" -#: pytrainer/gui/windowimportdata.py:201 +#: pytrainer/gui/windowimportdata.py:245 msgid " Homepage" msgstr "Page d'accueil" -#: pytrainer/gui/windowimportdata.py:255 -msgid "Start Time" -msgstr "Heure de début" +#: pytrainer/gui/windowimportdata.py:298 +msgid "File" +msgstr "Fichier" -#: pytrainer/gui/windowimportdata.py:255 -msgid "Duration" -msgstr "Durée" +#: pytrainer/gui/windowimportdata.py:298 +msgid "Type" +msgstr "Type" -#: pytrainer/gui/windowimportdata.py:255 +#: pytrainer/gui/windowimportdata.py:298 +msgid "Activities" +msgstr "Activités" + +#: pytrainer/gui/windowimportdata.py:333 msgid "Notes" msgstr "" -#: pytrainer/gui/windowimportdata.py:404 -#, python-format -msgid "Found file of type: %s" -msgstr "Fichier trouvé de type: %s" +#: pytrainer/gui/windowimportdata.py:482 +msgid "Imported into database" +msgstr "Importé dans la base" -#: pytrainer/gui/windowimportdata.py:413 -msgid "Found in database" -msgstr "Présent dans la base" +#: pytrainer/gui/windowimportdata.py:609 +msgid "Saving options" +msgstr "Sauvegarde des options" -#: pytrainer/gui/windowimportdata.py:428 -msgid "Unknown file type" -msgstr "Fichier de type inconnu" +#: pytrainer/gui/windowimportdata.py:611 +msgid "Options saved" +msgstr "Options sauvegardées" -#: pytrainer/gui/windowimportdata.py:430 -msgid "File selected is of unknown or unsupported file type" -msgstr "Le type de fichier sélectionné est inconnu ou non supporté" - -#: pytrainer/gui/windowimportdata.py:457 +#: pytrainer/gui/windowimportdata.py:636 msgid "Importing one activity" msgstr "Importation d'une activité" -#: pytrainer/gui/windowimportdata.py:458 +#: pytrainer/gui/windowimportdata.py:637 msgid "Imported one activity" msgstr "Une activité importée" -#: pytrainer/gui/windowimportdata.py:460 +#: pytrainer/gui/windowimportdata.py:639 #, python-format msgid "Importing %d activities" msgstr "Import de %d activités" -#: pytrainer/gui/windowimportdata.py:461 +#: pytrainer/gui/windowimportdata.py:640 #, python-format msgid "Imported %d activities" msgstr "%d activités importées" -#: pytrainer/gui/windowimportdata.py:469 -msgid "Import Success" -msgstr "Importation réussie" +#: pytrainer/gui/windowimportdata.py:659 +msgid "Choose a file (or files) to import activities from" +msgstr "Choisir un fichier pour importer vos activitées" -#: pytrainer/lib/gpx.py:93 +#: pytrainer/gui/windowimportdata.py:674 +#: pytrainer/gui/windowimportdata.py:675 +#, python-format +msgid "Found file of type: %s" +msgstr "Fichier trouvé de type: %s" + +#: pytrainer/gui/windowimportdata.py:699 +msgid "Found in database" +msgstr "Présent dans la base" + +#: pytrainer/gui/windowimportdata.py:714 +#: pytrainer/gui/windowimportdata.py:715 +#, python-format +msgid "File %s is of unknown or unsupported file type" +msgstr "Le fichier %s est inconnu ou d'un type non supporté" + +#: pytrainer/lib/gpx.py:119 msgid "No Name" msgstr "Sans Nom" -#: pytrainer/lib/gpx.py:100 +#: pytrainer/lib/gpx.py:126 msgid "No Data" msgstr "Pas de Valeurs" @@ -1155,11 +1480,11 @@ #: pytrainer/daygraph.py:52 #: pytrainer/daygraph.py:54 #: pytrainer/daygraph.py:56 -#: pytrainer/recordgraph.py:93 -#: pytrainer/recordgraph.py:95 -#: pytrainer/recordgraph.py:97 -#: pytrainer/recordgraph.py:99 -#: pytrainer/recordgraph.py:101 +#: pytrainer/recordgraph.py:114 +#: pytrainer/recordgraph.py:116 +#: pytrainer/recordgraph.py:118 +#: pytrainer/recordgraph.py:120 +#: pytrainer/recordgraph.py:122 #: pytrainer/heartrategraph.py:38 #: pytrainer/monthgraph.py:69 #: pytrainer/weekgraph.py:115 @@ -1168,12 +1493,12 @@ msgstr "Distance (km) " #: pytrainer/daygraph.py:52 -#: pytrainer/recordgraph.py:93 +#: pytrainer/recordgraph.py:114 msgid "Height (m)" msgstr "Altitude (m)" #: pytrainer/daygraph.py:52 -#: pytrainer/recordgraph.py:93 +#: pytrainer/recordgraph.py:114 msgid "Stage Profile" msgstr "Profil de la sortie" @@ -1186,32 +1511,32 @@ msgstr "Vitesse" #: pytrainer/daygraph.py:56 -#: pytrainer/recordgraph.py:99 +#: pytrainer/recordgraph.py:120 #: pytrainer/heartrategraph.py:38 msgid "Beats (bpm)" msgstr "Pulsations (bpm)" -#: pytrainer/recordgraph.py:95 +#: pytrainer/recordgraph.py:116 msgid "Speed (Km/h)" msgstr "Vitesse (km/h)" -#: pytrainer/recordgraph.py:95 +#: pytrainer/recordgraph.py:116 msgid "Speed" msgstr "Vitesse" -#: pytrainer/recordgraph.py:97 +#: pytrainer/recordgraph.py:118 msgid "Pace (min/km)" msgstr "Cadence (min/km)" -#: pytrainer/recordgraph.py:97 +#: pytrainer/recordgraph.py:118 msgid "Pace" msgstr "Cadence" -#: pytrainer/recordgraph.py:101 +#: pytrainer/recordgraph.py:122 msgid "Cadence (rpm)" msgstr "Rythme (rpm) " -#: pytrainer/recordgraph.py:101 +#: pytrainer/recordgraph.py:122 msgid "Cadence" msgstr "Rythme" @@ -1266,16 +1591,16 @@ msgid "Daily Calories" msgstr "Calories Journalière" -#: pytrainer/waypoint.py:80 +#: pytrainer/waypoint.py:94 msgid "The gpx file seems to be a several days records. Perhaps you will need to edit your gpx file" msgstr "Ce fichier GPX semble contenir plusieurs jours d'enregistrements. Vous devrez peut-être au préalable éditer celui-ci." -#: pytrainer/record.py:61 +#: pytrainer/record.py:72 msgid "Edit Entry" msgstr "Entrée Rapide" -#: pytrainer/record.py:373 -msgid "pyTrainer cant import data from your gpx file" +#: pytrainer/record.py:453 +msgid "pyTrainer can't import data from your gpx file" msgstr "pyTrainer ne peut pas importer de données depuis le fichier GPX" #: pytrainer/yeargraph.py:70 @@ -1306,15 +1631,15 @@ msgid "Monthly Calories" msgstr "Calories Mensuelle" -#: pytrainer/main.py:416 +#: pytrainer/main.py:452 msgid "Delete this database entry?" msgstr "Supprimer cette entrée de la Base de Données?" -#: pytrainer/main.py:430 +#: pytrainer/main.py:466 msgid "Delete this waypoint?" msgstr "Détruire ce Point de Localisation" -#: import/file_garmintools.py:45 +#: import/file_garmintools.py:48 msgid "Garmin tools dump file" msgstr "Fichier de dump Garmin tools" @@ -1342,17 +1667,33 @@ msgid "Gant" msgstr "" -#~ msgid "window1" -#~ msgstr "fenêtre1" -#~ msgid "label154" -#~ msgstr "label154" -#~ msgid "label155" -#~ msgstr "label155" -#~ msgid "label162" -#~ msgstr "label162" -#~ msgid "label163" -#~ msgstr "label163" +#: import/file_kml20.py:50 +msgid "Geodistance kml version 2.0 fil... [truncated message content] |
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. |