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...> - 2011-08-28 16:19:56
|
Revision: 868 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=868&view=rev Author: dgranda Date: 2011-08-28 16:19:49 +0000 (Sun, 28 Aug 2011) Log Message: ----------- Trkpoints too separated may affect accuracy although values up to 15 seconds are not logged Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/gpx.py Modified: pytrainer/trunk/pytrainer/lib/gpx.py =================================================================== --- pytrainer/trunk/pytrainer/lib/gpx.py 2011-08-28 16:00:59 UTC (rev 867) +++ pytrainer/trunk/pytrainer/lib/gpx.py 2011-08-28 16:19:49 UTC (rev 868) @@ -303,7 +303,7 @@ else: time_elapsed = time_ - self.trkpoints[i-1]['time'] if self.trkpoints[i-1]['time'] is not None else 0 self.total_time_trkpts += time_elapsed - if time_elapsed > 5: + if time_elapsed > 15: logging.debug("Adding %d seconds from last trkpt, someone took a break!" % time_elapsed) else: time_ = None This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2011-08-28 16:01:06
|
Revision: 867 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=867&view=rev Author: dgranda Date: 2011-08-28 16:00:59 +0000 (Sun, 28 Aug 2011) Log Message: ----------- Using normal way of import for new GPX based activities - ticket:137, ticket:105 Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowrecord.py pytrainer/trunk/pytrainer/lib/activity.py pytrainer/trunk/pytrainer/lib/gpx.py pytrainer/trunk/pytrainer/record.py Modified: pytrainer/trunk/pytrainer/gui/windowrecord.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowrecord.py 2011-08-28 11:39:59 UTC (rev 866) +++ pytrainer/trunk/pytrainer/gui/windowrecord.py 2011-08-28 16:00:59 UTC (rev 867) @@ -289,9 +289,8 @@ if self.mode == "newrecord": logging.debug('Track data: '+str(list_options)) if list_options["rcd_gpxfile"] != "": - logging.info('Adding new activity based on GPX file') - trackSummary=(list_options["rcd_sport"],"","") - self.parent.insertNewRecord(list_options["rcd_gpxfile"], trackSummary) + logging.info('Adding new activity based on GPX file') + self.parent.insertRecord(list_options, None, selected_equipment_ids) else: logging.info('Adding new activity based on provided data') #Manual entry, calculate time info Modified: pytrainer/trunk/pytrainer/lib/activity.py =================================================================== --- pytrainer/trunk/pytrainer/lib/activity.py 2011-08-28 11:39:59 UTC (rev 866) +++ pytrainer/trunk/pytrainer/lib/activity.py 2011-08-28 16:00:59 UTC (rev 867) @@ -219,7 +219,8 @@ self.gpx_distance = self.gpx.total_dist logging.info("GPX Distance: %s | distance (trkpts): %s | duration: %s | duration (trkpts): %s" % (self.gpx_distance, self.gpx.total_dist_trkpts, self.gpx.total_time, self.gpx.total_time_trkpts)) time_diff = self.gpx.total_time_trkpts - self.gpx.total_time - if time_diff > 10: + acceptable_lapse = 4 # number of seconds that duration calculated using lap and trkpts data can differ + if time_diff > acceptable_lapse: self.time_pause = time_diff logging.debug("Identified non active time: %s s" % self.time_pause) logging.debug("<<") Modified: pytrainer/trunk/pytrainer/lib/gpx.py =================================================================== --- pytrainer/trunk/pytrainer/lib/gpx.py 2011-08-28 11:39:59 UTC (rev 866) +++ pytrainer/trunk/pytrainer/lib/gpx.py 2011-08-28 16:00:59 UTC (rev 867) @@ -75,6 +75,7 @@ self.maxhr = 0 self.hr_average = 0 self.date = "" + self.start_time = "" #self.Date = Date() self.calories= 0 self.tree = None @@ -129,6 +130,7 @@ timeResult = trk.find(timeTag) if timeResult is not None: time_ = timeResult.text # check timezone + logging.debug("TimeResult: %s" %time_) mk_time = self.getDateTime(time_)[0] time_ = mk_time.strftime("%Y-%m-%d") else: @@ -152,6 +154,9 @@ def getCalories(self): return self.calories + def getStart_time(self): + return self.start_time + def getLaps(self): logging.debug(">>") lapInfo = [] @@ -228,7 +233,7 @@ logging.info("Lap distance: %s m | Duration: %s s | Calories: %s kcal" % (lapDistance, lapDuration, lapCalories)) self.total_dist = float(totalDistance/1000.0) # Returning km self.total_time = int(totalDuration) # Returning seconds - logging.info("Distance: %.02f km | Duration: %d s | Calories: %s kcal" % (self.total_dist, self.total_time, self.calories)) + logging.info("Laps - Distance: %.02f km | Duration: %d s | Calories: %s kcal" % (self.total_dist, self.total_time, self.calories)) else: laps = [] @@ -255,9 +260,10 @@ else: mk_time = self.getDateTime(date_)[1] #Local Date self.date = mk_time.strftime("%Y-%m-%d") + self.start_time = mk_time.strftime("%H:%M:%S") waiting_points = [] + logging.debug("date: %s | start_time: %s | mk_time: %s" % (self.date, self.start_time, mk_time)) - for i, trkpoint in enumerate(trkpoints): #Get data from trkpoint try: @@ -297,7 +303,7 @@ else: time_elapsed = time_ - self.trkpoints[i-1]['time'] if self.trkpoints[i-1]['time'] is not None else 0 self.total_time_trkpts += time_elapsed - if time_elapsed > 10: + if time_elapsed > 5: logging.debug("Adding %d seconds from last trkpt, someone took a break!" % time_elapsed) else: time_ = None @@ -403,12 +409,13 @@ self.total_dist = self.total_dist_trkpts else: dist_diff = 1000*(self.total_dist_trkpts - self.total_dist) - logging.info("Distance difference between laps and trkpts calculation: %f m" % dist_diff) + logging.debug("Distance difference between laps and trkpts calculation: %f m" % dist_diff) if self.total_time is None or self.total_time == 0: self.total_time = self.total_time_trkpts else: time_diff = self.total_time_trkpts - self.total_time - logging.info("Duration difference between laps and trkpts calculation: %d s" % time_diff) + logging.debug("Duration difference between laps and trkpts calculation: %d s" % time_diff) + logging.info("Values - Distance: %.02f km | Duration: %d s | Calories: %s kcal" % (self.total_dist, self.total_time, self.calories)) logging.debug("<<") return retorno Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2011-08-28 11:39:59 UTC (rev 866) +++ pytrainer/trunk/pytrainer/record.py 2011-08-28 16:00:59 UTC (rev 867) @@ -53,7 +53,7 @@ def newMultiRecord(self, activities): logging.debug('>>') sports = self._sport_service.get_all_sports() - self.recordwindow = WindowRecord(self._equipment_service, self.data_path, sports, parent=self, windowTitle="Modify details before importing") + self.recordwindow = WindowRecord(self._equipment_service, self.data_path, sports, parent=self, windowTitle=_("Modify details before importing")) self.recordwindow.populateMultiWindow(activities) self.recordwindow.run() return self.recordwindow.getActivityData() @@ -476,8 +476,10 @@ heartrate = gpx.getHeartRateAverage() date = gpx.getDate() calories = gpx.getCalories() + start_time = gpx.getStart_time() self.recordwindow.rcd_date.set_text(date) + self.recordwindow.rcd_starttime.set_text(start_time) self.recordwindow.rcd_upositive.set_text(str(upositive)) self.recordwindow.rcd_unegative.set_text(str(unegative)) self.recordwindow.rcd_beats.set_text(str(heartrate)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2011-08-28 11:40:05
|
Revision: 866 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=866&view=rev Author: dgranda Date: 2011-08-28 11:39:59 +0000 (Sun, 28 Aug 2011) Log Message: ----------- Equipment was missing when importing activity from file - ticket:137 Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowrecord.py Modified: pytrainer/trunk/pytrainer/gui/windowrecord.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowrecord.py 2011-08-28 11:20:48 UTC (rev 865) +++ pytrainer/trunk/pytrainer/gui/windowrecord.py 2011-08-28 11:39:59 UTC (rev 866) @@ -248,7 +248,8 @@ activity["rcd_title"] = activity["rcd_title"].replace("\"","'") #Add activity to DB etc laps = activity.pop("laps", ()) - self.activity_data[index]["db_id"] = self.parent.insertRecord(activity, laps) + selected_equipment_ids = self._get_selected_equipment_ids() + self.activity_data[index]["db_id"] = self.parent.insertRecord(activity, laps, equipment=selected_equipment_ids) row += 1 logging.debug("Processed %d rows of activity data" % row) else: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <nc...@us...> - 2011-08-28 11:20:54
|
Revision: 865 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=865&view=rev Author: ncjones Date: 2011-08-28 11:20:48 +0000 (Sun, 28 Aug 2011) Log Message: ----------- Fix sqlalchemy-migrate dependency version number. ticket:132 Modified Paths: -------------- pytrainer/trunk/INSTALL Modified: pytrainer/trunk/INSTALL =================================================================== --- pytrainer/trunk/INSTALL 2011-08-28 09:40:42 UTC (rev 864) +++ pytrainer/trunk/INSTALL 2011-08-28 11:20:48 UTC (rev 865) @@ -24,7 +24,7 @@ libxslt-1.1.26 sqlite-3.6.23 (sqlite is preferred as db than mysql, MySQL-python has been reported to be installed if so) sqlalchemy-0.6.4 -sqlalchemy-migrate-0.6.1 +sqlalchemy-migrate-0.6.0 - Only needed if correspondent plugin is enabled: gpsbabel-1.3.5 ("Garmin via GPSBabel 1.3.5" aka garmin_hr) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2011-08-28 09:40:48
|
Revision: 864 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=864&view=rev Author: dgranda Date: 2011-08-28 09:40:42 +0000 (Sun, 28 Aug 2011) Log Message: ----------- Missing varchar type for laptrigger - ticket:132 Modified Paths: -------------- pytrainer/trunk/pytrainer/upgrade/versions/009_default_upgrade.sql Modified: pytrainer/trunk/pytrainer/upgrade/versions/009_default_upgrade.sql =================================================================== --- pytrainer/trunk/pytrainer/upgrade/versions/009_default_upgrade.sql 2011-08-27 23:41:19 UTC (rev 863) +++ pytrainer/trunk/pytrainer/upgrade/versions/009_default_upgrade.sql 2011-08-28 09:40:42 UTC (rev 864) @@ -1,7 +1,7 @@ -- lap info added in version 1.9.0 alter table laps add intensity varchar(7); -alter table laps add laptrigger(9); +alter table laps add laptrigger varchar(9); alter table laps add max_speed float; alter table laps add avg_hr int; alter table laps add max_hr int; -alter table laps add comments text; \ No newline at end of file +alter table laps add comments text; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2011-08-27 23:41:29
|
Revision: 863 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=863&view=rev Author: dgranda Date: 2011-08-27 23:41:19 +0000 (Sat, 27 Aug 2011) Log Message: ----------- Updating 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 2011-08-27 23:24:24 UTC (rev 862) +++ pytrainer/trunk/locale/es/LC_MESSAGES/pytrainer_es.po 2011-08-27 23:41:19 UTC (rev 863) @@ -5,17 +5,19 @@ # msgid "" msgstr "" -"Project-Id-Version: pytrainer 1.8.1\n" +"Project-Id-Version: pytrainer 1.9\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-08-15 12:02+0200\n" -"PO-Revision-Date: 2011-08-15 12:03+0100\n" +"POT-Creation-Date: 2011-08-28 01:38+0200\n" +"PO-Revision-Date: 2011-08-28 01:39+0100\n" "Last-Translator: David Garcia Granda <dg...@gm...>\n" -"Language-Team: Spanish <es...@li...>\n" +"Language-Team: Spanish <pyt...@li...>\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-Language: Spanish\n" +"X-Poedit-Country: SPAIN\n" #: glade/calendar.glade:7 msgid "Calendar" @@ -27,7 +29,6 @@ #: glade/equipment.glade:149 #: glade/equipment.glade:406 -#: build/lib/pytrainer/gui/equipment.py:98 #: pytrainer/gui/equipment.py:98 msgid "Description" msgstr "Descripción" @@ -44,15 +45,13 @@ #: glade/equipment.glade:243 #: glade/equipment.glade:499 -#: build/lib/pytrainer/gui/equipment.py:102 #: pytrainer/gui/equipment.py:102 msgid "Active" msgstr "Habilitado" #: glade/equipment.glade:277 #: glade/equipment.glade:533 -#: build/lib/pytrainer/gui/windowimportdata.py:352 -#: pytrainer/gui/windowimportdata.py:352 +#: pytrainer/gui/windowimportdata.py:353 msgid "Notes" msgstr "Notas" @@ -243,15 +242,10 @@ msgstr "<b>Delimitador en el archivo</b>" #: glade/importdata.glade:864 -#: build/lib/pytrainer/gui/windowmain.py:115 -#: build/lib/pytrainer/gui/windowmain.py:130 -#: build/lib/pytrainer/gui/windowmain.py:183 -#: build/lib/pytrainer/gui/windowmain.py:1496 -#: build/lib/pytrainer/gui/dialogselecttrack.py:40 -#: pytrainer/gui/windowmain.py:115 -#: pytrainer/gui/windowmain.py:130 -#: pytrainer/gui/windowmain.py:183 -#: pytrainer/gui/windowmain.py:1496 +#: pytrainer/gui/windowmain.py:116 +#: pytrainer/gui/windowmain.py:131 +#: pytrainer/gui/windowmain.py:184 +#: pytrainer/gui/windowmain.py:1494 #: pytrainer/gui/dialogselecttrack.py:40 msgid "Date" msgstr "Fecha" @@ -275,22 +269,6 @@ msgstr "Descartar" #: glade/importdata.glade:892 -#: glade/newrecord.glade:221 -#: build/lib/pytrainer/recordgraph.py:134 -#: build/lib/pytrainer/recordgraph.py:136 -#: build/lib/pytrainer/recordgraph.py:138 -#: build/lib/pytrainer/recordgraph.py:140 -#: build/lib/pytrainer/recordgraph.py:142 -#: build/lib/pytrainer/recordgraph.py:144 -#: build/lib/pytrainer/recordgraph.py:146 -#: build/lib/pytrainer/monthgraph.py:26 -#: build/lib/pytrainer/heartrategraph.py:36 -#: build/lib/pytrainer/totalgraph.py:24 -#: build/lib/pytrainer/yeargraph.py:26 -#: build/lib/pytrainer/daygraph.py:52 -#: build/lib/pytrainer/daygraph.py:54 -#: build/lib/pytrainer/daygraph.py:56 -#: build/lib/pytrainer/weekgraph.py:28 #: pytrainer/recordgraph.py:134 #: pytrainer/recordgraph.py:136 #: pytrainer/recordgraph.py:138 @@ -322,10 +300,8 @@ msgstr "<b>Columna en el archivo</b>" #: glade/importdata.glade:972 -#: build/lib/pytrainer/gui/windowmain.py:114 -#: build/lib/pytrainer/gui/windowmain.py:1495 -#: pytrainer/gui/windowmain.py:114 -#: pytrainer/gui/windowmain.py:1495 +#: pytrainer/gui/windowmain.py:115 +#: pytrainer/gui/windowmain.py:1493 msgid "Title" msgstr "Título" @@ -346,10 +322,6 @@ msgstr "Velocidad Máx. (km/h)" #: glade/importdata.glade:1037 -#: build/lib/pytrainer/monthgraph.py:29 -#: build/lib/pytrainer/totalgraph.py:27 -#: build/lib/pytrainer/yeargraph.py:29 -#: build/lib/pytrainer/weekgraph.py:31 #: pytrainer/monthgraph.py:29 #: pytrainer/totalgraph.py:27 #: pytrainer/yeargraph.py:29 @@ -359,18 +331,11 @@ #: glade/importdata.glade:1050 #: glade/pytrainer.glade:277 -#: build/lib/pytrainer/gui/windowmain.py:109 -#: build/lib/pytrainer/gui/windowmain.py:117 -#: build/lib/pytrainer/gui/windowmain.py:139 -#: build/lib/pytrainer/gui/windowmain.py:1498 -#: build/lib/pytrainer/gui/windowimportdata.py:352 -#: build/lib/pytrainer/gui/windowrecord.py:210 -#: build/lib/pytrainer/gui/windowprofile.py:65 -#: pytrainer/gui/windowmain.py:109 -#: pytrainer/gui/windowmain.py:117 -#: pytrainer/gui/windowmain.py:139 -#: pytrainer/gui/windowmain.py:1498 -#: pytrainer/gui/windowimportdata.py:352 +#: pytrainer/gui/windowmain.py:110 +#: pytrainer/gui/windowmain.py:118 +#: pytrainer/gui/windowmain.py:140 +#: pytrainer/gui/windowmain.py:1496 +#: pytrainer/gui/windowimportdata.py:353 #: pytrainer/gui/windowrecord.py:210 #: pytrainer/gui/windowprofile.py:65 msgid "Sport" @@ -385,7 +350,6 @@ msgstr "Pulsaciones máximas (ppm)" #: glade/importdata.glade:1089 -#: build/lib/pytrainer/recordgraph.py:138 #: pytrainer/recordgraph.py:138 msgid "Pace (min/km)" msgstr "Ritmo (min/km)" @@ -395,9 +359,8 @@ msgstr "Ritmo máximo(min/km)" #: glade/importdata.glade:1115 -#: glade/newrecord.glade:1096 -#: build/lib/pytrainer/gui/windowmain.py:166 -#: pytrainer/gui/windowmain.py:166 +#: glade/newrecord.glade:1094 +#: pytrainer/gui/windowmain.py:167 msgid "Comments" msgstr "Comentarios" @@ -406,7 +369,7 @@ msgstr "Forzar deporte a:" #: glade/importdata.glade:1323 -#: glade/newrecord.glade:405 +#: glade/newrecord.glade:404 msgid " " msgstr " " @@ -437,8 +400,7 @@ msgstr "<b>Importar desde fichero CSV</b>" #: glade/newrecord.glade:7 -#: build/lib/pytrainer/gui/windowmain.py:2162 -#: pytrainer/gui/windowmain.py:2162 +#: pytrainer/gui/windowmain.py:2160 msgid "New Entry" msgstr "Nueva entrada" @@ -462,100 +424,97 @@ msgid "<b>Main</b>" msgstr "<b>Principal</b>" -#: glade/newrecord.glade:231 -#: glade/newrecord.glade:356 -#: glade/newrecord.glade:560 -#: glade/newrecord.glade:699 -#: glade/newrecord.glade:960 +#: glade/newrecord.glade:221 +msgid "Distance (Km):" +msgstr "Distancia (km):" + +#: glade/newrecord.glade:230 +#: glade/newrecord.glade:355 +#: glade/newrecord.glade:558 +#: glade/newrecord.glade:697 +#: glade/newrecord.glade:958 #: glade/profile.glade:1548 msgid "Calculate" msgstr "Calcular" -#: glade/newrecord.glade:249 +#: glade/newrecord.glade:248 msgid "Duration:" msgstr "Duración:" -#: glade/newrecord.glade:280 -#: glade/newrecord.glade:307 +#: glade/newrecord.glade:279 +#: glade/newrecord.glade:306 msgid ":" msgstr ":" -#: glade/newrecord.glade:377 +#: glade/newrecord.glade:376 msgid "Date:" msgstr "Fecha:" -#: glade/newrecord.glade:446 +#: glade/newrecord.glade:445 msgid "Start Time:" msgstr "Hora de comienzo:" -#: glade/newrecord.glade:462 +#: glade/newrecord.glade:461 msgid "12:00:00" msgstr "12:00:00" -#: glade/newrecord.glade:487 +#: glade/newrecord.glade:486 #: glade/profile.glade:1586 msgid "<b>General</b>" msgstr "<b>General:</b>" -#: glade/newrecord.glade:523 +#: glade/newrecord.glade:522 msgid "Max (km/h):" -msgstr "Punta (km/h)" +msgstr "Velocidad Máx. (km/h):" -#: glade/newrecord.glade:548 +#: glade/newrecord.glade:547 msgid "Average (km/h)" -msgstr "Media (km/h)" +msgstr "Velocidad media (km/h)" -#: glade/newrecord.glade:595 +#: glade/newrecord.glade:593 msgid "<b>Speed</b>" msgstr "<b>Velocidad</b>" -#: glade/newrecord.glade:614 +#: glade/newrecord.glade:612 msgid "Quick Entry" msgstr "Entrada" -#: glade/newrecord.glade:646 +#: glade/newrecord.glade:644 msgid "Max (min/km):" -msgstr "Max (min/km)" +msgstr "Máx (min/km):" -#: glade/newrecord.glade:673 +#: glade/newrecord.glade:671 msgid "Pace (min/km):" -msgstr "Ritmo (min/km)" +msgstr "Ritmo (min/km):" -#: glade/newrecord.glade:720 +#: glade/newrecord.glade:718 msgid "<b>Pace</b>" msgstr "<b>Ritmo</b>" -#: glade/newrecord.glade:756 +#: glade/newrecord.glade:754 msgid "Ascent:" msgstr "Ascenso:" -#: glade/newrecord.glade:782 +#: glade/newrecord.glade:780 msgid "Descent:" msgstr "Descenso:" -#: glade/newrecord.glade:815 +#: glade/newrecord.glade:813 msgid "<b>Accumulated Altitude Change</b>" msgstr "<b>Desnivel acumulado:</b>" -#: glade/newrecord.glade:852 +#: glade/newrecord.glade:850 msgid "Max (bpm):" -msgstr "Pulsaciones máximas" +msgstr "Pico (ppm)" -#: glade/newrecord.glade:864 +#: glade/newrecord.glade:862 msgid "Heart rate:" -msgstr "Pulsaciones" +msgstr "Pulsaciones:" -#: glade/newrecord.glade:904 -#: build/lib/pytrainer/gui/windowmain.py:121 -#: build/lib/pytrainer/gui/windowmain.py:164 -#: build/lib/pytrainer/gui/windowmain.py:1502 -#: build/lib/pytrainer/monthgraph.py:30 -#: build/lib/pytrainer/totalgraph.py:28 -#: build/lib/pytrainer/yeargraph.py:30 -#: build/lib/pytrainer/weekgraph.py:32 -#: pytrainer/gui/windowmain.py:121 -#: pytrainer/gui/windowmain.py:164 -#: pytrainer/gui/windowmain.py:1502 +#: glade/newrecord.glade:902 +#: pytrainer/gui/windowmain.py:122 +#: pytrainer/gui/windowmain.py:165 +#: pytrainer/gui/windowmain.py:1500 #: pytrainer/monthgraph.py:30 #: pytrainer/totalgraph.py:28 #: pytrainer/yeargraph.py:30 @@ -563,31 +522,31 @@ msgid "Calories" msgstr "Calorías" -#: glade/newrecord.glade:933 +#: glade/newrecord.glade:931 msgid "<small><b>Note:</b> In order to calculate the calories you must set the sport MET (in Preferences->Sport) </small>" msgstr "<small><b>Nota:</b> para el cálculo de calorías es necesario introducir el valor de MET del deporte (en Preferencias -> Deporte)</small>" -#: glade/newrecord.glade:1007 +#: glade/newrecord.glade:1005 msgid "<b>Heart Rate</b>" msgstr "<b>Pulsaciones</b>" -#: glade/newrecord.glade:1029 +#: glade/newrecord.glade:1027 msgid "Advanced" msgstr "Avanzado" -#: glade/newrecord.glade:1081 +#: glade/newrecord.glade:1079 msgid "<b>Comments</b>" msgstr "<b>Comentarios</b>" -#: glade/newrecord.glade:1136 +#: glade/newrecord.glade:1134 msgid "<i>There are no active equipment items.</i>" msgstr "<i>No hay piezas de material activas</i>" -#: glade/newrecord.glade:1190 +#: glade/newrecord.glade:1188 msgid "<b>Associated Equipment</b>" msgstr "<b>Material asociado</b>" -#: glade/newrecord.glade:1205 +#: glade/newrecord.glade:1203 #: glade/profile.glade:1446 msgid "Equipment" msgstr "Equipamiento" @@ -752,21 +711,17 @@ msgstr "M.E.T." #: glade/profile.glade:1193 -#: build/lib/pytrainer/gui/windowprofile.py:65 #: pytrainer/gui/windowprofile.py:65 msgid "Extra Weight" msgstr "Peso extra" #: glade/profile.glade:1238 -#: build/lib/pytrainer/gui/windowprofile.py:65 #: pytrainer/gui/windowprofile.py:65 msgid "Maximum Pace" msgstr "Ritmo más rápido" #: glade/profile.glade:1265 -#: build/lib/pytrainer/gui/windowmain.py:187 -#: build/lib/pytrainer/gui/windowprofile.py:65 -#: pytrainer/gui/windowmain.py:187 +#: pytrainer/gui/windowmain.py:188 #: pytrainer/gui/windowprofile.py:65 msgid "Color" msgstr "Color" @@ -808,8 +763,7 @@ msgstr "Basado en porcentajes" #: glade/profile.glade:1651 -#: build/lib/pytrainer/gui/windowmain.py:792 -#: pytrainer/gui/windowmain.py:792 +#: pytrainer/gui/windowmain.py:790 msgid "Karvonen method" msgstr "Karvonen" @@ -822,18 +776,11 @@ msgstr "<b>Zonas de frecuencia cardiaca</b>" #: glade/profile.glade:1733 -#: build/lib/pytrainer/recordgraph.py:140 -#: build/lib/pytrainer/lib/activity.py:433 -#: build/lib/pytrainer/lib/activity.py:435 -#: build/lib/pytrainer/lib/activity.py:445 -#: build/lib/pytrainer/lib/activity.py:515 -#: build/lib/pytrainer/heartrategraph.py:36 -#: build/lib/pytrainer/daygraph.py:56 #: pytrainer/recordgraph.py:140 -#: pytrainer/lib/activity.py:433 -#: pytrainer/lib/activity.py:435 -#: pytrainer/lib/activity.py:445 -#: pytrainer/lib/activity.py:515 +#: pytrainer/lib/activity.py:438 +#: pytrainer/lib/activity.py:440 +#: pytrainer/lib/activity.py:450 +#: pytrainer/lib/activity.py:520 #: pytrainer/heartrategraph.py:36 #: pytrainer/daygraph.py:56 msgid "Heart Rate" @@ -1021,8 +968,7 @@ #: glade/pytrainer.glade:3755 #: glade/pytrainer.glade:4409 #: glade/pytrainer.glade:5268 -#: build/lib/pytrainer/gui/windowmain.py:108 -#: pytrainer/gui/windowmain.py:108 +#: pytrainer/gui/windowmain.py:109 msgid "Km" msgstr "km" @@ -1035,20 +981,13 @@ #: glade/pytrainer.glade:4651 #: glade/pytrainer.glade:5311 #: glade/pytrainer.glade:5327 -#: build/lib/pytrainer/gui/windowmain.py:918 -#: build/lib/pytrainer/gui/windowmain.py:919 -#: build/lib/pytrainer/gui/windowmain.py:1047 -#: build/lib/pytrainer/gui/windowmain.py:1048 -#: build/lib/pytrainer/gui/windowmain.py:1129 -#: build/lib/pytrainer/gui/windowmain.py:1130 -#: build/lib/pytrainer/lib/activity.py:202 -#: pytrainer/gui/windowmain.py:918 -#: pytrainer/gui/windowmain.py:919 -#: pytrainer/gui/windowmain.py:1047 -#: pytrainer/gui/windowmain.py:1048 -#: pytrainer/gui/windowmain.py:1129 -#: pytrainer/gui/windowmain.py:1130 -#: pytrainer/lib/activity.py:202 +#: pytrainer/gui/windowmain.py:916 +#: pytrainer/gui/windowmain.py:917 +#: pytrainer/gui/windowmain.py:1045 +#: pytrainer/gui/windowmain.py:1046 +#: pytrainer/gui/windowmain.py:1127 +#: pytrainer/gui/windowmain.py:1128 +#: pytrainer/lib/activity.py:203 msgid "km/h" msgstr "km/h" @@ -1057,7 +996,7 @@ msgstr "<b>Material:</b>" #: glade/pytrainer.glade:935 -msgid "<b>Run / Rest:</b>" +msgid "<b>Active / Rest:</b>" msgstr "<b>Activo / Descanso:</b>" #: glade/pytrainer.glade:962 @@ -1073,8 +1012,7 @@ msgstr "<b>Título:</b>" #: glade/pytrainer.glade:1137 -#: build/lib/pytrainer/gui/windowmain.py:1724 -#: pytrainer/gui/windowmain.py:1724 +#: pytrainer/gui/windowmain.py:1722 msgid "Show graph display options" msgstr "Mostrar opciones del gráfico" @@ -1274,10 +1212,8 @@ #: glade/pytrainer.glade:4786 #: glade/pytrainer.glade:5136 #: glade/pytrainer.glade:5343 -#: build/lib/pytrainer/lib/activity.py:435 -#: build/lib/pytrainer/lib/activity.py:515 -#: pytrainer/lib/activity.py:435 -#: pytrainer/lib/activity.py:515 +#: pytrainer/lib/activity.py:440 +#: pytrainer/lib/activity.py:520 msgid "bpm" msgstr "ppm" @@ -1351,20 +1287,13 @@ #: glade/pytrainer.glade:4770 #: glade/pytrainer.glade:5408 #: glade/pytrainer.glade:5424 -#: build/lib/pytrainer/gui/windowmain.py:920 -#: build/lib/pytrainer/gui/windowmain.py:921 -#: build/lib/pytrainer/gui/windowmain.py:1049 -#: build/lib/pytrainer/gui/windowmain.py:1050 -#: build/lib/pytrainer/gui/windowmain.py:1131 -#: build/lib/pytrainer/gui/windowmain.py:1132 -#: build/lib/pytrainer/lib/activity.py:203 -#: pytrainer/gui/windowmain.py:920 -#: pytrainer/gui/windowmain.py:921 -#: pytrainer/gui/windowmain.py:1049 -#: pytrainer/gui/windowmain.py:1050 -#: pytrainer/gui/windowmain.py:1131 -#: pytrainer/gui/windowmain.py:1132 -#: pytrainer/lib/activity.py:203 +#: pytrainer/gui/windowmain.py:918 +#: pytrainer/gui/windowmain.py:919 +#: pytrainer/gui/windowmain.py:1047 +#: pytrainer/gui/windowmain.py:1048 +#: pytrainer/gui/windowmain.py:1129 +#: pytrainer/gui/windowmain.py:1130 +#: pytrainer/lib/activity.py:204 msgid "min/km" msgstr "min/km" @@ -1379,12 +1308,9 @@ #: glade/pytrainer.glade:4235 #: glade/pytrainer.glade:4889 #: glade/pytrainer.glade:5542 -#: build/lib/pytrainer/gui/windowmain.py:2068 -#: build/lib/pytrainer/gui/windowmain.py:2070 -#: build/lib/pytrainer/lib/activity.py:204 +#: pytrainer/gui/windowmain.py:2066 #: pytrainer/gui/windowmain.py:2068 -#: pytrainer/gui/windowmain.py:2070 -#: pytrainer/lib/activity.py:204 +#: pytrainer/lib/activity.py:205 msgid "m" msgstr "m" @@ -1515,15 +1441,12 @@ msgstr "Buscar" #: glade/pytrainer.glade:6293 -#: build/lib/pytrainer/lib/listview.py:3 -#: build/lib/pytrainer/lib/listview.py:10 #: pytrainer/lib/listview.py:3 #: pytrainer/lib/listview.py:10 msgid "All Distances" msgstr "Distancia" #: glade/pytrainer.glade:6302 -#: build/lib/pytrainer/lib/listview.py:35 #: pytrainer/lib/listview.py:35 msgid "All Durations" msgstr "Duración" @@ -1597,927 +1520,687 @@ msgid "Warning" msgstr "Advertencia" -#: build/lib/pytrainer/gui/windowmain.py:106 -#: pytrainer/gui/windowmain.py:106 +#: pytrainer/gui/windowmain.py:107 msgid "Miles" msgstr "Millas" -#: build/lib/pytrainer/gui/windowmain.py:109 -#: build/lib/pytrainer/gui/windowmain.py:113 -#: build/lib/pytrainer/gui/windowmain.py:126 -#: build/lib/pytrainer/gui/windowmain.py:129 -#: build/lib/pytrainer/gui/windowmain.py:138 -#: build/lib/pytrainer/gui/windowmain.py:172 -#: build/lib/pytrainer/gui/windowmain.py:181 -#: pytrainer/gui/windowmain.py:109 -#: pytrainer/gui/windowmain.py:113 -#: pytrainer/gui/windowmain.py:126 -#: pytrainer/gui/windowmain.py:129 -#: pytrainer/gui/windowmain.py:138 -#: pytrainer/gui/windowmain.py:172 -#: pytrainer/gui/windowmain.py:181 +#: pytrainer/gui/windowmain.py:110 +#: pytrainer/gui/windowmain.py:114 +#: pytrainer/gui/windowmain.py:127 +#: pytrainer/gui/windowmain.py:130 +#: pytrainer/gui/windowmain.py:139 +#: pytrainer/gui/windowmain.py:173 +#: pytrainer/gui/windowmain.py:182 msgid "id" msgstr "id" -#: build/lib/pytrainer/gui/windowmain.py:109 -#: pytrainer/gui/windowmain.py:109 +#: pytrainer/gui/windowmain.py:110 msgid "Start" msgstr "Comienzo" -#: build/lib/pytrainer/gui/windowmain.py:116 -#: build/lib/pytrainer/gui/windowmain.py:156 -#: build/lib/pytrainer/gui/windowmain.py:174 -#: build/lib/pytrainer/gui/windowmain.py:184 -#: build/lib/pytrainer/gui/windowmain.py:571 -#: build/lib/pytrainer/gui/windowmain.py:1497 -#: build/lib/pytrainer/gui/windowimportdata.py:352 -#: build/lib/pytrainer/gui/windowrecord.py:210 -#: build/lib/pytrainer/lib/activity.py:313 -#: build/lib/pytrainer/lib/activity.py:324 -#: build/lib/pytrainer/lib/activity.py:396 -#: build/lib/pytrainer/lib/activity.py:407 -#: build/lib/pytrainer/lib/activity.py:416 -#: build/lib/pytrainer/lib/activity.py:425 -#: build/lib/pytrainer/lib/activity.py:434 -#: build/lib/pytrainer/lib/activity.py:444 -#: build/lib/pytrainer/lib/activity.py:453 -#: build/lib/pytrainer/lib/activity.py:514 -#: build/lib/pytrainer/extensions/googlemaps.py:129 -#: build/lib/pytrainer/extensions/osm.py:105 -#: pytrainer/gui/windowmain.py:116 -#: pytrainer/gui/windowmain.py:156 -#: pytrainer/gui/windowmain.py:174 -#: pytrainer/gui/windowmain.py:184 -#: pytrainer/gui/windowmain.py:571 -#: pytrainer/gui/windowmain.py:1497 -#: pytrainer/gui/windowimportdata.py:352 +#: pytrainer/gui/windowmain.py:117 +#: pytrainer/gui/windowmain.py:157 +#: pytrainer/gui/windowmain.py:175 +#: pytrainer/gui/windowmain.py:185 +#: pytrainer/gui/windowmain.py:569 +#: pytrainer/gui/windowmain.py:1495 +#: pytrainer/gui/windowimportdata.py:353 #: pytrainer/gui/windowrecord.py:210 -#: pytrainer/lib/activity.py:313 -#: pytrainer/lib/activity.py:324 -#: pytrainer/lib/activity.py:396 -#: pytrainer/lib/activity.py:407 -#: pytrainer/lib/activity.py:416 -#: pytrainer/lib/activity.py:425 -#: pytrainer/lib/activity.py:434 -#: pytrainer/lib/activity.py:444 -#: pytrainer/lib/activity.py:453 -#: pytrainer/lib/activity.py:514 +#: pytrainer/lib/activity.py:318 +#: pytrainer/lib/activity.py:329 +#: pytrainer/lib/activity.py:401 +#: pytrainer/lib/activity.py:412 +#: pytrainer/lib/activity.py:421 +#: pytrainer/lib/activity.py:430 +#: pytrainer/lib/activity.py:439 +#: pytrainer/lib/activity.py:449 +#: pytrainer/lib/activity.py:458 +#: pytrainer/lib/activity.py:519 #: pytrainer/extensions/googlemaps.py:129 #: pytrainer/extensions/osm.py:105 msgid "Distance" msgstr "Distancia" -#: build/lib/pytrainer/gui/windowmain.py:118 -#: build/lib/pytrainer/gui/windowmain.py:157 -#: build/lib/pytrainer/gui/windowmain.py:175 -#: build/lib/pytrainer/gui/windowmain.py:185 -#: build/lib/pytrainer/gui/windowmain.py:572 -#: build/lib/pytrainer/gui/windowmain.py:1499 -#: build/lib/pytrainer/extensions/googlemaps.py:129 -#: build/lib/pytrainer/extensions/osm.py:104 -#: pytrainer/gui/windowmain.py:118 -#: pytrainer/gui/windowmain.py:157 -#: pytrainer/gui/windowmain.py:175 -#: pytrainer/gui/windowmain.py:185 -#: pytrainer/gui/windowmain.py:572 -#: pytrainer/gui/windowmain.py:1499 +#: pytrainer/gui/windowmain.py:119 +#: pytrainer/gui/windowmain.py:158 +#: pytrainer/gui/windowmain.py:176 +#: pytrainer/gui/windowmain.py:186 +#: pytrainer/gui/windowmain.py:570 +#: pytrainer/gui/windowmain.py:1497 #: pytrainer/extensions/googlemaps.py:129 #: pytrainer/extensions/osm.py:104 msgid "Time" msgstr "Tiempo" -#: build/lib/pytrainer/gui/windowmain.py:119 -#: pytrainer/gui/windowmain.py:119 +#: pytrainer/gui/windowmain.py:120 msgid "⌀ HR" msgstr "⌀ FC" -#: build/lib/pytrainer/gui/windowmain.py:120 -#: pytrainer/gui/windowmain.py:120 +#: pytrainer/gui/windowmain.py:121 msgid "⌀ Speed" msgstr "⌀ Velocidad" -#: build/lib/pytrainer/gui/windowmain.py:126 -#: pytrainer/gui/windowmain.py:126 +#: pytrainer/gui/windowmain.py:127 msgid "Waypoint" msgstr "Waypoint" -#: build/lib/pytrainer/gui/windowmain.py:131 -#: pytrainer/gui/windowmain.py:131 +#: pytrainer/gui/windowmain.py:132 msgid "Weight" msgstr "Peso" -#: build/lib/pytrainer/gui/windowmain.py:132 -#: pytrainer/gui/windowmain.py:132 +#: pytrainer/gui/windowmain.py:133 msgid "Body Fat %" msgstr "Grasa corporal %" -#: build/lib/pytrainer/gui/windowmain.py:133 -#: pytrainer/gui/windowmain.py:133 +#: pytrainer/gui/windowmain.py:134 msgid "Resting HR" msgstr "FC en reposo" -#: build/lib/pytrainer/gui/windowmain.py:134 -#: build/lib/pytrainer/gui/windowmain.py:146 -#: build/lib/pytrainer/gui/windowmain.py:163 -#: pytrainer/gui/windowmain.py:134 -#: pytrainer/gui/windowmain.py:146 -#: pytrainer/gui/windowmain.py:163 +#: pytrainer/gui/windowmain.py:135 +#: pytrainer/gui/windowmain.py:147 +#: pytrainer/gui/windowmain.py:164 msgid "Max HR" msgstr "FC max" -#: build/lib/pytrainer/gui/windowmain.py:140 -#: pytrainer/gui/windowmain.py:140 +#: pytrainer/gui/windowmain.py:141 msgid "Records" msgstr "Registros" -#: build/lib/pytrainer/gui/windowmain.py:141 -#: pytrainer/gui/windowmain.py:141 +#: pytrainer/gui/windowmain.py:142 msgid "Total duration" msgstr "Duración" -#: build/lib/pytrainer/gui/windowmain.py:142 -#: pytrainer/gui/windowmain.py:142 +#: pytrainer/gui/windowmain.py:143 msgid "Total distance" msgstr "Distancia" -#: build/lib/pytrainer/gui/windowmain.py:143 -#: build/lib/pytrainer/gui/windowmain.py:158 -#: pytrainer/gui/windowmain.py:143 -#: pytrainer/gui/windowmain.py:158 +#: pytrainer/gui/windowmain.py:144 +#: pytrainer/gui/windowmain.py:159 msgid "Avg speed" msgstr "Velocidad" -#: build/lib/pytrainer/gui/windowmain.py:144 -#: build/lib/pytrainer/gui/windowmain.py:159 -#: pytrainer/gui/windowmain.py:144 -#: pytrainer/gui/windowmain.py:159 +#: pytrainer/gui/windowmain.py:145 +#: pytrainer/gui/windowmain.py:160 msgid "Max speed" msgstr "Velocidad Máx." -#: build/lib/pytrainer/gui/windowmain.py:145 -#: build/lib/pytrainer/gui/windowmain.py:162 -#: pytrainer/gui/windowmain.py:145 -#: pytrainer/gui/windowmain.py:162 +#: pytrainer/gui/windowmain.py:146 +#: pytrainer/gui/windowmain.py:163 msgid "Avg HR" msgstr "FC med" -#: build/lib/pytrainer/gui/windowmain.py:147 -#: pytrainer/gui/windowmain.py:147 +#: pytrainer/gui/windowmain.py:148 msgid "Max duration" msgstr "Duración" -#: build/lib/pytrainer/gui/windowmain.py:148 -#: pytrainer/gui/windowmain.py:148 +#: pytrainer/gui/windowmain.py:149 msgid "Max distance" msgstr "Distancia" -#: build/lib/pytrainer/gui/windowmain.py:154 -#: pytrainer/gui/windowmain.py:154 +#: pytrainer/gui/windowmain.py:155 msgid "Lap" msgstr "Vuelta" -#: build/lib/pytrainer/gui/windowmain.py:155 -#: pytrainer/gui/windowmain.py:155 +#: pytrainer/gui/windowmain.py:156 msgid "Trigger" msgstr "Activador" -#: build/lib/pytrainer/gui/windowmain.py:160 -#: pytrainer/gui/windowmain.py:160 +#: pytrainer/gui/windowmain.py:161 msgid "Avg pace" msgstr "Ritmo" -#: build/lib/pytrainer/gui/windowmain.py:161 -#: pytrainer/gui/windowmain.py:161 +#: pytrainer/gui/windowmain.py:162 msgid "Max pace" msgstr "Pico ritmo" -#: build/lib/pytrainer/gui/windowmain.py:165 -#: pytrainer/gui/windowmain.py:165 +#: pytrainer/gui/windowmain.py:166 msgid "Intensity" msgstr "Intensidad" -#: build/lib/pytrainer/gui/windowmain.py:173 -#: pytrainer/gui/windowmain.py:173 +#: pytrainer/gui/windowmain.py:174 msgid "Race" msgstr "Carrera" -#: build/lib/pytrainer/gui/windowmain.py:182 -#: pytrainer/gui/windowmain.py:182 +#: pytrainer/gui/windowmain.py:183 msgid "Rank" msgstr "Posición" -#: build/lib/pytrainer/gui/windowmain.py:186 -#: build/lib/pytrainer/recordgraph.py:136 -#: build/lib/pytrainer/lib/activity.py:325 -#: build/lib/pytrainer/lib/activity.py:415 -#: build/lib/pytrainer/lib/activity.py:417 -#: pytrainer/gui/windowmain.py:186 +#: pytrainer/gui/windowmain.py:187 #: pytrainer/recordgraph.py:136 -#: pytrainer/lib/activity.py:325 -#: pytrainer/lib/activity.py:415 -#: pytrainer/lib/activity.py:417 +#: pytrainer/lib/activity.py:330 +#: pytrainer/lib/activity.py:420 +#: pytrainer/lib/activity.py:422 msgid "Speed" msgstr "Velocidad" -#: build/lib/pytrainer/gui/windowmain.py:318 -#: pytrainer/gui/windowmain.py:318 +#: pytrainer/gui/windowmain.py:319 msgid "d" msgstr "d" -#: build/lib/pytrainer/gui/windowmain.py:561 -#: pytrainer/gui/windowmain.py:561 +#: pytrainer/gui/windowmain.py:559 msgid "Show on X Axis" msgstr "Mostrar en eje X" -#: build/lib/pytrainer/gui/windowmain.py:562 -#: pytrainer/gui/windowmain.py:562 +#: pytrainer/gui/windowmain.py:560 msgid "Show on Y1 Axis" msgstr "Mostrar en eje Y1" -#: build/lib/pytrainer/gui/windowmain.py:563 -#: pytrainer/gui/windowmain.py:563 +#: pytrainer/gui/windowmain.py:561 msgid "Show on Y2 Axis" msgstr "Mostrar en eje Y2" -#: build/lib/pytrainer/gui/windowmain.py:564 -#: pytrainer/gui/windowmain.py:564 +#: pytrainer/gui/windowmain.py:562 msgid "Axis Limits" msgstr "Límites de ejes" -#: build/lib/pytrainer/gui/windowmain.py:573 -#: pytrainer/gui/windowmain.py:573 +#: pytrainer/gui/windowmain.py:571 msgid "Laps" msgstr "Vueltas" -#: build/lib/pytrainer/gui/windowmain.py:574 -#: pytrainer/gui/windowmain.py:574 +#: pytrainer/gui/windowmain.py:572 msgid "Left Axis Grid" msgstr "Cuadrícula eje izquierdo" -#: build/lib/pytrainer/gui/windowmain.py:575 -#: pytrainer/gui/windowmain.py:575 +#: pytrainer/gui/windowmain.py:573 msgid "Right Axis Grid" msgstr "Cuadrícula eje derecho" -#: build/lib/pytrainer/gui/windowmain.py:576 -#: pytrainer/gui/windowmain.py:576 +#: pytrainer/gui/windowmain.py:574 msgid "X Axis Grid" msgstr "Cuadrícula eje X" -#: build/lib/pytrainer/gui/windowmain.py:637 -#: pytrainer/gui/windowmain.py:637 +#: pytrainer/gui/windowmain.py:635 msgid "Reset Limits" msgstr "Borrar límites" -#: build/lib/pytrainer/gui/windowmain.py:639 -#: pytrainer/gui/windowmain.py:639 +#: pytrainer/gui/windowmain.py:637 msgid "Set Limits" msgstr "Establecer límites" -#: build/lib/pytrainer/gui/windowmain.py:794 -#: pytrainer/gui/windowmain.py:794 +#: pytrainer/gui/windowmain.py:792 msgid "Percentages method" msgstr "basado en porcentajes" -#: build/lib/pytrainer/gui/windowmain.py:807 -#: pytrainer/gui/windowmain.py:807 +#: pytrainer/gui/windowmain.py:805 msgid "800 m" msgstr "800 m" -#: build/lib/pytrainer/gui/windowmain.py:808 -#: pytrainer/gui/windowmain.py:808 +#: pytrainer/gui/windowmain.py:806 msgid "1500 m" msgstr "1500 m" -#: build/lib/pytrainer/gui/windowmain.py:809 -#: pytrainer/gui/windowmain.py:809 +#: pytrainer/gui/windowmain.py:807 msgid "5K" msgstr "5 km" -#: build/lib/pytrainer/gui/windowmain.py:810 -#: pytrainer/gui/windowmain.py:810 +#: pytrainer/gui/windowmain.py:808 msgid "7K" msgstr "7 km" -#: build/lib/pytrainer/gui/windowmain.py:811 -#: pytrainer/gui/windowmain.py:811 +#: pytrainer/gui/windowmain.py:809 msgid "10K" msgstr "10 km" -#: build/lib/pytrainer/gui/windowmain.py:812 -#: pytrainer/gui/windowmain.py:812 +#: pytrainer/gui/windowmain.py:810 msgid "Half marathon" msgstr "Media maratón" -#: build/lib/pytrainer/gui/windowmain.py:813 -#: pytrainer/gui/windowmain.py:813 +#: pytrainer/gui/windowmain.py:811 msgid "Marathon" msgstr "Maratón" -#: build/lib/pytrainer/gui/windowmain.py:814 -#: pytrainer/gui/windowmain.py:814 +#: pytrainer/gui/windowmain.py:812 msgid "100K" msgstr "100 km" -#: build/lib/pytrainer/gui/windowmain.py:911 -#: build/lib/pytrainer/gui/windowmain.py:1040 -#: build/lib/pytrainer/gui/windowmain.py:1122 -#: build/lib/pytrainer/lib/activity.py:196 +#: pytrainer/gui/windowmain.py:909 +#: pytrainer/gui/windowmain.py:1038 +#: pytrainer/gui/windowmain.py:1120 +#: pytrainer/lib/activity.py:197 +msgid "miles" +msgstr "millas" + +#: pytrainer/gui/windowmain.py:910 #: pytrainer/gui/windowmain.py:911 +#: pytrainer/gui/windowmain.py:1039 #: pytrainer/gui/windowmain.py:1040 +#: pytrainer/gui/windowmain.py:1121 #: pytrainer/gui/windowmain.py:1122 -#: pytrainer/lib/activity.py:196 -msgid "miles" -msgstr "millas" +#: pytrainer/lib/activity.py:198 +msgid "miles/h" +msgstr "millas/h" -#: build/lib/pytrainer/gui/windowmain.py:912 -#: build/lib/pytrainer/gui/windowmain.py:913 -#: build/lib/pytrainer/gui/windowmain.py:1041 -#: build/lib/pytrainer/gui/windowmain.py:1042 -#: build/lib/pytrainer/gui/windowmain.py:1123 -#: build/lib/pytrainer/gui/windowmain.py:1124 -#: build/lib/pytrainer/lib/activity.py:197 #: pytrainer/gui/windowmain.py:912 #: pytrainer/gui/windowmain.py:913 #: pytrainer/gui/windowmain.py:1041 #: pytrainer/gui/windowmain.py:1042 #: pytrainer/gui/windowmain.py:1123 #: pytrainer/gui/windowmain.py:1124 -#: pytrainer/lib/activity.py:197 -msgid "miles/h" -msgstr "millas/h" +#: pytrainer/lib/activity.py:199 +msgid "min/mile" +msgstr "min/milla" -#: build/lib/pytrainer/gui/windowmain.py:914 -#: build/lib/pytrainer/gui/windowmain.py:915 -#: build/lib/pytrainer/gui/windowmain.py:1043 -#: build/lib/pytrainer/gui/windowmain.py:1044 -#: build/lib/pytrainer/gui/windowmain.py:1125 -#: build/lib/pytrainer/gui/windowmain.py:1126 -#: build/lib/pytrainer/lib/activity.py:198 -#: pytrainer/gui/windowmain.py:914 #: pytrainer/gui/windowmain.py:915 -#: pytrainer/gui/windowmain.py:1043 #: pytrainer/gui/windowmain.py:1044 -#: pytrainer/gui/windowmain.py:1125 #: pytrainer/gui/windowmain.py:1126 -#: pytrainer/lib/activity.py:198 -msgid "min/mile" -msgstr "min/milla" - -#: build/lib/pytrainer/gui/windowmain.py:917 -#: build/lib/pytrainer/gui/windowmain.py:1046 -#: build/lib/pytrainer/gui/windowmain.py:1128 -#: build/lib/pytrainer/lib/activity.py:201 -#: pytrainer/gui/windowmain.py:917 -#: pytrainer/gui/windowmain.py:1046 -#: pytrainer/gui/windowmain.py:1128 -#: pytrainer/lib/activity.py:201 +#: pytrainer/lib/activity.py:202 msgid "km" msgstr "km" -#: build/lib/pytrainer/gui/windowmain.py:1500 -#: build/lib/pytrainer/recordgraph.py:144 -#: pytrainer/gui/windowmain.py:1500 +#: pytrainer/gui/windowmain.py:1498 #: pytrainer/recordgraph.py:144 msgid "Beats" msgstr "Pulsaciones" -#: build/lib/pytrainer/gui/windowmain.py:1501 -#: pytrainer/gui/windowmain.py:1501 +#: pytrainer/gui/windowmain.py:1499 msgid "Average" msgstr "Media" -#: build/lib/pytrainer/gui/windowmain.py:1720 -#: pytrainer/gui/windowmain.py:1720 +#: pytrainer/gui/windowmain.py:1718 msgid "Hide graph display options" msgstr "Ocultar configuración de visualización gráfica" -#: build/lib/pytrainer/gui/windowmain.py:2058 -#: pytrainer/gui/windowmain.py:2058 +#: pytrainer/gui/windowmain.py:2056 msgid "lap" msgstr "vuelta" -#: build/lib/pytrainer/gui/windowmain.py:2068 -#: build/lib/pytrainer/gui/drawArea.py:165 -#: build/lib/pytrainer/extensions/googlemaps.py:127 -#: build/lib/pytrainer/extensions/osm.py:102 -#: pytrainer/gui/windowmain.py:2068 +#: pytrainer/gui/windowmain.py:2066 #: pytrainer/gui/drawArea.py:165 #: pytrainer/extensions/googlemaps.py:127 #: pytrainer/extensions/osm.py:102 msgid "h" msgstr "h" -#: build/lib/pytrainer/gui/windowmain.py:2068 -#: build/lib/pytrainer/gui/windowmain.py:2070 +#: pytrainer/gui/windowmain.py:2066 #: pytrainer/gui/windowmain.py:2068 -#: pytrainer/gui/windowmain.py:2070 msgid "s" msgstr "s" -#: build/lib/pytrainer/gui/windowmain.py:2158 -#: build/lib/pytrainer/record.py:63 -#: pytrainer/gui/windowmain.py:2158 -#: pytrainer/record.py:63 +#: pytrainer/gui/windowmain.py:2156 +#: pytrainer/record.py:67 msgid "Edit Entry" msgstr "Editar entrada" -#: build/lib/pytrainer/gui/windowmain.py:2169 -#: pytrainer/gui/windowmain.py:2169 +#: pytrainer/gui/windowmain.py:2167 msgid "Delete Entry" msgstr "Borrar entrada" -#: build/lib/pytrainer/gui/windowmain.py:2193 -#: pytrainer/gui/windowmain.py:2193 +#: pytrainer/gui/windowmain.py:2191 msgid "Create Athlete Entry" msgstr "Crear entrada de atleta" -#: build/lib/pytrainer/gui/windowmain.py:2197 -#: pytrainer/gui/windowmain.py:2197 +#: pytrainer/gui/windowmain.py:2195 msgid "Edit Athlete Entry" msgstr "Editar atleta" -#: build/lib/pytrainer/gui/windowmain.py:2210 -#: pytrainer/gui/windowmain.py:2210 +#: pytrainer/gui/windowmain.py:2208 msgid "<b>Date</b>" msgstr "<b>Fecha</b>" -#: build/lib/pytrainer/gui/windowmain.py:2226 -#: pytrainer/gui/windowmain.py:2226 +#: pytrainer/gui/windowmain.py:2224 msgid "<b>Weight</b>" msgstr "<b>Peso</b>" -#: build/lib/pytrainer/gui/windowmain.py:2234 -#: pytrainer/gui/windowmain.py:2234 +#: pytrainer/gui/windowmain.py:2232 msgid "<b>Body Fat</b>" msgstr "<b>Grasa corporal</b>" -#: build/lib/pytrainer/gui/windowmain.py:2242 -#: pytrainer/gui/windowmain.py:2242 +#: pytrainer/gui/windowmain.py:2240 msgid "<b>Resting Heart Rate</b>" msgstr "<b>Pulsaciones en reposo</b>" -#: build/lib/pytrainer/gui/windowmain.py:2250 -#: pytrainer/gui/windowmain.py:2250 +#: pytrainer/gui/windowmain.py:2248 msgid "<b>Max Heart Rate</b>" msgstr "<b>Pulsaciones máx</b>" -#: build/lib/pytrainer/gui/windowmain.py:2278 -#: build/lib/pytrainer/main.py:453 -#: pytrainer/gui/windowmain.py:2278 -#: pytrainer/main.py:453 +#: pytrainer/gui/windowmain.py:2276 +#: pytrainer/main.py:451 msgid "Delete this database entry?" msgstr "¿Borrar esta entrada de la base de datos?" -#: build/lib/pytrainer/gui/windowmain.py:2280 -#: pytrainer/gui/windowmain.py:2280 +#: pytrainer/gui/windowmain.py:2278 msgid "Are you sure?" msgstr "¿Está seguro?" -#: build/lib/pytrainer/gui/windowimportdata.py:116 -#: pytrainer/gui/windowimportdata.py:116 +#: pytrainer/gui/windowimportdata.py:117 msgid "No file selected" msgstr "Ningún fichero seleccionado" -#: build/lib/pytrainer/gui/windowimportdata.py:161 -#: pytrainer/gui/windowimportdata.py:161 +#: pytrainer/gui/windowimportdata.py:162 msgid "Configure" msgstr "Configurar" -#: build/lib/pytrainer/gui/windowimportdata.py:162 -#: pytrainer/gui/windowimportdata.py:162 +#: pytrainer/gui/windowimportdata.py:163 msgid "Run" msgstr "Ejecutar" -#: build/lib/pytrainer/gui/windowimportdata.py:170 -#: pytrainer/gui/windowimportdata.py:170 +#: pytrainer/gui/windowimportdata.py:171 msgid "Disabled" msgstr "Desactivo" -#: build/lib/pytrainer/gui/windowimportdata.py:172 -#: pytrainer/gui/windowimportdata.py:172 +#: pytrainer/gui/windowimportdata.py:173 msgid "Enabled" msgstr "Activo" -#: build/lib/pytrainer/gui/windowimportdata.py:252 -#: pytrainer/gui/windowimportdata.py:252 +#: pytrainer/gui/windowimportdata.py:253 msgid "GPS device found" msgstr "Dispositivos GPS encontrado" -#: build/lib/pytrainer/gui/windowimportdata.py:255 -#: pytrainer/gui/windowimportdata.py:255 +#: pytrainer/gui/windowimportdata.py:256 msgid "GPS device <b>not</b> found" msgstr "Dispositivo GPS <b>no</b> encontrado" -#: build/lib/pytrainer/gui/windowimportdata.py:262 -#: pytrainer/gui/windowimportdata.py:262 +#: pytrainer/gui/windowimportdata.py:263 msgid "This tool was not found on the system" msgstr "No se ha encontrado esta herramienta en el sistema" -#: build/lib/pytrainer/gui/windowimportdata.py:264 -#: pytrainer/gui/windowimportdata.py:264 +#: pytrainer/gui/windowimportdata.py:265 msgid " Homepage" msgstr "Página de inicio" -#: build/lib/pytrainer/gui/windowimportdata.py:317 -#: pytrainer/gui/windowimportdata.py:317 +#: pytrainer/gui/windowimportdata.py:318 msgid "File" msgstr "Archivo" -#: build/lib/pytrainer/gui/windowimportdata.py:317 -#: pytrainer/gui/windowimportdata.py:317 +#: pytrainer/gui/windowimportdata.py:318 msgid "Type" msgstr "Tipo" -#: build/lib/pytrainer/gui/windowimportdata.py:317 -#: pytrainer/gui/windowimportdata.py:317 +#: pytrainer/gui/windowimportdata.py:318 msgid "Activities" msgstr "Actividades" -#: build/lib/pytrainer/gui/windowimportdata.py:352 -#: build/lib/pytrainer/gui/windowrecord.py:210 -#: pytrainer/gui/windowimportdata.py:352 +#: pytrainer/gui/windowimportdata.py:353 #: pytrainer/gui/windowrecord.py:210 msgid "Start Time" msgstr "Hora de comienzo" -#: build/lib/pytrainer/gui/windowimportdata.py:352 -#: build/lib/pytrainer/gui/windowrecord.py:210 -#: pytrainer/gui/windowimportdata.py:352 +#: pytrainer/gui/windowimportdata.py:353 #: pytrainer/gui/windowrecord.py:210 msgid "Duration" msgstr "Duración" -#: build/lib/pytrainer/gui/windowimportdata.py:501 -#: pytrainer/gui/windowimportdata.py:501 +#: pytrainer/gui/windowimportdata.py:499 msgid "Imported into database" msgstr "Importado a base de datos" -#: build/lib/pytrainer/gui/windowimportdata.py:545 -#: build/lib/pytrainer/gui/windowextensions.py:81 -#: build/lib/pytrainer/gui/windowplugins.py:80 -#: pytrainer/gui/windowimportdata.py:545 +#: pytrainer/gui/windowimportdata.py:543 #: pytrainer/gui/windowextensions.py:81 #: pytrainer/gui/windowplugins.py:80 #, python-format msgid "%s settings" msgstr "%s opciones" -#: build/lib/pytrainer/gui/windowimportdata.py:560 -#: build/lib/pytrainer/gui/windowextensions.py:70 -#: build/lib/pytrainer/gui/windowplugins.py:71 -#: build/lib/pytrainer/gui/windowplugins.py:95 -#: pytrainer/gui/windowimportdata.py:560 +#: pytrainer/gui/windowimportdata.py:558 #: pytrainer/gui/windowextensions.py:70 #: pytrainer/gui/windowplugins.py:71 #: pytrainer/gui/windowplugins.py:95 msgid "Disable" msgstr "Desactivo" -#: build/lib/pytrainer/gui/windowimportdata.py:561 -#: build/lib/pytrainer/gui/windowextensions.py:72 -#: build/lib/pytrainer/gui/windowplugins.py:69 -#: build/lib/pytrainer/gui/windowplugins.py:96 -#: pytrainer/gui/windowimportdata.py:561 +#: pytrainer/gui/windowimportdata.py:559 #: pytrainer/gui/windowextensions.py:72 #: pytrainer/gui/windowplugins.py:69 #: pytrainer/gui/windowplugins.py:96 msgid "Enable" msgstr "Activo" -#: build/lib/pytrainer/gui/windowimportdata.py:568 -#: build/lib/pytrainer/gui/windowplugins.py:103 -#: pytrainer/gui/windowimportdata.py:568 +#: pytrainer/gui/windowimportdata.py:566 #: pytrainer/gui/windowplugins.py:103 msgid "Ok" msgstr "Ok" -#: build/lib/pytrainer/gui/windowimportdata.py:628 -#: pytrainer/gui/windowimportdata.py:628 +#: pytrainer/gui/windowimportdata.py:626 msgid "Saving options" msgstr "Guardar configuración" -#: build/lib/pytrainer/gui/windowimportdata.py:630 -#: pytrainer/gui/windowimportdata.py:630 +#: pytrainer/gui/windowimportdata.py:628 msgid "Options saved" msgstr "Configuración guardada" -#: build/lib/pytrainer/gui/windowimportdata.py:655 -#: pytrainer/gui/windowimportdata.py:655 +#: pytrainer/gui/windowimportdata.py:653 msgid "Importing one activity" msgstr "Importando una actividad" -#: build/lib/pytrainer/gui/windowimportdata.py:656 -#: pytrainer/gui/windowimportdata.py:656 +#: pytrainer/gui/windowimportdata.py:654 msgid "Imported one activity" msgstr "Una actividad importada" -#: build/lib/pytrainer/gui/windowimportdata.py:658 -#: pytrainer/gui/windowimportdata.py:658 +#: pytrainer/gui/windowimportdata.py:656 #, python-format msgid "Importing %d activities" msgstr "Importando %d actividades" -#: build/lib/pytrainer/gui/windowimportdata.py:659 -#: pytrainer/gui/windowimportdata.py:659 +#: pytrainer/gui/windowimportdata.py:657 #, python-format msgid "Imported %d activities" msgstr "Importadas %d actividades" -#: build/lib/pytrainer/gui/windowimportdata.py:678 -#: pytrainer/gui/windowimportdata.py:678 +#: pytrainer/gui/windowimportdata.py:676 msgid "Choose a file (or files) to import activities from" msgstr "Seleccione fichero/s desde el/los que importar actividades" -#: build/lib/pytrainer/gui/windowimportdata.py:693 -#: build/lib/pytrainer/gui/windowimportdata.py:694 -#: pytrainer/gui/windowimportdata.py:693 -#: pytrainer/gui/windowimportdata.py:694 +#: pytrainer/gui/windowimportdata.py:691 +#: pytrainer/gui/windowimportdata.py:692 #, python-format msgid "Found file of type: %s" msgstr "Tipo de fichero encontrado: %s" -#: build/lib/pytrainer/gui/windowimportdata.py:718 -#: pytrainer/gui/windowimportdata.py:718 +#: pytrainer/gui/windowimportdata.py:716 msgid "Found in database" msgstr "Encontrado en base de datos" -#: build/lib/pytrainer/gui/windowimportdata.py:733 -#: build/lib/pytrainer/gui/windowimportdata.py:734 -#: pytrainer/gui/windowimportdata.py:733 -#: pytrainer/gui/windowimportdata.py:734 +#: pytrainer/gui/windowimportdata.py:731 +#: pytrainer/gui/windowimportdata.py:732 #, python-format msgid "File %s is of unknown or unsupported file type" msgstr "Fichero %s seleccionado desconocido o no soportado" -#: build/lib/pytrainer/gui/windowimportdata.py:807 -#: pytrainer/gui/windowimportdata.py:807 +#: pytrainer/gui/windowimportdata.py:805 #, python-format msgid "Column %d" msgstr "Columna %d" -#: build/lib/pytrainer/gui/drawArea.py:166 -#: build/lib/pytrainer/extensions/googlemaps.py:127 -#: build/lib/pytrainer/extensions/osm.py:102 #: pytrainer/gui/drawArea.py:166 #: pytrainer/extensions/googlemaps.py:127 #: pytrainer/extensions/osm.py:102 msgid "min" msgstr "min" -#: build/lib/pytrainer/gui/drawArea.py:410 #: pytrainer/gui/drawArea.py:410 msgid "rest" msgstr "descanso" -#: build/lib/pytrainer/gui/windowrecord.py:210 #: pytrainer/gui/windowrecord.py:210 msgid "GPX File" msgstr "Archivo GPX" -#: build/lib/pytrainer/gui/windowprofile.py:47 #: pytrainer/gui/windowprofile.py:47 msgid "Male" msgstr "Varón" -#: build/lib/pytrainer/gui/windowprofile.py:48 #: pytrainer/gui/windowprofile.py:48 msgid "Female" msgstr "Mujer" -#: build/lib/pytrainer/gui/windowprofile.py:65 #: pytrainer/gui/windowprofile.py:65 msgid "MET" msgstr "M.E.T." -#: build/lib/pytrainer/gui/windowprofile.py:314 #: pytrainer/gui/windowprofile.py:314 msgid "Sport Creation Error" msgstr "Fallo en la creación de deporte" -#: build/lib/pytrainer/gui/equipment.py:101 #: pytrainer/gui/equipment.py:101 msgid "Usage" msgstr "Uso" -#: build/lib/pytrainer/gui/dialogselecttrack.py:40 #: pytrainer/gui/dialogselecttrack.py:40 msgid "Track Name" msgstr "Nombre de la ruta" -#: build/lib/pytrainer/gui/drawGraph.py:170 #: pytrainer/gui/drawGraph.py:170 msgid "Athlete Data" msgstr "Datos del atleta" -#: build/lib/pytrainer/gui/windowextensions.py:112 -#: build/lib/pytrainer/gui/windowextensions.py:125 #: pytrainer/gui/windowextensions.py:112 #: pytrainer/gui/windowextensions.py:125 msgid "OK" msgstr "Ok" -#: build/lib/pytrainer/recordgraph.py:134 -#: build/lib/pytrainer/daygraph.py:52 #: pytrainer/recordgraph.py:134 #: pytrainer/daygraph.py:52 msgid "Height (m)" msgstr "Altura (m)" -#: build/lib/pytrainer/recordgraph.py:134 -#: build/lib/pytrainer/daygraph.py:52 #: pytrainer/recordgraph.py:134 #: pytrainer/daygraph.py:52 msgid "Stage Profile" msgstr "Perfil de Etapa" -#: build/lib/pytrainer/recordgraph.py:136 #: pytrainer/recordgraph.py:136 msgid "Speed (Km/h)" msgstr "Velocidad (km/h)" -#: build/lib/pytrainer/recordgraph.py:138 -#: build/lib/pytrainer/lib/activity.py:314 -#: build/lib/pytrainer/lib/activity.py:424 -#: build/lib/pytrainer/lib/activity.py:426 #: pytrainer/recordgraph.py:138 -#: pytrainer/lib/activity.py:314 -#: pytrainer/lib/activity.py:424 -#: pytrainer/lib/activity.py:426 +#: pytrainer/lib/activity.py:319 +#: pytrainer/lib/activity.py:429 +#: pytrainer/lib/activity.py:431 msgid "Pace" msgstr "Ritmo" -#: build/lib/pytrainer/recordgraph.py:140 -#: build/lib/pytrainer/heartrategraph.py:36 -#: build/lib/pytrainer/daygraph.py:56 #: pytrainer/recordgraph.py:140 #: pytrainer/heartrategraph.py:36 #: pytrainer/daygraph.py:56 msgid "Beats (bpm)" msgstr "Media pulsaciones (ppm)" -#: build/lib/pytrainer/recordgraph.py:142 #: pytrainer/recordgraph.py:142 msgid "Cadence (rpm)" msgstr "Cadencia (rpm)" -#: build/lib/pytrainer/recordgraph.py:142 -#: build/lib/pytrainer/lib/activity.py:452 -#: build/lib/pytrainer/lib/activity.py:454 #: pytrainer/recordgraph.py:142 -#: pytrainer/lib/activity.py:452 -#: pytrainer/lib/activity.py:454 +#: pytrainer/lib/activity.py:457 +#: pytrainer/lib/activity.py:459 msgid "Cadence" msgstr "Cadence" -#: build/lib/pytrainer/recordgraph.py:144 #: pytrainer/recordgraph.py:144 msgid "Beats (%)" msgstr "Pulsaciones (%)" -#: build/lib/pytrainer/recordgraph.py:146 #: pytrainer/recordgraph.py:146 msgid "Zone" msgstr "Zona" -#: build/lib/pytrainer/profile.py:109 #: pytrainer/profile.py:109 msgid "Moderate activity" msgstr "Actividad moderada" -#: build/lib/pytrainer/profile.py:110 #: pytrainer/profile.py:110 msgid "Weight Control" msgstr "Control de peso" -#: build/lib/pytrainer/profile.py:111 #: pytrainer/profile.py:111 msgid "Aerobic" msgstr "Aeróbico" -#: build/lib/pytrainer/profile.py:112 #: pytrainer/profile.py:112 msgid "Anaerobic" msgstr "Anaeróbico" -#: build/lib/pytrainer/profile.py:113 #: pytrainer/profile.py:113 msgid "VO2 MAX" msgstr "VO2 máximo" -#: build/lib/pytrainer/lib/listview.py:32 #: pytrainer/lib/listview.py:32 msgid "All Time" msgstr "Fecha" -#: build/lib/pytrainer/lib/listview.py:33 +#: pytrainer/lib/listview.py:32 +msgid "Last 4 Weeks" +msgstr "Últimas 4 semanas" + #: pytrainer/lib/listview.py:33 msgid "Last 6 Months" msgstr "Últimos 6 meses" -#: build/lib/pytrainer/lib/listview.py:36 +#: pytrainer/lib/listview.py:33 +msgid "Last 12 Months" +msgstr "Últimos 12 meses" + #: pytrainer/lib/listview.py:36 msgid "<1 Hour" msgstr "< 1 hora" -#: build/lib/pytrainer/lib/listview.py:37 #: pytrainer/lib/listview.py:37 msgid "1-2 Hours" msgstr "De 1 a 2 horas" -#: build/lib/pytrainer/lib/listview.py:38 #: pytrainer/lib/listview.py:38 msgid ">2 Hours" msgstr "> 2 horas" -#: build/lib/pytrainer/lib/gpx.py:126 -#: pytrainer/lib/gpx.py:126 +#: pytrainer/lib/gpx.py:128 msgid "No Name" msgstr "Sin nombre" -#: build/lib/pytrainer/lib/gpx.py:133 -#: pytrainer/lib/gpx.py:133 +#: pytrainer/lib/gpx.py:135 msgid "No Data" msgstr "Sin datos" -#: build/lib/pytrainer/lib/activity.py:199 -#: pytrainer/lib/activity.py:199 +#: pytrainer/lib/activity.py:200 msgid "feet" msgstr "pies" -#: build/lib/pytrainer/lib/activity.py:312 -#: pytrainer/lib/activity.py:312 +#: pytrainer/lib/activity.py:317 msgid "Pace by Lap" msgstr "Ritmo por vuelta" -#: build/lib/pytrainer/lib/activity.py:318 -#: build/lib/pytrainer/lib/activity.py:329 -#: build/lib/pytrainer/lib/activity.py:401 -#: build/lib/pytrainer/lib/activity.py:411 -#: build/lib/pytrainer/lib/activity.py:420 -#: build/lib/pytrainer/lib/activity.py:429 -#: build/lib/pytrainer/lib/activity.py:438 -#: build/lib/pytrainer/lib/activity.py:448 -#: build/lib/pytrainer/lib/activity.py:457 -#: build/lib/pytrainer/lib/activity.py:519 -#: pytrainer/lib/activity.py:318 -#: pytrainer/lib/activity.py:329 -#: pytrainer/lib/activity.py:401 -#: pytrainer/lib/activity.py:411 -#: pytrainer/lib/activity.py:420 -#: pytrainer/lib/activity.py:429 -#: pytrainer/lib/activity.py:438 -#: pytrainer/lib/activity.py:448 -#: pytrainer/lib/activity.py:457 -#: pytrainer/lib/activity.py:519 +#: pytrainer/lib/activity.py:323 +#: pytrainer/lib/activity.py:334 +#: pytrainer/lib/activity.py:406 +#: pytrainer/lib/activity.py:416 +#: pytrainer/lib/activity.py:425 +#: pytrainer/lib/activity.py:434 +#: pytrainer/lib/activity.py:443 +#: pytrainer/lib/activity.py:453 +#: pytrainer/lib/activity.py:462 +#: pytrainer/lib/activity.py:524 msgid "Time (seconds)" msgstr "Tiempo (segundos)" -#: build/lib/pytrainer/lib/activity.py:323 -#: pytrainer/lib/activity.py:323 +#: pytrainer/lib/activity.py:328 msgid "Speed by Lap" msgstr "Velocidad por vuelta" -#: build/lib/pytrainer/lib/activity.py:395 -#: build/lib/pytrainer/lib/activity.py:397 -#: pytrainer/lib/activity.py:395 -#: pytrainer/lib/activity.py:397 +#: pytrainer/lib/activity.py:400 +#: pytrainer/lib/activity.py:402 msgid "Elevation" msgstr "Altura" -#: build/lib/pytrainer/lib/activity.py:406 -#: build/lib/pytrainer/lib/activity.py:408 -#: pytrainer/lib/activity.py:406 -#: pytrainer/lib/activity.py:408 +#: pytrainer/lib/activity.py:411 +#: pytrainer/lib/activity.py:413 msgid "Corrected Elevation" msgstr "Altura corregida" -#: build/lib/pytrainer/lib/activity.py:443 -#: pytrainer/lib/activity.py:443 +#: pytrainer/lib/activity.py:448 #, python-format msgid "Heart Rate (% of max)" msgstr "Frecuencia cardíaca (% del máx.)" -#: build/lib/pytrainer/lib/activity.py:445 -#: pytrainer/lib/activity.py:445 +#: pytrainer/lib/activity.py:450 msgid "%" msgstr "%" -#: build/lib/pytrainer/lib/activity.py:454 -#: pytrainer/lib/activity.py:454 +#: pytrainer/lib/activity.py:459 msgid "rpm" msgstr "rpm" -#: build/lib/pytrainer/lib/activity.py:513 -#: pytrainer/lib/activity.py:513 +#: pytrainer/lib/activity.py:518 msgid "Heart Rate zone" msgstr "Zona frecuencia cardiaca" -#: build/lib/pytrainer/monthgraph.py:26 -#: build/lib/pytrainer/monthgraph.py:27 -#: build/lib/pytrainer/monthgraph.py:28 -#: build/lib/pytrainer/monthgraph.py:29 -#: build/lib/pytrainer/monthgraph.py:30 #: pytrainer/monthgraph.py:26 #: pytrainer/monthgraph.py:27 #: pytrainer/monthgraph.py:28 @@ -2526,17 +2209,11 @@ msgid "day" msgstr "día" -#: build/lib/pytrainer/monthgraph.py:26 -#: build/lib/pytrainer/weekgraph.py:28 #: pytrainer/monthgraph.py:26 #: pytrainer/weekgraph.py:28 msgid "Daily Distance" msgstr "Distancia" -#: build/lib/pytrainer/monthgraph.py:27 -#: build/lib/pytrainer/totalgraph.py:25 -#: build/lib/pytrainer/yeargraph.py:27 -#: build/lib/pytrainer/weekgraph.py:29 #: pytrainer/monthgraph.py:27 #: pytrainer/totalgraph.py:25 #: pytrainer/yeargraph.py:27 @@ -2544,17 +2221,11 @@ msgid "Time (hours)" msgstr "Tiempo en horas" -#: build/lib/pytrainer/monthgraph.py:27 -#: build/lib/pytrainer/weekgraph.py:29 #: pytrainer/monthgraph.py:27 #: pytrainer/weekgraph.py:29 msgid "Daily Time" msgstr "Tiempo diario" -#: build/lib/pytrainer/monthgraph.py:28 -#: build/lib/pytrainer/totalgraph.py:26 -#: build/lib/pytrainer/yeargraph.py:28 -#: build/lib/pytrainer/weekgraph.py:30 #: pytrainer/monthgraph.py:28 #: pytrainer/totalgraph.py:26 #: pytrainer/yeargraph.py:28 @@ -2562,32 +2233,21 @@ msgid "Average Heart Rate (bpm)" msgstr "Pulsaciones medias (ppm)" -#: build/lib/pytrainer/monthgraph.py:28 -#: build/lib/pytrainer/weekgraph.py:30 #: pytrainer/monthgraph.py:28 #: pytrainer/weekgraph.py:30 msgid "Daily Average Heart Rate" msgstr "Pulsaciones diarias" -#: build/lib/pytrainer/monthgraph.py:29 -#: build/lib/pytrainer/weekgraph.py:31 #: pytrainer/monthgraph.py:29 #: pytrainer/weekgraph.py:31 msgid "Daily Average Speed" msgstr "medias diarias" -#: build/lib/pytrainer/monthgraph.py:30 -#: build/lib/pytrainer/weekgraph.py:32 #: pytrainer/monthgraph.py:30 #: pytrainer/weekgraph.py:32 msgid "Daily Calories" msgstr "Calorías diarias" -#: build/lib/pytrainer/totalgraph.py:24 -#: build/lib/pytrainer/totalgraph.py:25 -#: build/lib/pytrainer/totalgraph.py:26 -#: build/lib/pytrainer/totalgraph.py:27 -#: build/lib/pytrainer/totalgraph.py:28 #: pytrainer/totalgraph.py:24 #: pytrainer/totalgraph.py:25 #: pytrainer/totalgraph.py:26 @@ -2596,51 +2256,38 @@ msgid "year" msgstr "año" -#: build/lib/pytrainer/totalgraph.py:24 #: pytrainer/totalgraph.py:24 msgid "Annual Distance" msgstr "Distancia anual" -#: build/lib/pytrainer/totalgraph.py:25 #: pytrainer/totalgraph.py:25 msgid "Annual Time" msgstr "Tiempo anual" -#: build/lib/pytrainer/totalgraph.py:26 #: pytrainer/totalgraph.py:26 msgid "Annual Average Heart Rate" msgstr "Pulsaciones medias en el año" -#: build/lib/pytrainer/totalgraph.py:27 #: pytrainer/totalgraph.py:27 msgid "Annual Average Speed" msgstr "Velocidad media anual" -#: build/lib/pytrainer/totalgraph.py:28 #: pytrainer/totalgraph.py:28 msgid "Annual Calories" msgstr "Calorías (kcal) en el año" -#: build/lib/pytrainer/athlete.py:52 #: pytrainer/athlete.py:52 msgid "lb" msgstr "lb" -#: build/lib/pytrainer/athlete.py:54 #: pytrainer/athlete.py:54 msgid "kg" msgstr "kg" -#: build/lib/pytrainer/record.py:519 -#: pytrainer/record.py:519 +#: pytrainer/record.py:465 msgid "pyTrainer can't import data from your gpx file" msgstr "pyTrainer no puede importar datos de tu fichero gpx" -#: build/lib/pytrainer/yeargraph.py:26 -#: build/lib/pytrainer/yeargraph.py:27 -#: build/lib/pytrainer/yeargraph.py:28 -#: build/lib/pytrainer/yeargraph.py:29 -#: build/lib/pytrainer/yeargraph.py:30 #: pytrainer/yeargraph.py:26 #: pytrainer/yeargraph.py:27 #: pytrainer/yeargraph.py:28 @@ -2649,59 +2296,42 @@ msgid "month" msgstr "mes" -#: build/lib/pytrainer/yeargraph.py:26 #: pytrainer/yeargraph.py:26 msgid "Monthly Distance" msgstr "Distancia" -#: build/lib/pytrainer/yeargraph.py:27 #: pytrainer/yeargraph.py:27 msgid "Monthly Time" msgstr "Tiempo mensual" -#: build/lib/pytrainer/yeargraph.py:28 #: pytrainer/yeargraph.py:28 msgid "Monthly Average Heart Rate" msgstr "Pulsaciones medias mensuales" -#: build/lib/pytrainer/yeargraph.py:29 #: pytrainer/yeargraph.py:29 msgid "Monthly Average Speed" msgstr "Medias mensuales" -#: build/lib/pytrainer/yeargraph.py:30 #: pytrainer/yeargraph.py:30 msgid "Monthly Calories" msgstr "Calorías mensuales" -#: build/lib/pytrainer/waypoint.py:87 #: 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" -#: build/lib/pytrainer/daygraph.py:54 #: pytrainer/daygraph.py:54 msgid "Velocity (Km/h)" msgstr "Velocidad (km/h)" -#: build/lib/pytrainer/daygraph.py:54 #: pytrainer/daygraph.py:54 msgid "Velocity" msgstr "Velocidad" -#: build/lib/pytrainer/main.py:469 -#: pytrainer/main.py:469 +#: pytrainer/main.py:467 msgid "Delete this waypoint?" msgstr "¿Borrar este waypoint?" -#: pytrainer/lib/listview.py:32 -msgid "Last 4 Weeks" -msgstr "Últimas 4 semanas" - -#: pytrainer/lib/listview.py:33 -msgid "Last 12 Months" -msgstr "Últimos 12 meses" - #: import/file_gpxplus.py:41 msgid "GPS eXchange file" msgstr "Fichero de intercambio GPS" @@ -2734,7 +2364,7 @@ msgid "Garmin tools dump file" msgstr "Fichero de volcado de datos de Garmintools" -#: import/file_garmintcxv2.py:43 +#: import/file_garmintcxv2.py:44 msgid "Garmin training center database file version 2" msgstr "Versión 2 del fichero Garmin training center database" @@ -2792,8 +2422,3 @@ msgid "Wordpress Extension Upload Complete" msgstr "Envío completo a Wordpress" -#~ msgid "Distance (Km):" -#~ msgstr "Distancia (km):" - -#~ msgid "Must have username and password configured" -#~ msgstr "Es obligatorio indicar nombre de usuario y contraseña" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2011-08-27 23:24:30
|
Revision: 862 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=862&view=rev Author: dgranda Date: 2011-08-27 23:24:24 +0000 (Sat, 27 Aug 2011) Log Message: ----------- Pause time value is now available to activity and printed in register tab. Renaming legend from 'Run' to 'Active' to make it multisport - Ticket:103 Modified Paths: -------------- pytrainer/trunk/glade/pytrainer.glade pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/lib/activity.py pytrainer/trunk/pytrainer/lib/gpx.py Modified: pytrainer/trunk/glade/pytrainer.glade =================================================================== --- pytrainer/trunk/glade/pytrainer.glade 2011-08-27 22:28:36 UTC (rev 861) +++ pytrainer/trunk/glade/pytrainer.glade 2011-08-27 23:24:24 UTC (rev 862) @@ -932,7 +932,7 @@ <widget class="GtkLabel" id="label42"> <property name="visible">True</property> <property name="xalign">0</property> - <property name="label" translatable="yes"><b>Run / Rest:</b></property> + <property name="label" translatable="yes"><b>Active / Rest:</b></property> <property name="use_markup">True</property> </widget> <packing> Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2011-08-27 22:28:36 UTC (rev 861) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2011-08-27 23:24:24 UTC (rev 862) @@ -415,6 +415,9 @@ self.record_duration.set_text(activity.get_value_f('time', '%s')) self.record_calories.set_text(activity.get_value_f('calories', "%0.0f")) self.record_title.set_text(activity.title) + hrun,mrun,srun = self.pytrainer_main.date.second2time(activity.time) + hpause,mpause,spause = self.pytrainer_main.date.second2time(activity.time_pause) + self.record_runrest.set_text("%02d:%02d:%02d / %02d:%02d:%02d" %(hrun,mrun,srun,hpause,mpause,spause)) buffer = self.record_comments.get_buffer() start,end = buffer.get_bounds() buffer.set_text(activity.comments) @@ -423,8 +426,7 @@ equipment_text = ", ".join(map(lambda(item): item.description, equipment)) self.label_record_equipment.set_text(equipment_text) else: - self.label_record_equipment.set_markup("<i>None</i>") - runTime = 0.0; + self.label_record_equipment.set_markup("<i>None</i>") if len(activity.laps)>1: store = gtk.ListStore( gobject.TYPE_INT, @@ -442,8 +444,7 @@ gobject.TYPE_STRING, ) for lap in activity.laps: - t = lap['elapsed_time'] - runTime += float(t) + t = lap['elapsed_time'] m = lap['distance'] if self.pytrainer_main.profile.getValue("pytraining","prf_us_system") == "True": @@ -518,15 +519,11 @@ self.frame_laps.show() else: self.frame_laps.hide() - runTime = float(activity.laps[0]['elapsed_time']) else: self.recordview.set_current_page(0) self.recordview.set_sensitive(0) - pauseTime = activity.time - runTime - hrun,mrun,srun = self.pytrainer_main.date.second2time(runTime) - hpause,mpause,spause = self.pytrainer_main.date.second2time(pauseTime) - self.record_runrest.set_text("%02d:%02d:%02d / %02d:%02d:%02d" %(hrun,mrun,srun,hpause,mpause,spause) ) + logging.debug("<<") def actualize_recordgraph(self,activity): Modified: pytrainer/trunk/pytrainer/lib/activity.py =================================================================== --- pytrainer/trunk/pytrainer/lib/activity.py 2011-08-27 22:28:36 UTC (rev 861) +++ pytrainer/trunk/pytrainer/lib/activity.py 2011-08-27 23:24:24 UTC (rev 862) @@ -99,6 +99,7 @@ self.has_data = False self.distance_data = {} self.time_data = {} + self.time_pause = 0 self.pace_limit = None self.starttime = None self.gpx_distance = None @@ -216,7 +217,11 @@ self.tracks = self.gpx.getTrackList() #TODO fix - this should removed and replaced with self.tracklist functionality self.tracklist = self.gpx.trkpoints self.gpx_distance = self.gpx.total_dist - logging.debug("GPX Distance: %s" % self.gpx_distance) + logging.info("GPX Distance: %s | distance (trkpts): %s | duration: %s | duration (trkpts): %s" % (self.gpx_distance, self.gpx.total_dist_trkpts, self.gpx.total_time, self.gpx.total_time_trkpts)) + time_diff = self.gpx.total_time_trkpts - self.gpx.total_time + if time_diff > 10: + self.time_pause = time_diff + logging.debug("Identified non active time: %s s" % self.time_pause) logging.debug("<<") def _init_from_db(self): Modified: pytrainer/trunk/pytrainer/lib/gpx.py =================================================================== --- pytrainer/trunk/pytrainer/lib/gpx.py 2011-08-27 22:28:36 UTC (rev 861) +++ pytrainer/trunk/pytrainer/lib/gpx.py 2011-08-27 23:24:24 UTC (rev 862) @@ -66,6 +66,7 @@ self.trkpoints = [] self.vel_array = [] self.total_dist = 0 + self.total_dist_trkpts = 0 self.total_time = 0 self.total_time_trkpts = 0 self.upositive = 0 @@ -348,7 +349,7 @@ #Accumulate distances if dist is not None: dist_elapsed += dist #TODO fix - total_dist += dist + self.total_dist_trkpts += dist #Calculate speed... vel = self._calculate_speed(dist, time_elapsed, smoothing_factor=3) @@ -368,10 +369,10 @@ waiting_points = [] dist_elapsed = 0 else: - retorno.append((total_dist,ele, self.total_time,vel,lat,lon,hr,cadence,corEle)) + retorno.append((self.total_dist_trkpts,ele, self.total_time,vel,lat,lon,hr,cadence,corEle)) dist_elapsed = 0 else: # time_ is None - waiting_points.append((total_dist, dist_elapsed, ele, self.total_time, lat, lon, hr, cadence, corEle)) + waiting_points.append((self.total_dist_trkpts, dist_elapsed, ele, self.total_time, lat, lon, hr, cadence, corEle)) #Add to dict of values to trkpoint list self.trkpoints.append({ 'id': i, @@ -385,7 +386,7 @@ 'ele':ele, 'ele_change': rel_alt, 'distance_from_previous': dist, - 'elapsed_distance': total_dist, + 'elapsed_distance': self.total_dist_trkpts, 'velocity':vel, 'correctedElevation':corEle, @@ -399,12 +400,15 @@ self.hr_average = total_hr/len_validhrpoints # In case there is no other way to calculate distance, we rely on trackpoints (number of trackpoints is configurable!) if self.total_dist is None or self.total_dist == 0: - self.total_dist = total_dist + self.total_dist = self.total_dist_trkpts + else: + dist_diff = 1000*(self.total_dist_trkpts - self.total_dist) + logging.info("Distance difference between laps and trkpts calculation: %f m" % dist_diff) if self.total_time is None or self.total_time == 0: self.total_time = self.total_time_trkpts else: time_diff = self.total_time_trkpts - self.total_time - logging.info("Duration difference between laps and trkpts calculation: %d seconds" % time_diff) + logging.info("Duration difference between laps and trkpts calculation: %d s" % time_diff) logging.debug("<<") return retorno This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2011-08-27 22:28:43
|
Revision: 861 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=861&view=rev Author: dgranda Date: 2011-08-27 22:28:36 +0000 (Sat, 27 Aug 2011) Log Message: ----------- Time tag has different type of value depending source file, tricky one - Ticket:103 Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/gpx.py Modified: pytrainer/trunk/pytrainer/lib/gpx.py =================================================================== --- pytrainer/trunk/pytrainer/lib/gpx.py 2011-08-27 20:25:17 UTC (rev 860) +++ pytrainer/trunk/pytrainer/lib/gpx.py 2011-08-27 22:28:36 UTC (rev 861) @@ -214,9 +214,15 @@ self.calories += int(lapCalories) lapDistance = lap.findtext(distanceTag) totalDistance += float(lapDistance) - lapDuration_hms = lap.findtext(elapsedTimeTag) - hour,minu,sec = lapDuration_hms.split(":") - lapDuration = float(sec) + int(minu)*60 + int(hour)*3600 + lapDuration_tmp = lap.findtext(elapsedTimeTag) + # When retrieving data from TCX file -> seconds (float) + # When retrieving data from GPX+ file -> hh:mm:ss + # EAFP -> http://docs.python.org/glossary.html + try: + lapDuration = float(lapDuration_tmp) + except ValueError: + hour,minu,sec = lapDuration_tmp.split(":") + lapDuration = float(sec) + int(minu)*60 + int(hour)*3600 totalDuration += lapDuration logging.info("Lap distance: %s m | Duration: %s s | Calories: %s kcal" % (lapDistance, lapDuration, lapCalories)) self.total_dist = float(totalDistance/1000.0) # Returning km This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2011-08-27 20:25:23
|
Revision: 860 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=860&view=rev Author: dgranda Date: 2011-08-27 20:25:17 +0000 (Sat, 27 Aug 2011) Log Message: ----------- Converting elapsed time to seconds for easier duration calculation - Ticket:103 Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/gpx.py Modified: pytrainer/trunk/pytrainer/lib/gpx.py =================================================================== --- pytrainer/trunk/pytrainer/lib/gpx.py 2011-08-27 19:43:37 UTC (rev 859) +++ pytrainer/trunk/pytrainer/lib/gpx.py 2011-08-27 20:25:17 UTC (rev 860) @@ -214,9 +214,11 @@ self.calories += int(lapCalories) lapDistance = lap.findtext(distanceTag) totalDistance += float(lapDistance) - lapDuration = lap.findtext(elapsedTimeTag) - totalDuration += float(lapDuration) - logging.info("Lap distance: %s | Duration: %s | Calories (kcal): %s" % (lapDistance, lapDuration, lapCalories)) + lapDuration_hms = lap.findtext(elapsedTimeTag) + hour,minu,sec = lapDuration_hms.split(":") + lapDuration = float(sec) + int(minu)*60 + int(hour)*3600 + totalDuration += lapDuration + logging.info("Lap distance: %s m | Duration: %s s | Calories: %s kcal" % (lapDistance, lapDuration, lapCalories)) self.total_dist = float(totalDistance/1000.0) # Returning km self.total_time = int(totalDuration) # Returning seconds logging.info("Distance: %.02f km | Duration: %d s | Calories: %s kcal" % (self.total_dist, self.total_time, self.calories)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2011-08-27 19:43:43
|
Revision: 859 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=859&view=rev Author: dgranda Date: 2011-08-27 19:43:37 +0000 (Sat, 27 Aug 2011) Log Message: ----------- Duration calculation relies on lap data and if not present, tries to retrieve it from trackpoints information - ticket:103 Modified Paths: -------------- pytrainer/trunk/import/file_garmintcxv2.py Modified: pytrainer/trunk/import/file_garmintcxv2.py =================================================================== --- pytrainer/trunk/import/file_garmintcxv2.py 2011-08-27 19:09:37 UTC (rev 858) +++ pytrainer/trunk/import/file_garmintcxv2.py 2011-08-27 19:43:37 UTC (rev 859) @@ -19,6 +19,7 @@ import logging import os +import traceback from lxml import etree from pytrainer.lib.date import Date @@ -46,23 +47,43 @@ return self.activitiesSummary def getDetails(self, activity, startTime): - points = activity.findall(".//{http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2}Trackpoint") - while True: - lastPoint = points[-1] - try: - distance = lastPoint.find(".//{http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2}DistanceMeters") - if distance is None: + logging.debug(">>") + distance = 0 + duration = 0 + laps = activity.findall(".//{http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2}Lap") + if laps: + for lap in laps: + lap_duration = float(lap.findtext(".//{http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2}TotalTimeSeconds")) + lap_distance = float(lap.findtext(".//{http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2}DistanceMeters")) + logging.debug("Lap distance (m): %f | duration (s): %f" % (lap_distance, lap_duration)) + distance += lap_distance + duration += lap_duration + hours = int(duration)//3600 + minutes = (int(duration)/60)%60 + seconds = int(duration)%60 + duration_hhmmss = "%02d:%02d:%02d" % (hours, minutes, seconds) + logging.debug("Activity distance (m): %f | duration (hh:mm:ss - s): %s - %f" % (distance, duration_hhmmss, duration)) + else: + points = activity.findall(".//{http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2}Trackpoint") + while True: + lastPoint = points[-1] + try: + distance = lastPoint.find(".//{http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2}DistanceMeters") + if distance is None: + points = points[:-1] + continue + time = lastPoint.find(".//{http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2}Time") + distance = distance.text + time = time.text + break + except: + #Try again without the last point (i.e work from end until find time and distance) points = points[:-1] continue - time = lastPoint.find(".//{http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2}Time") - distance = distance.text - time = time.text - break - except: - #Try again without the last point (i.e work from end until find time and distance) - points = points[:-1] - continue - return float(distance), self.getDateTime(time)[0]-startTime[0] + duration_hhmmss = self.getDateTime(time)[0]-startTime[0] + logging.debug("Activity distance (m): %f | duration (hh:mm:ss): %s" % (distance, duration_hhmmss)) + logging.debug("<<") + return float(distance), duration_hhmmss def testFile(self, filename): logging.debug('>>') @@ -95,7 +116,7 @@ #print self.activitiesSummary return True except: - #Not valid file + logging.debug("Traceback: %s" % traceback.format_exc()) return False return False This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2011-08-27 19:09:44
|
Revision: 858 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=858&view=rev Author: dgranda Date: 2011-08-27 19:09:37 +0000 (Sat, 27 Aug 2011) Log Message: ----------- Duration calculation relies on laps data and if not present, tries to retrieve it from trackpoints information Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/gpx.py Modified: pytrainer/trunk/pytrainer/lib/gpx.py =================================================================== --- pytrainer/trunk/pytrainer/lib/gpx.py 2011-08-27 12:54:33 UTC (rev 857) +++ pytrainer/trunk/pytrainer/lib/gpx.py 2011-08-27 19:09:37 UTC (rev 858) @@ -67,6 +67,7 @@ self.vel_array = [] self.total_dist = 0 self.total_time = 0 + self.total_time_trkpts = 0 self.upositive = 0 self.unegative = 0 self.maxvel = 0 @@ -165,6 +166,7 @@ lat = self.trkpoints[-1]['lat'] lon = self.trkpoints[-1]['lon'] #print ((self.total_time, lat, lon, self.calories, self.total_dist, stLat, stLon)) + logging.debug("total_time: %s" %self.total_time) lapInfo.append((self.total_time, lat, lon, self.calories, self.total_dist*1000, stLat, stLon, "active", self.hr_average, self.maxhr, self.maxvel, "manual")) else: for lap in laps: @@ -206,14 +208,18 @@ laps = tree.findall(lapTag) if laps is not None and laps != "": totalDistance = 0 + totalDuration = 0 for lap in laps: lapCalories = lap.findtext(calorieTag) self.calories += int(lapCalories) - lapDistance = int(float(lap.findtext(distanceTag))) - totalDistance += lapDistance - logging.debug("Lap distance: " + str(lapDistance) + " | calories (kcal): "+str(lapCalories)) + lapDistance = lap.findtext(distanceTag) + totalDistance += float(lapDistance) + lapDuration = lap.findtext(elapsedTimeTag) + totalDuration += float(lapDuration) + logging.info("Lap distance: %s | Duration: %s | Calories (kcal): %s" % (lapDistance, lapDuration, lapCalories)) self.total_dist = float(totalDistance/1000.0) # Returning km - logging.debug("Distance: " + str(self.total_dist) + " | calories (kcal): "+str(self.calories)) + self.total_time = int(totalDuration) # Returning seconds + logging.info("Distance: %.02f km | Duration: %d s | Calories: %s kcal" % (self.total_dist, self.total_time, self.calories)) else: laps = [] @@ -270,6 +276,7 @@ cadence = int(cadResult.text) else: cadence = None + #get the time timeResult = trkpoint.find(timeTag) if timeResult is not None: @@ -280,10 +287,13 @@ 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 + self.total_time_trkpts += time_elapsed + if time_elapsed > 10: + logging.debug("Adding %d seconds from last trkpt, someone took a break!" % time_elapsed) else: time_ = None time_elapsed = None + #get the elevation eleResult = trkpoint.find(elevationTag) rel_alt = 0 @@ -345,6 +355,7 @@ w_time = (w_dist/dist_elapsed) * time_elapsed w_vel = w_dist/((w_time)/3600.0) w_total_time += w_time + logging.info("Time added: %f" % w_time) retorno.append((w_total_dist, w_alt, w_total_time, w_vel, w_lat, w_lon, w_hr, w_cadence, w_corEle)) waiting_points = [] dist_elapsed = 0 @@ -362,7 +373,7 @@ 'cadence':cadence, 'time':time_, 'time_since_previous': time_elapsed, - 'time_elapsed': self.total_time, + 'time_elapsed': self.total_time_trkpts, 'ele':ele, 'ele_change': rel_alt, 'distance_from_previous': dist, @@ -381,6 +392,11 @@ # In case there is no other way to calculate distance, we rely on trackpoints (number of trackpoints is configurable!) if self.total_dist is None or self.total_dist == 0: self.total_dist = total_dist + if self.total_time is None or self.total_time == 0: + self.total_time = self.total_time_trkpts + else: + time_diff = self.total_time_trkpts - self.total_time + logging.info("Duration difference between laps and trkpts calculation: %d seconds" % time_diff) logging.debug("<<") return retorno This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <nc...@us...> - 2011-08-27 12:54:39
|
Revision: 857 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=857&view=rev Author: ncjones Date: 2011-08-27 12:54:33 +0000 (Sat, 27 Aug 2011) Log Message: ----------- Wrap webkit view in scroll window to allow correct resizing. ticket:113 Modified Paths: -------------- pytrainer/trunk/pytrainer/extensions/mapviewer.py pytrainer/trunk/pytrainer/extensions/waypointeditor.py Modified: pytrainer/trunk/pytrainer/extensions/mapviewer.py =================================================================== --- pytrainer/trunk/pytrainer/extensions/mapviewer.py 2011-08-18 03:15:18 UTC (rev 856) +++ pytrainer/trunk/pytrainer/extensions/mapviewer.py 2011-08-27 12:54:33 UTC (rev 857) @@ -16,12 +16,11 @@ #along with this program; if not, write to the Free Software #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +from pytrainer.lib.fileUtils import fileUtils +import gtk +import logging import webkit -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(">>") @@ -37,7 +36,9 @@ def pack_box(self): logging.debug(">>") - self.box.pack_start(self.wkview, True, True) + scrolled_window = gtk.ScrolledWindow() + scrolled_window.add(self.wkview) + self.box.pack_start(scrolled_window, True, True) self.box.show_all() logging.debug("<<") Modified: pytrainer/trunk/pytrainer/extensions/waypointeditor.py =================================================================== --- pytrainer/trunk/pytrainer/extensions/waypointeditor.py 2011-08-18 03:15:18 UTC (rev 856) +++ pytrainer/trunk/pytrainer/extensions/waypointeditor.py 2011-08-27 12:54:33 UTC (rev 857) @@ -16,17 +16,13 @@ #along with this program; if not, write to the Free Software #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -import webkit -import os -import re - from pytrainer.extension import Extension from pytrainer.lib.fileUtils import fileUtils - -import string,cgi,time -import time - +import gtk import logging +import os +import re +import webkit class WaypointEditor: def __init__(self, data_path = None, vbox = None, waypoint=None, parent=None): @@ -35,7 +31,9 @@ self.extension = Extension() self.wkview = webkit.WebView() self.wkview.connect('notify::title', self.handle_title_changed) - vbox.pack_start(self.wkview, True, True) + scrolled_window = gtk.ScrolledWindow() + scrolled_window.add(self.wkview) + vbox.pack_start(scrolled_window, True, True) vbox.show_all() self.htmlfile = "" self.waypoint=waypoint This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <nc...@us...> - 2011-08-18 03:15:24
|
Revision: 856 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=856&view=rev Author: ncjones Date: 2011-08-18 03:15:18 +0000 (Thu, 18 Aug 2011) Log Message: ----------- Remove unused getSportList method from profile. ticket:138 Modified Paths: -------------- pytrainer/trunk/pytrainer/profile.py Modified: pytrainer/trunk/pytrainer/profile.py =================================================================== --- pytrainer/trunk/pytrainer/profile.py 2011-08-18 03:14:59 UTC (rev 855) +++ pytrainer/trunk/pytrainer/profile.py 2011-08-18 03:15:18 UTC (rev 856) @@ -219,15 +219,6 @@ self.uc.set_us(list_options['prf_us_system']) logging.debug("<<") - def getSportList(self): - logging.debug("--") - #connection = self.pytrainer_main.ddbb.connect() - #if (connection == 1): - logging.debug("retrieving sports info") - return self.pytrainer_main.ddbb.select("sports","name,met,weight,id_sports,max_pace,color",None) - #else: - # return connection - def editProfile(self, sport_service): logging.debug(">>") from gui.windowprofile import WindowProfile This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <nc...@us...> - 2011-08-18 03:15:05
|
Revision: 855 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=855&view=rev Author: ncjones Date: 2011-08-18 03:14:59 +0000 (Thu, 18 Aug 2011) Log Message: ----------- Use sport service to load sports for graphs. ticket:138 Modified Paths: -------------- pytrainer/trunk/pytrainer/daygraph.py pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/monthgraph.py pytrainer/trunk/pytrainer/timegraph.py pytrainer/trunk/pytrainer/totalgraph.py pytrainer/trunk/pytrainer/weekgraph.py pytrainer/trunk/pytrainer/yeargraph.py Modified: pytrainer/trunk/pytrainer/daygraph.py =================================================================== --- pytrainer/trunk/pytrainer/daygraph.py 2011-08-18 03:14:26 UTC (rev 854) +++ pytrainer/trunk/pytrainer/daygraph.py 2011-08-18 03:14:59 UTC (rev 855) @@ -19,8 +19,8 @@ from timegraph import TimeGraph class DayGraph(TimeGraph): - def __init__(self, vbox = None, combovalue = None): - TimeGraph.__init__(self, vbox=vbox, window=window) + def __init__(self, sports, vbox = None, combovalue = None): + TimeGraph.__init__(self, sports, vbox=vbox) self.combovalue = combovalue def drawgraph(self,values): Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2011-08-18 03:14:26 UTC (rev 854) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2011-08-18 03:14:59 UTC (rev 855) @@ -58,6 +58,7 @@ class Main(SimpleGladeApp): def __init__(self, sport_service, data_path = None, parent = None, version = None, gpxDir = None): + self._sport_service = sport_service def url_hook(dialog, url): pytrainer.lib.webUtils.open_url_in_browser(url) # Available in PyGTK 2.6 and above @@ -271,12 +272,12 @@ def createGraphs(self): self.drawarearecord = RecordGraph(self.record_graph_vbox, self.window1, self.record_combovalue, self.record_combovalue2, self.btnShowLaps, self.tableConfigY1, pytrainer_main=self.pytrainer_main) self.drawareaheartrate = HeartRateGraph(self.heartrate_vbox, self.window1, self.heartrate_vbox2, pytrainer_main=self.pytrainer_main) - #self.drawareaday = DayGraph(self.day_vbox, self.day_combovalue) self.day_vbox.hide() - self.drawareaweek = WeekGraph(self.weekview, self.window1, self.week_combovalue, self.week_combovalue2, self.pytrainer_main) - self.drawareamonth = MonthGraph(self.month_vbox, self.window1, self.month_combovalue,self.month_combovalue2, self.pytrainer_main) - self.drawareayear = YearGraph(self.year_vbox, self.window1, self.year_combovalue,self.year_combovalue2, self.pytrainer_main) - self.drawareatotal = TotalGraph(self.total_vbox, self.window1, self.total_combovalue,self.total_combovalue2, self.pytrainer_main) + sports = self._sport_service.get_all_sports() + self.drawareaweek = WeekGraph(sports, self.weekview, self.window1, self.week_combovalue, self.week_combovalue2, self.pytrainer_main) + self.drawareamonth = MonthGraph(sports, self.month_vbox, self.window1, self.month_combovalue,self.month_combovalue2, self.pytrainer_main) + self.drawareayear = YearGraph(sports, self.year_vbox, self.window1, self.year_combovalue,self.year_combovalue2, self.pytrainer_main) + self.drawareatotal = TotalGraph(sports, self.total_vbox, self.window1, self.total_combovalue,self.total_combovalue2, self.pytrainer_main) def createMap(self,MapViewer,waypoint): self.waypoint = waypoint Modified: pytrainer/trunk/pytrainer/monthgraph.py =================================================================== --- pytrainer/trunk/pytrainer/monthgraph.py 2011-08-18 03:14:26 UTC (rev 854) +++ pytrainer/trunk/pytrainer/monthgraph.py 2011-08-18 03:14:59 UTC (rev 855) @@ -30,8 +30,8 @@ (_("day"),_("Calories"), _("Daily Calories"),"b"), ] - def __init__(self, vbox = None, window = None, combovalue = None, combovalue2 = None, main = None): - TimeGraph.__init__(self, vbox=vbox, window=window, main=main) + def __init__(self, sports, vbox = None, window = None, combovalue = None, combovalue2 = None, main = None): + TimeGraph.__init__(self, sports, vbox=vbox, window=window, main=main) self.combovalue = combovalue self.combovalue2 = combovalue2 self.KEY_FORMAT = "%d" Modified: pytrainer/trunk/pytrainer/timegraph.py =================================================================== --- pytrainer/trunk/pytrainer/timegraph.py 2011-08-18 03:14:26 UTC (rev 854) +++ pytrainer/trunk/pytrainer/timegraph.py 2011-08-18 03:14:59 UTC (rev 855) @@ -16,15 +16,15 @@ #along with this program; if not, write to the Free Software #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -import datetime, calendar +import datetime import logging from gui.drawArea import DrawArea class TimeGraph(object): - def __init__(self, vbox = None, window = None, combovalue = None, combovalue2 = None, main = None): + def __init__(self, sports, vbox = None, window = None, combovalue = None, combovalue2 = None, main = None): self.drawarea = DrawArea(vbox, window) self.SPORT_FIELD = 9 - self.sportlist = dict([(s[0],s[5]) for s in main.profile.getSportList()]) + self.sport_colors = dict([(sport.name, sport.color.to_hex_string()) for sport in sports]) def getFloatValue(self, value): try: @@ -124,7 +124,7 @@ xlab.append(xvalues) valsAreTime.append(valuesAreTime) #Draw chart - self.drawarea.drawStackedBars(xlab,yval,ylab,tit,valsAreTime, colors = self.sportlist) + self.drawarea.drawStackedBars(xlab,yval,ylab,tit,valsAreTime, colors = self.sport_colors) def get_value_params(self,value): return self.value_params[value] Modified: pytrainer/trunk/pytrainer/totalgraph.py =================================================================== --- pytrainer/trunk/pytrainer/totalgraph.py 2011-08-18 03:14:26 UTC (rev 854) +++ pytrainer/trunk/pytrainer/totalgraph.py 2011-08-18 03:14:59 UTC (rev 855) @@ -28,8 +28,8 @@ (_("year"),_("Calories"), _("Annual Calories"),"b"), ] - def __init__(self, vbox = None, window = None, combovalue = None, combovalue2 = None, main = None): - TimeGraph.__init__(self, vbox=vbox, window=window, main=main) + def __init__(self, sports, vbox = None, window = None, combovalue = None, combovalue2 = None, main = None): + TimeGraph.__init__(self, sports, vbox=vbox, window=window, main=main) self.combovalue = combovalue self.combovalue2 = combovalue2 self.KEY_FORMAT = "%Y" Modified: pytrainer/trunk/pytrainer/weekgraph.py =================================================================== --- pytrainer/trunk/pytrainer/weekgraph.py 2011-08-18 03:14:26 UTC (rev 854) +++ pytrainer/trunk/pytrainer/weekgraph.py 2011-08-18 03:14:59 UTC (rev 855) @@ -32,8 +32,8 @@ (None, _("Calories"), _("Daily Calories"), None), ] - def __init__(self, vbox = None, window = None, combovalue = None, combovalue2 = None, main = None): - TimeGraph.__init__(self, vbox=vbox, window=window, main=main) + def __init__(self, sports, vbox = None, window = None, combovalue = None, combovalue2 = None, main = None): + TimeGraph.__init__(self, sports, vbox=vbox, window=window, main=main) self.combovalue = combovalue self.combovalue2 = combovalue2 self.KEY_FORMAT = "%a" Modified: pytrainer/trunk/pytrainer/yeargraph.py =================================================================== --- pytrainer/trunk/pytrainer/yeargraph.py 2011-08-18 03:14:26 UTC (rev 854) +++ pytrainer/trunk/pytrainer/yeargraph.py 2011-08-18 03:14:59 UTC (rev 855) @@ -30,8 +30,8 @@ (_("month"),_("Calories"), _("Monthly Calories"),"b"), ] - def __init__(self, vbox = None, window = None, combovalue = None, combovalue2 = None, main = None): - TimeGraph.__init__(self, vbox=vbox, window=window, main=main) + def __init__(self, sports, vbox = None, window = None, combovalue = None, combovalue2 = None, main = None): + TimeGraph.__init__(self, sports, vbox=vbox, window=window, main=main) self.combovalue = combovalue self.combovalue2 = combovalue2 self.KEY_FORMAT = "%m" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <nc...@us...> - 2011-08-18 03:14:32
|
Revision: 854 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=854&view=rev Author: ncjones Date: 2011-08-18 03:14:26 +0000 (Thu, 18 Aug 2011) Log Message: ----------- Use sport service for list view sport filter. ticket:138 Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/lib/listview.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2011-08-18 03:13:58 UTC (rev 853) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2011-08-18 03:14:26 UTC (rev 854) @@ -57,7 +57,7 @@ class Main(SimpleGladeApp): - def __init__(self, data_path = None, parent = None, version = None, gpxDir = None): + def __init__(self, sport_service, data_path = None, parent = None, version = None, gpxDir = None): def url_hook(dialog, url): pytrainer.lib.webUtils.open_url_in_browser(url) # Available in PyGTK 2.6 and above @@ -87,7 +87,7 @@ self.y1_color = None self.y1_linewidth = 1 # setup Search ListView - self.listsearch = ListSearch(self, self.pytrainer_main) + self.listsearch = ListSearch(sport_service, self, self.pytrainer_main) self.aboutwindow = None Modified: pytrainer/trunk/pytrainer/lib/listview.py =================================================================== --- pytrainer/trunk/pytrainer/lib/listview.py 2011-08-18 03:13:58 UTC (rev 853) +++ pytrainer/trunk/pytrainer/lib/listview.py 2011-08-18 03:14:26 UTC (rev 854) @@ -17,7 +17,7 @@ } class ListSearch(object): """ Builds SQLite condition out of search parameters""" - def __init__(self, parent = None, pytrainer_main = None): + def __init__(self, sport_service, parent = None, pytrainer_main = None): self.parent = parent self.pytrainer_main = pytrainer_main self.uc = self.pytrainer_main.uc @@ -27,7 +27,7 @@ self.past = 0 self.duration = 0 self.distance = 0 - self.listSport = self.pytrainer_main.profile.getSportList() + self.listSport = sport_service.get_all_sports() self.listPast = [[_('All Time'), -99999], [_('Last 4 Weeks'), -31], [_('Last 6 Months'), -183], [_('Last 12 Months'), -366]] @@ -70,7 +70,7 @@ _search = "title like '%" +self.title + "%'" _add_and = True if self.sport > 0: - _sport = self.listSport[self.sport-1][3] + _sport = self.listSport[self.sport-1].id _here = "sport=%s" % _sport if _add_and: _search += " and " + _here @@ -130,8 +130,8 @@ #Re-add "All Sports" liststore_lsa.append([firstEntry]) #Re-add all sports in listSport - for i in self.listSport: - liststore_lsa.append([i[0]]) + for sport in self.listSport: + liststore_lsa.append([sport.name]) self.parent.lsa_sport.set_active(0) #Add handler manually, so above changes do not trigger recursive loop self.parent.lsa_sport.connect("changed", self.parent.on_listareasearch_clicked) Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2011-08-18 03:13:58 UTC (rev 853) +++ pytrainer/trunk/pytrainer/main.py 2011-08-18 03:14:26 UTC (rev 854) @@ -88,7 +88,7 @@ pool_size = self.profile.getIntValue("pytraining","activitypool_size", default=1) self.activitypool = ActivityPool(self, size=pool_size) #preparamos la ventana principal - self.windowmain = Main(data_path,self,self.version, gpxDir=self.profile.gpxdir) + self.windowmain = Main(self._sport_service, data_path,self,self.version, gpxDir=self.profile.gpxdir) self.date = Date(self.windowmain.calendar) self.waypoint = Waypoint(data_path,self) self.extension = Extension(data_path, self) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <nc...@us...> - 2011-08-18 03:14:04
|
Revision: 853 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=853&view=rev Author: ncjones Date: 2011-08-18 03:13:58 +0000 (Thu, 18 Aug 2011) Log Message: ----------- Use sport service in windowimportdata.py. ticket:138 Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowimportdata.py pytrainer/trunk/pytrainer/importdata.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/record.py Modified: pytrainer/trunk/pytrainer/gui/windowimportdata.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowimportdata.py 2011-08-18 03:13:32 UTC (rev 852) +++ pytrainer/trunk/pytrainer/gui/windowimportdata.py 2011-08-18 03:13:58 UTC (rev 853) @@ -32,7 +32,8 @@ from pytrainer.lib.date import Date class WindowImportdata(SimpleGladeApp): - def __init__(self, data_path = None, parent=None, config=None, pytrainer_main=None): + def __init__(self, sport_service, data_path = None, parent=None, config=None, pytrainer_main=None): + self._sport_service = sport_service self.data_path = data_path self.glade_path=data_path+"glade/importdata.glade" self.root = "win_importdata" @@ -202,12 +203,12 @@ def init_csvimport_tab(self): logging.debug(">>") #Populate Force Sport to combobox - sport_list = self.pytrainer_main.profile.getSportList() + sport_list = self._sport_service.get_all_sports() #Remove placeholder item (needed to ensure correct model for combobox) self.comboCSVForceSport.remove_text(0) for sport in sport_list: - logging.debug('Adding sport: %s' % sport[0]) - self.comboCSVForceSport.append_text(sport[0]) + logging.debug('Adding sport: %s' % sport.name) + self.comboCSVForceSport.append_text(sport.name) self.comboCSVForceSport.set_active(0) logging.debug("<<") return @@ -487,11 +488,8 @@ """ Function to import selected activity """ - - #selectedActivities.append((activity_id, start_time, distance, duration, sport, gpx_file)) logging.debug( "Importing %d activities" % len(activities)) - list_sport = self.pytrainer_main.profile.getSportList() - result = self.pytrainer_main.record.newMultiRecord(activities, list_sport) + result = self.pytrainer_main.record.newMultiRecord(activities) for activity in result: if "db_id" in activity.keys() and type(activity["db_id"]) is types.IntType: #Activity imported correctly Modified: pytrainer/trunk/pytrainer/importdata.py =================================================================== --- pytrainer/trunk/pytrainer/importdata.py 2011-08-18 03:13:32 UTC (rev 852) +++ pytrainer/trunk/pytrainer/importdata.py 2011-08-18 03:13:58 UTC (rev 853) @@ -16,17 +16,16 @@ #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 - from gui.windowimportdata import WindowImportdata class Importdata: - def __init__(self, data_path = None, parent = None, config = None): + def __init__(self, sport_service, data_path = None, parent = None, config = None): + self._sport_service = sport_service self.data_path=data_path self.parent = parent self.pytrainer_main = parent self.configuration = config def runImportdata(self): - windowImportdata = WindowImportdata(self.data_path, self, self.configuration, self.pytrainer_main) + windowImportdata = WindowImportdata(self._sport_service, self.data_path, self, self.configuration, self.pytrainer_main) windowImportdata.run() Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2011-08-18 03:13:32 UTC (rev 852) +++ pytrainer/trunk/pytrainer/main.py 2011-08-18 03:13:58 UTC (rev 853) @@ -45,7 +45,6 @@ from athlete import Athlete from stats import Stats -from gui.windowimportdata import WindowImportdata from gui.windowmain import Main from gui.warning import Warning from lib.date import Date @@ -94,7 +93,7 @@ self.waypoint = Waypoint(data_path,self) self.extension = Extension(data_path, self) self.plugins = Plugins(data_path, self) - self.importdata = Importdata(data_path, self, self.profile) + self.importdata = Importdata(self._sport_service, data_path, self, self.profile) self.loadPlugins() self.loadExtensions() self.windowmain.setup() Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2011-08-18 03:13:32 UTC (rev 852) +++ pytrainer/trunk/pytrainer/record.py 2011-08-18 03:13:58 UTC (rev 853) @@ -50,10 +50,10 @@ self.recordwindow.run() logging.debug('<<') - def newMultiRecord(self, activities, list_sport): + def newMultiRecord(self, activities): logging.debug('>>') - #activities (activity_id, start_time, distance, duration, sport, gpx_file) - self.recordwindow = WindowRecord(self._equipment_service, self.data_path, list_sport, parent=self, windowTitle="Modify details before importing") + sports = self._sport_service.get_all_sports() + self.recordwindow = WindowRecord(self._equipment_service, self.data_path, sports, parent=self, windowTitle="Modify details before importing") self.recordwindow.populateMultiWindow(activities) self.recordwindow.run() return self.recordwindow.getActivityData() @@ -66,19 +66,6 @@ sports = self._sport_service.get_all_sports() self.recordwindow = WindowRecord(self._equipment_service, self.data_path, sports, self, None, windowTitle=_("Edit Entry"), equipment=record_equipment) self.recordwindow.setValuesFromActivity(activity) - ''' - record = self.pytrainer_main.ddbb.select("records", "id_record, date, sport, distance, time, beats, average, calories, comments, gpslog, title, upositive, unegative, maxspeed, maxpace, pace, maxbeats, date_time_utc, date_time_local", "id_record=\"%s\"" %id_record) - logging.debug('retrieving data from DB: '+str(record)) - gpxfile = self.pytrainer_main.profile.gpxdir+"/%d.gpx"%int(id_record) - logging.debug('gpx file associated: '+gpxfile) - self.recordwindow = WindowRecord(self.data_path, list_sport,self, None, windowTitle=_("Edit Entry")) - if os.path.isfile(gpxfile): - self.recordwindow.rcd_gpxfile.set_text(gpxfile) - self.recordwindow.frameGeneral.set_sensitive(0) #Currently record values not changed if a GPX file is present - self.recordwindow.frameVelocity.set_sensitive(0) #Greying out options to indicate this to user - logging.debug('sending record info to window') - self.recordwindow.setValues(record[0]) - ''' logging.debug('launching window') self.recordwindow.run() logging.debug('<<') @@ -519,18 +506,6 @@ 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)) - self.recordwindow = WindowRecord(self._equipment_service, self.data_path, list_sport,self, None) - logging.debug('setting text in window '+ gpxfile) - self.recordwindow.rcd_gpxfile.set_text(gpxfile) - logging.debug('retrieving data from gpx file') - self.actualize_fromgpx(gpxfile) - logging.debug('Launching window...') - self.recordwindow.run() - logging.debug('<<') - def importFromGPX(self, gpxFile, sport): """ Add a record from a valid pytrainer type GPX file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <nc...@us...> - 2011-08-18 03:13:38
|
Revision: 852 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=852&view=rev Author: ncjones Date: 2011-08-18 03:13:32 +0000 (Thu, 18 Aug 2011) Log Message: ----------- Use sport service in stats.py ticket:138 Modified Paths: -------------- pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/stats.py Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2011-08-18 03:13:11 UTC (rev 851) +++ pytrainer/trunk/pytrainer/main.py 2011-08-18 03:13:32 UTC (rev 852) @@ -85,7 +85,7 @@ self._sport_service = SportService(self.ddbb) self.record = Record(self._sport_service, data_path, self) self.athlete = Athlete(data_path,self) - self.stats = Stats(data_path,self) + self.stats = Stats(self._sport_service, self) pool_size = self.profile.getIntValue("pytraining","activitypool_size", default=1) self.activitypool = ActivityPool(self, size=pool_size) #preparamos la ventana principal Modified: pytrainer/trunk/pytrainer/stats.py =================================================================== --- pytrainer/trunk/pytrainer/stats.py 2011-08-18 03:13:11 UTC (rev 851) +++ pytrainer/trunk/pytrainer/stats.py 2011-08-18 03:13:32 UTC (rev 852) @@ -17,17 +17,12 @@ #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. import logging -import dateutil -from pytrainer.lib.ddbb import DDBB -from pytrainer.lib.graphdata import GraphData - class Stats: - def __init__(self, data_path = None, parent = None): + def __init__(self, sport_service, parent = None): logging.debug('>>') - self.parent = parent + self._sport_service = sport_service self.pytrainer_main = parent - self.data_path = data_path self.init_from_conf() self.data = self.get_stats() logging.debug('<<') @@ -54,12 +49,11 @@ for f in fields: data[f] = 0 - sports = dict([(s['id_sports'], s['name']) for s in self.pytrainer_main.ddbb.select_dict("sports", ('id_sports', 'name'))]) results = self.pytrainer_main.ddbb.select_dict("records", ('id_record', 'date', 'sport', 'distance', 'duration', 'maxbeats', 'maxspeed', 'maxpace', 'average','pace','beats')) for r in results: -# r['duration'] /= 3600 if r['sport'] not in data['sports']: - data['sports'][r['sport']] = {'name': sports[r['sport']], 'count': 0} + sport = self._sport_service.get_sport(r['sport']) + data['sports'][r['sport']] = {'name': sport.name, 'count': 0} for f in fields: data['sports'][r['sport']][f] = 0 data['sports'][r['sport']]['total_'+f] = 0 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <nc...@us...> - 2011-08-18 03:13:17
|
Revision: 851 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=851&view=rev Author: ncjones Date: 2011-08-18 03:13:11 +0000 (Thu, 18 Aug 2011) Log Message: ----------- Use sport service in record.py ticket:138 Modified Paths: -------------- pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/record.py pytrainer/trunk/pytrainer/sport.py pytrainer/trunk/pytrainer/test/sport_test.py Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2011-08-18 03:12:43 UTC (rev 850) +++ pytrainer/trunk/pytrainer/main.py 2011-08-18 03:13:11 UTC (rev 851) @@ -83,7 +83,7 @@ self.sanityCheck() self._sport_service = SportService(self.ddbb) - self.record = Record(data_path,self) + self.record = Record(self._sport_service, data_path, self) self.athlete = Athlete(data_path,self) self.stats = Stats(data_path,self) pool_size = self.profile.getIntValue("pytraining","activitypool_size", default=1) Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2011-08-18 03:12:43 UTC (rev 850) +++ pytrainer/trunk/pytrainer/record.py 2011-08-18 03:13:11 UTC (rev 851) @@ -29,10 +29,12 @@ from lib.date import Date from lib.gpx import Gpx from pytrainer.equipment import EquipmentService +from pytrainer.sport import Sport class Record: - def __init__(self, data_path = None, parent = None): + def __init__(self, sport_service, data_path = None, parent = None): logging.debug('>>') + self._sport_service = sport_service self.parent = parent self.pytrainer_main = parent self._equipment_service = EquipmentService(self.pytrainer_main.ddbb) @@ -92,37 +94,6 @@ logging.debug('removed gpxfile '+gpxfile) logging.debug('<<') - def _formatRecord (self, list_options): - logging.debug('>>') - time = self.date.time2second(list_options["rcd_time"]) - average = self.parseFloatRecord(list_options["rcd_average"]) - 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] - - values= ( - list_options["rcd_date"], - sport_id, - self.parseFloatRecord(list_options["rcd_distance"]), - time, - self.parseFloatRecord(list_options["rcd_beats"]), - list_options["rcd_comments"], - average, - self.parseFloatRecord(list_options["rcd_calories"]), - list_options["rcd_title"], - self.parseFloatRecord(list_options["rcd_upositive"]), - self.parseFloatRecord(list_options["rcd_unegative"]), - self.parseFloatRecord(list_options["rcd_maxvel"]), - self.pace_to_float(list_options["rcd_maxpace"]), - self.pace_to_float(list_options["rcd_pace"]), - self.parseFloatRecord(list_options["rcd_maxbeats"]) - ) - logging.debug('<<') - return cells,values - def pace_to_float(self, value): '''Take a mm:ss or mm.ss and return float''' value = value.replace(':', '.') @@ -418,55 +389,41 @@ return self.pytrainer_main.ddbb.select(tables, "date,distance,time,beats,comments,average,calories,maxspeed,maxbeats,upositive,unegative", condition) + + def _get_sport(self, sport_name): + return self._sport_service.get_sport_by_name(sport_name) - def getSportMet(self,sport): + def getSportMet(self,sport_name): + """Deprecated: use sport.met""" logging.debug('--') - return self.pytrainer_main.ddbb.select("sports","met","name=\"%s\"" %(sport))[0][0] + return self._get_sport(sport_name).met - def getSportWeight(self,sport): + def getSportWeight(self,sport_name): + """Deprecated: use sport.weight""" logging.debug('--') - return self.pytrainer_main.ddbb.select("sports","weight","name=\"%s\"" %(sport))[0][0] + return self._get_sport(sport_name).weight - 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 + def getSportId(self, sport_name, add=None): + """Deprecated: use sport_service.get_sport_by_name() + + Get the id of a sport by name, optionally adding a new sport if + none exists with the given name. arguments: - 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('>>') - sport_id=None - if sport == "" or sport is None: - return sport_id - try: - sport_id = self.pytrainer_main.ddbb.select("sports","id_sports","name=\"%s\"" %(sport))[0][0] - except: - logging.error('Error retrieving id_sports from '+ str(sport)) - #traceback.print_last() - if add is None: - logging.debug('Sport '+str(sport)+' will not be added to DB') - else: - logging.debug('Adding sport '+str(sport)+' to DB') - sport_id = self.addNewSport(sport,"0","0") - logging.debug('<<') - return sport_id + sport_name: sport's name to get id for + add: whether the sport should be added if not found + returns: id for sport with given name or None""" + if sport_name is None: + return None + sport = self._get_sport(sport_name) + if sport is None: + logging.debug("No sport with name: '%s'", str(sport_name)) + if add is not None: + logging.debug("Adding sport '%s'", str(sport)) + new_sport = Sport() + new_sport.name = sport_name + sport = self._sport_service.store_sport(new_sport) + return None if sport is None else 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 - met: - weight: - returns: id_sports from new sport""" - logging.debug(">>") - logging.debug("Adding new sport: "+sport+"|"+weight+"|"+met) - sportT = [sport,met,weight] - self.pytrainer_main.ddbb.insert("sports","name,met,weight",sportT) - 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") Modified: pytrainer/trunk/pytrainer/sport.py =================================================================== --- pytrainer/trunk/pytrainer/sport.py 2011-08-18 03:12:43 UTC (rev 850) +++ pytrainer/trunk/pytrainer/sport.py 2011-08-18 03:13:11 UTC (rev 851) @@ -144,6 +144,8 @@ """Get the sport with the specified id. If no sport with the given id exists then None is returned.""" + if sport_id is None: + raise ValueError("Sport id cannot be None") resultSet = self._ddbb.select(_TABLE, _SELECT_COLUMNS, self._create_id_where_clause(sport_id)) if len(resultSet) == 0: return None @@ -154,7 +156,11 @@ """Get the sport with the specified name. If no sport with the given name exists then None is returned.""" + if name is None: + raise ValueError("Sport name cannot be None") sport_id = self._get_sport_id_from_name(name) + if sport_id is None: + return None return self.get_sport(sport_id) def _get_sport_id_from_name(self, name): Modified: pytrainer/trunk/pytrainer/test/sport_test.py =================================================================== --- pytrainer/trunk/pytrainer/test/sport_test.py 2011-08-18 03:12:43 UTC (rev 850) +++ pytrainer/trunk/pytrainer/test/sport_test.py 2011-08-18 03:13:11 UTC (rev 851) @@ -224,7 +224,12 @@ self.sport_service = SportService(self.mock_ddbb) def test_store_sport_should_insert_row_when_sport_has_no_id(self): - self.mock_ddbb.select.return_value = [] + def mock_select(table, columns, where): + call_count = self.mock_ddbb.select.call_count + if call_count == 2: + return [[1]] + return [] + self.mock_ddbb.select = mock.Mock(wraps=mock_select) sport = Sport() sport.name = u"Test name" self.sport_service.store_sport(sport) @@ -309,6 +314,14 @@ sport = self.sport_service.get_sport(1) self.assertEquals(1, sport.id) + def test_get_sport_raises_error_for_id_none(self): + try: + self.sport_service.get_sport(None) + except(ValueError): + pass + else: + self.fail() + def test_get_sport_by_name_returns_none_for_nonexistant_sport(self): self.mock_ddbb.select.return_value = [] sport = self.sport_service.get_sport("no such sport") @@ -324,6 +337,14 @@ sport = self.sport_service.get_sport("rugby") self.assertEquals(u"rugby", sport.name) + def test_get_sport_by_name_raises_error_for_none_sport_name(self): + try: + self.sport_service.get_sport_by_name(None) + except(ValueError): + pass + else: + self.fail() + def test_get_all_sports_should_return_all_sports_in_query_result(self): self.mock_ddbb.select.return_value = [(1, u"Test name", 0, 0, 0, "0"), (2, u"Test name 2", 0, 0, 0, "0")] sports = self.sport_service.get_all_sports() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <nc...@us...> - 2011-08-18 03:12:49
|
Revision: 850 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=850&view=rev Author: ncjones Date: 2011-08-18 03:12:43 +0000 (Thu, 18 Aug 2011) Log Message: ----------- Use sport service in main. ticket:138 Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/gui/windowprofile.py pytrainer/trunk/pytrainer/gui/windowrecord.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/profile.py pytrainer/trunk/pytrainer/record.py Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2011-08-17 11:10:47 UTC (rev 849) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2011-08-18 03:12:43 UTC (rev 850) @@ -297,8 +297,8 @@ #Re-add "All Sports" liststore.append([firstEntry]) #Re-add all sports in listSport - for i in listSport: - liststore.append([i[0]]) + for sport in listSport: + liststore.append([sport.name]) self.sportlist.set_active(0) logging.debug("<<") Modified: pytrainer/trunk/pytrainer/gui/windowprofile.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowprofile.py 2011-08-17 11:10:47 UTC (rev 849) +++ pytrainer/trunk/pytrainer/gui/windowprofile.py 2011-08-18 03:12:43 UTC (rev 850) @@ -21,7 +21,7 @@ from windowcalendar import WindowCalendar from pytrainer.equipment import EquipmentService from pytrainer.gui.equipment import EquipmentUi -from pytrainer.sport import Sport, SportService +from pytrainer.sport import Sport import gtk import gobject import logging @@ -30,7 +30,7 @@ from pytrainer.gui.color import ColorConverter class WindowProfile(SimpleGladeApp): - def __init__(self, data_path = None, parent=None, pytrainer_main=None): + def __init__(self, sport_service, data_path = None, parent=None, pytrainer_main=None): glade_path="glade/profile.glade" root = "newprofile" domain = None @@ -40,7 +40,7 @@ SimpleGladeApp.__init__(self, data_path+glade_path, root, domain) self.conf_options = parent.profile_options self.stored_color = pytrainer.lib.color.Color(0) - self._sport_service = SportService(self.pytrainer_main.ddbb) + self._sport_service = sport_service def new(self): self.gender_options = { Modified: pytrainer/trunk/pytrainer/gui/windowrecord.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowrecord.py 2011-08-17 11:10:47 UTC (rev 849) +++ pytrainer/trunk/pytrainer/gui/windowrecord.py 2011-08-18 03:12:43 UTC (rev 850) @@ -67,8 +67,8 @@ "rcd_maxvel", ] self.listSport = {} - for i in listSport: - self.listSport[i[3]] = i[0] #Create dictionary using SportID as key (may be non sequential if sports have been deleted) + for sport in listSport: + self.listSport[sport.id] = sport.name for i in self.listSport: self.rcd_sport.insert_text(i,self.listSport[i]) self.rcd_sport.set_active(0) Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2011-08-17 11:10:47 UTC (rev 849) +++ pytrainer/trunk/pytrainer/main.py 2011-08-18 03:12:43 UTC (rev 850) @@ -41,6 +41,7 @@ from importdata import Importdata from plugins import Plugins from profile import Profile +from pytrainer.sport import SportService from athlete import Athlete from stats import Stats @@ -81,6 +82,7 @@ logging.debug("Checking DB as per user's request") self.sanityCheck() + self._sport_service = SportService(self.ddbb) self.record = Record(data_path,self) self.athlete = Athlete(data_path,self) self.stats = Stats(data_path,self) @@ -207,8 +209,8 @@ def refreshMainSportList(self): logging.debug('>>') - listSport = self.profile.getSportList() - self.windowmain.updateSportList(listSport) + sports = self._sport_service.get_all_sports() + self.windowmain.updateSportList(sports) logging.debug('<<') def refreshGraphView(self, view, sport=None): @@ -426,20 +428,17 @@ def newRecord(self,title=None,distance=None,time=None,upositive=None,unegative=None,bpm=None,calories=None,date=None,comment=None,view=None): logging.debug('>>') - list_sport = self.profile.getSportList() if date == None: date = self.date.getDate() - self.record.newRecord(list_sport, date, title, distance, time, upositive, unegative, bpm, calories, comment) + self.record.newRecord(date, title, distance, time, upositive, unegative, bpm, calories, comment) self.refreshListRecords() if view is not None: self.refreshGraphView(view) logging.debug('<<') def editRecord(self, id_record, view=None): - logging.debug('>>') - list_sport = self.profile.getSportList() - logging.debug('id_record: '+str(id_record)+' | list_sport: '+str(list_sport)) - self.record.editRecord(id_record,list_sport) + logging.debug("Editing record with id: '%s'", id_record) + self.record.editRecord(id_record) self.refreshListRecords() if view is not None: self.refreshGraphView(view) @@ -488,7 +487,7 @@ def editProfile(self): logging.debug('>>') - self.profile.editProfile() + self.profile.editProfile(self._sport_service) self.activitypool.clear_pool() self.windowmain.setup() logging.debug('<<') Modified: pytrainer/trunk/pytrainer/profile.py =================================================================== --- pytrainer/trunk/pytrainer/profile.py 2011-08-17 11:10:47 UTC (rev 849) +++ pytrainer/trunk/pytrainer/profile.py 2011-08-18 03:12:43 UTC (rev 850) @@ -228,14 +228,14 @@ #else: # return connection - def editProfile(self): + def editProfile(self, sport_service): logging.debug(">>") from gui.windowprofile import WindowProfile logging.debug("retrieving configuration data") #Refresh configuration self.configuration = self._parse_config_file(self.config_file) if self.profilewindow is None: - self.profilewindow = WindowProfile(self.data_path, self, pytrainer_main=self.pytrainer_main) + self.profilewindow = WindowProfile(sport_service, self.data_path, self, pytrainer_main=self.pytrainer_main) logging.debug("setting data values") self.profilewindow.setValues(self.configuration) self.profilewindow.run() Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2011-08-17 11:10:47 UTC (rev 849) +++ pytrainer/trunk/pytrainer/record.py 2011-08-18 03:12:43 UTC (rev 850) @@ -41,9 +41,10 @@ self.date = Date() logging.debug('<<') - def newRecord(self, list_sport, date, title=None, distance=None, time=None, upositive=None, unegative=None, bpm=None, calories=None, comment=None): + def newRecord(self, date, title=None, distance=None, time=None, upositive=None, unegative=None, bpm=None, calories=None, comment=None): logging.debug('>>') - self.recordwindow = WindowRecord(self._equipment_service, self.data_path, list_sport,self, date, title, distance, time, upositive, unegative, bpm, calories, comment) + sports = self._sport_service.get_all_sports() + self.recordwindow = WindowRecord(self._equipment_service, self.data_path, sports, self, date, title, distance, time, upositive, unegative, bpm, calories, comment) self.recordwindow.run() logging.debug('<<') @@ -56,11 +57,12 @@ return self.recordwindow.getActivityData() logging.debug('<<') - def editRecord(self,id_record,list_sport): + def editRecord(self,id_record): logging.debug('>>') activity = self.pytrainer_main.activitypool.get_activity(id_record) record_equipment = self.get_record_equipment(id_record) - self.recordwindow = WindowRecord(self._equipment_service, self.data_path, list_sport, self, None, windowTitle=_("Edit Entry"), equipment=record_equipment) + sports = self._sport_service.get_all_sports() + self.recordwindow = WindowRecord(self._equipment_service, self.data_path, sports, self, None, windowTitle=_("Edit Entry"), equipment=record_equipment) self.recordwindow.setValuesFromActivity(activity) ''' record = self.pytrainer_main.ddbb.select("records", "id_record, date, sport, distance, time, beats, average, calories, comments, gpslog, title, upositive, unegative, maxspeed, maxpace, pace, maxbeats, date_time_utc, date_time_local", "id_record=\"%s\"" %id_record) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <nc...@us...> - 2011-08-17 11:10:53
|
Revision: 849 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=849&view=rev Author: ncjones Date: 2011-08-17 11:10:47 +0000 (Wed, 17 Aug 2011) Log Message: ----------- Fix GPX import. ticket:141 Modified Paths: -------------- pytrainer/trunk/pytrainer/record.py Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2011-08-15 10:10:10 UTC (rev 848) +++ pytrainer/trunk/pytrainer/record.py 2011-08-17 11:10:47 UTC (rev 849) @@ -50,7 +50,7 @@ def newMultiRecord(self, activities, list_sport): logging.debug('>>') #activities (activity_id, start_time, distance, duration, sport, gpx_file) - self.recordwindow = WindowRecord(self._equipment_service, self._equipment_service, self.data_path, list_sport, parent=self, windowTitle="Modify details before importing") + self.recordwindow = WindowRecord(self._equipment_service, self.data_path, list_sport, parent=self, windowTitle="Modify details before importing") self.recordwindow.populateMultiWindow(activities) self.recordwindow.run() return self.recordwindow.getActivityData() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2011-08-15 10:10:18
|
Revision: 848 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=848&view=rev Author: dgranda Date: 2011-08-15 10:10:10 +0000 (Mon, 15 Aug 2011) Log Message: ----------- Updating 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 2011-08-15 10:09:33 UTC (rev 847) +++ pytrainer/trunk/locale/es/LC_MESSAGES/pytrainer_es.po 2011-08-15 10:10:10 UTC (rev 848) @@ -7,8 +7,8 @@ msgstr "" "Project-Id-Version: pytrainer 1.8.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-20 11:35+0200\n" -"PO-Revision-Date: 2011-05-20 11:36+0100\n" +"POT-Creation-Date: 2011-08-15 12:02+0200\n" +"PO-Revision-Date: 2011-08-15 12:03+0100\n" "Last-Translator: David Garcia Granda <dg...@gm...>\n" "Language-Team: Spanish <es...@li...>\n" "Language: es\n" @@ -27,6 +27,8 @@ #: glade/equipment.glade:149 #: glade/equipment.glade:406 +#: build/lib/pytrainer/gui/equipment.py:98 +#: pytrainer/gui/equipment.py:98 msgid "Description" msgstr "Descripción" @@ -42,11 +44,14 @@ #: glade/equipment.glade:243 #: glade/equipment.glade:499 +#: build/lib/pytrainer/gui/equipment.py:102 +#: pytrainer/gui/equipment.py:102 msgid "Active" msgstr "Habilitado" #: glade/equipment.glade:277 #: glade/equipment.glade:533 +#: build/lib/pytrainer/gui/windowimportdata.py:352 #: pytrainer/gui/windowimportdata.py:352 msgid "Notes" msgstr "Notas" @@ -83,7 +88,7 @@ #: glade/extensions.glade:82 #: glade/plugins.glade:144 #: glade/profile.glade:728 -#: glade/pytrainer.glade:5676 +#: glade/pytrainer.glade:5712 msgid "Name:" msgstr "Nombre:" @@ -94,7 +99,7 @@ #: glade/extensions.glade:110 #: glade/plugins.glade:86 -#: glade/pytrainer.glade:6512 +#: glade/pytrainer.glade:6548 msgid "Description:" msgstr "<b>Descripción:</b>" @@ -238,10 +243,15 @@ msgstr "<b>Delimitador en el archivo</b>" #: glade/importdata.glade:864 -#: pytrainer/gui/windowmain.py:112 -#: pytrainer/gui/windowmain.py:127 -#: pytrainer/gui/windowmain.py:180 -#: pytrainer/gui/windowmain.py:1491 +#: build/lib/pytrainer/gui/windowmain.py:115 +#: build/lib/pytrainer/gui/windowmain.py:130 +#: build/lib/pytrainer/gui/windowmain.py:183 +#: build/lib/pytrainer/gui/windowmain.py:1496 +#: build/lib/pytrainer/gui/dialogselecttrack.py:40 +#: pytrainer/gui/windowmain.py:115 +#: pytrainer/gui/windowmain.py:130 +#: pytrainer/gui/windowmain.py:183 +#: pytrainer/gui/windowmain.py:1496 #: pytrainer/gui/dialogselecttrack.py:40 msgid "Date" msgstr "Fecha" @@ -265,6 +275,22 @@ msgstr "Descartar" #: glade/importdata.glade:892 +#: glade/newrecord.glade:221 +#: build/lib/pytrainer/recordgraph.py:134 +#: build/lib/pytrainer/recordgraph.py:136 +#: build/lib/pytrainer/recordgraph.py:138 +#: build/lib/pytrainer/recordgraph.py:140 +#: build/lib/pytrainer/recordgraph.py:142 +#: build/lib/pytrainer/recordgraph.py:144 +#: build/lib/pytrainer/recordgraph.py:146 +#: build/lib/pytrainer/monthgraph.py:26 +#: build/lib/pytrainer/heartrategraph.py:36 +#: build/lib/pytrainer/totalgraph.py:24 +#: build/lib/pytrainer/yeargraph.py:26 +#: build/lib/pytrainer/daygraph.py:52 +#: build/lib/pytrainer/daygraph.py:54 +#: build/lib/pytrainer/daygraph.py:56 +#: build/lib/pytrainer/weekgraph.py:28 #: pytrainer/recordgraph.py:134 #: pytrainer/recordgraph.py:136 #: pytrainer/recordgraph.py:138 @@ -296,8 +322,10 @@ msgstr "<b>Columna en el archivo</b>" #: glade/importdata.glade:972 -#: pytrainer/gui/windowmain.py:111 -#: pytrainer/gui/windowmain.py:1490 +#: build/lib/pytrainer/gui/windowmain.py:114 +#: build/lib/pytrainer/gui/windowmain.py:1495 +#: pytrainer/gui/windowmain.py:114 +#: pytrainer/gui/windowmain.py:1495 msgid "Title" msgstr "Título" @@ -318,6 +346,10 @@ msgstr "Velocidad Máx. (km/h)" #: glade/importdata.glade:1037 +#: build/lib/pytrainer/monthgraph.py:29 +#: build/lib/pytrainer/totalgraph.py:27 +#: build/lib/pytrainer/yeargraph.py:29 +#: build/lib/pytrainer/weekgraph.py:31 #: pytrainer/monthgraph.py:29 #: pytrainer/totalgraph.py:27 #: pytrainer/yeargraph.py:29 @@ -327,13 +359,20 @@ #: glade/importdata.glade:1050 #: glade/pytrainer.glade:277 -#: pytrainer/gui/windowmain.py:106 -#: pytrainer/gui/windowmain.py:114 -#: pytrainer/gui/windowmain.py:136 -#: pytrainer/gui/windowmain.py:1493 +#: build/lib/pytrainer/gui/windowmain.py:109 +#: build/lib/pytrainer/gui/windowmain.py:117 +#: build/lib/pytrainer/gui/windowmain.py:139 +#: build/lib/pytrainer/gui/windowmain.py:1498 +#: build/lib/pytrainer/gui/windowimportdata.py:352 +#: build/lib/pytrainer/gui/windowrecord.py:210 +#: build/lib/pytrainer/gui/windowprofile.py:65 +#: pytrainer/gui/windowmain.py:109 +#: pytrainer/gui/windowmain.py:117 +#: pytrainer/gui/windowmain.py:139 +#: pytrainer/gui/windowmain.py:1498 #: pytrainer/gui/windowimportdata.py:352 #: pytrainer/gui/windowrecord.py:210 -#: pytrainer/gui/windowprofile.py:60 +#: pytrainer/gui/windowprofile.py:65 msgid "Sport" msgstr "Deporte" @@ -346,6 +385,7 @@ msgstr "Pulsaciones máximas (ppm)" #: glade/importdata.glade:1089 +#: build/lib/pytrainer/recordgraph.py:138 #: pytrainer/recordgraph.py:138 msgid "Pace (min/km)" msgstr "Ritmo (min/km)" @@ -355,8 +395,9 @@ msgstr "Ritmo máximo(min/km)" #: glade/importdata.glade:1115 -#: glade/newrecord.glade:1094 -#: pytrainer/gui/windowmain.py:163 +#: glade/newrecord.glade:1096 +#: build/lib/pytrainer/gui/windowmain.py:166 +#: pytrainer/gui/windowmain.py:166 msgid "Comments" msgstr "Comentarios" @@ -365,7 +406,7 @@ msgstr "Forzar deporte a:" #: glade/importdata.glade:1323 -#: glade/newrecord.glade:404 +#: glade/newrecord.glade:405 msgid " " msgstr " " @@ -396,7 +437,8 @@ msgstr "<b>Importar desde fichero CSV</b>" #: glade/newrecord.glade:7 -#: pytrainer/gui/windowmain.py:2156 +#: build/lib/pytrainer/gui/windowmain.py:2162 +#: pytrainer/gui/windowmain.py:2162 msgid "New Entry" msgstr "Nueva entrada" @@ -420,97 +462,100 @@ msgid "<b>Main</b>" msgstr "<b>Principal</b>" -#: glade/newrecord.glade:221 -msgid "Distance (Km):" -msgstr "Distancia (km):" - -#: glade/newrecord.glade:230 -#: glade/newrecord.glade:355 -#: glade/newrecord.glade:558 -#: glade/newrecord.glade:697 -#: glade/newrecord.glade:958 +#: glade/newrecord.glade:231 +#: glade/newrecord.glade:356 +#: glade/newrecord.glade:560 +#: glade/newrecord.glade:699 +#: glade/newrecord.glade:960 #: glade/profile.glade:1548 msgid "Calculate" msgstr "Calcular" -#: glade/newrecord.glade:248 +#: glade/newrecord.glade:249 msgid "Duration:" msgstr "Duración:" -#: glade/newrecord.glade:279 -#: glade/newrecord.glade:306 +#: glade/newrecord.glade:280 +#: glade/newrecord.glade:307 msgid ":" msgstr ":" -#: glade/newrecord.glade:376 +#: glade/newrecord.glade:377 msgid "Date:" msgstr "Fecha:" -#: glade/newrecord.glade:445 +#: glade/newrecord.glade:446 msgid "Start Time:" msgstr "Hora de comienzo:" -#: glade/newrecord.glade:461 +#: glade/newrecord.glade:462 msgid "12:00:00" msgstr "12:00:00" -#: glade/newrecord.glade:486 +#: glade/newrecord.glade:487 #: glade/profile.glade:1586 msgid "<b>General</b>" msgstr "<b>General:</b>" -#: glade/newrecord.glade:522 +#: glade/newrecord.glade:523 msgid "Max (km/h):" msgstr "Punta (km/h)" -#: glade/newrecord.glade:547 +#: glade/newrecord.glade:548 msgid "Average (km/h)" msgstr "Media (km/h)" -#: glade/newrecord.glade:593 +#: glade/newrecord.glade:595 msgid "<b>Speed</b>" msgstr "<b>Velocidad</b>" -#: glade/newrecord.glade:612 +#: glade/newrecord.glade:614 msgid "Quick Entry" msgstr "Entrada" -#: glade/newrecord.glade:644 +#: glade/newrecord.glade:646 msgid "Max (min/km):" msgstr "Max (min/km)" -#: glade/newrecord.glade:671 +#: glade/newrecord.glade:673 msgid "Pace (min/km):" msgstr "Ritmo (min/km)" -#: glade/newrecord.glade:718 +#: glade/newrecord.glade:720 msgid "<b>Pace</b>" msgstr "<b>Ritmo</b>" -#: glade/newrecord.glade:754 +#: glade/newrecord.glade:756 msgid "Ascent:" msgstr "Ascenso:" -#: glade/newrecord.glade:780 +#: glade/newrecord.glade:782 msgid "Descent:" msgstr "Descenso:" -#: glade/newrecord.glade:813 +#: glade/newrecord.glade:815 msgid "<b>Accumulated Altitude Change</b>" msgstr "<b>Desnivel acumulado:</b>" -#: glade/newrecord.glade:850 +#: glade/newrecord.glade:852 msgid "Max (bpm):" msgstr "Pulsaciones máximas" -#: glade/newrecord.glade:862 +#: glade/newrecord.glade:864 msgid "Heart rate:" msgstr "Pulsaciones" -#: glade/newrecord.glade:902 -#: pytrainer/gui/windowmain.py:118 -#: pytrainer/gui/windowmain.py:161 -#: pytrainer/gui/windowmain.py:1497 +#: glade/newrecord.glade:904 +#: build/lib/pytrainer/gui/windowmain.py:121 +#: build/lib/pytrainer/gui/windowmain.py:164 +#: build/lib/pytrainer/gui/windowmain.py:1502 +#: build/lib/pytrainer/monthgraph.py:30 +#: build/lib/pytrainer/totalgraph.py:28 +#: build/lib/pytrainer/yeargraph.py:30 +#: build/lib/pytrainer/weekgraph.py:32 +#: pytrainer/gui/windowmain.py:121 +#: pytrainer/gui/windowmain.py:164 +#: pytrainer/gui/windowmain.py:1502 #: pytrainer/monthgraph.py:30 #: pytrainer/totalgraph.py:28 #: pytrainer/yeargraph.py:30 @@ -518,31 +563,31 @@ msgid "Calories" msgstr "Calorías" -#: glade/newrecord.glade:931 +#: glade/newrecord.glade:933 msgid "<small><b>Note:</b> In order to calculate the calories you must set the sport MET (in Preferences->Sport) </small>" msgstr "<small><b>Nota:</b> para el cálculo de calorías es necesario introducir el valor de MET del deporte (en Preferencias -> Deporte)</small>" -#: glade/newrecord.glade:1005 +#: glade/newrecord.glade:1007 msgid "<b>Heart Rate</b>" msgstr "<b>Pulsaciones</b>" -#: glade/newrecord.glade:1027 +#: glade/newrecord.glade:1029 msgid "Advanced" msgstr "Avanzado" -#: glade/newrecord.glade:1079 +#: glade/newrecord.glade:1081 msgid "<b>Comments</b>" msgstr "<b>Comentarios</b>" -#: glade/newrecord.glade:1134 +#: glade/newrecord.glade:1136 msgid "<i>There are no active equipment items.</i>" msgstr "<i>No hay piezas de material activas</i>" -#: glade/newrecord.glade:1188 +#: glade/newrecord.glade:1190 msgid "<b>Associated Equipment</b>" msgstr "<b>Material asociado</b>" -#: glade/newrecord.glade:1203 +#: glade/newrecord.glade:1205 #: glade/profile.glade:1446 msgid "Equipment" msgstr "Equipamiento" @@ -576,12 +621,12 @@ msgstr "<b>Sistema de medida</b>" #: glade/profile.glade:103 -#: glade/pytrainer.glade:2085 +#: glade/pytrainer.glade:2120 msgid "Google" msgstr "Google" #: glade/profile.glade:118 -#: glade/pytrainer.glade:2068 +#: glade/pytrainer.glade:2103 msgid "Open Street Map" msgstr "Open Street Map" @@ -626,12 +671,12 @@ msgstr "Género:" #: glade/profile.glade:407 -#: glade/pytrainer.glade:5701 +#: glade/pytrainer.glade:5737 msgid "Height:" msgstr "Altura:" #: glade/profile.glade:447 -#: glade/pytrainer.glade:5688 +#: glade/pytrainer.glade:5724 msgid "Date of birth:" msgstr "Fecha de nacimiento:" @@ -640,12 +685,12 @@ msgstr "Peso:" #: glade/profile.glade:542 -#: glade/pytrainer.glade:5763 +#: glade/pytrainer.glade:5799 msgid "<b>Athlete Details</b>" msgstr "<b>Datos personales</b>" #: glade/profile.glade:557 -#: glade/pytrainer.glade:5866 +#: glade/pytrainer.glade:5902 msgid "Athlete" msgstr "Atleta" @@ -707,18 +752,22 @@ msgstr "M.E.T." #: glade/profile.glade:1193 -#: pytrainer/gui/windowprofile.py:60 +#: build/lib/pytrainer/gui/windowprofile.py:65 +#: pytrainer/gui/windowprofile.py:65 msgid "Extra Weight" msgstr "Peso extra" #: glade/profile.glade:1238 -#: pytrainer/gui/windowprofile.py:60 +#: build/lib/pytrainer/gui/windowprofile.py:65 +#: pytrainer/gui/windowprofile.py:65 msgid "Maximum Pace" msgstr "Ritmo más rápido" #: glade/profile.glade:1265 -#: pytrainer/gui/windowmain.py:184 -#: pytrainer/gui/windowprofile.py:60 +#: build/lib/pytrainer/gui/windowmain.py:187 +#: build/lib/pytrainer/gui/windowprofile.py:65 +#: pytrainer/gui/windowmain.py:187 +#: pytrainer/gui/windowprofile.py:65 msgid "Color" msgstr "Color" @@ -759,7 +808,8 @@ msgstr "Basado en porcentajes" #: glade/profile.glade:1651 -#: pytrainer/gui/windowmain.py:789 +#: build/lib/pytrainer/gui/windowmain.py:792 +#: pytrainer/gui/windowmain.py:792 msgid "Karvonen method" msgstr "Karvonen" @@ -772,6 +822,13 @@ msgstr "<b>Zonas de frecuencia cardiaca</b>" #: glade/profile.glade:1733 +#: build/lib/pytrainer/recordgraph.py:140 +#: build/lib/pytrainer/lib/activity.py:433 +#: build/lib/pytrainer/lib/activity.py:435 +#: build/lib/pytrainer/lib/activity.py:445 +#: build/lib/pytrainer/lib/activity.py:515 +#: build/lib/pytrainer/heartrategraph.py:36 +#: build/lib/pytrainer/daygraph.py:56 #: pytrainer/recordgraph.py:140 #: pytrainer/lib/activity.py:433 #: pytrainer/lib/activity.py:435 @@ -879,7 +936,7 @@ msgstr "_Ayuda" #: glade/pytrainer.glade:290 -#: glade/pytrainer.glade:6288 +#: glade/pytrainer.glade:6324 msgid "All Sports" msgstr "Deportes" @@ -888,26 +945,26 @@ msgstr "<b>Deporte:</b>" #: glade/pytrainer.glade:408 -#: glade/pytrainer.glade:3117 -#: glade/pytrainer.glade:3759 -#: glade/pytrainer.glade:4413 -#: glade/pytrainer.glade:5143 +#: glade/pytrainer.glade:3153 +#: glade/pytrainer.glade:3795 +#: glade/pytrainer.glade:4449 +#: glade/pytrainer.glade:5179 msgid "<b>Duration:</b>" msgstr "<b>Duración:</b>" #: glade/pytrainer.glade:423 -#: glade/pytrainer.glade:3207 -#: glade/pytrainer.glade:3838 -#: glade/pytrainer.glade:4492 -#: glade/pytrainer.glade:5245 +#: glade/pytrainer.glade:3243 +#: glade/pytrainer.glade:3874 +#: glade/pytrainer.glade:4528 +#: glade/pytrainer.glade:5281 msgid "<b>Speed:</b>" msgstr "<b>Velocidad:</b>" #: glade/pytrainer.glade:437 -#: glade/pytrainer.glade:3375 -#: glade/pytrainer.glade:4033 -#: glade/pytrainer.glade:4687 -#: glade/pytrainer.glade:5340 +#: glade/pytrainer.glade:3411 +#: glade/pytrainer.glade:4069 +#: glade/pytrainer.glade:4723 +#: glade/pytrainer.glade:5376 msgid "<b>Pace:</b>" msgstr "<b>Ritmo:</b>" @@ -928,10 +985,10 @@ msgstr "<b>Fecha:</b>" #: glade/pytrainer.glade:628 -#: glade/pytrainer.glade:3103 -#: glade/pytrainer.glade:3745 -#: glade/pytrainer.glade:4399 -#: glade/pytrainer.glade:5129 +#: glade/pytrainer.glade:3139 +#: glade/pytrainer.glade:3781 +#: glade/pytrainer.glade:4435 +#: glade/pytrainer.glade:5165 msgid "<b>Distance:</b>" msgstr "<b>Distancia:</b>" @@ -940,10 +997,10 @@ msgstr "<b>Pico velocidad:</b>" #: glade/pytrainer.glade:661 -#: glade/pytrainer.glade:3405 -#: glade/pytrainer.glade:4047 -#: glade/pytrainer.glade:4701 -#: glade/pytrainer.glade:5355 +#: glade/pytrainer.glade:3441 +#: glade/pytrainer.glade:4083 +#: glade/pytrainer.glade:4737 +#: glade/pytrainer.glade:5391 msgid "<b>Max Pace:</b>" msgstr "<b>Pico ritmo:</b>" @@ -952,67 +1009,76 @@ msgstr "<b>Descenso:</b>" #: glade/pytrainer.glade:769 -#: glade/pytrainer.glade:3315 -#: glade/pytrainer.glade:3913 -#: glade/pytrainer.glade:4567 -#: glade/pytrainer.glade:5055 +#: glade/pytrainer.glade:3351 +#: glade/pytrainer.glade:3949 +#: glade/pytrainer.glade:4603 +#: glade/pytrainer.glade:5091 msgid "Cal" msgstr "Cal" -#: glade/pytrainer.glade:810 -#: glade/pytrainer.glade:3077 -#: glade/pytrainer.glade:3719 -#: glade/pytrainer.glade:4373 -#: glade/pytrainer.glade:5232 -#: pytrainer/gui/windowmain.py:105 +#: glade/pytrainer.glade:809 +#: glade/pytrainer.glade:3113 +#: glade/pytrainer.glade:3755 +#: glade/pytrainer.glade:4409 +#: glade/pytrainer.glade:5268 +#: build/lib/pytrainer/gui/windowmain.py:108 +#: pytrainer/gui/windowmain.py:108 msgid "Km" msgstr "km" -#: glade/pytrainer.glade:825 -#: glade/pytrainer.glade:3237 -#: glade/pytrainer.glade:3270 -#: glade/pytrainer.glade:3868 -#: glade/pytrainer.glade:3961 -#: glade/pytrainer.glade:4522 -#: glade/pytrainer.glade:4615 -#: glade/pytrainer.glade:5275 -#: glade/pytrainer.glade:5291 -#: pytrainer/gui/windowmain.py:913 -#: pytrainer/gui/windowmain.py:914 -#: pytrainer/gui/windowmain.py:1042 -#: pytrainer/gui/windowmain.py:1043 -#: pytrainer/gui/windowmain.py:1124 -#: pytrainer/gui/windowmain.py:1125 +#: glade/pytrainer.glade:824 +#: glade/pytrainer.glade:3273 +#: glade/pytrainer.glade:3306 +#: glade/pytrainer.glade:3904 +#: glade/pytrainer.glade:3997 +#: glade/pytrainer.glade:4558 +#: glade/pytrainer.glade:4651 +#: glade/pytrainer.glade:5311 +#: glade/pytrainer.glade:5327 +#: build/lib/pytrainer/gui/windowmain.py:918 +#: build/lib/pytrainer/gui/windowmain.py:919 +#: build/lib/pytrainer/gui/windowmain.py:1047 +#: build/lib/pytrainer/gui/windowmain.py:1048 +#: build/lib/pytrainer/gui/windowmain.py:1129 +#: build/lib/pytrainer/gui/windowmain.py:1130 +#: build/lib/pytrainer/lib/activity.py:202 +#: pytrainer/gui/windowmain.py:918 +#: pytrainer/gui/windowmain.py:919 +#: pytrainer/gui/windowmain.py:1047 +#: pytrainer/gui/windowmain.py:1048 +#: pytrainer/gui/windowmain.py:1129 +#: pytrainer/gui/windowmain.py:1130 #: pytrainer/lib/activity.py:202 msgid "km/h" msgstr "km/h" -#: glade/pytrainer.glade:840 +#: glade/pytrainer.glade:839 msgid "<b>Equipment:</b>" msgstr "<b>Material:</b>" -#: glade/pytrainer.glade:879 +#: glade/pytrainer.glade:935 msgid "<b>Run / Rest:</b>" msgstr "<b>Activo / Descanso:</b>" -#: glade/pytrainer.glade:906 +#: glade/pytrainer.glade:962 msgid "h:m:s" msgstr "h:m:s" -#: glade/pytrainer.glade:981 +#: glade/pytrainer.glade:1016 msgid "<b>Laps</b>" msgstr "<b>Vueltas</b>" -#: glade/pytrainer.glade:1052 +#: glade/pytrainer.glade:1087 msgid " <b>Title:</b>" msgstr "<b>Título:</b>" -#: glade/pytrainer.glade:1102 -#: pytrainer/gui/windowmain.py:1719 +#: glade/pytrainer.glade:1137 +#: build/lib/pytrainer/gui/windowmain.py:1724 +#: pytrainer/gui/windowmain.py:1724 msgid "Show graph display options" msgstr "Mostrar opciones del gráfico" -#: glade/pytrainer.glade:1120 +#: glade/pytrainer.glade:1155 msgid "" "Profile\n" "Speed\n" @@ -1030,15 +1096,15 @@ "Porcentaje\n" "Zona" -#: glade/pytrainer.glade:1137 -#: glade/pytrainer.glade:4284 -#: glade/pytrainer.glade:4938 -#: glade/pytrainer.glade:5591 -#: glade/pytrainer.glade:5948 +#: glade/pytrainer.glade:1172 +#: glade/pytrainer.glade:4320 +#: glade/pytrainer.glade:4974 +#: glade/pytrainer.glade:5627 +#: glade/pytrainer.glade:5984 msgid "Versus" msgstr "contra" -#: glade/pytrainer.glade:1148 +#: glade/pytrainer.glade:1183 msgid "" "None\n" "Profile\n" @@ -1053,80 +1119,80 @@ "Ritmo\n" "Pulsaciones\n" -#: glade/pytrainer.glade:1294 +#: glade/pytrainer.glade:1329 msgid "<small>Graph Display Options</small>" msgstr "<small>Opciones de visualización gráfica</small>" -#: glade/pytrainer.glade:1319 -#: glade/pytrainer.glade:1534 -#: glade/pytrainer.glade:1754 +#: glade/pytrainer.glade:1354 +#: glade/pytrainer.glade:1569 +#: glade/pytrainer.glade:1789 msgid "<small>Limits</small>" msgstr "<small>Límites</small>" -#: glade/pytrainer.glade:1331 -#: glade/pytrainer.glade:1546 -#: glade/pytrainer.glade:1800 +#: glade/pytrainer.glade:1366 +#: glade/pytrainer.glade:1581 +#: glade/pytrainer.glade:1835 msgid "<small>Min</small>" msgstr "<small>Mín</small>" -#: glade/pytrainer.glade:1343 -#: glade/pytrainer.glade:1558 -#: glade/pytrainer.glade:1812 +#: glade/pytrainer.glade:1378 +#: glade/pytrainer.glade:1593 +#: glade/pytrainer.glade:1847 msgid "<small>Max</small>" msgstr "<small>Máx</small>" -#: glade/pytrainer.glade:1392 -#: glade/pytrainer.glade:1614 +#: glade/pytrainer.glade:1427 +#: glade/pytrainer.glade:1649 msgid "<small>Color</small>" msgstr "<small>Color</small>" -#: glade/pytrainer.glade:1423 -#: glade/pytrainer.glade:1627 +#: glade/pytrainer.glade:1458 +#: glade/pytrainer.glade:1662 msgid "<small>Weight</small>" msgstr "<small>Peso</small>" -#: glade/pytrainer.glade:1453 +#: glade/pytrainer.glade:1488 msgid "Y1" msgstr "Y1" -#: glade/pytrainer.glade:1464 -#: glade/pytrainer.glade:1675 +#: glade/pytrainer.glade:1499 +#: glade/pytrainer.glade:1710 msgid "<small>Smoothing</small>" msgstr "<small>Suavizado</small>" -#: glade/pytrainer.glade:1604 +#: glade/pytrainer.glade:1639 msgid "Y2" msgstr "Y2" -#: glade/pytrainer.glade:1744 +#: glade/pytrainer.glade:1779 msgid "X" msgstr "X" -#: glade/pytrainer.glade:1825 +#: glade/pytrainer.glade:1860 msgid "<small>Distance</small>" msgstr "<small>Distancia</small>" -#: glade/pytrainer.glade:1854 +#: glade/pytrainer.glade:1889 msgid "<small>Time</small>" msgstr "<small>Tiempo</small>" -#: glade/pytrainer.glade:1915 +#: glade/pytrainer.glade:1950 msgid "Show Laps" msgstr "Mostras vueltas" -#: glade/pytrainer.glade:1954 +#: glade/pytrainer.glade:1989 msgid "Reset Graph" msgstr "Resetear" -#: glade/pytrainer.glade:2016 +#: glade/pytrainer.glade:2051 msgid "Redraw Map" msgstr "Restaurar" -#: glade/pytrainer.glade:2032 +#: glade/pytrainer.glade:2067 msgid "<small>Show:</small>" msgstr "<small>Mostrar:</small>" -#: glade/pytrainer.glade:2043 +#: glade/pytrainer.glade:2078 msgid "" "None\n" "Speed\n" @@ -1138,187 +1204,199 @@ "Pulsaciones\n" "Cadencia" -#: glade/pytrainer.glade:2058 +#: glade/pytrainer.glade:2093 msgid "<small>Display map using:</small>" msgstr "<small>Opciones de visualización de mapas:</small>" -#: glade/pytrainer.glade:2159 +#: glade/pytrainer.glade:2194 msgid "<b>Beats:</b>" msgstr "<b>Pulsaciones:</b>" -#: glade/pytrainer.glade:2171 -#: glade/pytrainer.glade:3285 -#: glade/pytrainer.glade:3883 -#: glade/pytrainer.glade:4537 -#: glade/pytrainer.glade:5025 +#: glade/pytrainer.glade:2206 +#: glade/pytrainer.glade:3321 +#: glade/pytrainer.glade:3919 +#: glade/pytrainer.glade:4573 +#: glade/pytrainer.glade:5061 msgid "<b>Calories: </b>" msgstr "<b>Calorías: </b>" -#: glade/pytrainer.glade:2185 -#: glade/pytrainer.glade:3437 -#: glade/pytrainer.glade:4111 -#: glade/pytrainer.glade:4765 -#: glade/pytrainer.glade:5403 +#: glade/pytrainer.glade:2220 +#: glade/pytrainer.glade:3473 +#: glade/pytrainer.glade:4147 +#: glade/pytrainer.glade:4801 +#: glade/pytrainer.glade:5439 msgid "<b>Max Beats:</b>" msgstr "<b>Pico pulsaciones:</b>" -#: glade/pytrainer.glade:2199 +#: glade/pytrainer.glade:2234 msgid "<b>HR Zones Method:</b>" msgstr "<b>Método de cálculo:</b>" -#: glade/pytrainer.glade:2214 +#: glade/pytrainer.glade:2249 msgid "<b>HR Zone5:</b>" msgstr "<b>Máximo esfuerzo:</b>" -#: glade/pytrainer.glade:2229 -#: glade/pytrainer.glade:2428 +#: glade/pytrainer.glade:2264 +#: glade/pytrainer.glade:2463 msgid " bpm" msgstr "ppm" -#: glade/pytrainer.glade:2245 +#: glade/pytrainer.glade:2280 msgid " Cal" msgstr "Cal" -#: glade/pytrainer.glade:2303 +#: glade/pytrainer.glade:2338 msgid "<b>HR Zone4:</b>" msgstr "<b>Anaeróbica:</b>" -#: glade/pytrainer.glade:2319 +#: glade/pytrainer.glade:2354 msgid "<b>HR Zone3:</b>" msgstr "<b>Aeróbica:</b>" -#: glade/pytrainer.glade:2335 +#: glade/pytrainer.glade:2370 msgid "<b>HR Zone2:</b>" msgstr "<b>Quemagrasas:</b>" -#: glade/pytrainer.glade:2351 +#: glade/pytrainer.glade:2386 msgid "<b>HR Zone1:</b>" msgstr "<b>Recuperación:</b>" -#: glade/pytrainer.glade:2453 -#: glade/pytrainer.glade:2465 -#: glade/pytrainer.glade:2480 -#: glade/pytrainer.glade:2495 -#: glade/pytrainer.glade:2510 -#: glade/pytrainer.glade:3360 -#: glade/pytrainer.glade:3454 -#: glade/pytrainer.glade:4018 -#: glade/pytrainer.glade:4096 -#: glade/pytrainer.glade:4672 -#: glade/pytrainer.glade:4750 -#: glade/pytrainer.glade:5100 -#: glade/pytrainer.glade:5307 +#: glade/pytrainer.glade:2488 +#: glade/pytrainer.glade:2500 +#: glade/pytrainer.glade:2515 +#: glade/pytrainer.glade:2530 +#: glade/pytrainer.glade:2545 +#: glade/pytrainer.glade:3396 +#: glade/pytrainer.glade:3490 +#: glade/pytrainer.glade:4054 +#: glade/pytrainer.glade:4132 +#: glade/pytrainer.glade:4708 +#: glade/pytrainer.glade:4786 +#: glade/pytrainer.glade:5136 +#: glade/pytrainer.glade:5343 +#: build/lib/pytrainer/lib/activity.py:435 +#: build/lib/pytrainer/lib/activity.py:515 #: pytrainer/lib/activity.py:435 #: pytrainer/lib/activity.py:515 msgid "bpm" msgstr "ppm" -#: glade/pytrainer.glade:2555 +#: glade/pytrainer.glade:2590 msgid " <b>Heart Rate:</b>" msgstr "<b>Pulsaciones:</b>" -#: glade/pytrainer.glade:2737 +#: glade/pytrainer.glade:2778 +msgid "<b>Projected times</b>" +msgstr "<b>Tiempos estimados</b>" + +#: glade/pytrainer.glade:2808 msgid "<i>Rank relative to same-sport activities for distances ± x%:</i>" msgstr "<i>Historial en distancias similares ± x%: </i>" -#: glade/pytrainer.glade:2773 +#: glade/pytrainer.glade:2841 msgid "<b>Range:</b>" msgstr "<b>Horquilla:</b>" -#: glade/pytrainer.glade:2785 +#: glade/pytrainer.glade:2854 msgid "<b>Rank:</b>" msgstr "<b>Posición:</b>" -#: glade/pytrainer.glade:2798 +#: glade/pytrainer.glade:2867 msgid "<b>Speed: </b>" msgstr "<b>Velocidad: </b>" -#: glade/pytrainer.glade:2811 +#: glade/pytrainer.glade:2880 msgid "<b>Avg speed:</b>" msgstr "<b>Velocidad media:</b>" -#: glade/pytrainer.glade:2824 +#: glade/pytrainer.glade:2893 msgid "<b>Standard deviation:</b>" msgstr "<b>Desviación estándar:</b>" -#: glade/pytrainer.glade:2838 +#: glade/pytrainer.glade:2907 msgid "<b>Deviation:</b>" msgstr "<b>Desviación:</b>" -#: glade/pytrainer.glade:2958 +#: glade/pytrainer.glade:3026 msgid "<b>Ranking</b>" msgstr "<b>Clasificación</b>" -#: glade/pytrainer.glade:2990 -msgid "<b>Projected times</b>" -msgstr "<b>Tiempos estimados</b>" - -#: glade/pytrainer.glade:3016 +#: glade/pytrainer.glade:3052 msgid "<b>Analytics:</b>" msgstr "<b>Estadísticas:</b>" -#: glade/pytrainer.glade:3044 +#: glade/pytrainer.glade:3080 msgid "Record" msgstr "Registro" -#: glade/pytrainer.glade:3253 -#: glade/pytrainer.glade:3929 -#: glade/pytrainer.glade:4583 -#: glade/pytrainer.glade:5323 +#: glade/pytrainer.glade:3289 +#: glade/pytrainer.glade:3965 +#: glade/pytrainer.glade:4619 +#: glade/pytrainer.glade:5359 msgid "<b>Max Speed:</b>" msgstr "<b>Velocidad máxima:</b>" -#: glade/pytrainer.glade:3330 -#: glade/pytrainer.glade:3988 -#: glade/pytrainer.glade:4642 -#: glade/pytrainer.glade:5070 +#: glade/pytrainer.glade:3366 +#: glade/pytrainer.glade:4024 +#: glade/pytrainer.glade:4678 +#: glade/pytrainer.glade:5106 msgid "<b>Beats avg:</b>" msgstr "<b>Media pulsaciones:</b>" -#: glade/pytrainer.glade:3390 -#: glade/pytrainer.glade:3422 -#: glade/pytrainer.glade:4064 -#: glade/pytrainer.glade:4080 -#: glade/pytrainer.glade:4718 -#: glade/pytrainer.glade:4734 -#: glade/pytrainer.glade:5372 -#: glade/pytrainer.glade:5388 -#: pytrainer/gui/windowmain.py:915 -#: pytrainer/gui/windowmain.py:916 -#: pytrainer/gui/windowmain.py:1044 -#: pytrainer/gui/windowmain.py:1045 -#: pytrainer/gui/windowmain.py:1126 -#: pytrainer/gui/windowmain.py:1127 +#: glade/pytrainer.glade:3426 +#: glade/pytrainer.glade:3458 +#: glade/pytrainer.glade:4100 +#: glade/pytrainer.glade:4116 +#: glade/pytrainer.glade:4754 +#: glade/pytrainer.glade:4770 +#: glade/pytrainer.glade:5408 +#: glade/pytrainer.glade:5424 +#: build/lib/pytrainer/gui/windowmain.py:920 +#: build/lib/pytrainer/gui/windowmain.py:921 +#: build/lib/pytrainer/gui/windowmain.py:1049 +#: build/lib/pytrainer/gui/windowmain.py:1050 +#: build/lib/pytrainer/gui/windowmain.py:1131 +#: build/lib/pytrainer/gui/windowmain.py:1132 +#: build/lib/pytrainer/lib/activity.py:203 +#: pytrainer/gui/windowmain.py:920 +#: pytrainer/gui/windowmain.py:921 +#: pytrainer/gui/windowmain.py:1049 +#: pytrainer/gui/windowmain.py:1050 +#: pytrainer/gui/windowmain.py:1131 +#: pytrainer/gui/windowmain.py:1132 #: pytrainer/lib/activity.py:203 msgid "min/km" msgstr "min/km" -#: glade/pytrainer.glade:3529 -#: glade/pytrainer.glade:4172 -#: glade/pytrainer.glade:4826 -#: glade/pytrainer.glade:5479 +#: glade/pytrainer.glade:3565 +#: glade/pytrainer.glade:4208 +#: glade/pytrainer.glade:4862 +#: glade/pytrainer.glade:5515 msgid "<b>Total Asc/Desc:</b>" msgstr "<b>Desnivel pos/neg:</b>" -#: glade/pytrainer.glade:3556 -#: glade/pytrainer.glade:4199 -#: glade/pytrainer.glade:4853 -#: glade/pytrainer.glade:5506 -#: pytrainer/gui/windowmain.py:2063 -#: pytrainer/gui/windowmain.py:2065 +#: glade/pytrainer.glade:3592 +#: glade/pytrainer.glade:4235 +#: glade/pytrainer.glade:4889 +#: glade/pytrainer.glade:5542 +#: build/lib/pytrainer/gui/windowmain.py:2068 +#: build/lib/pytrainer/gui/windowmain.py:2070 +#: build/lib/pytrainer/lib/activity.py:204 +#: pytrainer/gui/windowmain.py:2068 +#: pytrainer/gui/windowmain.py:2070 #: pytrainer/lib/activity.py:204 msgid "m" msgstr "m" -#: glade/pytrainer.glade:3575 +#: glade/pytrainer.glade:3611 msgid " <b>Date:</b>" msgstr "<b>Fecha:</b>" -#: glade/pytrainer.glade:3618 +#: glade/pytrainer.glade:3654 msgid "Value" msgstr "Valor" -#: glade/pytrainer.glade:3629 +#: glade/pytrainer.glade:3665 msgid "" "Stage Profile\n" "Stage Velocity\n" @@ -1328,18 +1406,18 @@ "Velocidad de Etapa\n" "Perfil/Velocidad de Etapa" -#: glade/pytrainer.glade:3685 +#: glade/pytrainer.glade:3721 msgid "Day" msgstr "Día" -#: glade/pytrainer.glade:4218 +#: glade/pytrainer.glade:4254 msgid " <b>Week:</b>" msgstr "<b>Semana:</b>" -#: glade/pytrainer.glade:4269 -#: glade/pytrainer.glade:4923 -#: glade/pytrainer.glade:5576 -#: glade/pytrainer.glade:5933 +#: glade/pytrainer.glade:4305 +#: glade/pytrainer.glade:4959 +#: glade/pytrainer.glade:5612 +#: glade/pytrainer.glade:5969 msgid "" "Distance\n" "Time\n" @@ -1353,10 +1431,10 @@ "Velocidad media\n" "Calorías" -#: glade/pytrainer.glade:4295 -#: glade/pytrainer.glade:4949 -#: glade/pytrainer.glade:5602 -#: glade/pytrainer.glade:5959 +#: glade/pytrainer.glade:4331 +#: glade/pytrainer.glade:4985 +#: glade/pytrainer.glade:5638 +#: glade/pytrainer.glade:5995 msgid "" "None\n" "Distance\n" @@ -1372,79 +1450,85 @@ "Velocidad media\n" "Calorías" -#: glade/pytrainer.glade:4339 +#: glade/pytrainer.glade:4375 msgid "Week" msgstr "Semana" -#: glade/pytrainer.glade:4872 +#: glade/pytrainer.glade:4908 msgid " <b>Month:</b>" msgstr "<b>Mes:</b>" -#: glade/pytrainer.glade:4992 +#: glade/pytrainer.glade:5028 msgid "Month" msgstr "Mes" -#: glade/pytrainer.glade:5525 +#: glade/pytrainer.glade:5561 msgid " <b>Year:</b>" msgstr "<b>Año:</b>" -#: glade/pytrainer.glade:5645 +#: glade/pytrainer.glade:5681 msgid "Year" msgstr "Año" -#: glade/pytrainer.glade:5799 +#: glade/pytrainer.glade:5835 msgid "<b>Graph</b>" msgstr "<b>Gráfico</b>" -#: glade/pytrainer.glade:5840 +#: glade/pytrainer.glade:5876 msgid "<b>History</b>" msgstr "<b>Histórico</b>" -#: glade/pytrainer.glade:5900 +#: glade/pytrainer.glade:5936 msgid "<b>Sports</b>" msgstr "<b>Deportes</b>" -#: glade/pytrainer.glade:5982 +#: glade/pytrainer.glade:6018 msgid "Total distance:" msgstr "Distancia:" -#: glade/pytrainer.glade:5996 +#: glade/pytrainer.glade:6032 msgid "Total duration:" msgstr "Duración:" -#: glade/pytrainer.glade:6045 +#: glade/pytrainer.glade:6081 msgid "Start date:" msgstr "Fecha de comienzo:" -#: glade/pytrainer.glade:6060 +#: glade/pytrainer.glade:6096 msgid "End date:" msgstr "Fecha fin:" -#: glade/pytrainer.glade:6146 +#: glade/pytrainer.glade:6182 msgid "<b>All</b>" msgstr "<b>Todos</b>" -#: glade/pytrainer.glade:6172 +#: glade/pytrainer.glade:6208 msgid "Totals" msgstr "Totales" -#: glade/pytrainer.glade:6210 +#: glade/pytrainer.glade:6246 msgid "<b>Title:</b>" msgstr "<b>Título:</b>" -#: glade/pytrainer.glade:6233 +#: glade/pytrainer.glade:6269 msgid "Search" msgstr "Buscar" -#: glade/pytrainer.glade:6257 +#: glade/pytrainer.glade:6293 +#: build/lib/pytrainer/lib/listview.py:3 +#: build/lib/pytrainer/lib/listview.py:10 +#: pytrainer/lib/listview.py:3 +#: pytrainer/lib/listview.py:10 msgid "All Distances" msgstr "Distancia" -#: glade/pytrainer.glade:6266 +#: glade/pytrainer.glade:6302 +#: build/lib/pytrainer/lib/listview.py:35 +#: pytrainer/lib/listview.py:35 msgid "All Durations" msgstr "Duración" -#: glade/pytrainer.glade:6276 +#: glade/pytrainer.glade:6312 msgid "" "All time\n" "Last 4 weeks\n" @@ -1456,15 +1540,15 @@ "Últimos 6 meses\n" "Últimos 12 meses" -#: glade/pytrainer.glade:6313 +#: glade/pytrainer.glade:6349 msgid "Columns" msgstr "Columnas" -#: glade/pytrainer.glade:6441 +#: glade/pytrainer.glade:6477 msgid "Type:" msgstr "Tipo:" -#: glade/pytrainer.glade:6454 +#: glade/pytrainer.glade:6490 msgid "" "Font\n" "Restaurant\n" @@ -1476,31 +1560,31 @@ "Mirador\n" "Cumbre" -#: glade/pytrainer.glade:6470 +#: glade/pytrainer.glade:6506 msgid "Latitude: " msgstr "<b>Latitud:</b>" -#: glade/pytrainer.glade:6484 +#: glade/pytrainer.glade:6520 msgid " Name:" msgstr "Nombre:" -#: glade/pytrainer.glade:6496 +#: glade/pytrainer.glade:6532 msgid "Longitude:" msgstr "<b>Longitud:</b>" -#: glade/pytrainer.glade:6588 +#: glade/pytrainer.glade:6624 msgid "<b> Waypoint: </b>" msgstr "<b> Waypoint: </b>" -#: glade/pytrainer.glade:6772 +#: glade/pytrainer.glade:6808 msgid "Edit Record" msgstr "Editar entrada" -#: glade/pytrainer.glade:6786 +#: glade/pytrainer.glade:6822 msgid "Show graph in classic view" msgstr "Mostrar gráfico en vista clásica" -#: glade/pytrainer.glade:6800 +#: glade/pytrainer.glade:6836 msgid "Merge tracks" msgstr "Combinar entrenamientos" @@ -1513,30 +1597,59 @@ msgid "Warning" msgstr "Advertencia" -#: pytrainer/gui/windowmain.py:103 +#: build/lib/pytrainer/gui/windowmain.py:106 +#: pytrainer/gui/windowmain.py:106 msgid "Miles" msgstr "Millas" -#: pytrainer/gui/windowmain.py:106 -#: pytrainer/gui/windowmain.py:110 -#: pytrainer/gui/windowmain.py:123 +#: build/lib/pytrainer/gui/windowmain.py:109 +#: build/lib/pytrainer/gui/windowmain.py:113 +#: build/lib/pytrainer/gui/windowmain.py:126 +#: build/lib/pytrainer/gui/windowmain.py:129 +#: build/lib/pytrainer/gui/windowmain.py:138 +#: build/lib/pytrainer/gui/windowmain.py:172 +#: build/lib/pytrainer/gui/windowmain.py:181 +#: pytrainer/gui/windowmain.py:109 +#: pytrainer/gui/windowmain.py:113 #: pytrainer/gui/windowmain.py:126 -#: pytrainer/gui/windowmain.py:135 -#: pytrainer/gui/windowmain.py:169 -#: pytrainer/gui/windowmain.py:178 +#: pytrainer/gui/windowmain.py:129 +#: pytrainer/gui/windowmain.py:138 +#: pytrainer/gui/windowmain.py:172 +#: pytrainer/gui/windowmain.py:181 msgid "id" msgstr "id" -#: pytrainer/gui/windowmain.py:106 +#: build/lib/pytrainer/gui/windowmain.py:109 +#: pytrainer/gui/windowmain.py:109 msgid "Start" msgstr "Comienzo" -#: pytrainer/gui/windowmain.py:113 -#: pytrainer/gui/windowmain.py:153 -#: pytrainer/gui/windowmain.py:171 -#: pytrainer/gui/windowmain.py:181 -#: pytrainer/gui/windowmain.py:568 -#: pytrainer/gui/windowmain.py:1492 +#: build/lib/pytrainer/gui/windowmain.py:116 +#: build/lib/pytrainer/gui/windowmain.py:156 +#: build/lib/pytrainer/gui/windowmain.py:174 +#: build/lib/pytrainer/gui/windowmain.py:184 +#: build/lib/pytrainer/gui/windowmain.py:571 +#: build/lib/pytrainer/gui/windowmain.py:1497 +#: build/lib/pytrainer/gui/windowimportdata.py:352 +#: build/lib/pytrainer/gui/windowrecord.py:210 +#: build/lib/pytrainer/lib/activity.py:313 +#: build/lib/pytrainer/lib/activity.py:324 +#: build/lib/pytrainer/lib/activity.py:396 +#: build/lib/pytrainer/lib/activity.py:407 +#: build/lib/pytrainer/lib/activity.py:416 +#: build/lib/pytrainer/lib/activity.py:425 +#: build/lib/pytrainer/lib/activity.py:434 +#: build/lib/pytrainer/lib/activity.py:444 +#: build/lib/pytrainer/lib/activity.py:453 +#: build/lib/pytrainer/lib/activity.py:514 +#: build/lib/pytrainer/extensions/googlemaps.py:129 +#: build/lib/pytrainer/extensions/osm.py:105 +#: pytrainer/gui/windowmain.py:116 +#: pytrainer/gui/windowmain.py:156 +#: pytrainer/gui/windowmain.py:174 +#: pytrainer/gui/windowmain.py:184 +#: pytrainer/gui/windowmain.py:571 +#: pytrainer/gui/windowmain.py:1497 #: pytrainer/gui/windowimportdata.py:352 #: pytrainer/gui/windowrecord.py:210 #: pytrainer/lib/activity.py:313 @@ -1549,116 +1662,156 @@ #: pytrainer/lib/activity.py:444 #: pytrainer/lib/activity.py:453 #: pytrainer/lib/activity.py:514 -#: pytrainer/extensions/googlemaps.py:131 -#: pytrainer/extensions/osm.py:108 +#: pytrainer/extensions/googlemaps.py:129 +#: pytrainer/extensions/osm.py:105 msgid "Distance" msgstr "Distancia" -#: pytrainer/gui/windowmain.py:115 -#: pytrainer/gui/windowmain.py:154 -#: pytrainer/gui/windowmain.py:172 -#: pytrainer/gui/windowmain.py:182 -#: pytrainer/gui/windowmain.py:569 -#: pytrainer/gui/windowmain.py:1494 -#: pytrainer/extensions/googlemaps.py:131 -#: pytrainer/extensions/osm.py:107 +#: build/lib/pytrainer/gui/windowmain.py:118 +#: build/lib/pytrainer/gui/windowmain.py:157 +#: build/lib/pytrainer/gui/windowmain.py:175 +#: build/lib/pytrainer/gui/windowmain.py:185 +#: build/lib/pytrainer/gui/windowmain.py:572 +#: build/lib/pytrainer/gui/windowmain.py:1499 +#: build/lib/pytrainer/extensions/googlemaps.py:129 +#: build/lib/pytrainer/extensions/osm.py:104 +#: pytrainer/gui/windowmain.py:118 +#: pytrainer/gui/windowmain.py:157 +#: pytrainer/gui/windowmain.py:175 +#: pytrainer/gui/windowmain.py:185 +#: pytrainer/gui/windowmain.py:572 +#: pytrainer/gui/windowmain.py:1499 +#: pytrainer/extensions/googlemaps.py:129 +#: pytrainer/extensions/osm.py:104 msgid "Time" msgstr "Tiempo" -#: pytrainer/gui/windowmain.py:116 +#: build/lib/pytrainer/gui/windowmain.py:119 +#: pytrainer/gui/windowmain.py:119 msgid "⌀ HR" msgstr "⌀ FC" -#: pytrainer/gui/windowmain.py:117 +#: build/lib/pytrainer/gui/windowmain.py:120 +#: pytrainer/gui/windowmain.py:120 msgid "⌀ Speed" msgstr "⌀ Velocidad" -#: pytrainer/gui/windowmain.py:123 +#: build/lib/pytrainer/gui/windowmain.py:126 +#: pytrainer/gui/windowmain.py:126 msgid "Waypoint" msgstr "Waypoint" -#: pytrainer/gui/windowmain.py:128 +#: build/lib/pytrainer/gui/windowmain.py:131 +#: pytrainer/gui/windowmain.py:131 msgid "Weight" msgstr "Peso" -#: pytrainer/gui/windowmain.py:129 +#: build/lib/pytrainer/gui/windowmain.py:132 +#: pytrainer/gui/windowmain.py:132 msgid "Body Fat %" msgstr "Grasa corporal %" -#: pytrainer/gui/windowmain.py:130 +#: build/lib/pytrainer/gui/windowmain.py:133 +#: pytrainer/gui/windowmain.py:133 msgid "Resting HR" msgstr "FC en reposo" -#: pytrainer/gui/windowmain.py:131 -#: pytrainer/gui/windowmain.py:143 -#: pytrainer/gui/windowmain.py:160 +#: build/lib/pytrainer/gui/windowmain.py:134 +#: build/lib/pytrainer/gui/windowmain.py:146 +#: build/lib/pytrainer/gui/windowmain.py:163 +#: pytrainer/gui/windowmain.py:134 +#: pytrainer/gui/windowmain.py:146 +#: pytrainer/gui/windowmain.py:163 msgid "Max HR" msgstr "FC max" -#: pytrainer/gui/windowmain.py:137 +#: build/lib/pytrainer/gui/windowmain.py:140 +#: pytrainer/gui/windowmain.py:140 msgid "Records" msgstr "Registros" -#: pytrainer/gui/windowmain.py:138 +#: build/lib/pytrainer/gui/windowmain.py:141 +#: pytrainer/gui/windowmain.py:141 msgid "Total duration" msgstr "Duración" -#: pytrainer/gui/windowmain.py:139 +#: build/lib/pytrainer/gui/windowmain.py:142 +#: pytrainer/gui/windowmain.py:142 msgid "Total distance" msgstr "Distancia" -#: pytrainer/gui/windowmain.py:140 -#: pytrainer/gui/windowmain.py:155 +#: build/lib/pytrainer/gui/windowmain.py:143 +#: build/lib/pytrainer/gui/windowmain.py:158 +#: pytrainer/gui/windowmain.py:143 +#: pytrainer/gui/windowmain.py:158 msgid "Avg speed" msgstr "Velocidad" -#: pytrainer/gui/windowmain.py:141 -#: pytrainer/gui/windowmain.py:156 +#: build/lib/pytrainer/gui/windowmain.py:144 +#: build/lib/pytrainer/gui/windowmain.py:159 +#: pytrainer/gui/windowmain.py:144 +#: pytrainer/gui/windowmain.py:159 msgid "Max speed" msgstr "Velocidad Máx." -#: pytrainer/gui/windowmain.py:142 -#: pytrainer/gui/windowmain.py:159 +#: build/lib/pytrainer/gui/windowmain.py:145 +#: build/lib/pytrainer/gui/windowmain.py:162 +#: pytrainer/gui/windowmain.py:145 +#: pytrainer/gui/windowmain.py:162 msgid "Avg HR" msgstr "FC med" -#: pytrainer/gui/windowmain.py:144 +#: build/lib/pytrainer/gui/windowmain.py:147 +#: pytrainer/gui/windowmain.py:147 msgid "Max duration" msgstr "Duración" -#: pytrainer/gui/windowmain.py:145 +#: build/lib/pytrainer/gui/windowmain.py:148 +#: pytrainer/gui/windowmain.py:148 msgid "Max distance" msgstr "Distancia" -#: pytrainer/gui/windowmain.py:151 +#: build/lib/pytrainer/gui/windowmain.py:154 +#: pytrainer/gui/windowmain.py:154 msgid "Lap" msgstr "Vuelta" -#: pytrainer/gui/windowmain.py:152 +#: build/lib/pytrainer/gui/windowmain.py:155 +#: pytrainer/gui/windowmain.py:155 msgid "Trigger" msgstr "Activador" -#: pytrainer/gui/windowmain.py:157 +#: build/lib/pytrainer/gui/windowmain.py:160 +#: pytrainer/gui/windowmain.py:160 msgid "Avg pace" msgstr "Ritmo" -#: pytrainer/gui/windowmain.py:158 +#: build/lib/pytrainer/gui/windowmain.py:161 +#: pytrainer/gui/windowmain.py:161 msgid "Max pace" msgstr "Pico ritmo" -#: pytrainer/gui/windowmain.py:162 +#: build/lib/pytrainer/gui/windowmain.py:165 +#: pytrainer/gui/windowmain.py:165 msgid "Intensity" msgstr "Intensidad" -#: pytrainer/gui/windowmain.py:170 +#: build/lib/pytrainer/gui/windowmain.py:173 +#: pytrainer/gui/windowmain.py:173 msgid "Race" msgstr "Carrera" -#: pytrainer/gui/windowmain.py:179 +#: build/lib/pytrainer/gui/windowmain.py:182 +#: pytrainer/gui/windowmain.py:182 msgid "Rank" msgstr "Posición" -#: pytrainer/gui/windowmain.py:183 +#: build/lib/pytrainer/gui/windowmain.py:186 +#: build/lib/pytrainer/recordgraph.py:136 +#: build/lib/pytrainer/lib/activity.py:325 +#: build/lib/pytrainer/lib/activity.py:415 +#: build/lib/pytrainer/lib/activity.py:417 +#: pytrainer/gui/windowmain.py:186 #: pytrainer/recordgraph.py:136 #: pytrainer/lib/activity.py:325 #: pytrainer/lib/activity.py:415 @@ -1666,221 +1819,343 @@ msgid "Speed" msgstr "Velocidad" -#: pytrainer/gui/windowmain.py:315 +#: build/lib/pytrainer/gui/windowmain.py:318 +#: pytrainer/gui/windowmain.py:318 msgid "d" msgstr "d" -#: pytrainer/gui/windowmain.py:570 +#: build/lib/pytrainer/gui/windowmain.py:561 +#: pytrainer/gui/windowmain.py:561 +msgid "Show on X Axis" +msgstr "Mostrar en eje X" + +#: build/lib/pytrainer/gui/windowmain.py:562 +#: pytrainer/gui/windowmain.py:562 +msgid "Show on Y1 Axis" +msgstr "Mostrar en eje Y1" + +#: build/lib/pytrainer/gui/windowmain.py:563 +#: pytrainer/gui/windowmain.py:563 +msgid "Show on Y2 Axis" +msgstr "Mostrar en eje Y2" + +#: build/lib/pytrainer/gui/windowmain.py:564 +#: pytrainer/gui/windowmain.py:564 +msgid "Axis Limits" +msgstr "Límites de ejes" + +#: build/lib/pytrainer/gui/windowmain.py:573 +#: pytrainer/gui/windowmain.py:573 msgid "Laps" msgstr "Vueltas" -#: pytrainer/gui/windowmain.py:571 +#: build/lib/pytrainer/gui/windowmain.py:574 +#: pytrainer/gui/windowmain.py:574 msgid "Left Axis Grid" msgstr "Cuadrícula eje izquierdo" -#: pytrainer/gui/windowmain.py:572 +#: build/lib/pytrainer/gui/windowmain.py:575 +#: pytrainer/gui/windowmain.py:575 msgid "Right Axis Grid" msgstr "Cuadrícula eje derecho" -#: pytrainer/gui/windowmain.py:573 +#: build/lib/pytrainer/gui/windowmain.py:576 +#: pytrainer/gui/windowmain.py:576 msgid "X Axis Grid" msgstr "Cuadrícula eje X" -#: pytrainer/gui/windowmain.py:634 +#: build/lib/pytrainer/gui/windowmain.py:637 +#: pytrainer/gui/windowmain.py:637 msgid "Reset Limits" msgstr "Borrar límites" -#: pytrainer/gui/windowmain.py:636 +#: build/lib/pytrainer/gui/windowmain.py:639 +#: pytrainer/gui/windowmain.py:639 msgid "Set Limits" msgstr "Establecer límites" -#: pytrainer/gui/windowmain.py:791 +#: build/lib/pytrainer/gui/windowmain.py:794 +#: pytrainer/gui/windowmain.py:794 msgid "Percentages method" msgstr "basado en porcentajes" -#: pytrainer/gui/windowmain.py:804 +#: build/lib/pytrainer/gui/windowmain.py:807 +#: pytrainer/gui/windowmain.py:807 msgid "800 m" msgstr "800 m" -#: pytrainer/gui/windowmain.py:805 +#: build/lib/pytrainer/gui/windowmain.py:808 +#: pytrainer/gui/windowmain.py:808 msgid "1500 m" msgstr "1500 m" -#: pytrainer/gui/windowmain.py:806 +#: build/lib/pytrainer/gui/windowmain.py:809 +#: pytrainer/gui/windowmain.py:809 msgid "5K" msgstr "5 km" -#: pytrainer/gui/windowmain.py:807 +#: build/lib/pytrainer/gui/windowmain.py:810 +#: pytrainer/gui/windowmain.py:810 msgid "7K" msgstr "7 km" -#: pytrainer/gui/windowmain.py:808 +#: build/lib/pytrainer/gui/windowmain.py:811 +#: pytrainer/gui/windowmain.py:811 msgid "10K" msgstr "10 km" -#: pytrainer/gui/windowmain.py:809 +#: build/lib/pytrainer/gui/windowmain.py:812 +#: pytrainer/gui/windowmain.py:812 msgid "Half marathon" msgstr "Media maratón" -#: pytrainer/gui/windowmain.py:810 +#: build/lib/pytrainer/gui/windowmain.py:813 +#: pytrainer/gui/windowmain.py:813 msgid "Marathon" msgstr "Maratón" -#: pytrainer/gui/windowmain.py:811 +#: build/lib/pytrainer/gui/windowmain.py:814 +#: pytrainer/gui/windowmain.py:814 msgid "100K" msgstr "100 km" -#: pytrainer/gui/windowmain.py:906 -#: pytrainer/gui/windowmain.py:1035 -#: pytrainer/gui/windowmain.py:1117 +#: build/lib/pytrainer/gui/windowmain.py:911 +#: build/lib/pytrainer/gui/windowmain.py:1040 +#: build/lib/pytrainer/gui/windowmain.py:1122 +#: build/lib/pytrainer/lib/activity.py:196 +#: pytrainer/gui/windowmain.py:911 +#: pytrainer/gui/windowmain.py:1040 +#: pytrainer/gui/windowmain.py:1122 #: pytrainer/lib/activity.py:196 msgid "miles" msgstr "millas" -#: pytrainer/gui/windowmain.py:907 -#: pytrainer/gui/windowmain.py:908 -#: pytrainer/gui/windowmain.py:1036 -#: pytrainer/gui/windowmain.py:1037 -#: pytrainer/gui/windowmain.py:1118 -#: pytrainer/gui/windowmain.py:1119 +#: build/lib/pytrainer/gui/windowmain.py:912 +#: build/lib/pytrainer/gui/windowmain.py:913 +#: build/lib/pytrainer/gui/windowmain.py:1041 +#: build/lib/pytrainer/gui/windowmain.py:1042 +#: build/lib/pytrainer/gui/windowmain.py:1123 +#: build/lib/pytrainer/gui/windowmain.py:1124 +#: build/lib/pytrainer/lib/activity.py:197 +#: pytrainer/gui/windowmain.py:912 +#: pytrainer/gui/windowmain.py:913 +#: pytrainer/gui/windowmain.py:1041 +#: pytrainer/gui/windowmain.py:1042 +#: pytrainer/gui/windowmain.py:1123 +#: pytrainer/gui/windowmain.py:1124 #: pytrainer/lib/activity.py:197 msgid "miles/h" msgstr "millas/h" -#: pytrainer/gui/windowmain.py:909 -#: pytrainer/gui/windowmain.py:910 -#: pytrainer/gui/windowmain.py:1038 -#: pytrainer/gui/windowmain.py:1039 -#: pytrainer/gui/windowmain.py:1120 -#: pytrainer/gui/windowmain.py:1121 +#: build/lib/pytrainer/gui/windowmain.py:914 +#: build/lib/pytrainer/gui/windowmain.py:915 +#: build/lib/pytrainer/gui/windowmain.py:1043 +#: build/lib/pytrainer/gui/windowmain.py:1044 +#: build/lib/pytrainer/gui/windowmain.py:1125 +#: build/lib/pytrainer/gui/windowmain.py:1126 +#: build/lib/pytrainer/lib/activity.py:198 +#: pytrainer/gui/windowmain.py:914 +#: pytrainer/gui/windowmain.py:915 +#: pytrainer/gui/windowmain.py:1043 +#: pytrainer/gui/windowmain.py:1044 +#: pytrainer/gui/windowmain.py:1125 +#: pytrainer/gui/windowmain.py:1126 #: pytrainer/lib/activity.py:198 msgid "min/mile" msgstr "min/milla" -#: pytrainer/gui/windowmain.py:912 -#: pytrainer/gui/windowmain.py:1041 -#: pytrainer/gui/windowmain.py:1123 +#: build/lib/pytrainer/gui/windowmain.py:917 +#: build/lib/pytrainer/gui/windowmain.py:1046 +#: build/lib/pytrainer/gui/windowmain.py:1128 +#: build/lib/pytrainer/lib/activity.py:201 +#: pytrainer/gui/windowmain.py:917 +#: pytrainer/gui/windowmain.py:1046 +#: pytrainer/gui/windowmain.py:1128 #: pytrainer/lib/activity.py:201 msgid "km" msgstr "km" -#: pytrainer/gui/windowmain.py:1495 +#: build/lib/pytrainer/gui/windowmain.py:1500 +#: build/lib/pytrainer/recordgraph.py:144 +#: pytrainer/gui/windowmain.py:1500 #: pytrainer/recordgraph.py:144 msgid "Beats" msgstr "Pulsaciones" -#: pytrainer/gui/windowmain.py:1496 +#: build/lib/pytrainer/gui/windowmain.py:1501 +#: pytrainer/gui/windowmain.py:1501 msgid "Average" msgstr "Media" -#: pytrainer/gui/windowmain.py:1715 +#: build/lib/pytrainer/gui/windowmain.py:1720 +#: pytrainer/gui/windowmain.py:1720 msgid "Hide graph display options" msgstr "Ocultar configuración de visualización gráfica" -#: pytrainer/gui/windowmain.py:2053 +#: build/lib/pytrainer/gui/windowmain.py:2058 +#: pytrainer/gui/windowmain.py:2058 msgid "lap" msgstr "vuelta" -#: pytrainer/gui/windowmain.py:2063 +#: build/lib/pytrainer/gui/windowmain.py:2068 +#: build/lib/pytrainer/gui/drawArea.py:165 +#: build/lib/pytrainer/extensions/googlemaps.py:127 +#: build/lib/pytrainer/extensions/osm.py:102 +#: pytrainer/gui/windowmain.py:2068 #: pytrainer/gui/drawArea.py:165 -#: pytrainer/extensions/googlemaps.py:129 -#: pytrainer/extensions/osm.py:105 +#: pytrainer/extensions/googlemaps.py:127 +#: pytrainer/extensions/osm.py:102 msgid "h" msgstr "h" -#: pytrainer/gui/windowmain.py:2063 -#: pytrainer/gui/windowmain.py:2065 +#: build/lib/pytrainer/gui/windowmain.py:2068 +#: build/lib/pytrainer/gui/windowmain.py:2070 +#: pytrainer/gui/windowmain.py:2068 +#: pytrainer/gui/windowmain.py:2070 msgid "s" msgstr "s" -#: pytrainer/gui/windowmain.py:2152 +#: build/lib/pytrainer/gui/windowmain.py:2158 +#: build/lib/pytrainer/record.py:63 +#: pytrainer/gui/windowmain.py:2158 #: pytrainer/record.py:63 msgid "Edit Entry" msgstr "Editar entrada" -#: pytrainer/gui/windowmain.py:2163 +#: build/lib/pytrainer/gui/windowmain.py:2169 +#: pytrainer/gui/windowmain.py:2169 msgid "Delete Entry" msgstr "Borrar entrada" -#: pytrainer/gui/windowmain.py:2187 +#: build/lib/pytrainer/gui/windowmain.py:2193 +#: pytrainer/gui/windowmain.py:2193 msgid "Create Athlete Entry" msgstr "Crear entrada de atleta" -#: pytrainer/gui/windowmain.py:2191 +#: build/lib/pytrainer/gui/windowmain.py:2197 +#: pytrainer/gui/windowmain.py:2197 msgid "Edit Athlete Entry" msgstr "Editar atleta" -#: pytrainer/gui/windowmain.py:2272 -#: pytrainer/main.py:463 +#: build/lib/pytrainer/gui/windowmain.py:2210 +#: pytrainer/gui/windowmain.py:2210 +msgid "<b>Date</b>" +msgstr "<b>Fecha</b>" + +#: build/lib/pytrainer/gui/windowmain.py:2226 +#: pytrainer/gui/windowmain.py:2226 +msgid "<b>Weight</b>" +msgstr "<b>Peso</b>" + +#: build/lib/pytrainer/gui/windowmain.py:2234 +#: pytrainer/gui/windowmain.py:2234 +msgid "<b>Body Fat</b>" +msgstr "<b>Grasa corporal</b>" + +#: build/lib/pytrainer/gui/windowmain.py:2242 +#: pytrainer/gui/windowmain.py:2242 +msgid "<b>Resting Heart Rate</b>" +msgstr "<b>Pulsaciones en reposo</b>" + +#: build/lib/pytrainer/gui/windowmain.py:2250 +#: pytrainer/gui/windowmain.py:2250 +msgid "<b>Max Heart Rate</b>" +msgstr "<b>Pulsaciones máx</b>" + +#: build/lib/pytrainer/gui/windowmain.py:2278 +#: build/lib/pytrainer/main.py:453 +#: pytrainer/gui/windowmain.py:2278 +#: pytrainer/main.py:453 msgid "Delete this database entry?" msgstr "¿Borrar esta entrada de la base de datos?" -#: pytrainer/gui/windowmain.py:2274 +#: build/lib/pytrainer/gui/windowmain.py:2280 +#: pytrainer/gui/windowmain.py:2280 msgid "Are you sure?" msgstr "¿Está seguro?" +#: build/lib/pytrainer/gui/windowimportdata.py:116 #: pytrainer/gui/windowimportdata.py:116 msgid "No file selected" msgstr "Ningún fichero seleccionado" +#: build/lib/pytrainer/gui/windowimportdata.py:161 #: pytrainer/gui/windowimportdata.py:161 msgid "Configure" msgstr "Configurar" +#: build/lib/pytrainer/gui/windowimportdata.py:162 #: pytrainer/gui/windowimportdata.py:162 msgid "Run" msgstr "Ejecutar" +#: build/lib/pytrainer/gui/windowimportdata.py:170 #: pytrainer/gui/windowimportdata.py:170 msgid "Disabled" msgstr "Desactivo" +#: build/lib/pytrainer/gui/windowimportdata.py:172 #: pytrainer/gui/windowimportdata.py:172 msgid "Enabled" msgstr "Activo" +#: build/lib/pytrainer/gui/windowimportdata.py:252 #: pytrainer/gui/windowimportdata.py:252 msgid "GPS device found" msgstr "Dispositivos GPS encontrado" +#: build/lib/pytrainer/gui/windowimportdata.py:255 #: pytrainer/gui/windowimportdata.py:255 msgid "GPS device <b>not</b> found" msgstr "Dispositivo GPS <b>no</b> encontrado" +#: build/lib/pytrainer/gui/windowimportdata.py:262 #: pytrainer/gui/windowimportdata.py:262 msgid "This tool was not found on the system" msgstr "No se ha encontrado esta herramienta en el sistema" +#: build/lib/pytrainer/gui/windowimportdata.py:264 #: pytrainer/gui/windowimportdata.py:264 msgid " Homepage" msgstr "Página de inicio" +#: build/lib/pytrainer/gui/windowimportdata.py:317 #: pytrainer/gui/windowimportdata.py:317 msgid "File" msgstr "Archivo" +#: build/lib/pytrainer/gui/windowimportdata.py:317 #: pytrainer/gui/windowimportdata.py:317 msgid "Type" msgstr "Tipo" +#: build/lib/pytrainer/gui/windowimportdata.py:317 #: pytrainer/gui/windowimportdata.py:317 msgid "Activities" msgstr "Actividades" +#: build/lib/pytrainer/gui/windowimportdata.py:352 +#: build/lib/pytrainer/gui/windowrecord.py:210 #: pytrainer/gui/windowimportdata.py:352 #: pytrainer/gui/windowrecord.py:210 msgid "Start Time" msgstr "Hora de comienzo" +#: build/lib/pytrainer/gui/windowimportdata.py:352 +#: build/lib/pytrainer/gui/windowrecord.py:210 #: pytrainer/gui/windowimportdata.py:352 #: pytrainer/gui/windowrecord.py:210 msgid "Duration" msgstr "Duración" +#: build/lib/pytrainer/gui/windowimportdata.py:501 #: pytrainer/gui/windowimportdata.py:501 msgid "Imported into database" msgstr "Importado a base de datos" +#: build/lib/pytrainer/gui/windowimportdata.py:545 +#: build/lib/pytrainer/gui/windowextensions.py:81 +#: build/lib/pytrainer/gui/windowplugins.py:80 #: pytrainer/gui/windowimportdata.py:545 #: pytrainer/gui/windowextensions.py:81 #: pytrainer/gui/windowplugins.py:80 @@ -1888,6 +2163,10 @@ msgid "%s settings" msgstr "%s opciones" +#: build/lib/pytrainer/gui/windowimportdata.py:560 +#: build/lib/pytrainer/gui/windowextensions.py:70 +#: build/lib/pytrainer/gui/windowplugins.py:71 +#: build/lib/pytrainer/gui/windowplugins.py:95 #: pytrainer/gui/windowimportdata.py:560 #: pytrainer/gui/windowextensions.py:70 #: pytrainer/gui/windowplugins.py:71 @@ -1895,6 +2174,10 @@ msgid "Disable" msgstr "Desactivo" +#: build/lib/pytrainer/gui/windowimportdata.py:561 +#: build/lib/pytrainer/gui/windowextensions.py:72 +#: build/lib/pytrainer/gui/windowplugins.py:69 +#: build/lib/pytrainer/gui/windowplugins.py:96 #: pytrainer/gui/windowimportdata.py:561 #: pytrainer/gui/windowextensions.py:72 #: pytrainer/gui/windowplugins.py:69 @@ -1902,119 +2185,161 @@ msgid "Enable" msgstr "Activo" +#: build/lib/pytrainer/gui/windowimportdata.py:568 +#: build/lib/pytrainer/gui/windowplugins.py:103 #: pytrainer/gui/windowimportdata.py:568 #: pytrainer/gui/windowplugins.py:103 msgid "Ok" msgstr "Ok" +#: build/lib/pytrainer/gui/windowimportdata.py:628 #: pytrainer/gui/windowimportdata.py:628 msgid "Saving options" msgstr "Guardar configuración" +#: build/lib/pytrainer/gui/windowimportdata.py:630 #: pytrainer/gui/windowimportdata.py:630 msgid "Options saved" msgstr "Configuración guardada" +#: build/lib/pytrainer/gui/windowimportdata.py:655 #: pytrainer/gui/windowimportdata.py:655 msgid "Importing one activity" msgstr "Importando una actividad" +#: build/lib/pytrainer/gui/windowimportdata.py:656 #: pytrainer/gui/windowimportdata.py:656 msgid "Imported one activity" msgstr "Una actividad importada" +#: build/lib/pytrainer/gui/windowimportdata.py:658 #: pytrainer/gui/windowimportdata.py:658 #, python-format msgid "Importing %d activities" msgstr "Importando %d actividades" +#: build/lib/pytrainer/gui/windowimportdata.py:659 #: pytrainer/gui/windowimportdata.py:659 #, python-format msgid "Imported %d activities" msgstr "Importadas %d actividades" +#: build/lib/pytrainer/gui/windowimportdata.py:678 #: pytrainer/gui/windowimportdata.py:678 msgid "Choose a file (or files) to import activities from" msgstr "Seleccione fichero/s desde el/los que importar actividades" +#: build/lib/pytrainer/gui/windowimportdata.py:693 +#: build/lib/pytrainer/gui/windowimportdata.py:694 #: pytrainer/gui/windowimportdata.py:693 #: pytrainer/gui/windowimportdata.py:694 #, python-format msgid "Found file of type: %s" msgstr "Tipo de fichero encontrado: %s" +#: build/lib/pytrainer/gui/windowimportdata.py:718 #: pytrainer/gui/windowimportdata.py:718 msgid "Found in database" msgstr "Encontrado en base de datos" +#: build/lib/pytrainer/gui/windowimportdata.py:733 +#: build/lib/pytrainer/gui/windowimportdata.py:734 #: pytrainer/gui/windowimportdata.py:733 #: pytrainer/gui/windowimportdata.py:734 #, python-format msgid "File %s is of unknown or unsupported file type" msgstr "Fichero %s seleccionado desconocido o no soportado" +#: build/lib/pytrainer/gui/windowimportdata.py:807 #: pytrainer/gui/windowimportdata.py:807 #, python-format msgid "Column %d" msgstr "Columna %d" +#: build/lib/pytrainer/gui/drawArea.py:166 +#: build/lib/pytrainer/extensions/googlemaps.py:127 +#: build/lib/pytrainer/extensions/osm.py:102 #: pytrainer/gui/drawArea.py:166 -#: pytrainer/extensions/googlemaps.py:129 -#: pytrainer/extensions/osm.py:105 +#: pytrainer/extensions/googlemaps.py:127 +#: pytrainer/extensions/osm.py:102 msgid "min" msgstr "min" +#: build/lib/pytrainer/gui/drawArea.py:410 #: pytrainer/gui/drawArea.py:410 msgid "rest" msgstr "descanso" +#: build/lib/pytrainer/gui/windowrecord.py:210 #: pytrainer/gui/windowrecord.py:210 msgid "GPX File" msgstr "Archivo GPX" -#: pytrainer/gui/windowprofile.py:42 +#: build/lib/pytrainer/gui/windowprofile.py:47 +#: pytrainer/gui/windowprofile.py:47 msgid "Male" msgstr "Varón" -#: pytrainer/gui/windowprofile.py:43 +#: build/lib/pytrainer/gui/windowprofile.py:48 +#: pytrainer/gui/windowprofile.py:48 msgid "Female" msgstr "Mujer" -#: pytrainer/gui/windowprofile.py:60 +#: build/lib/pytrainer/gui/windowprofile.py:65 +#: pytrainer/gui/windowprofile.py:65 msgid "MET" msgstr "M.E.T." -#: pytrainer/gui/windowprofile.py:341 +#: build/lib/pytrainer/gui/windowprofile.py:314 +#: pytrainer/gui/windowprofile.py:314 msgid "Sport Creation Error" msgstr "Fallo en la creación de deporte" +#: build/lib/pytrainer/gui/equipment.py:101 +#: pytrainer/gui/equipment.py:101 +msgid "Usage" +msgstr "Uso" + +#: build/lib/pytrainer/gui/dialogselecttrack.py:40 #: pytrainer/gui/dialogselecttrack.py:40 msgid "Track Name" msgstr "Nombre de la ruta" +#: build/lib/pytrainer/gui/drawGraph.py:170 #: pytrainer/gui/drawGraph.py:170 msgid "Athlete Data" msgstr "Datos del atleta" +#: build/lib/pytrainer/gui/windowextensions.py:112 +#: build/lib/pytrainer/gui/windowextensions.py:125 #: pytrainer/gui/windowextensions.py:112 #: pytrainer/gui/windowextensions.py:125 msgid "OK" msgstr "Ok" +#: build/lib/pytrainer/recordgraph.py:134 +#: build/lib/pytrainer/daygraph.py:52 #: pytrainer/recordgraph.py:134 #: pytrainer/daygraph.py:52 msgid "Height (m)" msgstr "Altura (m)" +#: build/lib/pytrainer/recordgraph.py:134 +#: build/lib/pytrainer/daygraph.py:52 #: pytrainer/recordgraph.py:134 #: pytrainer/daygraph.py:52 msgid "Stage Profile" msgstr "Perfil de Etapa" +#: build/lib/pytrainer/recordgraph.py:136 #: pytrainer/recordgraph.py:136 msgid "Speed (Km/h)" msgstr "Velocidad (km/h)" +#: build/lib/pytrainer/recordgraph.py:138 +#: build/lib/pytrainer/lib/activity.py:314 +#: build/lib/pytrainer/lib/activity.py:424 +#: build/lib/pytrainer/lib/activity.py:426 #: pytrainer/recordgraph.py:138 #: pytrainer/lib/activity.py:314 #: pytrainer/lib/activity.py:424 @@ -2022,66 +2347,119 @@ msgid "Pace" msgstr "Ritmo" +#: build/lib/pytrainer/recordgraph.py:140 +#: build/lib/pytrainer/heartrategraph.py:36 +#: build/lib/pytrainer/daygraph.py:56 #: pytrainer/recordgraph.py:140 #: pytrainer/heartrategraph.py:36 #: pytrainer/daygraph.py:56 msgid "Beats (bpm)" msgstr "Media pulsaciones (ppm)" +#: build/lib/pytrainer/recordgraph.py:142 #: pytrainer/recordgraph.py:142 msgid "Cadence (rpm)" msgstr "Cadencia (rpm)" +#: build/lib/pytrainer/recordgraph.py:142 +#: build/lib/pytrainer/lib/activity.py:452 +#: build/lib/pytrainer/lib/activity.py:454 #: pytrainer/recordgraph.py:142 #: pytrainer/lib/activity.py:452 #: pytrainer/lib/activity.py:454 msgid "Cadence" msgstr "Cadence" +#: build/lib/pytrainer/recordgraph.py:144 #: pytrainer/recordgraph.py:144 msgid "Beats (%)" msgstr "Pulsaciones (%)" +#: build/lib/pytrainer/recordgraph.py:146 #: pytrainer/recordgraph.py:146 msgid "Zone" msgstr "Zona" -#: pytrainer/profile.py:110 +#: build/lib/pytrainer/profile.py:109 +#... [truncated message content] |
From: <dg...@us...> - 2011-08-15 10:09:39
|
Revision: 847 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=847&view=rev Author: dgranda Date: 2011-08-15 10:09:33 +0000 (Mon, 15 Aug 2011) Log Message: ----------- Enabling localization for labels - ticket #99 Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/equipment.py pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/lib/listview.py Modified: pytrainer/trunk/pytrainer/gui/equipment.py =================================================================== --- pytrainer/trunk/pytrainer/gui/equipment.py 2011-08-14 20:01:41 UTC (rev 846) +++ pytrainer/trunk/pytrainer/gui/equipment.py 2011-08-15 10:09:33 UTC (rev 847) @@ -95,11 +95,11 @@ def _init_tree_view(self): tree_view = self._get_tree_view() - column = gtk.TreeViewColumn("Description", gtk.CellRendererText(), text=1) + column = gtk.TreeViewColumn(_("Description"), gtk.CellRendererText(), text=1) column.set_resizable(True) tree_view.append_column(column) - tree_view.append_column(gtk.TreeViewColumn("Usage", gtk.CellRendererProgress(), value=2, text=3)) - tree_view.append_column(gtk.TreeViewColumn("Active", gtk.CellRendererToggle(), active=4)) + tree_view.append_column(gtk.TreeViewColumn(_("Usage"), gtk.CellRendererProgress(), value=2, text=3)) + tree_view.append_column(gtk.TreeViewColumn(_("Active"), gtk.CellRendererToggle(), active=4)) # add filler column tree_view.append_column(gtk.TreeViewColumn()) tree_view.set_model(self._equipment_store) Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2011-08-14 20:01:41 UTC (rev 846) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2011-08-15 10:09:33 UTC (rev 847) @@ -2207,7 +2207,7 @@ table = gtk.Table(1,2) self.entryList = [] #Add date - label = gtk.Label("<b>Date</b>") + label = gtk.Label(_("<b>Date</b>")) label.set_use_markup(True) entry = gtk.Entry() entry.set_text(data['date']) @@ -2223,7 +2223,7 @@ #table.attach(calbut,2,3,0,1) #TODO #Add weight - label = gtk.Label("<b>Weight</b>") + label = gtk.Label(_("<b>Weight</b>")) label.set_use_markup(True) entry = gtk.Entry() entry.set_text(data['weight']) @@ -2231,7 +2231,7 @@ table.attach(label,0,1,1,2) table.attach(entry,1,2,1,2) #Add Body fat - label = gtk.Label("<b>Body Fat</b>") + label = gtk.Label(_("<b>Body Fat</b>")) label.set_use_markup(True) entry = gtk.Entry() entry.set_text(data['bf']) @@ -2239,7 +2239,7 @@ table.attach(label,0,1,2,3) table.attach(entry,1,2,2,3) #Add Resting HR - label = gtk.Label("<b>Resting Heart Rate</b>") + label = gtk.Label(_("<b>Resting Heart Rate</b>")) label.set_use_markup(True) entry = gtk.Entry() entry.set_text(data['restingHR']) @@ -2247,7 +2247,7 @@ table.attach(label,0,1,3,4) table.attach(entry,1,2,3,4) #Add Max HR - label = gtk.Label("<b>Max Heart Rate</b>") + label = gtk.Label(_("<b>Max Heart Rate</b>")) label.set_use_markup(True) entry = gtk.Entry() entry.set_text(data['maxHR']) Modified: pytrainer/trunk/pytrainer/lib/listview.py =================================================================== --- pytrainer/trunk/pytrainer/lib/listview.py 2011-08-14 20:01:41 UTC (rev 846) +++ pytrainer/trunk/pytrainer/lib/listview.py 2011-08-15 10:09:33 UTC (rev 847) @@ -1,13 +1,13 @@ import datetime -UC_LISTDISTANCE = {False : [['All Distances', [0.0,999999.9]], +UC_LISTDISTANCE = {False : [[_('All Distances'), [0.0,999999.9]], ['<1 km', [0.0, 1.0]], ['1-5 km', [1.0, 5.0]], ['5-20 km', [5.0, 20.0]], ['20-50 km', [20.0, 50.0]], ['50-100 km', [50.0, 100.0]], ['>100 km', [100.0, 999999.9]]] , - True : [['All Distances', [0.0,999999.9]], + True : [[_('All Distances'), [0.0,999999.9]], ['<1 mi', [0.0, 1.609344]], ['1-5 mi', [1.609344, 8.04672]], ['5-10 mi', [8.04672, 16.09344]], @@ -29,13 +29,13 @@ self.distance = 0 self.listSport = self.pytrainer_main.profile.getSportList() - self.listPast = [['All Time', -99999], ['Last 4 Weeks', -31], - ['Last 6 Months', -183], ['Last 12 Months', -366]] + self.listPast = [[_('All Time'), -99999], [_('Last 4 Weeks'), -31], + [_('Last 6 Months'), -183], [_('Last 12 Months'), -366]] - self.listDuration = [['All Durations', [0,999999]], - ['<1 Hour', [0,3600]], - ['1-2 Hours', [3600,7200]], - ['>2 Hours', [7200,999999]]] + self.listDuration = [[_('All Durations'), [0,999999]], + [_('<1 Hour'), [0,3600]], + [_('1-2 Hours'), [3600,7200]], + [_('>2 Hours'), [7200,999999]]] """ self.listDistanceUS = [['All Distances', [0.0,999999.9]], This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2011-08-14 20:01:47
|
Revision: 846 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=846&view=rev Author: dgranda Date: 2011-08-14 20:01:41 +0000 (Sun, 14 Aug 2011) Log Message: ----------- Enabling localization for some graph labels Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowmain.py Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2011-08-14 10:15:38 UTC (rev 845) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2011-08-14 20:01:41 UTC (rev 846) @@ -558,10 +558,10 @@ if isinstance(child, gtk.Frame): self.graph_data_hbox.remove(child) #Build frames and vboxs to hold checkbuttons - xFrame = gtk.Frame(label="Show on X Axis") - y1Frame = gtk.Frame(label="Show on Y1 Axis") - y2Frame = gtk.Frame(label="Show on Y2 Axis") - limitsFrame = gtk.Frame(label="Axis Limits") + xFrame = gtk.Frame(label=_("Show on X Axis")) + y1Frame = gtk.Frame(label=_("Show on Y1 Axis")) + y2Frame = gtk.Frame(label=_("Show on Y2 Axis")) + limitsFrame = gtk.Frame(label=_("Axis Limits")) xvbox = gtk.VBox() y1box = gtk.Table() y2box = gtk.Table() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2011-08-14 10:15:44
|
Revision: 845 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=845&view=rev Author: dgranda Date: 2011-08-14 10:15:38 +0000 (Sun, 14 Aug 2011) Log Message: ----------- Field date_time_local in table records comes from datetime object which has an space between date and time, breaking sql query when not properly parsed - MySQL library might have same behavior, not checked Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/sqliteUtils.py Modified: pytrainer/trunk/pytrainer/lib/sqliteUtils.py =================================================================== --- pytrainer/trunk/pytrainer/lib/sqliteUtils.py 2011-08-13 08:29:41 UTC (rev 844) +++ pytrainer/trunk/pytrainer/lib/sqliteUtils.py 2011-08-14 10:15:38 UTC (rev 845) @@ -20,6 +20,7 @@ import logging import sys, traceback, commands +import datetime try: from sqlite3 import dbapi2 as sqlite except ImportError: @@ -83,6 +84,7 @@ logging.debug('<<') def insert(self,table, cells, values): + logging.debug('>>') cur = self.db.cursor() val = values count = 0 @@ -93,16 +95,23 @@ string+= self._to_sql_value(i) count = count+1 sql = "insert into %s (%s) values (%s)" %(table,cells,string) + logging.debug('SQL sentence: '+str(sql)) cur.execute(sql) self.db.commit() + logging.debug('<<') def _to_sql_value(self, value): + logging.debug('>>') + logging.debug('Value: %s | type: %s ' %(value,type(value))) if value == None: return "null" elif type(value) in [str, unicode]: return "\"" + value + "\"" + elif type(value) == datetime.datetime: + return value.strftime("\"%Y-%m-%d %H:%M:%S%z\"") else: return str(value) + logging.debug('<<') def freeExec(self,sql): cur = self.db.cursor() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <nc...@us...> - 2011-08-13 08:29:48
|
Revision: 844 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=844&view=rev Author: ncjones Date: 2011-08-13 08:29:41 +0000 (Sat, 13 Aug 2011) Log Message: ----------- Ensure sport data is valid. ticket:138 Modified Paths: -------------- pytrainer/trunk/INSTALL pytrainer/trunk/pytrainer/lib/ddbb.py Added Paths: ----------- pytrainer/trunk/pytrainer/test/upgrade/versions/ pytrainer/trunk/pytrainer/test/upgrade/versions/__init__.py pytrainer/trunk/pytrainer/test/upgrade/versions/version012_test.py pytrainer/trunk/pytrainer/upgrade/versions/012_clean_sport_data.py pytrainer/trunk/pytrainer/upgrade/versions/version012.py Modified: pytrainer/trunk/INSTALL =================================================================== --- pytrainer/trunk/INSTALL 2011-08-13 08:28:05 UTC (rev 843) +++ pytrainer/trunk/INSTALL 2011-08-13 08:29:41 UTC (rev 844) @@ -23,6 +23,7 @@ libxslt-python-1.1.26 libxslt-1.1.26 sqlite-3.6.23 (sqlite is preferred as db than mysql, MySQL-python has been reported to be installed if so) +sqlalchemy-0.6.4 sqlalchemy-migrate-0.6.1 - Only needed if correspondent plugin is enabled: Modified: pytrainer/trunk/pytrainer/lib/ddbb.py =================================================================== --- pytrainer/trunk/pytrainer/lib/ddbb.py 2011-08-13 08:28:05 UTC (rev 843) +++ pytrainer/trunk/pytrainer/lib/ddbb.py 2011-08-13 08:29:41 UTC (rev 844) @@ -104,7 +104,11 @@ "equipment_id": "int", } } -tablesDefaultData = { "sports": [({ "name":"Mountain Bike" } ), ( {"name": "Bike"}), ({"name": "Run"}) ]} +tablesDefaultData = { "sports": [ + ({ "name": u"Mountain Bike", "weight": 0.0, "color": "0000ff" } ), + ({ "name": u"Bike", "weight": 0.0, "color": "00ff00"}), + ({ "name": u"Run", "weight": 0.0, "color": "ffff00"}) +]} class DDBB: @@ -219,6 +223,10 @@ #Text so is OK?? #TODO check length against spec? return value + elif cell_type.startswith('char'): + #Text so is OK?? + #TODO check length against spec? + return value elif cell_type.startswith('date'): try: result = dateutil.parser.parse(value).date() Added: pytrainer/trunk/pytrainer/test/upgrade/versions/__init__.py =================================================================== Added: pytrainer/trunk/pytrainer/test/upgrade/versions/version012_test.py =================================================================== --- pytrainer/trunk/pytrainer/test/upgrade/versions/version012_test.py (rev 0) +++ pytrainer/trunk/pytrainer/test/upgrade/versions/version012_test.py 2011-08-13 08:29:41 UTC (rev 844) @@ -0,0 +1,81 @@ +# -*- coding: iso-8859-1 -*- + +#Copyright (C) Nathan Jones nc...@us... + +#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 unittest +import sqlalchemy +import pytrainer.upgrade.versions.version012 as version012 + +class UpgradeTest(unittest.TestCase): + + def setUp(self): + self._engine = sqlalchemy.create_engine("sqlite:///:memory:") + self._metadata = sqlalchemy.MetaData() + self._metadata.bind = self._engine + self._sports_table = sqlalchemy.Table("sports", self._metadata, + sqlalchemy.Column("id_sports", sqlalchemy.Integer, primary_key=True), + sqlalchemy.Column("name", sqlalchemy.String(100)), + sqlalchemy.Column("weight", sqlalchemy.Float), + sqlalchemy.Column("color", sqlalchemy.String(6)), + sqlalchemy.Column("met", sqlalchemy.Float), + sqlalchemy.Column("max_pace", sqlalchemy.Integer) + ) + self._metadata.drop_all() + self._metadata.create_all() + + def upgradeAndAssert(self, original, expected): + self._engine.execute(sqlalchemy.text("insert into sports (id_sports, name, weight, color, met, max_pace)" + " values (:id, :name, :weight, :color, :met, :max_pace)"), + id= 1, + name= "Test Sport", + weight= original["weight"], + color= original["color"], + met= original["met"], + max_pace= original["max_pace"]) + version012.upgrade(self._engine) + result = self._engine.execute(self._sports_table.select(self._sports_table.c.id_sports==1)) + (_, _, weight, color, met, max_pace) = result.fetchone() + result.close() + self.assertEqual(expected["weight"], weight) + self.assertEqual(expected["color"], color) + self.assertEqual(expected["met"], met) + self.assertEqual(expected["max_pace"], max_pace) + + def testUpgradeFromNullValues(self): + original = { "weight": None, "color": None, "met": None, "max_pace": None } + expected = { "weight": 0.0, "color": "0000ff", "met": None, "max_pace": None } + self.upgradeAndAssert(original, expected) + + def testUpgradeFromZeroValues(self): + original = { "weight": 0, "color": 0, "met": 0, "max_pace": 0 } + expected = { "weight": 0.0, "color": "0", "met": 0, "max_pace": None } + self.upgradeAndAssert(original, expected) + + def testUpgradeFromEmptyValues(self): + original = { "weight": "", "color": "", "met": "", "max_pace": "" } + expected = { "weight": 0.0, "color": "0000ff", "met": None, "max_pace": None } + self.upgradeAndAssert(original, expected) + + def testUpgradeFromNegativeValues(self): + original = { "weight": -1, "color": -1, "met": -1, "max_pace": -1 } + expected = { "weight": 0.0, "color": "-1", "met": None, "max_pace": None } + self.upgradeAndAssert(original, expected) + + def testUpgradeFromValidValues(self): + original = { "weight": 3.4, "color": "abc123", "met": 45.6, "max_pace": 123 } + expected = { "weight": 3.4, "color": "abc123", "met": 45.6, "max_pace": 123 } + self.upgradeAndAssert(original, expected) Added: pytrainer/trunk/pytrainer/upgrade/versions/012_clean_sport_data.py =================================================================== --- pytrainer/trunk/pytrainer/upgrade/versions/012_clean_sport_data.py (rev 0) +++ pytrainer/trunk/pytrainer/upgrade/versions/012_clean_sport_data.py 2011-08-13 08:29:41 UTC (rev 844) @@ -0,0 +1,4 @@ +import pytrainer.upgrade.versions.version012 as version12 + +def upgrade(migrate_engine): + version12.upgrade(migrate_engine) \ No newline at end of file Added: pytrainer/trunk/pytrainer/upgrade/versions/version012.py =================================================================== --- pytrainer/trunk/pytrainer/upgrade/versions/version012.py (rev 0) +++ pytrainer/trunk/pytrainer/upgrade/versions/version012.py 2011-08-13 08:29:41 UTC (rev 844) @@ -0,0 +1,91 @@ +# -*- coding: iso-8859-1 -*- + +#Copyright (C) Nathan Jones nc...@us... + +#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. + +from sqlalchemy.sql.expression import text +import logging + +class _SportNormalizer(object): + + """A row from the sport DB table that can be "normalized" to have invalid + values replaced with valid defaults.""" + + def __init__(self, id, weight, color, met, max_pace): + self._id = id + self._weight = weight + self._color = color + self._met = met + self._max_pace = max_pace + + def normalize(self, migrate_engine): + self._normalize_weight(migrate_engine) + self._normalize_color(migrate_engine) + self._normalize_met(migrate_engine) + self._normalize_max_pace(migrate_engine) + + def _normalize_weight(self, migrate_engine): + valid = True + try: + weight = float(self._weight) + if weight < 0: + valid = False + except: + valid = False + if not valid: + logging.debug("Sport with id '%s' has invalid weight: '%s'. Replacing with default.", self._id, self._weight) + migrate_engine.execute(text("update sports set weight=:weight where id_sports=:id"), id=self._id, weight=0.0) + + def _normalize_color(self, migrate_engine): + try: + # colors that do not have exactly 6 hexadecimal digits should also + # be invalid, but we do not expect such invalid values to exist. + int(self._color, 16) + except: + logging.debug("Sport with id '%s' has invalid color: '%s'. Replacing with default.", self._id, self._color) + migrate_engine.execute(text("update sports set color=:color where id_sports=:id"), id=self._id, color="0000ff") + + def _normalize_met(self, migrate_engine): + valid = True + if self._met is not None: + try: + met = float(self._met) + if met < 0: + valid = False + except: + valid = False + if not valid: + logging.debug("Sport with id '%s' has invalid MET: '%s'. Replacing with default.", self._id, self._met) + migrate_engine.execute(text("update sports set met=:met where id_sports=:id"), id=self._id, met=None) + + def _normalize_max_pace(self, migrate_engine): + valid = True + if self._max_pace is not None: + try: + max_pace = int(self._max_pace) + if max_pace <= 0: + valid = False + except: + valid = False + if not valid: + logging.debug("Sport with id '%s' has invalid max pace: '%s'. Replacing with default.", self._id, self._max_pace) + migrate_engine.execute(text("update sports set max_pace=:max_pace where id_sports=:id"), id=self._id, max_pace=None) + +def upgrade(migrate_engine): + sport_rows = migrate_engine.execute("select id_sports, weight, color, met, max_pace from sports") + for (id, weight, color, met, max_pace) in sport_rows: + _SportNormalizer(id, weight, color, met, max_pace).normalize(migrate_engine) + sport_rows.close() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |