You can subscribe to this list here.
2008 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(1) |
Nov
|
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2009 |
Jan
|
Feb
(1) |
Mar
(15) |
Apr
(20) |
May
(2) |
Jun
(9) |
Jul
(3) |
Aug
(2) |
Sep
(17) |
Oct
(16) |
Nov
(38) |
Dec
(40) |
2010 |
Jan
(51) |
Feb
(11) |
Mar
(24) |
Apr
(31) |
May
(24) |
Jun
(3) |
Jul
(9) |
Aug
(1) |
Sep
(29) |
Oct
(33) |
Nov
(81) |
Dec
(6) |
2011 |
Jan
(2) |
Feb
(4) |
Mar
(13) |
Apr
(4) |
May
(24) |
Jun
(4) |
Jul
(19) |
Aug
(46) |
Sep
(10) |
Oct
(28) |
Nov
(31) |
Dec
|
From: <dg...@us...> - 2010-01-21 20:02:46
|
Revision: 493 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=493&view=rev Author: dgranda Date: 2010-01-21 20:01:51 +0000 (Thu, 21 Jan 2010) Log Message: ----------- Reviewed dependencies, added garmintools Modified Paths: -------------- pytrainer/trunk/INSTALL Modified: pytrainer/trunk/INSTALL =================================================================== --- pytrainer/trunk/INSTALL 2010-01-21 03:47:28 UTC (rev 492) +++ pytrainer/trunk/INSTALL 2010-01-21 20:01:51 UTC (rev 493) @@ -7,28 +7,31 @@ Here you are dependencies for PyTrainer. Of course you must have a working environment with proper shell configuration and typical GNU tools to uncompress (gunzip) and untar (tar) files. -1.1.- Working packages (Fedora 12 package revisions as of 2009.12.06 for 1.7.0) +1.1.- Packages (Fedora 12 working versions as of 2010.01.21 for 1.7.1) -python-2.6.2-2 -python-devel-2.6.2-2 (to run the installation from tarball) -python-matplotlib-0.98.5.2-5 -gnome-python2-gtkmozembed-2.25.3-13 -pygtk2-libglade-2.16.0-1 -pygtk2-2.16.0-1 -SOAPpy-0.11.6-10 -python-lxml-2.2.3-1 -libxml2-python-2.7.6-1 -libxml2-2.7.6-1 -libxslt-python-1.1.26-1 -libxslt-1.1.26-1 -sqlite-3.6.20-1 (sqlite is preferred as db than mysql) -gpsbabel-1.3.5-1 -xulrunner-1.9.1.5-1 -firefox-3.5.5-1 +python-2.6.2 +python-devel-2.6.2 (to run installation from tarball) +python-matplotlib-0.98.5.2 +gnome-python2-gtkmozembed-2.25.3 +pygtk2-libglade-2.16.0 +pygtk2-2.16.0 +SOAPpy-0.11.6 +python-lxml-2.2.3 +libxml2-python-2.7.6 +libxml2-2.7.6 +libxslt-python-1.1.26 +libxslt-1.1.26 +sqlite-3.6.20 (sqlite is preferred as db than mysql) +xulrunner-1.9.1.6 +firefox-3.5.6 +- Only needed if correspondent plugin is enabled: +gpsbabel-1.3.5 ("Garmin via GPSBabel 1.3.5" aka garmin_hr) +garmintools-0.10 ("Garmin via garmintools" aka garmintools_full) + 2.- Installation process -Copy the tarball file to a location where you have write and execution rights (e.g. /tmp or ~/). Make sure executables are under your $PATH. +Copy tarball file to a location where you have write and execution rights (e.g. /tmp or your $HOME directory). Make sure executables are under your $PATH. $ tar -xzf pytrainer-X.Y.Z.tar.gz $ cd pytrainer-X.Y.Z This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-01-21 03:47:34
|
Revision: 492 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=492&view=rev Author: jblance Date: 2010-01-21 03:47:28 +0000 (Thu, 21 Jan 2010) Log Message: ----------- Initial update of CHANGES for release 1.7.1 Modified Paths: -------------- pytrainer/trunk/CHANGES pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/CHANGES =================================================================== --- pytrainer/trunk/CHANGES 2010-01-21 03:43:55 UTC (rev 491) +++ pytrainer/trunk/CHANGES 2010-01-21 03:47:28 UTC (rev 492) @@ -1,3 +1,36 @@ +See the pytrainer roadmap for more information http://sourceforge.net/apps/trac/pytrainer/roadmap + +- PyTrainer changes for 1.7.1: + + * New import plugin - Garmintools - svn [430], [431], [436], [452], [453], [459], [460], [461], [463], [464], [486], [487], [488] + o both file (dump file) and device import implemented + o smart import from device to cater for different start times compared to GPSBabel (to reduce duplicated activities) + * Move to Google maps API version 3 - svn [477] + * Add lap functionality - svn [433], [447], [448], [451], [454], [455] + o display individual laps under activity on treeview + o visually display lap duration on record graphs (user selectable) + o display lap markers on route map + * Improve check functionality - svn [437], [438], [439], [475], [478], [479], [480], [482] + o Can be initiated by command line option --check + o Will be initiated if DB version in code is newer than user's DB version + o DB migration checks refactored and improved + * Timezone support - svn [434], [440], [442], [483] + o DB updated with new field date_time_local + o field populated on import (or when DB check is run) + o field used in preference to UTC if present for display + * Cadence / RPM support and graph added (tcx v2 file import only) - svn [432] + * Improved install process and remove unneeded files - svn [445], [446], [462], [467], [472], [473] + * Bug fix to TCX v2 to cater for multiple activities per file - svn [435] + * Bug fix for calorie calculation - svn [441], [474] + * Bug fix for migration/new install error bug #2924209 - svn [456] + * Bug fix for GPX import without elevation data - svn [490] + * Separate some GUI elements into separate files to ease development - svn [443], [457], [465] + * EXPERIMENTAL Unified Import GUI begun (for testing/feedback only) - svn [458], [466], [468], [469], [470], [471], [476], [481], [489] + o disabled by default + o enabled on startup with --testimport + o file import functional + o device import NOT functional + - PyTrainer changes for 1.7.0: Updated Spanish translation (svn rev 420,423,424) Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-01-21 03:43:55 UTC (rev 491) +++ pytrainer/trunk/pytrainer/main.py 2010-01-21 03:47:28 UTC (rev 492) @@ -101,7 +101,7 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.1_pre-release-svn#491" + self.version ="1.7.1_pre-release-svn#492" self.DB_version = 1 self.date = Date() # Checking profile This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-01-21 03:44:01
|
Revision: 491 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=491&view=rev Author: jblance Date: 2010-01-21 03:43:55 +0000 (Thu, 21 Jan 2010) Log Message: ----------- Bug fixes for wordpress extension - needs wordpress blog that supports uploads of html, gpx and kml files Modified Paths: -------------- pytrainer/trunk/extensions/wordpress/googlemaps.py pytrainer/trunk/extensions/wordpress/main.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/extensions/wordpress/googlemaps.py =================================================================== --- pytrainer/trunk/extensions/wordpress/googlemaps.py 2010-01-20 07:41:33 UTC (rev 490) +++ pytrainer/trunk/extensions/wordpress/googlemaps.py 2010-01-21 03:43:55 UTC (rev 491) @@ -19,16 +19,20 @@ import os import re import sys -sys.path.insert(0,os.path.join(sys.path[0],'../../pytrainer/lib')) -from gpx import Gpx -import points as Points -from fileUtils import fileUtils import fileinput +import shutil + +import pytrainer.lib.points as Points +from pytrainer.lib.gpx import Gpx +from pytrainer.lib.fileUtils import fileUtils + def drawMap(gpxfile,key,htmlpath): + #Not sure why need to process gpx file cachefile = "/tmp/gpx.txt" - trackdistance = 100 - os.system("gpsbabel -t -i gpx -f %s -x position,distance=%sm -o gpx -F %s" %(gpxfile,trackdistance,cachefile)) + #trackdistance = 100 + #os.system("gpsbabel -t -i gpx -f %s -x position,distance=%sm -o gpx -F %s" %(gpxfile,trackdistance,cachefile)) + shutil.copy2(gpxfile, cachefile) # Test if file already contains gpxdata attribute found = False Modified: pytrainer/trunk/extensions/wordpress/main.py =================================================================== --- pytrainer/trunk/extensions/wordpress/main.py 2010-01-20 07:41:33 UTC (rev 490) +++ pytrainer/trunk/extensions/wordpress/main.py 2010-01-21 03:43:55 UTC (rev 491) @@ -1,15 +1,14 @@ #!/usr/bin/env python -import wordpresslib -import points as Points from optparse import OptionParser import os -import googlemaps import sys -sys.path.insert(0,os.path.join(sys.path[0],'../../pytrainer/lib')) -from date import Date - import SOAPpy +import wordpresslib +import googlemaps +import pytrainer.lib.points as Points +from pytrainer.lib.date import Date + class Main: def __init__(self,options): self.wordpressurl = options.wordpressurl Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-01-20 07:41:33 UTC (rev 490) +++ pytrainer/trunk/pytrainer/main.py 2010-01-21 03:43:55 UTC (rev 491) @@ -101,7 +101,7 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.0_svn#489" + self.version ="1.7.1_pre-release-svn#491" self.DB_version = 1 self.date = Date() # Checking profile This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-01-20 07:41:40
|
Revision: 490 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=490&view=rev Author: jblance Date: 2010-01-20 07:41:33 +0000 (Wed, 20 Jan 2010) Log Message: ----------- Fix for gpx import without elevaltion Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/gpx.py pytrainer/trunk/pytrainer/record.py Modified: pytrainer/trunk/pytrainer/lib/gpx.py =================================================================== --- pytrainer/trunk/pytrainer/lib/gpx.py 2010-01-18 06:48:59 UTC (rev 489) +++ pytrainer/trunk/pytrainer/lib/gpx.py 2010-01-20 07:41:33 UTC (rev 490) @@ -145,7 +145,6 @@ ''' logging.debug(">>") tree = self.tree - # Calories data comes within laps. Maybe more than one, adding them together - dgranda 20100114 laps = tree.findall(lapTag) for lap in laps: @@ -200,7 +199,11 @@ else: time_ = 1 #get the elevation - ele = trkpoint.find(elevationTag).text + eleResult = trkpoint.find(elevationTag) + if eleResult is not None: + ele = eleResult.text + else: + ele = None #chequeamos que la altura sea correcta / check that the height is correct if ele is not None: if len(ele)<15: @@ -209,7 +212,7 @@ print "ele len >= 15" + ele else: tmp_alt= 0 - print "tmp_alt:" + tmp_alt + #print "tmp_alt:" + str(tmp_alt) #evitamos los puntos blancos / we avoid the white points if (float(lat) < -0.000001) or (float(lat) > 0.0000001): Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2010-01-18 06:48:59 UTC (rev 489) +++ pytrainer/trunk/pytrainer/record.py 2010-01-20 07:41:33 UTC (rev 490) @@ -294,12 +294,14 @@ add: attribute to add or not the sport to db returns: id_sports from provided sport""" logging.debug('>>') - sport_id=0 + sport_id=1 + if sport == "" or sport is None: + return sport_id try: sport_id = self.ddbb.select("sports","id_sports","name=\"%s\"" %(sport))[0][0] except: logging.error('Error retrieving id_sports from '+ str(sport)) - traceback.print_last() + #traceback.print_last() if add is None: logging.debug('Sport '+str(sport)+' will not be added to DB') else: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-01-18 06:49:09
|
Revision: 489 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=489&view=rev Author: jblance Date: 2010-01-18 06:48:59 +0000 (Mon, 18 Jan 2010) Log Message: ----------- Added plugins tab to unified import gui - buttons not yet active Modified Paths: -------------- pytrainer/trunk/glade/importdata.glade pytrainer/trunk/pytrainer/gui/windowimportdata.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/glade/importdata.glade =================================================================== --- pytrainer/trunk/glade/importdata.glade 2010-01-17 20:32:21 UTC (rev 488) +++ pytrainer/trunk/glade/importdata.glade 2010-01-18 06:48:59 UTC (rev 489) @@ -347,6 +347,32 @@ </packing> </child> <child> + <widget class="GtkVBox" id="vboxPlugins"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <child> + <placeholder/> + </child> + </widget> + <packing> + <property name="position">3</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="labelPluginsPage"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>Plugins</b></property> + <property name="use_markup">True</property> + <property name="single_line_mode">True</property> + </widget> + <packing> + <property name="position">3</property> + <property name="tab_expand">True</property> + <property name="tab_fill">False</property> + <property name="type">tab</property> + </packing> + </child> + <child> <widget class="GtkVBox" id="vboxOptions"> <property name="visible">True</property> <property name="orientation">vertical</property> @@ -493,7 +519,7 @@ </child> </widget> <packing> - <property name="position">2</property> + <property name="position">3</property> </packing> </child> <child> @@ -504,8 +530,7 @@ <property name="single_line_mode">True</property> </widget> <packing> - <property name="position">2</property> - <property name="tab_expand">True</property> + <property name="position">3</property> <property name="tab_fill">False</property> <property name="type">tab</property> </packing> Modified: pytrainer/trunk/pytrainer/gui/windowimportdata.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowimportdata.py 2010-01-17 20:32:21 UTC (rev 488) +++ pytrainer/trunk/pytrainer/gui/windowimportdata.py 2010-01-18 06:48:59 UTC (rev 489) @@ -24,6 +24,8 @@ import logging from lxml import etree +from pytrainer.plugins import Plugins + class WindowImportdata(SimpleGladeApp): def __init__(self, data_path = None, parent=None, config=None): self.data_path = data_path @@ -34,6 +36,7 @@ self.configuration = config self.store = None self.processClass = None + self.plugins = Plugins(data_path, self.parent.parent) #SimpleGladeApp.__init__(self, data_path+glade_path, root, domain) def run(self): @@ -56,6 +59,9 @@ #'Import from File' tab self.init_file_tab() elif page ==2: + #'Plugins' tab + self.init_plugins_tab() + elif page ==3: #'Options' tab self.init_options_tab() else: @@ -69,7 +75,6 @@ return context_id def init_gpsdevice_tab(self): - return def init_file_tab(self): @@ -84,6 +89,58 @@ self.buttonFileImport.set_sensitive(0) return + def init_plugins_tab(self): + #Remove all components in vbox - in case of re-detection + for child in self.vboxPlugins.get_children(): + print "removing ", child + self.vboxPlugins.remove(child) + pluginList = self.plugins.getPluginsList() + for plugin in pluginList: + #Store plugin details + pluginClass = plugin[0] + pluginName = plugin[1] + pluginDescription = plugin[2] + #Build frame with name and description + pluginFrame = gtk.Frame(label="<b>"+pluginName+"</b>") + pluginFrameLabel = pluginFrame.get_label_widget() + pluginFrameLabel.set_use_markup(True) + description = gtk.Label("<small>"+pluginDescription+"</small>") + description.set_alignment(0,0) + description.set_use_markup(True) + description.set_line_wrap(True) + pluginFrame.add(description) + #Get plugin information + name,description,status = self.plugins.getPluginInfo(pluginClass) + #get plugin conf params ## These are the default params, need to get those stored for the user + #params = self.plugins.getPluginConfParams(pluginClass) + #print params + #Create buttons + statusButton = gtk.Button(label="Disable") + statusButton.connect('clicked', self.pluginsButton_clicked, pluginClass) + configButton = gtk.Button(label="Configure") + configButton.connect('clicked', self.pluginsButton_clicked, pluginClass) + runButton = gtk.Button(label="Run") + runButton.connect('clicked', self.pluginsButton_clicked, pluginClass) + + if status == 0 or status == "0": + #Plugin disabled + pluginFrame.set_sensitive(0) + statusButton.set_label("Enable") + configButton.set_sensitive(0) + runButton.set_sensitive(0) + else: + pass + #Create a table for the frame and button + pluginTable = gtk.Table() + pluginTable.attach(pluginFrame, 0, 1, 0, 1, xoptions=gtk.EXPAND|gtk.FILL, xpadding=5) + pluginTable.attach(statusButton, 1, 2, 0, 1, xoptions=gtk.FILL, yoptions=gtk.SHRINK, xpadding=5, ypadding=5) + pluginTable.attach(configButton, 2, 3, 0, 1, xoptions=gtk.FILL, yoptions=gtk.SHRINK, xpadding=5, ypadding=5) + pluginTable.attach(runButton, 3, 4, 0, 1, xoptions=gtk.FILL, yoptions=gtk.SHRINK, xpadding=5, ypadding=5) + #Add frame to tab + self.vboxPlugins.pack_start(pluginTable, expand=False, fill=False, padding=5) + self.win_importdata.show_all() + return + def init_options_tab(self): #Set correct radiobutton based on saved preference if self.defaulttab == 1: @@ -309,6 +366,12 @@ ## Window signal handlers ## ############################ + def pluginsButton_clicked(self, button, pluginClass): + ''' + Handler for plugin Buttons + ''' + print button.get_label(), pluginClass + def treeviewImportEvents_header_checkbox(self, column, store): """ Handler for click on checkbox column Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-01-17 20:32:21 UTC (rev 488) +++ pytrainer/trunk/pytrainer/main.py 2010-01-18 06:48:59 UTC (rev 489) @@ -101,7 +101,7 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.0_svn#485" + self.version ="1.7.0_svn#489" self.DB_version = 1 self.date = Date() # Checking profile This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2010-01-17 20:32:28
|
Revision: 488 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=488&view=rev Author: dgranda Date: 2010-01-17 20:32:21 +0000 (Sun, 17 Jan 2010) Log Message: ----------- Removing safe exit Modified Paths: -------------- pytrainer/trunk/plugins/garmintools_full/garmintools_full.py Modified: pytrainer/trunk/plugins/garmintools_full/garmintools_full.py =================================================================== --- pytrainer/trunk/plugins/garmintools_full/garmintools_full.py 2010-01-17 20:17:57 UTC (rev 487) +++ pytrainer/trunk/plugins/garmintools_full/garmintools_full.py 2010-01-17 20:32:21 UTC (rev 488) @@ -109,7 +109,6 @@ #TODO Remove Zenity below os.popen("zenity --error --text='Can not handle Garmin device (wrong module loaded)\nCheck your configuration'"); logging.info("Entries to import: "+str(len(importFiles))) - exit(0) logging.debug("<<") return importFiles This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2010-01-17 20:18:09
|
Revision: 487 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=487&view=rev Author: dgranda Date: 2010-01-17 20:17:57 +0000 (Sun, 17 Jan 2010) Log Message: ----------- Added smart comparison to minimize duplicate entries Modified Paths: -------------- pytrainer/trunk/plugins/garmintools_full/garmintools_full.py Modified: pytrainer/trunk/plugins/garmintools_full/garmintools_full.py =================================================================== --- pytrainer/trunk/plugins/garmintools_full/garmintools_full.py 2010-01-17 20:15:49 UTC (rev 486) +++ pytrainer/trunk/plugins/garmintools_full/garmintools_full.py 2010-01-17 20:17:57 UTC (rev 487) @@ -31,7 +31,7 @@ import traceback class garmintools_full(): - """ Plugin to import from a Garmin device using gpsbabel + """ Plugin to import from a Garmin device using garmintools Checks each activity to see if any entries are in the database with the same start time Creates GPX files for each activity not in the database @@ -48,10 +48,14 @@ self.sport = self.getConfValue("Force_sport_to") self.deltaDays = self.getConfValue("Not_older_days") if self.deltaDays is None: + logging.info("Delta days not set, retrieving complete history, defaulting to 0") self.deltaDays = 0 #so far hardcoded to False - dg 20100104 #self.legacyComp = self.getConfValue("Legacy_comparison") - self.legacyComp = False + self.maxGap = self.getConfValue("Max_gap_seconds") + if self.maxGap is None: + logging.info("No gap defined, strict comparison") + self.maxGap = 0 def getConfValue(self, confVar): info = XMLParser(self.data_path+"/conf.xml") @@ -70,30 +74,26 @@ if self.checkLoadedModule(): numError = self.getDeviceInfo() if numError >= 0: - # Create a compressed copy of current user directory - try: - self.createUserdirBackup() - except: - logging.error('Not able to make a copy of current user directory. Printing traceback and exiting') - traceback.print_exc() - exit(-1) #TODO Remove Zenity below outgps = commands.getstatusoutput("garmin_save_runs | zenity --progress --pulsate --text='Loading Data' auto-close") if outgps[0]==0: # now we should have a lot of gmn (binary) files under $GARMIN_SAVE_RUNS foundFiles = self.searchFiles(self.tmpdir, "gmn") logging.info("Retrieved "+str(len(foundFiles))+" entries from GPS device") - # discard old files - selectedFiles = self.discardOld(foundFiles) - # checking which entries are not imported yet - self.listStringDBUTC = self.parent.parent.ddbb.select("records","date_time_utc") - #logging.debug("From DB: "+str(self.listStringDBUTC)) - # commented out to fully rely on duplicates checking from garmintools plugin - #selectedFiles = self.checkDupes(foundFiles) - if selectedFiles is not None: + # Trying to minimize number of files to dump + if int(self.deltaDays) > 0: + selectedFiles = self.discardOld(foundFiles) + else: + logging.info("Retrieving complete history from GPS device") + selectedFiles = foundFiles + if len(selectedFiles) > 0: logging.info("Dumping "+str(len(selectedFiles))+" binary files found") dumpFiles = self.dumpBinaries(selectedFiles) - logging.info("Starting import") + self.listStringDBUTC = self.parent.parent.ddbb.select("records","date_time_utc") + if self.maxGap > 0: + logging.info("Starting import. Comparison will be made with "+str(self.maxGap)+" seconds interval") + else: + logging.info("Starting import. Comparison will be strict") importFiles = self.importEntries(dumpFiles) else: logging.info("No new entries to add") @@ -108,55 +108,26 @@ else: #No garmin device found #TODO Remove Zenity below os.popen("zenity --error --text='Can not handle Garmin device (wrong module loaded)\nCheck your configuration'"); - logging.info("Entries to import: "+str(len(importFiles))) + logging.info("Entries to import: "+str(len(importFiles))) + exit(0) logging.debug("<<") return importFiles def discardOld(self, listEntries): - tempList = [] - if self.deltaDays > 0: - logging.info("Discarding entries older than "+str(self.deltaDays)+" days") - limit = datetime.now() - timedelta(days = int(self.deltaDays)) - for entry in listEntries: - filename = os.path.split(entry)[1].rstrip(".gmn") - filenameDateTime = datetime.strptime(filename,"%Y%m%dT%H%M%S") - logging.debug("Entry time: "+str(filenameDateTime)+" | limit: "+str(limit)) - if filenameDateTime < limit: - logging.debug("Discarding old entry: "+str(filenameDateTime)) - else: - tempList.append(entry) - else: - logging.info("Retrieving complete history from GPS device") - return tempList - - def checkDupes(self, listEntries): - """ The idea behind is building two lists: one with all date_time_utc from DB (need conversion to datetime!) - and the other with all times from retrieved entries in UTC (need conversion from localtime -not possible only from filename- and to datetime!). - Seconds are the keys in a populated Dict, so if already present in the system can be removed from the mapping structure. - In case of legacy support, datetime from garmintools is older than (preceds) one stored in database (GPSBabel) - so DTgarmintools + delta (~ 3 mins) >= DTgpsbabel. - We obtain the final list retrieving remanent values from the dictionary """ logging.debug(">>") tempList = [] - tempDict = {} + logging.info("Discarding entries older than "+str(self.deltaDays)+" days") + limit = datetime.now() - timedelta(days = int(self.deltaDays)) for entry in listEntries: filename = os.path.split(entry)[1].rstrip(".gmn") filenameDateTime = datetime.strptime(filename,"%Y%m%dT%H%M%S") - logging.debug("Entry time: "+str(filenameDateTime)) - tempDict[filenameDatetime] = filename - - stringStartDatetime = self.detailsFromFile(tree) # this time is localtime! (with timezone offset) - exists = False - if stringStartDatetime is not None: - startDatetime = dateutil.parser.parse(stringStartDatetime) - # converting to utc for proper comparison with date_time_utc - utcStartDatetime = startDatetime.astimezone(tzutc()).strftime("%Y-%m-%dT%H:%M:%SZ") - #ToDo. Think about best approach - else: - logging.debug("Not able to find start time, please check "+str(filename)) - exists = True # workaround for old/not correct entries (will crash at some point during import process otherwise) + logging.debug("Entry time: "+str(filenameDateTime)+" | limit: "+str(limit)) + if filenameDateTime < limit: + logging.debug("Discarding old entry: "+str(filenameDateTime)) + else: + tempList.append(entry) logging.debug("<<") - return exists + return tempList def importEntries(self, entries): # modified from garmintools plugin written by jb @@ -199,27 +170,56 @@ return validator.validateXSL(filename, xslfile)''' def entryExists(self, tree, filename): + logging.debug(">>") stringStartDatetime = self.detailsFromFile(tree) # this time is localtime! (with timezone offset) exists = False if stringStartDatetime is not None: startDatetime = dateutil.parser.parse(stringStartDatetime) # converting to utc for proper comparison with date_time_utc stringStartUTC = startDatetime.astimezone(tzutc()).strftime("%Y-%m-%dT%H:%M:%SZ") - if self.legacyComp: - #ToDo - # All entries in UTC, so similars must have same date (startsWith) + if self.checkDupe(stringStartUTC, self.listStringDBUTC, int(self.maxGap)): + exists = True + else: + logging.info("Marking "+str(filename)+" | "+str(stringStartUTC)+" to import") exists = False - else: - if (stringStartUTC,) in self.listStringDBUTC: # strange way to store results from DB - exists = True - else: - logging.info("Marking "+str(filename)+" | "+str(stringStartUTC)+" to import") - exists = False else: logging.debug("Not able to find start time, please check "+str(filename)) exists = True # workaround for old/not correct entries (will crash at some point during import process otherwise) + logging.debug("<<") return exists + def checkDupe(self, stringStartUTC, listStringStartUTC, gap): + """ Checks if there is any startUTC in DB between provided startUTC plus a defined gap: + Check for same day (as baselined to UTC) + startDatetime + delta (~ 3 mins) >= listDatetime[x] + args: + stringStartUTC + listStringStartUTC + gap + returns: True if any coincidence is found. False otherwise""" + logging.debug(">>") + found = False + if gap > 0: + # Retrieve date from 2010-01-14T11:34:49Z + stringStartDate = stringStartUTC[0:10] + for entry in listStringStartUTC: + #logging.debug("start: "+str(startDatetime)+" | entry: "+str(entry)+" | gap: "+str(datetimePlusDelta)) + if entry[0] is not None: + if str(entry[0]).startswith(stringStartDate): + deltaGap = timedelta(seconds=gap) + datetimeStartUTC = datetime.strptime(stringStartUTC,"%Y-%m-%dT%H:%M:%SZ") + datetimeStartUTCDB = datetime.strptime(entry[0],"%Y-%m-%dT%H:%M:%SZ") + datetimePlusDelta = datetimeStartUTC + deltaGap + if datetimeStartUTC <= datetimeStartUTCDB and datetimeStartUTCDB <= datetimePlusDelta: + found = True + logging.debug("Found: "+str(stringStartUTC)+" <= "+str(entry[0])+" <= "+str(datetimePlusDelta)) + break + else: + if (stringStartUTC,) in listStringStartUTC: # strange way to store results from DB + found = True + logging.debug("<<") + return found + def getSport(self, tree): #return sport from file or overide if present if self.sport: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2010-01-17 20:16:05
|
Revision: 486 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=486&view=rev Author: dgranda Date: 2010-01-17 20:15:49 +0000 (Sun, 17 Jan 2010) Log Message: ----------- Added Max_gap_seconds parameter to support smart comparison Modified Paths: -------------- pytrainer/trunk/plugins/garmintools_full/conf.xml Modified: pytrainer/trunk/plugins/garmintools_full/conf.xml =================================================================== --- pytrainer/trunk/plugins/garmintools_full/conf.xml 2010-01-17 05:47:42 UTC (rev 485) +++ pytrainer/trunk/plugins/garmintools_full/conf.xml 2010-01-17 20:15:49 UTC (rev 486) @@ -7,6 +7,6 @@ executable="garmintools_full" > <conf-values variable="Force_sport_to" value=""/> -<conf-values variable="Not_older_days" value="0"/> -<conf-values variable="Legacy_comparison" value="True"/> +<conf-values variable="Not_older_days" value="30"/> +<conf-values variable="Max_gap_seconds" value="195"/> </pytrainer-plugin> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-01-17 05:47:49
|
Revision: 485 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=485&view=rev Author: jblance Date: 2010-01-17 05:47:42 +0000 (Sun, 17 Jan 2010) Log Message: ----------- More comments and disabling of unused code Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/ddbb.py pytrainer/trunk/pytrainer/lib/sqliteUtils.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/record.py Modified: pytrainer/trunk/pytrainer/lib/ddbb.py =================================================================== --- pytrainer/trunk/pytrainer/lib/ddbb.py 2010-01-17 04:50:44 UTC (rev 484) +++ pytrainer/trunk/pytrainer/lib/ddbb.py 2010-01-17 05:47:42 UTC (rev 485) @@ -28,7 +28,7 @@ class DDBB: def __init__(self, configuration): self.ddbb_type = configuration.getValue("pytraining","prf_ddbb") - if self.ddbb_type == "mysql": + if self.ddbb_type == "mysql": #TODO no longer supported? from mysqlUtils import Sql else: from sqliteUtils import Sql @@ -44,9 +44,9 @@ self.ddbbObject = Sql(ddbb_host,ddbb,ddbb_user,ddbb_pass) def connect(self): - #si devolvemos 1 ha ido todo con exito - #con 0 es que no estaba la bbdd creada - #con -1 imposible conectar a la maquina. + #si devolvemos 1 ha ido todo con exito : return 1 if all successful + #con 0 es que no estaba la bbdd creada : 0 is DB not created + #con -1 imposible conectar a la maquina. : -1 is impossible to connect to the host var = self.ddbbObject.connect() if var == 0: self.ddbbObject.createDDBB() @@ -202,12 +202,12 @@ logging.error('Column date_time_utc already exists in DB. Printing traceback and continuing') traceback.print_exc()''' - def shortFromLocal(self, getSport=True): # Check LEFT and RIGHT JOINS for people with multiple sports - if getSport is True: + #def shortFromLocal(self, getSport=True): # Check LEFT and RIGHT JOINS for people with multiple sports + '''if getSport is True: sql = "select sports.name,records.date_time_utc from sports INNER JOIN records ON sports.id_sports = records.sport" else: sql = "select records.date_time_utc from sports INNER JOIN records ON sports.id_sports = records.sport" - return self.ddbbObject.freeExec(sql) + return self.ddbbObject.freeExec(sql)''' def checkDBIntegrity(self): """17.11.2009 - dgranda Modified: pytrainer/trunk/pytrainer/lib/sqliteUtils.py =================================================================== --- pytrainer/trunk/pytrainer/lib/sqliteUtils.py 2010-01-17 04:50:44 UTC (rev 484) +++ pytrainer/trunk/pytrainer/lib/sqliteUtils.py 2010-01-17 05:47:42 UTC (rev 485) @@ -19,7 +19,7 @@ #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. import logging -import sys +import sys, traceback try: from sqlite3 import dbapi2 as sqlite except ImportError: @@ -269,5 +269,5 @@ self.freeExec(sql) except: logging.error('Not able to add/change column '+columnName+' to table '+tableName) - #traceback.print_exc() + traceback.print_exc() Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-01-17 04:50:44 UTC (rev 484) +++ pytrainer/trunk/pytrainer/main.py 2010-01-17 05:47:42 UTC (rev 485) @@ -101,7 +101,7 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.0_svn#484" + self.version ="1.7.0_svn#485" self.DB_version = 1 self.date = Date() # Checking profile @@ -117,17 +117,17 @@ self.windowmain = None logging.debug('checking configuration...') - self.conf = checkConf() + self.conf = checkConf() #TODO set this up so other modules can reference this and not have to duplicate this logging.debug("clearing tmp directory %s" % self.conf.getValue("tmpdir")) self.conf.clearTempDir() self.filename = self.conf.getValue("conffile") logging.debug('retrieving data from '+ self.filename) - self.configuration = XMLParser(self.filename) + self.configuration = XMLParser(self.filename) #TODO set this up so other modules can reference this and not have to duplicate this if self.configuration.getValue("pytraining","prf_us_system") == "True": self.prf_us_system = True else: self.prf_us_system = False - self.ddbb = DDBB(self.configuration) + self.ddbb = DDBB(self.configuration) #TODO set this up so other modules can reference this and not have to duplicate this logging.debug('connecting to DDBB') self.ddbb.connect() @@ -151,6 +151,7 @@ self.date = Date(self.windowmain.calendar) #Preparamos el webservice + #TODO check reason for webservice - remove / change to optional start if not needed gtk.gdk.threads_init() self.webservice = webService(data_path,self.refreshWaypointView,self.newRecord) self.webservice.start() @@ -465,7 +466,7 @@ self.configuration.setValue("pytraining","DB_version", str(self.DB_version)) logging.debug('<<') - #def addDateTimeUTC(self): + #def addDateTimeUTC(self): #TODO remove """12.07.2008 - dgranda Adds date_time (UTC format) for each record (new column date_time_utc in table records). New in version 1.6.0.1 args: none @@ -494,7 +495,7 @@ logging.info('Updated '+str(num)+' entries') logging.debug('<<')''' - #def checkPacesDB(self): + #def checkPacesDB(self): #TODO remove """19.07.2008 - dgranda Updates paces in DB (maxspeed<->maxpace | average<->pace). New in version 1.6.0.2 args: none Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2010-01-17 04:50:44 UTC (rev 484) +++ pytrainer/trunk/pytrainer/record.py 2010-01-17 05:47:42 UTC (rev 485) @@ -38,13 +38,13 @@ logging.debug('setting date...') self.date = Date() logging.debug('Checking current configuration...') - self.conf = checkConf() - self.filename = self.conf.getValue("conffile") - logging.debug('Retrieving data from '+ self.filename) - self.configuration = XMLParser(self.filename) - self.ddbb = DDBB(self.configuration) - logging.debug('connecting to DDBB') - self.ddbb.connect() + self.conf = checkConf() #TODO change to reference main versions of these + self.filename = self.conf.getValue("conffile") # + logging.debug('Retrieving data from '+ self.filename) # + self.configuration = XMLParser(self.filename) # + self.ddbb = DDBB(self.configuration) # + logging.debug('connecting to DDBB') # + self.ddbb.connect() # logging.debug('<<') def newRecord(self, list_sport, date, title=None, distance=None, time=None, upositive=None, unegative=None, bpm=None, calories=None, comment=None): @@ -67,7 +67,7 @@ self.recordwindow.run() logging.debug('<<') - def removeRecord(self,id_record): + def removeRecord(self,id_record): #TODO remember to update once laps are in DB logging.debug('>>') record = self.ddbb.delete("records", "id_record=\"%s\"" %id_record) logging.debug('removed record '+str(id_record)+' from bbdd') @@ -164,7 +164,7 @@ logging.debug('<<') return self.ddbb.lastRecord("records") - def insertNewRecord(self, gpxOrig, entry): + def insertNewRecord(self, gpxOrig, entry): #TODO consolidate with insertRecord """29.03.2008 - dgranda Moves GPX file to store destination and updates database args: path to source GPX file""" @@ -299,7 +299,7 @@ sport_id = self.ddbb.select("sports","id_sports","name=\"%s\"" %(sport))[0][0] except: logging.error('Error retrieving id_sports from '+ str(sport)) - #traceback.print_last() + traceback.print_last() if add is None: logging.debug('Sport '+str(sport)+' will not be added to DB') else: @@ -355,7 +355,7 @@ logging.debug('<<') return day_list - def actualize_fromgpx(self,gpxfile): + def actualize_fromgpx(self,gpxfile): #TODO remove? - should never have multiple tracks per GPX file logging.debug('>>') logging.debug('loading file: '+gpxfile) gpx = Gpx(self.data_path,gpxfile) @@ -404,7 +404,7 @@ self._actualize_fromgpx(gpx) logging.debug('<<') - def _select_trkfromgpx(self,gpxfile,tracks): + def _select_trkfromgpx(self,gpxfile,tracks): #TODO remove? - should never have multiple tracks per GPX file logging.debug('>>') logging.debug('Track dialog '+ self.data_path +'|'+ gpxfile) selectrckdialog = DialogSelectTrack(self.data_path, tracks,self.__actualize_fromgpx, gpxfile) @@ -412,7 +412,7 @@ selectrckdialog.run() logging.debug('<<') - def newGpxRecord(self,gpxfile,list_sport): + def newGpxRecord(self,gpxfile,list_sport): #TODO Not used? logging.debug('>>') logging.debug("opening a new window record "+self.data_path+'|'+gpxfile+'|'+str(list_sport)) self.recordwindow = WindowRecord(self.data_path, list_sport,self, None) @@ -440,7 +440,7 @@ logging.info("Entry %d has been added" % entry_id) logging.debug('<<') - #def importFromGTRNCTR(self,gtrnctrFile): + #def importFromGTRNCTR(self,gtrnctrFile): #TODO remove """22.03.2008 - dgranda Retrieves sport, date and start time from each entry coming from GPS and compares with what is stored locally, just to import new entries @@ -472,7 +472,7 @@ logging.debug('<<') """ - #def shortFromLocal(self): + #def shortFromLocal(self): #TODO remove """25.03.2008 - dgranda Retrieves sport, date and start time from each entry stored locally 12.07.2008 - dgranda - Added id_record for each one @@ -497,7 +497,7 @@ logging.debug('<<') return listTracksGPX''' - #def shortFromLocalDB(self, getSport=True): + #def shortFromLocalDB(self, getSport=True): #TODO remove """12.07.2008 - dgranda Retrieves sport, date and start time from local database returns: list with lists: SPORT|DATE_START_TIME""" @@ -518,19 +518,19 @@ logging.debug('<<') return listTracksGPX''' - #def removeSportFromList(self, list1): + #def removeSportFromList(self, list1): #TODO remove '''resultList = [] for entry in list1: resultList.append(entry[1]) return resultList''' - #def compareLists(self,list1,list2): + #def compareLists(self,list1,list2): #TODO remove '''# Optimizing comparison - 26042008 # http://mail.python.org/pipermail/python-list/2002-May/141458.html tempDict = dict(zip(list1,list1)) return [x for x in list2 if x not in tempDict]''' - #def compareTracks(self,listTracksGPS,listTracksLocal,checkSport=True): + #def compareTracks(self,listTracksGPS,listTracksLocal,checkSport=True): #TODO remove """22.03.2008 - dgranda Compares tracks retrieved from GPS with already locally stored args: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-01-17 04:50:50
|
Revision: 484 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=484&view=rev Author: jblance Date: 2010-01-17 04:50:44 +0000 (Sun, 17 Jan 2010) Log Message: ----------- Added a few extra comments Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/ddbb.py pytrainer/trunk/pytrainer/lib/sqliteUtils.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/lib/ddbb.py =================================================================== --- pytrainer/trunk/pytrainer/lib/ddbb.py 2010-01-17 04:25:47 UTC (rev 483) +++ pytrainer/trunk/pytrainer/lib/ddbb.py 2010-01-17 04:50:44 UTC (rev 484) @@ -58,7 +58,7 @@ def disconnect(self): self.ddbbObject.disconnect() - def build_ddbb(self): + def build_ddbb(self): #TODO Is this needed? self.ddbbObject.createDDBB() self.ddbbObject.connect() self.ddbbObject.createTables() @@ -88,7 +88,6 @@ return ret_val[0][0] #TODO Remove extra check functions below - #TODO Add functions to check that fill in date_time_local and update date etc #def addTitle2ddbb(self): '''#this function add a title column in @@ -134,7 +133,7 @@ newdate = "%s-%d-%s" %(rec[0],newmonth,rec[2]) self.ddbbObject.update("records","date",[newdate], "id_record = %d" %record[0])''' - #def updateDateFormat(self): + #def updateDateFormat(self): #TODO Might still need this function?? '''#this is a function to repair a bug from #pytrainer 0.9.8 and previus listOfRecords = self.ddbbObject.select("records","id_record,date", None) @@ -281,6 +280,7 @@ self.ddbbObject.checkTable(entry,tablesList[entry]) #Run any functions to update or correct data + #These functions _must_ be safe to run at any time (i.e. not be version specfic or only safe to run once) self.populate_date_time_local() logging.debug('<<') @@ -300,6 +300,8 @@ using OS timezone to create local_time also updates date if date != local_time + + TODO - leaves date_time_local blank for records that have been manually created (as date_time_utc will actually be local time) ''' logging.debug('--') listOfRecords = self.ddbbObject.select("records","id_record,date,date_time_utc,date_time_local", "date_time_local is NULL") Modified: pytrainer/trunk/pytrainer/lib/sqliteUtils.py =================================================================== --- pytrainer/trunk/pytrainer/lib/sqliteUtils.py 2010-01-17 04:25:47 UTC (rev 483) +++ pytrainer/trunk/pytrainer/lib/sqliteUtils.py 2010-01-17 04:50:44 UTC (rev 484) @@ -53,7 +53,7 @@ def createDDBB(self): pass - def createTables(self): + def createTables(self): #TODO Needs to be fixed to create tables based on definition, perhaps replaced by createTableDefault? cur = self.db.cursor() #creamos la tabla sports sql = """CREATE TABLE sports ( @@ -125,7 +125,7 @@ cur.execute(sql) logging.debug('<<') - def addWaipoints2ddbb(self): + def addWaipoints2ddbb(self): #TODO Remove? cur = self.db.cursor() sql = """CREATE TABLE waypoints ( id_waypoint integer primary key autoincrement , Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-01-17 04:25:47 UTC (rev 483) +++ pytrainer/trunk/pytrainer/main.py 2010-01-17 04:50:44 UTC (rev 484) @@ -101,7 +101,7 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.0_svn#483" + self.version ="1.7.0_svn#484" self.DB_version = 1 self.date = Date() # Checking profile This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-01-17 04:25:54
|
Revision: 483 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=483&view=rev Author: jblance Date: 2010-01-17 04:25:47 +0000 (Sun, 17 Jan 2010) Log Message: ----------- Added function to populate date_time_local and fix date if needed - does not update date_time_local for manaul entries. Also moved date parsing function to Date.py to remove duplication Modified Paths: -------------- pytrainer/trunk/import/file_garmintcxv1.py pytrainer/trunk/import/file_garmintcxv2.py pytrainer/trunk/import/file_garmintools.py pytrainer/trunk/import/file_gpxplus.py pytrainer/trunk/pytrainer/lib/date.py pytrainer/trunk/pytrainer/lib/ddbb.py pytrainer/trunk/pytrainer/lib/gpx.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/record.py Modified: pytrainer/trunk/import/file_garmintcxv1.py =================================================================== --- pytrainer/trunk/import/file_garmintcxv1.py 2010-01-17 02:53:53 UTC (rev 482) +++ pytrainer/trunk/import/file_garmintcxv1.py 2010-01-17 04:25:47 UTC (rev 483) @@ -20,11 +20,10 @@ import logging import os from lxml import etree -import dateutil.parser -from dateutil.tz import * # for tzutc() from pytrainer.lib.xmlUtils import XMLParser from pytrainer.lib.system import checkConf +from pytrainer.lib.date import Date #from pytrainer.gui.dialogs import fileChooserDialog, guiFlush class garmintcxv1(): @@ -132,20 +131,7 @@ return timeElement.text def getDateTime(self, time_): - # Time can be in multiple formats - # - zulu 2009-12-15T09:00Z - # - local ISO8601 2009-12-15T10:00+01:00 - if time_ is None or time_ == "": - return (None, None) - dateTime = dateutil.parser.parse(time_) - timezone = dateTime.tzname() - if timezone == 'UTC': #got a zulu time - local_dateTime = dateTime.astimezone(tzlocal()) #datetime with localtime offset (from OS) - else: - local_dateTime = dateTime #use datetime as supplied - utc_dateTime = dateTime.astimezone(tzutc()) #datetime with 00:00 offset - #print utc_dateTime, local_dateTime - return (utc_dateTime,local_dateTime) + return Date().getDateTime(time_) def getGPXFile(self, ID): """ Modified: pytrainer/trunk/import/file_garmintcxv2.py =================================================================== --- pytrainer/trunk/import/file_garmintcxv2.py 2010-01-17 02:53:53 UTC (rev 482) +++ pytrainer/trunk/import/file_garmintcxv2.py 2010-01-17 04:25:47 UTC (rev 483) @@ -20,8 +20,7 @@ import logging import os from lxml import etree -import dateutil.parser -from dateutil.tz import * # for tzutc() +from pytrainer.lib.date import Date from pytrainer.lib.xmlUtils import XMLParser from pytrainer.lib.system import checkConf @@ -137,20 +136,7 @@ return timeElement.text def getDateTime(self, time_): - # Time can be in multiple formats - # - zulu 2009-12-15T09:00Z - # - local ISO8601 2009-12-15T10:00+01:00 - if time_ is None or time_ == "": - return (None, None) - dateTime = dateutil.parser.parse(time_) - timezone = dateTime.tzname() - if timezone == 'UTC': #got a zulu time - local_dateTime = dateTime.astimezone(tzlocal()) #datetime with localtime offset (from OS) - else: - local_dateTime = dateTime #use datetime as supplied - utc_dateTime = dateTime.astimezone(tzutc()) #datetime with 00:00 offset - #print utc_dateTime, local_dateTime - return (utc_dateTime,local_dateTime) + return Date().getDateTime(time_) def getGPXFile(self, ID): """ Modified: pytrainer/trunk/import/file_garmintools.py =================================================================== --- pytrainer/trunk/import/file_garmintools.py 2010-01-17 02:53:53 UTC (rev 482) +++ pytrainer/trunk/import/file_garmintools.py 2010-01-17 04:25:47 UTC (rev 483) @@ -21,8 +21,7 @@ import os import StringIO from lxml import etree -import dateutil.parser -from dateutil.tz import * # for tzutc() +from pytrainer.lib.date import Date #from pytrainer.lib.xmlUtils import XMLParser #from pytrainer.gui.dialogs import fileChooserDialog, guiFlush @@ -84,20 +83,7 @@ return False def getDateTime(self, time_): - # Time can be in multiple formats - # - zulu 2009-12-15T09:00Z - # - local ISO8601 2009-12-15T10:00+01:00 - if time_ is None or time_ == "": - return (None, None) - dateTime = dateutil.parser.parse(time_) - timezone = dateTime.tzname() - if timezone == 'UTC': #got a zulu time - local_dateTime = dateTime.astimezone(tzlocal()) #datetime with localtime offset (from OS) - else: - local_dateTime = dateTime #use datetime as supplied - utc_dateTime = dateTime.astimezone(tzutc()) #datetime with 00:00 offset - #print utc_dateTime, local_dateTime - return (utc_dateTime,local_dateTime) + return Date().getDateTime(time_) def inDatabase(self, tree, startTime): #comparing date and start time (sport may have been changed in DB after import) Modified: pytrainer/trunk/import/file_gpxplus.py =================================================================== --- pytrainer/trunk/import/file_gpxplus.py 2010-01-17 02:53:53 UTC (rev 482) +++ pytrainer/trunk/import/file_gpxplus.py 2010-01-17 04:25:47 UTC (rev 483) @@ -21,8 +21,7 @@ import os #import StringIO from lxml import etree -import dateutil.parser -from dateutil.tz import * # for tzutc() +from pytrainer.lib.date import Date #from pytrainer.lib.xmlUtils import XMLParser #from pytrainer.gui.dialogs import fileChooserDialog, guiFlush @@ -81,20 +80,7 @@ return False def getDateTime(self, time_): - # Time can be in multiple formats - # - zulu 2009-12-15T09:00Z - # - local ISO8601 2009-12-15T10:00+01:00 - if time_ is None or time_ == "": - return (None, None) - dateTime = dateutil.parser.parse(time_) - timezone = dateTime.tzname() - if timezone == 'UTC': #got a zulu time - local_dateTime = dateTime.astimezone(tzlocal()) #datetime with localtime offset (from OS) - else: - local_dateTime = dateTime #use datetime as supplied - utc_dateTime = dateTime.astimezone(tzutc()) #datetime with 00:00 offset - #print utc_dateTime, local_dateTime - return (utc_dateTime,local_dateTime) + return Date().getDateTime(time_) def inDatabase(self, tree, startTime): #comparing date and start time (sport may have been changed in DB after import) Modified: pytrainer/trunk/pytrainer/lib/date.py =================================================================== --- pytrainer/trunk/pytrainer/lib/date.py 2010-01-17 02:53:53 UTC (rev 482) +++ pytrainer/trunk/pytrainer/lib/date.py 2010-01-17 04:25:47 UTC (rev 483) @@ -21,6 +21,8 @@ import time import datetime import calendar +import dateutil.parser +from dateutil.tz import * # for tzutc() class Date: def __init__(self, calendar=None): @@ -124,3 +126,17 @@ day = tm[2] return "%0.4d-%0.2d-%0.2d" %(year,month,day) + def getDateTime(self, time_): + # Time can be in multiple formats + # - zulu 2009-12-15T09:00Z + # - local ISO8601 2009-12-15T10:00+01:00 + dateTime = dateutil.parser.parse(time_) + timezone = dateTime.tzname() + if timezone == 'UTC': #got a zulu time + local_dateTime = dateTime.astimezone(tzlocal()) #datetime with localtime offset (from OS) + else: + local_dateTime = dateTime #use datetime as supplied + utc_dateTime = dateTime.astimezone(tzutc()) #datetime with 00:00 offset + #print utc_dateTime, local_dateTime + return (utc_dateTime,local_dateTime) + Modified: pytrainer/trunk/pytrainer/lib/ddbb.py =================================================================== --- pytrainer/trunk/pytrainer/lib/ddbb.py 2010-01-17 02:53:53 UTC (rev 482) +++ pytrainer/trunk/pytrainer/lib/ddbb.py 2010-01-17 04:25:47 UTC (rev 483) @@ -21,8 +21,9 @@ import logging import traceback -import commands +import commands, os from system import checkConf +from pytrainer.lib.date import Date class DDBB: def __init__(self, configuration): @@ -271,12 +272,16 @@ traceback.print_exc() exit(-1) + #Check Tables for entry in tablesList: if entry not in tablesDB: logging.warn('Table '+str(entry)+' does not exist in DB') self.ddbbObject.createTableDefault(entry,tablesList[entry]) else: self.ddbbObject.checkTable(entry,tablesList[entry]) + + #Run any functions to update or correct data + self.populate_date_time_local() logging.debug('<<') def createDatabaseBackup(self): @@ -289,3 +294,35 @@ logging.info('Database backup successfully created') logging.debug('<<') + def populate_date_time_local(self): + ''' Populate date_time_local and date from date_time_utc + only access records that date_time_local is NULL + using OS timezone to create local_time + + also updates date if date != local_time + ''' + logging.debug('--') + listOfRecords = self.ddbbObject.select("records","id_record,date,date_time_utc,date_time_local", "date_time_local is NULL") + logging.debug("Found %d records in DB without date_time_local field populated" % (len(listOfRecords) ) ) + for record in listOfRecords: + try: + gpxfile = self.conf.getValue("gpxdir")+"/%s.gpx"%(record[0]) + dateFromUTC = Date().getDateTime(record[2]) + if os.path.isfile(gpxfile) : #GPX file exists for this record - probably not a manual record + date_time_local = str(dateFromUTC[1]) + dateFromLocal = dateFromUTC[1].strftime("%Y-%m-%d") + if record[1] != dateFromLocal: + #date field incorrect - update it + logging.debug("Updating record id: %s with date: %s and date_time_local: %s" % (record[0], dateFromLocal, date_time_local) ) + self.ddbbObject.update("records","date, date_time_local",[dateFromLocal, date_time_local], "id_record = %d" %record[0]) + else: + #date field OK, just update date_time_local + logging.debug("Updating record id: %s with date_time_local: %s" % (record[0], date_time_local) ) + self.ddbbObject.update("records","date_time_local",[date_time_local], "id_record = %d" %record[0]) + else: #Manual entry? + #For manual entries, the UTC time is the local time + #TODO figure out a way to correct this... + pass + except: + print "Error updating record: " + str(record) + logging.debug("Error updating record: " + str(record)) Modified: pytrainer/trunk/pytrainer/lib/gpx.py =================================================================== --- pytrainer/trunk/pytrainer/lib/gpx.py 2010-01-17 02:53:53 UTC (rev 482) +++ pytrainer/trunk/pytrainer/lib/gpx.py 2010-01-17 04:25:47 UTC (rev 483) @@ -28,8 +28,7 @@ import logging from xmlUtils import XMLParser from lxml import etree -import dateutil.parser -from dateutil.tz import * # for tzutc() +from pytrainer.lib.date import Date # use of namespaces is mandatory if defined mainNS = string.Template(".//{http://www.topografix.com/GPX/1/1}$tag") @@ -65,6 +64,7 @@ self.maxvel = 0 self.maxhr = 0 self.date = "" + #self.Date = Date() self.calories= 0 if filename != None: if not os.path.isfile(self.filename): @@ -103,18 +103,7 @@ return tracks def getDateTime(self, time_): - # Time can be in multiple formats - # - zulu 2009-12-15T09:00Z - # - local ISO8601 2009-12-15T10:00+01:00 - dateTime = dateutil.parser.parse(time_) - timezone = dateTime.tzname() - if timezone == 'UTC': #got a zulu time - local_dateTime = dateTime.astimezone(tzlocal()) #datetime with localtime offset (from OS) - else: - local_dateTime = dateTime #use datetime as supplied - utc_dateTime = dateTime.astimezone(tzutc()) #datetime with 00:00 offset - #print utc_dateTime, local_dateTime - return (utc_dateTime,local_dateTime) + return Date().getDateTime(time_) def getUnevenness(self): return self.upositive,self.unegative Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-01-17 02:53:53 UTC (rev 482) +++ pytrainer/trunk/pytrainer/main.py 2010-01-17 04:25:47 UTC (rev 483) @@ -101,7 +101,7 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.0_svn#481" + self.version ="1.7.0_svn#483" self.DB_version = 1 self.date = Date() # Checking profile Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2010-01-17 02:53:53 UTC (rev 482) +++ pytrainer/trunk/pytrainer/record.py 2010-01-17 04:25:47 UTC (rev 483) @@ -257,7 +257,7 @@ "date=\"%s\" and records.sport=sports.id_sports" %date) def getrecordPeriod(self,date_ini, date_end, sport=None): - #This is essentially the same as getrecordPeriodSport (except date ranges) - need to look at merging the two + #TODO This is essentially the same as getrecordPeriodSport (except date ranges) - need to look at merging the two tables = "records,sports" if not sport: condition = "date>=\"%s\" and date<=\"%s\" and records.sport=sports.id_sports" %(date_ini,date_end) @@ -472,13 +472,13 @@ logging.debug('<<') """ - def shortFromLocal(self): + #def shortFromLocal(self): """25.03.2008 - dgranda Retrieves sport, date and start time from each entry stored locally 12.07.2008 - dgranda - Added id_record for each one returns: list with lists: SPORT|DATE_START_TIME|ID_RECORD 31.08.2008 - dgranda - Only available due to migration purposes from Main class""" - logging.debug('>>') + '''logging.debug('>>') listTracksGPX = [] sport = "Run" #hardcoded - 25.03.2008 (no info stored in gpx files yet) # looking in configuration for storing directory @@ -495,13 +495,13 @@ else: logging.error('Skipping '+gpxFile+' because of wrong format') logging.debug('<<') - return listTracksGPX + return listTracksGPX''' - def shortFromLocalDB(self, getSport=True): + #def shortFromLocalDB(self, getSport=True): """12.07.2008 - dgranda Retrieves sport, date and start time from local database returns: list with lists: SPORT|DATE_START_TIME""" - logging.debug('>>') + '''logging.debug('>>') # Retrieving sport (optional) and date_time (UTC) for each entry in DB # ToDo: replace id_sports with name listTracksGPX = self.ddbb.shortFromLocal(getSport) @@ -516,21 +516,21 @@ listTracksGPX = tempList logging.debug('Retrieved info: '+str(listTracksGPX)) logging.debug('<<') - return listTracksGPX + return listTracksGPX''' - def removeSportFromList(self, list1): - resultList = [] + #def removeSportFromList(self, list1): + '''resultList = [] for entry in list1: resultList.append(entry[1]) - return resultList + return resultList''' - def compareLists(self,list1,list2): - # Optimizing comparison - 26042008 + #def compareLists(self,list1,list2): + '''# Optimizing comparison - 26042008 # http://mail.python.org/pipermail/python-list/2002-May/141458.html tempDict = dict(zip(list1,list1)) - return [x for x in list2 if x not in tempDict] + return [x for x in list2 if x not in tempDict]''' - def compareTracks(self,listTracksGPS,listTracksLocal,checkSport=True): + #def compareTracks(self,listTracksGPS,listTracksLocal,checkSport=True): """22.03.2008 - dgranda Compares tracks retrieved from GPS with already locally stored args: @@ -538,7 +538,7 @@ listTracksLocal: local track list with lists -> (SPORT)|DATE_START_TIME checkSport (02.09.2008): indicates if sport data is included when comparing returns: tracks which are not present locally (list with lists)""" - logging.debug('>>') + '''logging.debug('>>') if checkSport is True: logging.info('Comparing sport info') listGPS = listTracksGPS[:] @@ -562,5 +562,5 @@ logging.info('Tracks to be imported: '+str(len(resultList))) logging.debug('Tracks summary: '+str(resultList)) logging.debug('<<') - return resultList + return resultList ''' This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-01-17 02:54:03
|
Revision: 482 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=482&view=rev Author: jblance Date: 2010-01-17 02:53:53 +0000 (Sun, 17 Jan 2010) Log Message: ----------- Sanitycheck writes DB version after run, disable legacy migration code Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/ddbb.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/profile.py Modified: pytrainer/trunk/pytrainer/lib/ddbb.py =================================================================== --- pytrainer/trunk/pytrainer/lib/ddbb.py 2010-01-17 00:50:25 UTC (rev 481) +++ pytrainer/trunk/pytrainer/lib/ddbb.py 2010-01-17 02:53:53 UTC (rev 482) @@ -75,7 +75,7 @@ def update(self,table,cells,value,condition): self.ddbbObject.update(table,cells,value,condition) - def lastRecord(self,table): + def lastRecord(self,table): #TODO Make generic i.e. something like id = "id_" + table[:-1] if table=="records": id = "id_record" if table=="sports": @@ -86,18 +86,21 @@ ret_val = self.ddbbObject.freeExec(sql) return ret_val[0][0] - def addTitle2ddbb(self): - #this function add a title column in + #TODO Remove extra check functions below + #TODO Add functions to check that fill in date_time_local and update date etc + + #def addTitle2ddbb(self): + '''#this function add a title column in #the record ddbb. New in 0.9.9 version sql = "alter table records add title varchar(200)" try: self.ddbbObject.freeExec(sql) except: logging.error('Column title already exists in DB. Printing traceback and continuing') - traceback.print_exc() + traceback.print_exc()''' - def addUnevenness2ddbb(self): - #this function add accumulated unevennes columns in + #def addUnevenness2ddbb(self): + '''#this function add accumulated unevennes columns in #the record ddbb. New in 1.3.2 version sql = "alter table records add upositive float" try: @@ -110,28 +113,28 @@ self.ddbbObject.freeExec(sql) except: logging.error('Column unegative already exists in DB. Printing traceback and continuing') - traceback.print_exc() + traceback.print_exc()''' - def addWaypoints2ddbb(self): - #adds waipoints table to database + #def addWaypoints2ddbb(self): + '''#adds waipoints table to database try: self.ddbbObject.addWaipoints2ddbb() except: logging.error('Waypoints table already exists in DB. Printing traceback and continuing') - traceback.print_exc() + traceback.print_exc()''' - def updatemonth(self): - #this is a function to repair a bug from + #def updatemonth(self): + '''#this is a function to repair a bug from #pytrainer 0.9.5 and previus listOfRecords = self.ddbbObject.select("records","id_record,date", None) for record in listOfRecords: rec = record[1].split("-") newmonth = int(rec[1])+1 newdate = "%s-%d-%s" %(rec[0],newmonth,rec[2]) - self.ddbbObject.update("records","date",[newdate], "id_record = %d" %record[0]) + self.ddbbObject.update("records","date",[newdate], "id_record = %d" %record[0])''' - def updateDateFormat(self): - #this is a function to repair a bug from + #def updateDateFormat(self): + '''#this is a function to repair a bug from #pytrainer 0.9.8 and previus listOfRecords = self.ddbbObject.select("records","id_record,date", None) for record in listOfRecords: @@ -140,10 +143,10 @@ newdate = "%0.4d-%0.2d-%0.2d" %(int(rec[0]),int(rec[1]),int(rec[2])) self.ddbbObject.update("records","date",[newdate], "id_record = %d" %record[0]) except: - print record + print record''' - def addweightandmet2ddbb(self): - #this function add weight extra and met fields to sports table + #def addweightandmet2ddbb(self): + '''#this function add weight extra and met fields to sports table sql = "alter table sports add weight float" try: self.ddbbObject.freeExec(sql) @@ -155,18 +158,18 @@ self.ddbbObject.freeExec(sql) except: logging.error('Column met already exists in DB. Printing traceback and continuing') - traceback.print_exc() + traceback.print_exc()''' - def checkmettable(self): - sql = "alter table sports add met float" + #def checkmettable(self): + '''sql = "alter table sports add met float" try: self.ddbbObject.freeExec(sql) except: logging.error('Column met already exists in DB. Printing traceback and continuing') - traceback.print_exc() + traceback.print_exc()''' - def addpaceandmax2ddbb(self): - sql = "alter table records add maxspeed float" + #def addpaceandmax2ddbb(self): + '''sql = "alter table records add maxspeed float" try: self.ddbbObject.freeExec(sql) except: @@ -189,15 +192,15 @@ self.ddbbObject.freeExec(sql) except: logging.error('Column maxbeats already exists in DB. Printing traceback and continuing') - traceback.print_exc() + traceback.print_exc()''' - def addDateTimeUTC2ddbb(self): - sql = "alter table records add date_time_utc varchar2(20)" + #def addDateTimeUTC2ddbb(self): + '''sql = "alter table records add date_time_utc varchar2(20)" try: self.ddbbObject.freeExec(sql) except: logging.error('Column date_time_utc already exists in DB. Printing traceback and continuing') - traceback.print_exc() + traceback.print_exc()''' def shortFromLocal(self, getSport=True): # Check LEFT and RIGHT JOINS for people with multiple sports if getSport is True: Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-01-17 00:50:25 UTC (rev 481) +++ pytrainer/trunk/pytrainer/main.py 2010-01-17 02:53:53 UTC (rev 482) @@ -130,18 +130,19 @@ self.ddbb = DDBB(self.configuration) logging.debug('connecting to DDBB') self.ddbb.connect() - - # DB check can be triggered either via new version (mandatory) or as runtime parameter (--check) + + #Get user's DB version currentDB_version = self.configuration.getValue("pytraining","DB_version") logging.debug("Current DB version: "+str(currentDB_version)) - - if currentDB_version is None or self.check: - self.sanityCheck() # Deprecates migrationCheck. Review first installation and version control + # DB check can be triggered either via new version (mandatory) or as runtime parameter (--check) + if self.check: # User requested check + self.sanityCheck() + elif currentDB_version is None: # No stored DB version - check DB etc + self.sanityCheck() + elif self.DB_version > int(currentDB_version): # DB version expected is newer than user's version - check DB etc + self.sanityCheck() else: - if self.DB_version > int(currentDB_version): - self.sanityCheck() # Deprecates migrationCheck. Review first installation and version control - else: - logging.info('No sanity check requested') + logging.info('No sanity check requested') self.record = Record(data_path,self) @@ -452,7 +453,7 @@ def sanityCheck(self): """23.11.2009 - dgranda - Checks database and configuration file if flag "--check" is enabled at start + Checks database and configuration file args: none returns: none""" logging.debug('>>') @@ -460,14 +461,16 @@ self.ddbb.checkDBIntegrity() logging.info('Checking configuration file integrity') self.profile.checkProfile() + logging.info('Setting DB version to: ' + str(self.DB_version)) + self.configuration.setValue("pytraining","DB_version", str(self.DB_version)) logging.debug('<<') - def addDateTimeUTC(self): + #def addDateTimeUTC(self): """12.07.2008 - dgranda Adds date_time (UTC format) for each record (new column date_time_utc in table records). New in version 1.6.0.1 args: none returns: none""" - logging.debug('>>') + '''logging.debug('>>') # Retrieves info from all GPX files stored locally listTracksGPX = self.record.shortFromLocal() logging.debug('Retrieved info from local files: '+ str(listTracksGPX)) @@ -489,14 +492,14 @@ logging.error('Error when updating data for track '+ track[2]) traceback.print_exc() logging.info('Updated '+str(num)+' entries') - logging.debug('<<') + logging.debug('<<')''' - def checkPacesDB(self): + #def checkPacesDB(self): """19.07.2008 - dgranda Updates paces in DB (maxspeed<->maxpace | average<->pace). New in version 1.6.0.2 args: none returns: none""" - logging.debug('>>') + '''logging.debug('>>') # Retrieves info from DB: id_record,maxspeed,maxpace,average,pace listPaces = self.ddbb.select("records", "id_record,maxspeed,maxpace,average,pace") logging.debug('Retrieved info from db: '+ str(listPaces)) @@ -514,4 +517,4 @@ else: logging.error('No pace info available for entry '+str(entry[0])+' in DB. Please check') logging.info('Updated '+str(num)+' entries') - logging.debug('<<') + logging.debug('<<')''' Modified: pytrainer/trunk/pytrainer/profile.py =================================================================== --- pytrainer/trunk/pytrainer/profile.py 2010-01-17 00:50:25 UTC (rev 481) +++ pytrainer/trunk/pytrainer/profile.py 2010-01-17 02:53:53 UTC (rev 482) @@ -108,7 +108,7 @@ ("prf_ddbbuser",""), ("prf_ddbbpass",""), ("prf_us_system","False"), - ("DB_version","1")] + ("DB_version","0")] defaultListKeys = [] for entry in defaultList: defaultListKeys.append(unicode(entry[0])) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2010-01-17 00:50:39
|
Revision: 479 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=479&view=rev Author: dgranda Date: 2010-01-17 00:16:08 +0000 (Sun, 17 Jan 2010) Log Message: ----------- getValue returns None instead of empty string if an exception is raised Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/xmlUtils.py Modified: pytrainer/trunk/pytrainer/lib/xmlUtils.py =================================================================== --- pytrainer/trunk/pytrainer/lib/xmlUtils.py 2010-01-17 00:13:25 UTC (rev 478) +++ pytrainer/trunk/pytrainer/lib/xmlUtils.py 2010-01-17 00:16:08 UTC (rev 479) @@ -58,7 +58,7 @@ return list_options def getOption(self,option): - print "this function is obsolete, use getValue instead" + logging.info("this function is obsolete, use getValue instead") return self.getValue("pytraining",option) def setVersion(self,version): @@ -79,7 +79,7 @@ root = self.xmldoc.getElementsByTagName(tagname)[0] value = root.attributes[variable].value except: - value = "" + value = None return value def getAllValues(self,tagname): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2010-01-17 00:50:33
|
Revision: 478 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=478&view=rev Author: dgranda Date: 2010-01-17 00:13:25 +0000 (Sun, 17 Jan 2010) Log Message: ----------- Added DB_version entry to support tracking of DB changes Modified Paths: -------------- pytrainer/trunk/pytrainer/profile.py Modified: pytrainer/trunk/pytrainer/profile.py =================================================================== --- pytrainer/trunk/pytrainer/profile.py 2010-01-16 22:57:55 UTC (rev 477) +++ pytrainer/trunk/pytrainer/profile.py 2010-01-17 00:13:25 UTC (rev 478) @@ -107,7 +107,8 @@ ("prf_ddbbname",""), ("prf_ddbbuser",""), ("prf_ddbbpass",""), - ("prf_us_system","False")] + ("prf_us_system","False"), + ("DB_version","1")] defaultListKeys = [] for entry in defaultList: defaultListKeys.append(unicode(entry[0])) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-01-17 00:50:32
|
Revision: 481 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=481&view=rev Author: jblance Date: 2010-01-17 00:50:25 +0000 (Sun, 17 Jan 2010) Log Message: ----------- Allow GUI to update statusbar while importing activities Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowimportdata.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/gui/windowimportdata.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowimportdata.py 2010-01-17 00:19:42 UTC (rev 480) +++ pytrainer/trunk/pytrainer/gui/windowimportdata.py 2010-01-17 00:50:25 UTC (rev 481) @@ -290,6 +290,7 @@ else: logging.error('File %s not valid' % gpxFile) + def updateActivity(self, activityID, status = None, notes = None): path = 0 for item in self.store: @@ -396,15 +397,15 @@ msgImporting = _("Importing %d activities" % selectedCount) msgImported = _("Imported %d activities" % selectedCount) self.updateStatusbar(self.statusbarImportFile, msgImporting) + while gtk.events_pending(): # This allows the GUI to update + gtk.main_iteration() # before completion of this entire action self.importSelectedActivities(selectedActivities) self.updateStatusbar(self.statusbarImportFile, msgImported) - #Display informational dialog box md = gtk.MessageDialog(self.win_importdata, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO, gtk.BUTTONS_CLOSE, msgImported) md.set_title(_("Import Success")) md.run() md.destroy() - self.buttonFileImport.set_sensitive(0) #Disable import button def on_buttonFileClose_clicked(self, widget): Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-01-17 00:19:42 UTC (rev 480) +++ pytrainer/trunk/pytrainer/main.py 2010-01-17 00:50:25 UTC (rev 481) @@ -101,7 +101,7 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.0_svn#480" + self.version ="1.7.0_svn#481" self.DB_version = 1 self.date = Date() # Checking profile This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2010-01-17 00:50:21
|
Revision: 480 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=480&view=rev Author: dgranda Date: 2010-01-17 00:19:42 +0000 (Sun, 17 Jan 2010) Log Message: ----------- DB check relies in own DB version. Removed deprecated stuff Modified Paths: -------------- pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-01-17 00:16:08 UTC (rev 479) +++ pytrainer/trunk/pytrainer/main.py 2010-01-17 00:19:42 UTC (rev 480) @@ -101,7 +101,8 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.0_svn#476" + self.version ="1.7.0_svn#480" + self.DB_version = 1 self.date = Date() # Checking profile self.profile = Profile(self.data_path,self) @@ -131,10 +132,16 @@ self.ddbb.connect() # DB check can be triggered either via new version (mandatory) or as runtime parameter (--check) - if self.isNewVersion() or self.check: + currentDB_version = self.configuration.getValue("pytraining","DB_version") + logging.debug("Current DB version: "+str(currentDB_version)) + + if currentDB_version is None or self.check: self.sanityCheck() # Deprecates migrationCheck. Review first installation and version control else: - logging.info('No sanity check requested') + if self.DB_version > int(currentDB_version): + self.sanityCheck() # Deprecates migrationCheck. Review first installation and version control + else: + logging.info('No sanity check requested') self.record = Record(data_path,self) @@ -442,65 +449,7 @@ logging.debug('>>') self.profile.editProfile() logging.debug('<<') - - def migrationCheck(self): - """22.06.2008 - dgranda (reviewed 31.07.2008) - Checks if it is necessary to run migration scripts for new features - args: none - returns: none""" - logging.debug('>>') - self.filename = self.conf.getValue("conffile") - logging.debug('Retrieving data from '+ self.filename) - version_tmp = self.configuration.getOption("version") - logging.info('Old version: '+version_tmp+' | New version: '+self.version) - if version_tmp == "0.0": - logging.info('Nothing to do, first installation') - else: - if version_tmp=="1.0": - logging.debug('updating month data') - self.ddbb.updatemonth() - if version_tmp<="0.9.8": - logging.debug('updating date format') - self.ddbb.updateDateFormat() - if version_tmp<="0.9.8.2": - logging.debug('updating DB title') - self.ddbb.addTitle2ddbb() - if version_tmp<="1.3.1": - self.ddbb.addUnevenness2ddbb() - if version_tmp<="1.4.2": - self.ddbb.addWaypoints2ddbb() - if version_tmp<="1.5.0.1": - self.ddbb.addweightandmet2ddbb() - if version_tmp<="1.5.0.2": - logging.info('Adding maxspeed, maxpace, pace and maxbeats columns') - self.ddbb.addpaceandmax2ddbb() - if version_tmp < "1.6.0.1": - logging.info('Adding date_time_utc column and retrieving data from local GPX files') - self.addDateTimeUTC() - if version_tmp < "1.6.0.3": - logging.info('Checking pace and max pace stored in DB') - self.checkPacesDB() - logging.info('Checking configuration file integrity') - self.profile.checkProfile() - if version_tmp < self.version: - self.configuration.setVersion(self.version) - logging.debug('<<') - def isNewVersion(self): - """16.01.2010 - dgranda - Checks if executed version is new - args: none - returns: boolean. True if version is newer, False otherwise""" - logging.debug('>>') - version_tmp = self.configuration.getValue("pytraining","version") - logging.info('Old version: '+version_tmp+' | New version: '+self.version) - isNew = False - if version_tmp < self.version: - isNew = True - self.configuration.setVersion(self.version) - logging.debug('<<') - return isNew - def sanityCheck(self): """23.11.2009 - dgranda Checks database and configuration file if flag "--check" is enabled at start This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-01-16 22:58:01
|
Revision: 477 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=477&view=rev Author: jblance Date: 2010-01-16 22:57:55 +0000 (Sat, 16 Jan 2010) Log Message: ----------- Make gmaps3 default, change option to allow v2 api to be used, minor tidy up of some googlemaps lap display Modified Paths: -------------- pytrainer/trunk/import/translate_garmintcxv2.xsl pytrainer/trunk/pytrainer/extensions/googlemaps.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/import/translate_garmintcxv2.xsl =================================================================== --- pytrainer/trunk/import/translate_garmintcxv2.xsl 2010-01-16 22:14:16 UTC (rev 476) +++ pytrainer/trunk/import/translate_garmintcxv2.xsl 2010-01-16 22:57:55 UTC (rev 477) @@ -67,8 +67,8 @@ </xsl:variable> <gpxdata:lap><xsl:value-of select="$newline"/> <gpxdata:index><xsl:value-of select="$vIndex"/></gpxdata:index><xsl:value-of select="$newline"/> - <xsl:variable name="stlat"><xsl:value-of select="t:Track/t:Trackpoint[1]/t:Position/t:LatitudeDegrees"/></xsl:variable> - <xsl:variable name="stlon"><xsl:value-of select="t:Track/t:Trackpoint[1]/t:Position/t:LongitudeDegrees"/></xsl:variable> + <xsl:variable name="stlat"><xsl:value-of select="t:Track/t:Trackpoint/t:Position[1]/t:LatitudeDegrees"/></xsl:variable> + <xsl:variable name="stlon"><xsl:value-of select="t:Track/t:Trackpoint/t:Position[1]/t:LongitudeDegrees"/></xsl:variable> <gpxdata:startPoint lat="{$stlat}" lon="{$stlon}"/><xsl:value-of select="$newline"/> <xsl:variable name="cnt"><xsl:value-of select="count(t:Track/t:Trackpoint/t:Position)-1"/></xsl:variable> <xsl:variable name="endlat"><xsl:value-of select="t:Track/t:Trackpoint[number($cnt)]/t:Position/t:LatitudeDegrees"/></xsl:variable> Modified: pytrainer/trunk/pytrainer/extensions/googlemaps.py =================================================================== --- pytrainer/trunk/pytrainer/extensions/googlemaps.py 2010-01-16 22:14:16 UTC (rev 476) +++ pytrainer/trunk/pytrainer/extensions/googlemaps.py 2010-01-16 22:57:55 UTC (rev 477) @@ -199,10 +199,23 @@ elapsedTimeHours = int(elapsedTime/3600) elapsedTimeMins = int((elapsedTime - (elapsedTimeHours * 3600)) / 60) elapsedTimeSecs = elapsedTime - (elapsedTimeHours * 3600) - (elapsedTimeMins * 60) - strElapsedTime = "%0.0dh:%0.2dm:%0.2fs" % (elapsedTimeHours, elapsedTimeMins, elapsedTimeSecs) - content += "var lap%dmarker = new google.maps.Marker({position: new google.maps.LatLng(%f, %f), icon: lapimage, map: map, title:\"Lap%d\"}); \n " % (lapNumber, float(lap[1]), float(lap[2]), lapNumber) - content += "var lap%d = new google.maps.InfoWindow({content: \"<div class='info_content'>End of lap:%s<br>Elapsed time:%s<br>Distance:%0.2f km<br>Calories:%s</div>\" });\n" % (lapNumber, lapNumber, strElapsedTime, float(lap[4])/1000, lap[3]) - content += "google.maps.event.addListener(lap%dmarker, 'click', function() { lap%d.open(map,lap%dmarker); });\n" % (lapNumber,lapNumber,lapNumber) + if elapsedTimeHours > 0: + strElapsedTime = "%0.0dh:%0.2dm:%0.2fs" % (elapsedTimeHours, elapsedTimeMins, elapsedTimeSecs) + elif elapsedTimeMins > 0: + strElapsedTime = "%0.0dm:%0.2fs" % (elapsedTimeMins, elapsedTimeSecs) + else: + strElapsedTime = "%0.0fs" % (elapsedTimeSecs) + #process lat and lon for this lap + try: + lapLat = float(lap[1]) + lapLon = float(lap[2]) + content += "var lap%dmarker = new google.maps.Marker({position: new google.maps.LatLng(%f, %f), icon: lapimage, map: map, title:\"Lap%d\"}); \n " % (lapNumber, lapLat, lapLon, lapNumber) + content += "var lap%d = new google.maps.InfoWindow({content: \"<div class='info_content'>End of lap:%s<br>Elapsed time:%s<br>Distance:%0.2f km<br>Calories:%s</div>\" });\n" % (lapNumber, lapNumber, strElapsedTime, float(lap[4])/1000, lap[3]) + content += "google.maps.event.addListener(lap%dmarker, 'click', function() { lap%d.open(map,lap%dmarker); });\n" % (lapNumber,lapNumber,lapNumber) + except: + #Error processing lap lat or lon + #dont show this lap + print "Error processing lap "+ str(lapNumber) + " (lat,lon) ( " + str(lap[1]) + "," +str (lap[2]) + ")" content += ''' Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-01-16 22:14:16 UTC (rev 476) +++ pytrainer/trunk/pytrainer/main.py 2010-01-16 22:57:55 UTC (rev 477) @@ -75,13 +75,13 @@ For more help on valid options try: %prog -h """ parser = OptionParser(usage=usage) -parser.set_defaults(log_level=logging.ERROR, validate=False, gm3=False, testimport=False) +parser.set_defaults(log_level=logging.ERROR, validate=False, gm3=True, testimport=False) parser.add_option("-d", "--debug", action="store_const", const=logging.DEBUG, dest="log_level", help="enable logging at debug level") parser.add_option("-i", "--info", action="store_const", const=logging.INFO, dest="log_level", help="enable logging at info level") parser.add_option("-w", "--warn", action="store_const", const=logging.WARNING, dest="log_level", help="enable logging at warning level") parser.add_option("--valid", action="store_true", dest="validate", help="enable validation of files imported by plugins (details at info or debug logging level) - note plugin must support validation") parser.add_option("--check", action="store_true", dest="check", help="triggers database (only sqlite based) and configuration file sanity checks, adding fields if necessary. Backup of database is done before any change. Details at info or debug logging level") -parser.add_option("--gmaps3", action="store_true", dest="gm3", help="EXPERIMENTAL: use Google Maps API version3 (currently slower than version 2, but includes some new functionality)") +parser.add_option("--gmaps2", action="store_false", dest="gm3", help="Use old Google Maps API version (v2)") parser.add_option("--testimport", action="store_true", dest="testimport", help="EXPERIMENTAL: show new import functionality - for testing only USE AT YOUR OWN RISK") (options, args) = parser.parse_args() log_level = options.log_level This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-01-16 22:14:45
|
Revision: 476 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=476&view=rev Author: jblance Date: 2010-01-16 22:14:16 +0000 (Sat, 16 Jan 2010) Log Message: ----------- Minor tweaks to unified import Modified Paths: -------------- pytrainer/trunk/glade/importdata.glade pytrainer/trunk/import/tool_gant.py pytrainer/trunk/pytrainer/gui/windowimportdata.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/glade/importdata.glade =================================================================== --- pytrainer/trunk/glade/importdata.glade 2010-01-16 16:26:48 UTC (rev 475) +++ pytrainer/trunk/glade/importdata.glade 2010-01-16 22:14:16 UTC (rev 476) @@ -22,10 +22,47 @@ <property name="visible">True</property> <property name="orientation">vertical</property> <child> - <widget class="GtkFrame" id="frameImportFromDevice"> + <widget class="GtkFrame" id="frameDeviceSelect"> <property name="visible">True</property> <property name="label_xalign">0</property> + <property name="shadow_type">none</property> <child> + <widget class="GtkAlignment" id="alignment5"> + <property name="visible">True</property> + <property name="left_padding">12</property> + <child> + <widget class="GtkComboBox" id="comboboxDevice"> + <property name="visible">True</property> + <property name="active">0</property> + <property name="items" translatable="yes">Test 1 +Test 2</property> + <signal name="changed" handler="on_comboboxDevice_changed"/> + </widget> + </child> + </widget> + </child> + <child> + <widget class="GtkLabel" id="labelSelectDevice"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>Select your GPS device</b></property> + <property name="use_markup">True</property> + <property name="single_line_mode">True</property> + </widget> + <packing> + <property name="type">label_item</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">3</property> + </packing> + </child> + <child> + <widget class="GtkFrame" id="frameImportFromDevice"> + <property name="label_xalign">0</property> + <child> <widget class="GtkAlignment" id="alignment1"> <property name="visible">True</property> <property name="left_padding">12</property> @@ -53,7 +90,8 @@ </child> </widget> <packing> - <property name="position">1</property> + <property name="pack_type">end</property> + <property name="position">2</property> </packing> </child> <child> @@ -71,7 +109,7 @@ <packing> <property name="expand">False</property> <property name="fill">False</property> - <property name="padding">10</property> + <property name="padding">5</property> <property name="pack_type">end</property> <property name="position">1</property> </packing> @@ -88,6 +126,7 @@ <packing> <property name="expand">False</property> <property name="fill">False</property> + <property name="padding">5</property> <property name="pack_type">end</property> <property name="position">0</property> </packing> @@ -97,7 +136,7 @@ <property name="expand">False</property> <property name="fill">False</property> <property name="pack_type">end</property> - <property name="position">2</property> + <property name="position">1</property> </packing> </child> <child> @@ -247,7 +286,7 @@ <packing> <property name="expand">False</property> <property name="fill">False</property> - <property name="padding">10</property> + <property name="padding">5</property> <property name="pack_type">end</property> <property name="position">1</property> </packing> @@ -264,6 +303,7 @@ <packing> <property name="expand">False</property> <property name="fill">False</property> + <property name="padding">5</property> <property name="pack_type">end</property> <property name="position">0</property> </packing> @@ -393,6 +433,7 @@ <packing> <property name="expand">False</property> <property name="fill">False</property> + <property name="padding">5</property> <property name="pack_type">end</property> <property name="position">2</property> </packing> @@ -408,7 +449,7 @@ <packing> <property name="expand">False</property> <property name="fill">False</property> - <property name="padding">10</property> + <property name="padding">5</property> <property name="pack_type">end</property> <property name="position">1</property> </packing> @@ -425,6 +466,7 @@ <packing> <property name="expand">False</property> <property name="fill">False</property> + <property name="padding">5</property> <property name="pack_type">end</property> <property name="position">0</property> </packing> Modified: pytrainer/trunk/import/tool_gant.py =================================================================== --- pytrainer/trunk/import/tool_gant.py 2010-01-16 16:26:48 UTC (rev 475) +++ pytrainer/trunk/import/tool_gant.py 2010-01-16 22:14:16 UTC (rev 476) @@ -38,6 +38,12 @@ return _("Gant") def getVersion(self): + outstatus = commands.getstatusoutput('which gant') + if outstatus[0] == 0: #Found gant in path + path = outstatus[1] + return path + else: + return None return None def getSourceLocation(self): Modified: pytrainer/trunk/pytrainer/gui/windowimportdata.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowimportdata.py 2010-01-16 16:26:48 UTC (rev 475) +++ pytrainer/trunk/pytrainer/gui/windowimportdata.py 2010-01-16 22:14:16 UTC (rev 476) @@ -34,7 +34,6 @@ self.configuration = config self.store = None self.processClass = None - self.toolsDetected = False #SimpleGladeApp.__init__(self, data_path+glade_path, root, domain) def run(self): @@ -70,14 +69,7 @@ return context_id def init_gpsdevice_tab(self): - #Only detect tools once (or if requested) - if not self.toolsDetected: - #Remove all components in vbox - in case of re-detection - for child in self.vboxImportTools.get_children(): - print "removing ", child - self.vboxImportTools.remove(child) - self.detect_tools() - self.toolsDetected = True + return def init_file_tab(self): @@ -111,6 +103,10 @@ """ logging.debug('>>') self.updateStatusbar(self.statusbarDevice, "Checking for tools") + #Remove all components in vbox - in case of re-detection + for child in self.vboxImportTools.get_children(): + print "removing ", child + self.vboxImportTools.remove(child) #Get import tool_* files fileList = glob.glob(self.data_path+"import/tool_*.py") for toolFile in fileList: @@ -134,6 +130,7 @@ version.set_alignment(0,0) if toolClass.deviceExists(): deviceExists = gtk.Label(_("GPS device found") ) + deviceExists.set_alignment(0,0) else: deviceExists = gtk.Label(_("GPS device <b>not</b> found")) deviceExists.set_alignment(0,0) @@ -420,5 +417,7 @@ self.close_window() def on_buttonDeviceToolRescan_clicked(self, widget): - self.toolsDetected = False - self.init_gpsdevice_tab() + self.detect_tools() + + def on_comboboxDevice_changed(self, widget): + self.detect_tools() Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-01-16 16:26:48 UTC (rev 475) +++ pytrainer/trunk/pytrainer/main.py 2010-01-16 22:14:16 UTC (rev 476) @@ -101,7 +101,7 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.0_svn#475" + self.version ="1.7.0_svn#476" self.date = Date() # Checking profile self.profile = Profile(self.data_path,self) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2010-01-16 16:26:54
|
Revision: 475 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=475&view=rev Author: dgranda Date: 2010-01-16 16:26:48 +0000 (Sat, 16 Jan 2010) Log Message: ----------- Triggering DB and config file check by new version or runtime argument Modified Paths: -------------- pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-01-14 21:41:25 UTC (rev 474) +++ pytrainer/trunk/pytrainer/main.py 2010-01-16 16:26:48 UTC (rev 475) @@ -101,7 +101,7 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.0_svn#471" + self.version ="1.7.0_svn#475" self.date = Date() # Checking profile self.profile = Profile(self.data_path,self) @@ -130,13 +130,8 @@ logging.debug('connecting to DDBB') self.ddbb.connect() - #Look for force check file - check_file = self.data_path+"/FORCE_DB_CHECK" - if os.path.isfile(check_file): - self.check = True - os.remove(check_file) - if self.check: - #self.migrationCheck() + # DB check can be triggered either via new version (mandatory) or as runtime parameter (--check) + if self.isNewVersion() or self.check: self.sanityCheck() # Deprecates migrationCheck. Review first installation and version control else: logging.info('No sanity check requested') @@ -491,6 +486,21 @@ self.configuration.setVersion(self.version) logging.debug('<<') + def isNewVersion(self): + """16.01.2010 - dgranda + Checks if executed version is new + args: none + returns: boolean. True if version is newer, False otherwise""" + logging.debug('>>') + version_tmp = self.configuration.getValue("pytraining","version") + logging.info('Old version: '+version_tmp+' | New version: '+self.version) + isNew = False + if version_tmp < self.version: + isNew = True + self.configuration.setVersion(self.version) + logging.debug('<<') + return isNew + def sanityCheck(self): """23.11.2009 - dgranda Checks database and configuration file if flag "--check" is enabled at start This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2010-01-14 21:41:32
|
Revision: 474 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=474&view=rev Author: dgranda Date: 2010-01-14 21:41:25 +0000 (Thu, 14 Jan 2010) Log Message: ----------- Calories data within lap information, not within trackpoints. Check other plugins than garmintools Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/gpx.py Modified: pytrainer/trunk/pytrainer/lib/gpx.py =================================================================== --- pytrainer/trunk/pytrainer/lib/gpx.py 2010-01-08 18:58:09 UTC (rev 473) +++ pytrainer/trunk/pytrainer/lib/gpx.py 2010-01-14 21:41:25 UTC (rev 474) @@ -146,7 +146,7 @@ #print elapsedTime calories = lap.findtext(calorieTag) distance = lap.findtext(distanceTag) - #print "Found time: %s, lat: %s lon: %s cal: %s dist: %s " % (elapsedTime, lat, lon, calories, distance) + logging.debug("Found time: %s, lat: %s lon: %s cal: %s dist: %s " % (elapsedTime, lat, lon, calories, distance)) lapInfo.append((elapsedTime, lat, lon, calories, distance)) return lapInfo @@ -154,18 +154,17 @@ ''' Migrated to eTree XML processing 26 Nov 2009 - jblance ''' - logging.debug(">>") tree = self.tree - - trkpoints = tree.findall(trackPointTag) - #start with the info at trkseg level - #calories - maybe more than one, currently adding them together - trks = tree.findall(trackTag) - for trk in trks: - calorieCollection = trk.findall(calorieTag) - for cal in calorieCollection: - self.calories += int(cal.text) + + # Calories data comes within laps. Maybe more than one, adding them together - dgranda 20100114 + laps = tree.findall(lapTag) + for lap in laps: + lapCalories = lap.findtext(calorieTag) + logging.debug("Lap calories: "+str(lapCalories)) + self.calories += int(lapCalories) + logging.debug("Calories: "+str(self.calories)) + retorno = [] his_vel = [] last_lat = "False" @@ -176,6 +175,7 @@ tmp_alt = 0 len_validhrpoints = 0 + trkpoints = tree.findall(trackPointTag) if not len(trkpoints): return retorno This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2010-01-08 18:58:15
|
Revision: 473 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=473&view=rev Author: dgranda Date: 2010-01-08 18:58:09 +0000 (Fri, 08 Jan 2010) Log Message: ----------- Changed files to make clearer localization process Modified Paths: -------------- pytrainer/trunk/locale/ca/LC_MESSAGES/Makefile pytrainer/trunk/locale/cs/LC_MESSAGES/Makefile pytrainer/trunk/locale/da/LC_MESSAGES/Makefile pytrainer/trunk/locale/de/LC_MESSAGES/Makefile pytrainer/trunk/locale/es/LC_MESSAGES/Makefile pytrainer/trunk/locale/eu/LC_MESSAGES/Makefile pytrainer/trunk/locale/fr/LC_MESSAGES/Makefile pytrainer/trunk/locale/no/LC_MESSAGES/Makefile pytrainer/trunk/locale/pl/LC_MESSAGES/Makefile pytrainer/trunk/locale/ru/LC_MESSAGES/Makefile pytrainer/trunk/setup.py pytrainer/trunk/utils/translator.sh Modified: pytrainer/trunk/locale/ca/LC_MESSAGES/Makefile =================================================================== --- pytrainer/trunk/locale/ca/LC_MESSAGES/Makefile 2010-01-08 18:43:31 UTC (rev 472) +++ pytrainer/trunk/locale/ca/LC_MESSAGES/Makefile 2010-01-08 18:58:09 UTC (rev 473) @@ -2,6 +2,6 @@ msgfmt pytrainer_ca.po -o ./pytrainer.mo merge: - msgmerge pytrainer_ca.po pytrainer_ca.pot > pytrainer_ca.po.tmp + msgmerge pytrainer_ca.po pytrainer_ca.po_new > pytrainer_ca.po.tmp mv pytrainer_ca.po.tmp pytrainer_ca.po - + rm pytrainer_ca.po_new Modified: pytrainer/trunk/locale/cs/LC_MESSAGES/Makefile =================================================================== --- pytrainer/trunk/locale/cs/LC_MESSAGES/Makefile 2010-01-08 18:43:31 UTC (rev 472) +++ pytrainer/trunk/locale/cs/LC_MESSAGES/Makefile 2010-01-08 18:58:09 UTC (rev 473) @@ -2,6 +2,6 @@ msgfmt pytrainer_cs.po -o ./pytrainer.mo merge: - msgmerge pytrainer_cs.po pytrainer_cs.pot > pytrainer_cs.po.tmp + msgmerge pytrainer_cs.po pytrainer_cs.po_new > pytrainer_cs.po.tmp mv pytrainer_cs.po.tmp pytrainer_cs.po - + rm pytrainer_cs.po_new Modified: pytrainer/trunk/locale/da/LC_MESSAGES/Makefile =================================================================== --- pytrainer/trunk/locale/da/LC_MESSAGES/Makefile 2010-01-08 18:43:31 UTC (rev 472) +++ pytrainer/trunk/locale/da/LC_MESSAGES/Makefile 2010-01-08 18:58:09 UTC (rev 473) @@ -2,6 +2,6 @@ msgfmt pytrainer_dk.po -o ./pytrainer.mo merge: - msgmerge pytrainer_dk.po pytrainer_dk.pot > pytrainer_dk.po.tmp + msgmerge pytrainer_dk.po pytrainer_dk.po_new > pytrainer_dk.po.tmp mv pytrainer_de.pk.tmp pytrainer_dk.po - + rm pytrainer_dk.po_new Modified: pytrainer/trunk/locale/de/LC_MESSAGES/Makefile =================================================================== --- pytrainer/trunk/locale/de/LC_MESSAGES/Makefile 2010-01-08 18:43:31 UTC (rev 472) +++ pytrainer/trunk/locale/de/LC_MESSAGES/Makefile 2010-01-08 18:58:09 UTC (rev 473) @@ -2,6 +2,6 @@ msgfmt pytrainer_de.po -o ./pytrainer.mo merge: - msgmerge pytrainer_de.po pytrainer_de.pot > pytrainer_de.po.tmp + msgmerge pytrainer_de.po pytrainer_de.po_new > pytrainer_de.po.tmp mv pytrainer_de.po.tmp pytrainer_de.po - + rm pytrainer_de.po_new Modified: pytrainer/trunk/locale/es/LC_MESSAGES/Makefile =================================================================== --- pytrainer/trunk/locale/es/LC_MESSAGES/Makefile 2010-01-08 18:43:31 UTC (rev 472) +++ pytrainer/trunk/locale/es/LC_MESSAGES/Makefile 2010-01-08 18:58:09 UTC (rev 473) @@ -2,6 +2,7 @@ msgfmt pytrainer_es.po -o ./pytrainer.mo merge: - msgmerge pytrainer_es.po pytrainer_es.pot > pytrainer_es.po.tmp + msgmerge pytrainer_es.po pytrainer_es.po_new > pytrainer_es.po.tmp mv pytrainer_es.po.tmp pytrainer_es.po + rm pytrainer_es.po_new Modified: pytrainer/trunk/locale/eu/LC_MESSAGES/Makefile =================================================================== --- pytrainer/trunk/locale/eu/LC_MESSAGES/Makefile 2010-01-08 18:43:31 UTC (rev 472) +++ pytrainer/trunk/locale/eu/LC_MESSAGES/Makefile 2010-01-08 18:58:09 UTC (rev 473) @@ -2,6 +2,6 @@ msgfmt pytrainer_eu.po -o ./pytrainer.mo merge: - msgmerge pytrainer_eu.po pytrainer_eu.pot > pytrainer_eu.po.tmp + msgmerge pytrainer_eu.po pytrainer_eu.po_new > pytrainer_eu.po.tmp mv pytrainer_eu.po.tmp pytrainer_eu.po - + rm pytrainer_eu.po_new Modified: pytrainer/trunk/locale/fr/LC_MESSAGES/Makefile =================================================================== --- pytrainer/trunk/locale/fr/LC_MESSAGES/Makefile 2010-01-08 18:43:31 UTC (rev 472) +++ pytrainer/trunk/locale/fr/LC_MESSAGES/Makefile 2010-01-08 18:58:09 UTC (rev 473) @@ -2,6 +2,6 @@ msgfmt pytrainer_fr.po -o ./pytrainer.mo merge: - msgmerge pytrainer_fr.po pytrainer_fr.pot > pytrainer_fr.po.tmp + msgmerge pytrainer_fr.po pytrainer_fr.po_new > pytrainer_fr.po.tmp mv pytrainer_fr.po.tmp pytrainer_fr.po - + rm pytrainer_fr.po_new Modified: pytrainer/trunk/locale/no/LC_MESSAGES/Makefile =================================================================== --- pytrainer/trunk/locale/no/LC_MESSAGES/Makefile 2010-01-08 18:43:31 UTC (rev 472) +++ pytrainer/trunk/locale/no/LC_MESSAGES/Makefile 2010-01-08 18:58:09 UTC (rev 473) @@ -2,6 +2,6 @@ msgfmt pytrainer_no.po -o ./pytrainer.mo merge: - msgmerge pytrainer_no.po pytrainer_no.pot > pytrainer_no.po.tmp + msgmerge pytrainer_no.po pytrainer_no.po_new > pytrainer_no.po.tmp mv pytrainer_no.po.tmp pytrainer_no.po - + rm pytrainer_no.po_new Modified: pytrainer/trunk/locale/pl/LC_MESSAGES/Makefile =================================================================== --- pytrainer/trunk/locale/pl/LC_MESSAGES/Makefile 2010-01-08 18:43:31 UTC (rev 472) +++ pytrainer/trunk/locale/pl/LC_MESSAGES/Makefile 2010-01-08 18:58:09 UTC (rev 473) @@ -2,6 +2,6 @@ msgfmt pytrainer_pl.po -o ./pytrainer.mo merge: - msgmerge pytrainer_pl.po pytrainer_pl.pot > pytrainer_pl.po.tmp + msgmerge pytrainer_pl.po pytrainer_pl.po_new > pytrainer_pl.po.tmp mv pytrainer_pl.po.tmp pytrainer_pl.po - + rm pytrainer_pl.po_new Modified: pytrainer/trunk/locale/ru/LC_MESSAGES/Makefile =================================================================== --- pytrainer/trunk/locale/ru/LC_MESSAGES/Makefile 2010-01-08 18:43:31 UTC (rev 472) +++ pytrainer/trunk/locale/ru/LC_MESSAGES/Makefile 2010-01-08 18:58:09 UTC (rev 473) @@ -2,6 +2,6 @@ msgfmt pytrainer_ru.po -o ./pytrainer.mo merge: - msgmerge pytrainer_ru.po pytrainer_ru.pot > pytrainer_ru.po.tmp + msgmerge pytrainer_ru.po pytrainer_ru.po_new > pytrainer_ru.po.tmp mv pytrainer_ru.po.tmp pytrainer_ru.po - + rm pytrainer_ru.po_new Modified: pytrainer/trunk/setup.py =================================================================== --- pytrainer/trunk/setup.py 2010-01-08 18:43:31 UTC (rev 472) +++ pytrainer/trunk/setup.py 2010-01-08 18:58:09 UTC (rev 473) @@ -42,14 +42,16 @@ install_plugin("garmintools"), install_plugin("garmintools_full"), install_extension("wordpress"), + (install_locale("ca")), + (install_locale("cs")), + (install_locale("da")), + (install_locale("de")), (install_locale("es")), - (install_locale("ca")), + (install_locale("eu")), (install_locale("fr")), - (install_locale("de")), - (install_locale("da")), + (install_locale("no")), (install_locale("pl")), - (install_locale("no")), - (install_locale("cs")), + (install_locale("ru")), ('share/pixmaps/',['pytrainer.png']), ('share/applications/',['pytrainer.desktop']) ], Modified: pytrainer/trunk/utils/translator.sh =================================================================== --- pytrainer/trunk/utils/translator.sh 2010-01-08 18:43:31 UTC (rev 472) +++ pytrainer/trunk/utils/translator.sh 2010-01-08 18:58:09 UTC (rev 473) @@ -8,15 +8,22 @@ cd ../ +# Extract translatable strings from input files xgettext glade/pytrainer.glade -o ./messages.pot -if [ $? != 0 ]; then echo "WARNNING: xgettext not found. Please, install gettext package"; exit; fi +if [ $? != 0 ]; then echo "WARNING: xgettext not found. Please install gettext package"; exit; fi find ./ -iname "*.py" -exec xgettext -k_ -j -o ./messages.pot ./pytrainer/main.py {} \; -msginit -i ./messages.pot -l $LANGUAGE -o ./locale/$LANGUAGE/LC_MESSAGES/pytrainer_$LANGUAGE.pot +# Initializing translations for desired language +msginit -i ./messages.pot -l $LANGUAGE -o ./locale/$LANGUAGE/LC_MESSAGES/pytrainer_$LANGUAGE.po_new +rm ./messages.pot cd ./locale/$LANGUAGE/LC_MESSAGES/ +# Merging old po file with the one generated as a result of current script make merge + +# Editing our new gettext catalog (.po file) $SOFTWARE pytrainer_$LANGUAGE.po -if [ $? != 0 ]; then echo "WARNNING: $SOFTWARE not found"; exit ; fi +if [ $? != 0 ]; then echo "WARNING: $SOFTWARE not found"; exit ; fi + +# Compiling our new message catalog into binary files ready for distribution make - This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2010-01-08 18:43:38
|
Revision: 472 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=472&view=rev Author: dgranda Date: 2010-01-08 18:43:31 +0000 (Fri, 08 Jan 2010) Log Message: ----------- Removed useless files for localization Removed Paths: ------------- pytrainer/trunk/Makefile pytrainer/trunk/locale/ca/LC_MESSAGES/pytrainer_ca.pot pytrainer/trunk/locale/da/LC_MESSAGES/pytrainer_dk.pot pytrainer/trunk/locale/de/LC_MESSAGES/pytrainer_de.pot pytrainer/trunk/locale/es/LC_MESSAGES/pytrainer_es.pot pytrainer/trunk/locale/eu/LC_MESSAGES/pytrainer_eu.pot pytrainer/trunk/locale/fr/LC_MESSAGES/pytrainer_fr.pot pytrainer/trunk/locale/no/LC_MESSAGES/pytrainer_no.pot pytrainer/trunk/locale/pl/LC_MESSAGES/pytrainer_pl.pot pytrainer/trunk/locale/ru/LC_MESSAGES/pytrainer_pl.pot pytrainer/trunk/locale/ru/LC_MESSAGES/pytrainer_ru.pot pytrainer/trunk/messages.pot Deleted: pytrainer/trunk/Makefile =================================================================== --- pytrainer/trunk/Makefile 2010-01-06 21:47:54 UTC (rev 471) +++ pytrainer/trunk/Makefile 2010-01-08 18:43:31 UTC (rev 472) @@ -1,36 +0,0 @@ -install: - xgettext glade/pytrainer.glade -o ./messages.pot - find ./ -iname "*.py" -exec xgettext -k_ -j -o ./messages.pot ./pytrainer/main.py {} \; - make locale_es - make locale_eu - make locale_ca - make locale_fr - make locale_da - make locale_de - make locale_no - make locale_cs - make locale_ru - make locale_pl - -locale_es: - msginit -i ./messages.pot -l es -o ./locale/es/LC_MESSAGES/pytrainer_es.pot -locale_eu: - msginit -i ./messages.pot -l eu -o ./locale/eu/LC_MESSAGES/pytrainer_eu.pot -locale_ca: - msginit -i ./messages.pot -l ca -o ./locale/ca/LC_MESSAGES/pytrainer_ca.pot -locale_fr: - msginit -i ./messages.pot -l fr -o ./locale/fr/LC_MESSAGES/pytrainer_fr.pot -locale_da: - msginit -i ./messages.pot -l da -o ./locale/de/LC_MESSAGES/pytrainer_da.pot -locale_de: - msginit -i ./messages.pot -l de -o ./locale/de/LC_MESSAGES/pytrainer_de.pot -locale_pl: - msginit -i ./messages.pot -l pl -o ./locale/pl/LC_MESSAGES/pytrainer_pl.pot -locale_no: - msginit -i ./messages.pot -l no -o ./locale/no/LC_MESSAGES/pytrainer_no.pot -locale_cs: - msginit -i ./messages.pot -l cs -o ./locale/cs/LC_MESSAGES/pytrainer_cs.pot -locale_ru: - msginit -i ./messages.pot -l ru -o ./locale/ru/LC_MESSAGES/pytrainer_ru.pot -locale_pl: - msginit -i ./messages.pot -l pl -o ./locale/ru/LC_MESSAGES/pytrainer_pl.pot Deleted: pytrainer/trunk/locale/ca/LC_MESSAGES/pytrainer_ca.pot =================================================================== --- pytrainer/trunk/locale/ca/LC_MESSAGES/pytrainer_ca.pot 2010-01-06 21:47:54 UTC (rev 471) +++ pytrainer/trunk/locale/ca/LC_MESSAGES/pytrainer_ca.pot 2010-01-08 18:43:31 UTC (rev 472) @@ -1,1191 +0,0 @@ -# Catalan translations for vud package. -# Copyright (C) 2008 THE vud'S COPYRIGHT HOLDER -# This file is distributed under the same license as the vud package. -# Fiz Vazquez <vu...@si...>, 2008. -# -msgid "" -msgstr "" -"Project-Id-Version: vud 1\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-03-03 19:57+0100\n" -"PO-Revision-Date: 2008-03-03 19:57+0100\n" -"Last-Translator: Fiz Vazquez <vu...@si...>\n" -"Language-Team: Catalan\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: glade/pytrainer.glade:10 -msgid "window1" -msgstr "" - -#: glade/pytrainer.glade:50 -msgid "_File" -msgstr "" - -#: glade/pytrainer.glade:74 -msgid "_Export as Text Separated by Commas" -msgstr "" - -#: glade/pytrainer.glade:114 -msgid "_Edit" -msgstr "" - -#: glade/pytrainer.glade:136 -msgid "_View" -msgstr "" - -#: glade/pytrainer.glade:145 -msgid " _Classic View" -msgstr "" - -#: glade/pytrainer.glade:156 -msgid " _List View" -msgstr "" - -#: glade/pytrainer.glade:168 -msgid " _Waypoints Editor" -msgstr "" - -#: glade/pytrainer.glade:184 -msgid "Tools" -msgstr "" - -#: glade/pytrainer.glade:194 glade/pytrainer.glade:12298 -msgid "Extensions" -msgstr "" - -#: glade/pytrainer.glade:204 -msgid "GPS Device Plugins" -msgstr "" - -#: glade/pytrainer.glade:218 -msgid "_Help" -msgstr "" - -#: glade/pytrainer.glade:338 pytrainer/gui/windowmain.py:49 -#: pytrainer/gui/windowmain.py:52 pytrainer/gui/windowmain.py:471 -#: pytrainer/gui/windowprofile.py:67 -msgid "Sport" -msgstr "" - -#: glade/pytrainer.glade:364 -msgid "All Sports" -msgstr "" - -#: glade/pytrainer.glade:473 glade/pytrainer.glade:838 -#: glade/pytrainer.glade:866 -msgid " " -msgstr "" - -#: glade/pytrainer.glade:501 glade/pytrainer.glade:894 -msgid " " -msgstr "" - -#: glade/pytrainer.glade:529 -msgid "<b>Sport:</b>" -msgstr "" - -#: glade/pytrainer.glade:557 glade/pytrainer.glade:2996 -#: glade/pytrainer.glade:4124 glade/pytrainer.glade:5419 -msgid "<b>Time:</b>" -msgstr "" - -#: glade/pytrainer.glade:586 glade/pytrainer.glade:3193 -#: glade/pytrainer.glade:4294 glade/pytrainer.glade:5643 -msgid "<b>Speed:</b>" -msgstr "" - -#: glade/pytrainer.glade:614 glade/pytrainer.glade:3502 -#: glade/pytrainer.glade:4658 glade/pytrainer.glade:5813 -msgid "<b>Pace:</b>" -msgstr "" - -#: glade/pytrainer.glade:642 -msgid "<b>Ascent:</b>" -msgstr "" - -#: glade/pytrainer.glade:670 -msgid "<b>Comments:</b>" -msgstr "" - -#: glade/pytrainer.glade:698 glade/pytrainer.glade:1381 -#: glade/pytrainer.glade:3249 glade/pytrainer.glade:3306 -#: glade/pytrainer.glade:4350 glade/pytrainer.glade:4519 -#: glade/pytrainer.glade:5699 glade/pytrainer.glade:5727 -msgid "km/h" -msgstr "" - -#: glade/pytrainer.glade:726 glade/pytrainer.glade:1091 -#: glade/pytrainer.glade:3530 glade/pytrainer.glade:3586 -#: glade/pytrainer.glade:4714 glade/pytrainer.glade:4742 -#: glade/pytrainer.glade:5870 glade/pytrainer.glade:5898 -msgid "min/km" -msgstr "" - -#: glade/pytrainer.glade:754 glade/pytrainer.glade:1147 -msgid "m" -msgstr "" - -#: glade/pytrainer.glade:782 -msgid " " -msgstr "" - -#: glade/pytrainer.glade:810 glade/pytrainer.glade:1119 -#: glade/pytrainer.glade:2042 glade/pytrainer.glade:2070 -#: glade/pytrainer.glade:2098 glade/pytrainer.glade:2266 -#: glade/pytrainer.glade:3698 glade/pytrainer.glade:4854 -msgid " " -msgstr "" - -#: glade/pytrainer.glade:922 -msgid "<b>Date:</b>" -msgstr "" - -#: glade/pytrainer.glade:950 glade/pytrainer.glade:2968 -#: glade/pytrainer.glade:4096 glade/pytrainer.glade:5391 -msgid "<b>Distance:</b>" -msgstr "" - -#: glade/pytrainer.glade:979 -msgid "<b>Max Speed</b>" -msgstr "" - -#: glade/pytrainer.glade:1007 glade/pytrainer.glade:3558 -#: glade/pytrainer.glade:4686 glade/pytrainer.glade:5842 -msgid "<b>Max Pace:</b>" -msgstr "" - -#: glade/pytrainer.glade:1035 -msgid "<b>Descent:</b>" -msgstr "" - -#: glade/pytrainer.glade:1063 -msgid " " -msgstr "" - -#: glade/pytrainer.glade:1213 glade/pytrainer.glade:2912 -#: glade/pytrainer.glade:4040 glade/pytrainer.glade:5615 -msgid "Km" -msgstr "" - -#: glade/pytrainer.glade:1246 glade/pytrainer.glade:1296 -#: glade/pytrainer.glade:1346 glade/pytrainer.glade:3030 -#: glade/pytrainer.glade:3080 glade/pytrainer.glade:3130 -#: glade/pytrainer.glade:4208 glade/pytrainer.glade:4258 -#: glade/pytrainer.glade:5503 glade/pytrainer.glade:5553 -msgid "00" -msgstr "" - -#: glade/pytrainer.glade:1271 glade/pytrainer.glade:1321 -#: glade/pytrainer.glade:3055 glade/pytrainer.glade:3105 -#: glade/pytrainer.glade:4183 glade/pytrainer.glade:4233 -#: glade/pytrainer.glade:5478 glade/pytrainer.glade:5528 -#: glade/pytrainer.glade:7648 glade/pytrainer.glade:7693 -msgid ":" -msgstr "" - -#: glade/pytrainer.glade:1415 glade/pytrainer.glade:2377 -#: glade/pytrainer.glade:2939 glade/pytrainer.glade:3221 -#: glade/pytrainer.glade:3362 glade/pytrainer.glade:3446 -#: glade/pytrainer.glade:3726 glade/pytrainer.glade:3754 -#: glade/pytrainer.glade:4067 glade/pytrainer.glade:4322 -#: glade/pytrainer.glade:4406 glade/pytrainer.glade:4602 -#: glade/pytrainer.glade:4882 glade/pytrainer.glade:5222 -#: glade/pytrainer.glade:5306 glade/pytrainer.glade:5362 -#: glade/pytrainer.glade:5671 glade/pytrainer.glade:5954 -#: glade/pytrainer.glade:5982 glade/pytrainer.glade:6010 -#: glade/pytrainer.glade:6038 -msgid " " -msgstr "" - -#: glade/pytrainer.glade:1522 -msgid " <b>Title:</b>" -msgstr "" - -#: glade/pytrainer.glade:1636 -msgid "" -"Profile\n" -"Speed\n" -"Pace\n" -"Heart Rate" -msgstr "" - -#: glade/pytrainer.glade:1655 glade/pytrainer.glade:5040 -#: glade/pytrainer.glade:6196 -msgid "Versus" -msgstr "" - -#: glade/pytrainer.glade:1680 -msgid "" -"None\n" -"Profile\n" -"Speed\n" -"Pace\n" -"Heart Rate\n" -msgstr "" - -#: glade/pytrainer.glade:1845 -msgid "<b>Beats:</b>" -msgstr "" - -#: glade/pytrainer.glade:1873 glade/pytrainer.glade:3334 -#: glade/pytrainer.glade:4378 glade/pytrainer.glade:5194 -msgid "<b>Calories: </b>" -msgstr "" - -#: glade/pytrainer.glade:1901 glade/pytrainer.glade:3614 -#: glade/pytrainer.glade:4798 glade/pytrainer.glade:5926 -msgid "<b>Max Beats:</b>" -msgstr "" - -#: glade/pytrainer.glade:1929 -msgid "<b>HR Zones Method:</b>" -msgstr "" - -#: glade/pytrainer.glade:1958 -msgid "<b>HR Zone5:</b>" -msgstr "" - -#: glade/pytrainer.glade:1986 glade/pytrainer.glade:2350 -msgid " bpm" -msgstr "" - -#: glade/pytrainer.glade:2014 -msgid " Cal" -msgstr "" - -#: glade/pytrainer.glade:2126 -msgid "<b>HR Zone4:</b>" -msgstr "" - -#: glade/pytrainer.glade:2154 -msgid "<b>HR Zone3:</b>" -msgstr "" - -#: glade/pytrainer.glade:2182 -msgid "<b>HR Zone2:</b>" -msgstr "" - -#: glade/pytrainer.glade:2210 -msgid "<b>HR Zone1:</b>" -msgstr "" - -#: glade/pytrainer.glade:2238 glade/pytrainer.glade:2294 -#: glade/pytrainer.glade:2322 glade/pytrainer.glade:3670 -#: glade/pytrainer.glade:4491 glade/pytrainer.glade:4826 -msgid " " -msgstr "" - -#: glade/pytrainer.glade:2405 glade/pytrainer.glade:2432 -#: glade/pytrainer.glade:2460 glade/pytrainer.glade:2488 -#: glade/pytrainer.glade:2516 glade/pytrainer.glade:3474 -#: glade/pytrainer.glade:3642 glade/pytrainer.glade:4630 -#: glade/pytrainer.glade:4770 glade/pytrainer.glade:5334 -#: glade/pytrainer.glade:5755 -msgid "bpm" -msgstr "" - -#: glade/pytrainer.glade:2544 -msgid " " -msgstr "" - -#: glade/pytrainer.glade:2582 -msgid " <b>Heart Rate:</b>" -msgstr "" - -#: glade/pytrainer.glade:2759 glade/pytrainer.glade:7010 -#: glade/pytrainer.glade:10877 -msgid "label-2147483648" -msgstr "" - -#: glade/pytrainer.glade:2797 -msgid "label-2147483647" -msgstr "" - -#: glade/pytrainer.glade:2853 -msgid "Record" -msgstr "" - -#: glade/pytrainer.glade:3278 glade/pytrainer.glade:4463 -#: glade/pytrainer.glade:5784 -msgid "<b>Max Speed:</b>" -msgstr "" - -#: glade/pytrainer.glade:3390 glade/pytrainer.glade:4434 -#: glade/pytrainer.glade:5250 -msgid "Cal" -msgstr "" - -#: glade/pytrainer.glade:3418 glade/pytrainer.glade:4574 -#: glade/pytrainer.glade:5278 -msgid "<b>Beats avg:</b>" -msgstr "" - -#: glade/pytrainer.glade:3792 -msgid " <b>Date:</b>" -msgstr "" - -#: glade/pytrainer.glade:3867 -msgid "Value" -msgstr "" - -#: glade/pytrainer.glade:3892 -msgid "" -"Stage Profile\n" -"Stage Velocity\n" -"Stage Profile/velocity" -msgstr "" - -#: glade/pytrainer.glade:3981 -msgid "Day" -msgstr "" - -#: glade/pytrainer.glade:4158 glade/pytrainer.glade:5453 -msgid "000" -msgstr "" - -#: glade/pytrainer.glade:4547 glade/pytrainer.glade:7846 -msgid " " -msgstr "" - -#: glade/pytrainer.glade:4920 -msgid " <b>Month:</b>" -msgstr "" - -#: glade/pytrainer.glade:5020 glade/pytrainer.glade:6176 -msgid "" -"Kilometers\n" -"Time\n" -"Beats\n" -"Average\n" -"Calories" -msgstr "" - -#: glade/pytrainer.glade:5065 glade/pytrainer.glade:6221 -msgid "" -"None\n" -"Kilometers\n" -"Time\n" -"Beats\n" -"Average\n" -"Calories" -msgstr "" - -#: glade/pytrainer.glade:5135 -msgid "Month" -msgstr "" - -#: glade/pytrainer.glade:6076 -msgid " <b>Year:</b>" -msgstr "" - -#: glade/pytrainer.glade:6291 -msgid "Year" -msgstr "" - -#: glade/pytrainer.glade:6334 -msgid "label154" -msgstr "" - -#: glade/pytrainer.glade:6371 -msgid "<b>Title:</b>" -msgstr "" - -#: glade/pytrainer.glade:6416 -msgid "Search" -msgstr "" - -#: glade/pytrainer.glade:6463 -msgid "Columns" -msgstr "" - -#: glade/pytrainer.glade:6538 -msgid "label155" -msgstr "" - -#: glade/pytrainer.glade:6672 -msgid "Type:" -msgstr "" - -#: glade/pytrainer.glade:6700 -msgid "" -"Font\n" -"Restaurant\n" -"Scenic Area\n" -"Summit" -msgstr "" - -#: glade/pytrainer.glade:6721 -msgid "Latitude: " -msgstr "" - -#: glade/pytrainer.glade:6749 -msgid " Name:" -msgstr "" - -#: glade/pytrainer.glade:6777 -msgid "Longitude:" -msgstr "" - -#: glade/pytrainer.glade:6805 glade/pytrainer.glade:12486 -#: glade/pytrainer.glade:12809 -msgid "Description:" -msgstr "" - -#: glade/pytrainer.glade:6925 -msgid "<b> Waypoint: </b>" -msgstr "" - -#: glade/pytrainer.glade:7058 -msgid "label162" -msgstr "" - -#: glade/pytrainer.glade:7198 -msgid "label163" -msgstr "" - -#: glade/pytrainer.glade:7223 -msgid "New Entry" -msgstr "" - -#: glade/pytrainer.glade:7296 -msgid "Title:" -msgstr "" - -#: glade/pytrainer.glade:7345 -msgid "GPX File:" -msgstr "" - -#: glade/pytrainer.glade:7415 -msgid "Calculate Values" -msgstr "" - -#: glade/pytrainer.glade:7434 -msgid "Sport:" -msgstr "" - -#: glade/pytrainer.glade:7485 -msgid "<b>Main</b>" -msgstr "" - -#: glade/pytrainer.glade:7546 -msgid "Distance (Km):" -msgstr "" - -#: glade/pytrainer.glade:7575 glade/pytrainer.glade:7772 -#: glade/pytrainer.glade:8053 glade/pytrainer.glade:8299 -#: glade/pytrainer.glade:8767 glade/pytrainer.glade:11515 -msgid "Calculate" -msgstr "" - -#: glade/pytrainer.glade:7594 -msgid "Time:" -msgstr "" - -#: glade/pytrainer.glade:7792 -msgid "Date:" -msgstr "" - -#: glade/pytrainer.glade:7912 glade/pytrainer.glade:11565 -msgid "<b>General</b>" -msgstr "" - -#: glade/pytrainer.glade:7973 -msgid "Max (km/h):" -msgstr "" - -#: glade/pytrainer.glade:8024 -msgid "Velocity (km/h)" -msgstr "" - -#: glade/pytrainer.glade:8099 -msgid "<b>Velocity</b>" -msgstr "" - -#: glade/pytrainer.glade:8135 -msgid "Quick Entry" -msgstr "" - -#: glade/pytrainer.glade:8195 -msgid "Max (min/km):" -msgstr "" - -#: glade/pytrainer.glade:8247 -msgid "Pace (min/km):" -msgstr "" - -#: glade/pytrainer.glade:8322 -msgid "<b>Pace</b>" -msgstr "" - -#: glade/pytrainer.glade:8383 -msgid "Ascent:" -msgstr "" - -#: glade/pytrainer.glade:8435 -msgid "Descent:" -msgstr "" - -#: glade/pytrainer.glade:8490 -msgid "<b>Accumulated Altitude Change</b>" -msgstr "" - -#: glade/pytrainer.glade:8551 -msgid "Max (bpm):" -msgstr "" - -#: glade/pytrainer.glade:8580 -msgid "Heart rate:" -msgstr "" - -#: glade/pytrainer.glade:8654 pytrainer/gui/windowmain.py:475 -#: pytrainer/monthgraph.py:77 -msgid "Calories" -msgstr "" - -#: glade/pytrainer.glade:8705 -msgid "" -"<small><b>Note:</b> In order to calculate the calories you must set the " -"sport MET (in Preferences->Sport) </small>" -msgstr "" - -#: glade/pytrainer.glade:8822 -msgid "<b>Heart Rate</b>" -msgstr "" - -#: glade/pytrainer.glade:8858 -msgid "Advanced" -msgstr "" - -#: glade/pytrainer.glade:8955 -msgid "<b>Comments</b>" -msgstr "" - -#: glade/pytrainer.glade:8984 -msgid "Comments" -msgstr "" - -#: glade/pytrainer.glade:9089 -msgid "Preferences" -msgstr "" - -#: glade/pytrainer.glade:9163 -msgid "Metric system" -msgstr "" - -#: glade/pytrainer.glade:9185 -msgid "U.S. customary units" -msgstr "" - -#: glade/pytrainer.glade:9211 -msgid "<b>System of Measurement</b>" -msgstr "" - -#: glade/pytrainer.glade:9271 -msgid "Database type:" -msgstr "" - -#: glade/pytrainer.glade:9299 -msgid "Database host:" -msgstr "" - -#: glade/pytrainer.glade:9348 -msgid "Database name:" -msgstr "" - -#: glade/pytrainer.glade:9416 -msgid "Database user:" -msgstr "" - -#: glade/pytrainer.glade:9444 -msgid "Database pass:" -msgstr "" - -#: glade/pytrainer.glade:9518 -msgid "<b>Database</b>" -msgstr "" - -#: glade/pytrainer.glade:9578 -msgid "Use this port for internal connections: " -msgstr "" - -#: glade/pytrainer.glade:9629 -msgid "" -"<small><b>Note:</b> Change this only if you know what you are doing</small>" -msgstr "" - -#: glade/pytrainer.glade:9661 -msgid "<b>Port Connnection</b>" -msgstr "" - -#: glade/pytrainer.glade:9697 -msgid "General" -msgstr "" - -#: glade/pytrainer.glade:9750 -msgid "User name:" -msgstr "" - -#: glade/pytrainer.glade:9778 -msgid "Gender:" -msgstr "" - -#: glade/pytrainer.glade:9824 -msgid "Height:" -msgstr "" - -#: glade/pytrainer.glade:9895 -msgid "Date of birth:" -msgstr "" - -#: glade/pytrainer.glade:10007 -msgid "Weight:" -msgstr "" - -#: glade/pytrainer.glade:10039 -msgid "<b>Athlete Details</b>" -msgstr "" - -#: glade/pytrainer.glade:10068 -msgid "Athlete" -msgstr "" - -#: glade/pytrainer.glade:10251 -msgid "<b>Sport List</b>" -msgstr "" - -#: glade/pytrainer.glade:10280 -msgid "llist" -msgstr "" - -#: glade/pytrainer.glade:10360 glade/pytrainer.glade:12430 -#: glade/pytrainer.glade:12921 -msgid "Name:" -msgstr "" - -#: glade/pytrainer.glade:10388 -msgid "M.E.T.:" -msgstr "" - -#: glade/pytrainer.glade:10437 -msgid "Extra Weight:" -msgstr "" - -#: glade/pytrainer.glade:10513 glade/pytrainer.glade:11119 -msgid "" -"<small><b>Note:</b> You can get your M.E.T. sport Coefficient here: http://" -"pytrainer.e-oss.net/met.pdf</small>" -msgstr "" - -#: glade/pytrainer.glade:10624 -msgid "<b>Add New Sport</b>" -msgstr "" - -#: glade/pytrainer.glade:10653 -msgid "new" -msgstr "" - -#: glade/pytrainer.glade:10713 -msgid "" -"Deleting a sport removes associated records.\n" -"Continue?" -msgstr "" - -#: glade/pytrainer.glade:10853 -msgid "<b>Delete Sport</b>" -msgstr "" - -#: glade/pytrainer.glade:10913 -msgid "delete" -msgstr "" - -#: glade/pytrainer.glade:10972 -msgid "Name" -msgstr "" - -#: glade/pytrainer.glade:11021 -msgid "M.E.T." -msgstr "" - -#: glade/pytrainer.glade:11070 pytrainer/gui/windowprofile.py:67 -msgid "Extra Weight" -msgstr "" - -#: glade/pytrainer.glade:11236 -msgid "<b>Edit Sport</b>" -msgstr "" - -#: glade/pytrainer.glade:11260 -msgid "<b>lalaal</b>" -msgstr "" - -#: glade/pytrainer.glade:11296 -msgid "edit" -msgstr "" - -#: glade/pytrainer.glade:11325 -msgid "Sports" -msgstr "" - -#: glade/pytrainer.glade:11384 -msgid "Maximum heart rate:" -msgstr "" - -#: glade/pytrainer.glade:11412 -msgid "Resting heart rate:" -msgstr "" - -#: glade/pytrainer.glade:11486 -msgid "" -"<small><b>Note:</b> Maximum heart rate is calculated by subtracting the " -"number 220 minus your age. </small>" -msgstr "" - -#: glade/pytrainer.glade:11625 -msgid "" -"<small><b>NOTE:</b> in order to use the Karvonen method you must cover the " -"Resting hr field.</small>" -msgstr "" - -#: glade/pytrainer.glade:11654 -msgid "Percentages based method" -msgstr "" - -#: glade/pytrainer.glade:11676 pytrainer/gui/windowmain.py:194 -msgid "Karvonen method" -msgstr "" - -#: glade/pytrainer.glade:11698 -msgid "Select how to calculate your heart rate zones." -msgstr "" - -#: glade/pytrainer.glade:11730 -msgid "<b>Heart Rate Zones</b>" -msgstr "" - -#: glade/pytrainer.glade:11766 pytrainer/daygraph.py:58 -#: pytrainer/heartrategraph.py:33 pytrainer/recordgraph.py:78 -msgid "Heart Rate" -msgstr "" - -#: glade/pytrainer.glade:11871 -msgid "Calendar" -msgstr "" - -#: glade/pytrainer.glade:11997 -msgid "pytrainer" -msgstr "" - -#: glade/pytrainer.glade:11998 -msgid "(c) Fiz Vazquez <vu...@si...>" -msgstr "" - -#: glade/pytrainer.glade:11999 -msgid "Track sporting activities and performance" -msgstr "" - -#: glade/pytrainer.glade:12000 -msgid "" -"(C) Fiz Vazquez\n" -"\n" -" This program is free software; you can redistribute \n" -" it and/or modify it under the terms of the GNU \n" -" General Public License as published by the Free \n" -" Software Foundation; either version 2 of the License, \n" -" or (at your option) any later version.\n" -"\n" -" This program is distributed in the hope that it will be \n" -" useful, but WITHOUT ANY WARRANTY; without even the\n" -" implied warranty of MERCHANTABILITY or FITNESS FOR \n" -" A PARTICULAR PURPOSE. See the GNU General Public \n" -" License <http://www.opensource.org/gpl-license.html>\n" -" for more details.\n" -"\n" -" You can found the license on Debian systems in the file\n" -" /usr/share/common-licenses/GPL\n" -msgstr "" - -#: glade/pytrainer.glade:12020 -msgid "pytrainer.e-oss.net" -msgstr "" - -#: glade/pytrainer.glade:12022 -msgid "" -"Basque: Jabier Santamaria <men...@gm...>\n" -"Catalan: Eloi Crespillo Itchart <el...@ik...>\n" -"Czech: Lobus Pokorny <sp...@se...>\n" -"French: Dj <dj...@dj...>\n" -"French: Pierre Gaigé <pg...@fr...>\n" -"Norwegian: Havard Davidsen <hav...@gm...>\n" -"Polish: Seweryn Kokot <sk...@po...>\n" -"german: Aleks <al...@sc...>\n" -"Spanish: Fiz vazquez <vu...@si...>" -msgstr "" - -#: glade/pytrainer.glade:12115 -msgid "Edit Record" -msgstr "" - -#: glade/pytrainer.glade:12136 -msgid "Show graph in classic view" -msgstr "" - -#: glade/pytrainer.glade:12172 -msgid "warning" -msgstr "" - -#: glade/pytrainer.glade:12374 -msgid "<b>Extension Details</b>" -msgstr "" - -#: glade/pytrainer.glade:12402 -msgid "name-entry" -msgstr "" - -#: glade/pytrainer.glade:12458 glade/pytrainer.glade:12865 -msgid "Status:" -msgstr "" - -#: glade/pytrainer.glade:12514 glade/pytrainer.glade:12837 -msgid "status-entry" -msgstr "" - -#: glade/pytrainer.glade:12542 -msgid "description-entry" -msgstr "" - -#: glade/pytrainer.glade:12677 -msgid "Plugins" -msgstr "" - -#: glade/pytrainer.glade:12752 -msgid "<b>Plugin Details</b>" -msgstr "" - -#: glade/pytrainer.glade:12781 -msgid "description-entry " -msgstr "" - -#: glade/pytrainer.glade:12893 -msgid "nameEntry" -msgstr "" - -#: glade/pytrainer.glade:13064 -msgid "Select track record" -msgstr "" - -#: pytrainer/main.py:94 -msgid "No Active Plugins" -msgstr "" - -#: pytrainer/main.py:103 -msgid "No Active Extensions" -msgstr "" - -#: pytrainer/main.py:245 -msgid "Delete this database entry?" -msgstr "" - -#: pytrainer/main.py:256 -msgid "Delete this waypoint?" -msgstr "" - -#: pytrainer/lib/heartrate.py:46 -msgid "Moderate activity" -msgstr "" - -#: pytrainer/lib/heartrate.py:47 -msgid "Weight Control" -msgstr "" - -#: pytrainer/lib/heartrate.py:48 -msgid "Aerobic" -msgstr "" - -#: pytrainer/lib/heartrate.py:49 -msgid "Anaerobic" -msgstr "" - -#: pytrainer/lib/heartrate.py:50 -msgid "VO2 MAX" -msgstr "" - -#: pytrainer/lib/gpx.py:75 -msgid "No Name" -msgstr "" - -#: pytrainer/lib/gpx.py:81 -msgid "No Data" -msgstr "" - -#: pytrainer/lib/date.py:73 -msgid "January" -msgstr "" - -#: pytrainer/lib/date.py:74 -msgid "Febrary" -msgstr "" - -#: pytrainer/lib/date.py:75 -msgid "March" -msgstr "" - -#: pytrainer/lib/date.py:76 -msgid "April" -msgstr "" - -#: pytrainer/lib/date.py:77 -msgid "May" -msgstr "" - -#: pytrainer/lib/date.py:78 -msgid "June" -msgstr "" - -#: pytrainer/lib/date.py:79 -msgid "July" -msgstr "" - -#: pytrainer/lib/date.py:80 -msgid "August" -msgstr "" - -#: pytrainer/lib/date.py:81 -msgid "September" -msgstr "" - -#: pytrainer/lib/date.py:82 -msgid "October" -msgstr "" - -#: pytrainer/lib/date.py:83 -msgid "November" -msgstr "" - -#: pytrainer/lib/date.py:84 -msgid "December" -msgstr "" - -#: pytrainer/yeargraph.py:69 pytrainer/yeargraph.py:71 -#: pytrainer/yeargraph.py:73 pytrainer/yeargraph.py:75 -#: pytrainer/yeargraph.py:77 -msgid "month" -msgstr "" - -#: pytrainer/yeargraph.py:69 -msgid "kilometers" -msgstr "" - -#: pytrainer/yeargraph.py:69 -msgid "monthly kilometers" -msgstr "" - -#: pytrainer/yeargraph.py:71 -msgid "time in hours" -msgstr "" - -#: pytrainer/yeargraph.py:71 -msgid "monthly time" -msgstr "" - -#: pytrainer/yeargraph.py:73 -msgid "beats per minute" -msgstr "" - -#: pytrainer/yeargraph.py:73 -msgid "monthly beats" -msgstr "" - -#: pytrainer/yeargraph.py:75 -msgid "average (hm/h)" -msgstr "" - -#: pytrainer/yeargraph.py:75 -msgid "monthly averages" -msgstr "" - -#: pytrainer/yeargraph.py:77 -msgid "calories" -msgstr "" - -#: pytrainer/yeargraph.py:77 -msgid "monthly calories" -msgstr "" - -#: pytrainer/gui/windowmain.py:49 pytrainer/gui/windowmain.py:52 -#: pytrainer/gui/windowmain.py:56 -msgid "id" -msgstr "" - -#: pytrainer/gui/windowmain.py:49 -msgid "Kilometer" -msgstr "" - -#: pytrainer/gui/windowmain.py:52 pytrainer/gui/windowmain.py:468 -msgid "Title" -msgstr "" - -#: pytrainer/gui/windowmain.py:52 pytrainer/gui/windowmain.py:469 -#: pytrainer/gui/dialogselecttrack.py:36 -msgid "Date" -msgstr "" - -#: pytrainer/gui/windowmain.py:52 pytrainer/gui/windowmain.py:470 -msgid "Distance" -msgstr "" - -#: pytrainer/gui/windowmain.py:52 pytrainer/gui/windowmain.py:472 -msgid "Time" -msgstr "" - -#: pytrainer/gui/windowmain.py:52 pytrainer/gui/windowmain.py:473 -msgid "Beats" -msgstr "" - -#: pytrainer/gui/windowmain.py:52 pytrainer/gui/windowmain.py:474 -msgid "Average" -msgstr "" - -#: pytrainer/gui/windowmain.py:56 -msgid "Waypoint" -msgstr "" - -#: pytrainer/gui/windowmain.py:196 -msgid "Percentages method" -msgstr "" - -#: pytrainer/gui/windowplugins.py:70 pytrainer/gui/windowplugins.py:97 -#: pytrainer/gui/windowextensions.py:70 -msgid "Enable" -msgstr "" - -#: pytrainer/gui/windowplugins.py:72 pytrainer/gui/windowplugins.py:96 -#: pytrainer/gui/windowextensions.py:72 -msgid "Disable" -msgstr "" - -#: pytrainer/gui/windowplugins.py:81 pytrainer/gui/windowextensions.py:81 -#, python-format -msgid "%s settings" -msgstr "" - -#: pytrainer/gui/windowplugins.py:104 -msgid "Ok" -msgstr "" - -#: pytrainer/gui/windowextensions.py:104 pytrainer/gui/windowextensions.py:117 -msgid "OK" -msgstr "" - -#: pytrainer/gui/windowprofile.py:49 -msgid "Male" -msgstr "" - -#: pytrainer/gui/windowprofile.py:50 -msgid "Female" -msgstr "" - -#: pytrainer/gui/windowprofile.py:67 -msgid "MET" -msgstr "" - -#: pytrainer/gui/dialogselecttrack.py:36 -msgid "Track Name" -msgstr "" - -#: pytrainer/daygraph.py:54 pytrainer/daygraph.py:56 pytrainer/daygraph.py:58 -#: pytrainer/heartrategraph.py:33 pytrainer/recordgraph.py:72 -#: pytrainer/recordgraph.py:74 pytrainer/recordgraph.py:76 -#: pytrainer/recordgraph.py:78 -msgid "Distance (km)" -msgstr "" - -#: pytrainer/daygraph.py:54 pytrainer/recordgraph.py:72 -msgid "Height (m)" -msgstr "" - -#: pytrainer/daygraph.py:54 pytrainer/recordgraph.py:72 -msgid "Stage Profile" -msgstr "" - -#: pytrainer/daygraph.py:56 -msgid "Velocity (Km/h)" -msgstr "" - -#: pytrainer/daygraph.py:56 -msgid "Velocity" -msgstr "" - -#: pytrainer/daygraph.py:58 pytrainer/heartrategraph.py:33 -#: pytrainer/recordgraph.py:78 -msgid "Beats (bpm)" -msgstr "" - -#: pytrainer/monthgraph.py:69 pytrainer/monthgraph.py:71 -#: pytrainer/monthgraph.py:73 pytrainer/monthgraph.py:75 -#: pytrainer/monthgraph.py:77 -msgid "day" -msgstr "" - -#: pytrainer/monthgraph.py:69 -msgid "Kilometers" -msgstr "" - -#: pytrainer/monthgraph.py:69 -msgid "Daily kilometers" -msgstr "" - -#: pytrainer/monthgraph.py:71 -msgid "Time in Hours" -msgstr "" - -#: pytrainer/monthgraph.py:71 -msgid "Daily Time" -msgstr "" - -#: pytrainer/monthgraph.py:73 -msgid "Beats per Minute" -msgstr "" - -#: pytrainer/monthgraph.py:73 -msgid "Daily Beats" -msgstr "" - -#: pytrainer/monthgraph.py:75 -msgid "Average (km/h)" -msgstr "" - -#: pytrainer/monthgraph.py:75 -msgid "Daily Averages" -msgstr "" - -#: pytrainer/monthgraph.py:77 -msgid "Daily Calories" -msgstr "" - -#: pytrainer/recordgraph.py:74 -msgid "Speed (Km/h)" -msgstr "" - -#: pytrainer/recordgraph.py:74 -msgid "Speed" -msgstr "" - -#: pytrainer/recordgraph.py:76 -msgid "Pace (min/km)" -msgstr "" - -#: pytrainer/recordgraph.py:76 -msgid "Pace" -msgstr "" - -#: pytrainer/record.py:207 -msgid "pyTrainer cant import data from your gpx file" -msgstr "" - -#: pytrainer/waypoint.py:67 -msgid "" -"The gpx file seems to be a several days records. Perhaps you will need to " -"edit your gpx file" -msgstr "" Deleted: pytrainer/trunk/locale/da/LC_MESSAGES/pytrainer_dk.pot =================================================================== --- pytrainer/trunk/locale/da/LC_MESSAGES/pytrainer_dk.pot 2010-01-06 21:47:54 UTC (rev 471) +++ pytrainer/trunk/locale/da/LC_MESSAGES/pytrainer_dk.pot 2010-01-08 18:43:31 UTC (rev 472) @@ -1,806 +0,0 @@ -# translation of pytrainer_dk.po to Dansk -# Danish translations for pytrainer package. -# Copyright (C) 2007 THE pytrainer'S COPYRIGHT HOLDER -# This file is distributed under the same license as the pytrainer package. -# -# Lars Olesen <ole...@gm...>, 2007. -msgid "" -msgstr "" -"Project-Id-Version: pytrainer_dk\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2007-12-09 23:06+0100\n" -"PO-Revision-Date: 2007-12-20 21:02+0100\n" -"Last-Translator: Lars Olesen <ole...@gm...>\n" -"Language-Team: Dansk\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-Generator: KBabel 1.11.4\n" - -#: glade/pytrainer.glade:10 -msgid "window1" -msgstr "Vindue1" - -#: glade/pytrainer.glade:50 -msgid "_File" -msgstr "Fil" - -#: glade/pytrainer.glade:74 -msgid "_Export as text separated by commas" -msgstr "Eksporteret som tekst adskilt af kommaer" - -#: glade/pytrainer.glade:114 -msgid "_Edit" -msgstr "Rediger" - -#: glade/pytrainer.glade:136 -msgid "_View" -msgstr "Billede" - -#: glade/pytrainer.glade:145 -msgid " _Classic View" -msgstr "Klassisk billede" - -#: glade/pytrainer.glade:156 -msgid " _List View" -msgstr "Liste billede" - -#: glade/pytrainer.glade:168 -msgid " _Waypoints Editor View" -msgstr "Waypoint redigerings billede" - -#: glade/pytrainer.glade:184 -msgid "Tools" -msgstr "Værktøjer" - -#: glade/pytrainer.glade:194 -msgid "Extensions" -msgstr "Udvidelser" - -#: glade/pytrainer.glade:204 -msgid "Gps Device Plugins" -msgstr "GPS udstyrs plugins" - -#: glade/pytrainer.glade:218 -msgid "_Help" -msgstr "Hjælp" - -#: glade/pytrainer.glade:338 glade/pytrainer.glade:4810 -#: pytrainer/gui/windowmain.py:49 pytrainer/gui/windowmain.py:52 -#: pytrainer/gui/windowmain.py:378 -msgid "Sport" -msgstr "Sport" - -#: glade/pytrainer.glade:364 -msgid "All Sports" -msgstr "Alle sportsgrene" - -#: glade/pytrainer.glade:472 glade/pytrainer.glade:1658 -#: glade/pytrainer.glade:2414 glade/pytrainer.glade:3125 -msgid "<b>Beats avg:</b>" -msgstr "Hjerteslag" - -#: glade/pytrainer.glade:522 -msgid " bpm" -msgstr "puls" - -#: glade/pytrainer.glade:550 glade/pytrainer.glade:1630 -#: glade/pytrainer.glade:2386 glade/pytrainer.glade:3097 -msgid "<b>Time:</b>" -msgstr "Tid" - -#: glade/pytrainer.glade:578 glade/pytrainer.glade:1602 -#: glade/pytrainer.glade:2358 glade/pytrainer.glade:3069 -msgid "<b>Distance:</b>" -msgstr "Distance" - -#: glade/pytrainer.glade:632 glade/pytrainer.glade:677 -#: glade/pytrainer.glade:1903 glade/pytrainer.glade:1948 -#: glade/pytrainer.glade:2659 glade/pytrainer.glade:2704 -#: glade/pytrainer.glade:3370 glade/pytrainer.glade:3415 -#: glade/pytrainer.glade:5178 glade/pytrainer.glade:5223 -msgid ":" -msgstr ":" - -#: glade/pytrainer.glade:782 -msgid " Km" -msgstr "km" - -#: glade/pytrainer.glade:810 glade/pytrainer.glade:1714 -#: glade/pytrainer.glade:2470 glade/pytrainer.glade:3181 -msgid "<b>Calories: </b>" -msgstr "Kalorier" - -#: glade/pytrainer.glade:860 -msgid " Cal" -msgstr "Kal" - -#: glade/pytrainer.glade:888 glade/pytrainer.glade:1686 -#: glade/pytrainer.glade:2442 glade/pytrainer.glade:3153 -msgid "<b>Average:</b>" -msgstr "Gennemsnit" - -#: glade/pytrainer.glade:938 -msgid " km/h" -msgstr "km/t" - -#: glade/pytrainer.glade:1005 -msgid "<b>Comments:</b>" -msgstr "Kommentarer" - -#: glade/pytrainer.glade:1059 glade/pytrainer.glade:5484 -msgid "<b>Positive:</b>" -msgstr "Positive" - -#: glade/pytrainer.glade:1103 glade/pytrainer.glade:5528 -msgid "<b>Negative:</b>" -msgstr "Negative" - -#: glade/pytrainer.glade:1151 glade/pytrainer.glade:5576 -msgid " <b>Accumulated Unevenness:</b> " -msgstr "Akkumuleret højdeforskel" - -#: glade/pytrainer.glade:1297 -msgid " <b>Title:</b>" -msgstr "Titel" - -#: glade/pytrainer.glade:1386 glade/pytrainer.glade:2185 -#: glade/pytrainer.glade:2941 glade/pytrainer.glade:3652 -msgid "Value" -msgstr "Værdi" - -#: glade/pytrainer.glade:1411 glade/pytrainer.glade:2210 -msgid "" -"Stage Profile\n" -"Stage Velocity\n" -"Stage Profile/velocity" -msgstr "" -"Træningspas Højdekurve\n" -"Træningspas Hastighed\n" -"Træningpas Højdekurve / Hastighed" - -#: glade/pytrainer.glade:1543 -msgid "Record" -msgstr "Data sæt" - -#: glade/pytrainer.glade:1742 glade/pytrainer.glade:2498 -#: glade/pytrainer.glade:3209 -msgid "Km" -msgstr "Km" - -#: glade/pytrainer.glade:1770 glade/pytrainer.glade:2526 -#: glade/pytrainer.glade:3237 -msgid "bpm" -msgstr "puls" - -#: glade/pytrainer.glade:1798 glade/pytrainer.glade:2554 -#: glade/pytrainer.glade:3265 -msgid "km/h" -msgstr "km/t" - -#: glade/pytrainer.glade:1826 glade/pytrainer.glade:2582 -#: glade/pytrainer.glade:3293 -msgid "Cal" -msgstr "Kal" - -#: glade/pytrainer.glade:2110 -msgid " <b>Date:</b>" -msgstr "Dato" - -#: glade/pytrainer.glade:2299 -msgid "Day" -msgstr "Dag" - -#: glade/pytrainer.glade:2759 glade/pytrainer.glade:4751 -msgid " " -msgstr " " - -#: glade/pytrainer.glade:2866 -msgid " <b>Month:</b>" -msgstr "Måned" - -#: glade/pytrainer.glade:2966 glade/pytrainer.glade:3677 -msgid "" -"Kilometers\n" -"Time\n" -"Beats\n" -"Average\n" -"Calories" -msgstr "" -"Kilometern " -"Tid\n" -"Hjerteslag\n" -"Gennemsnit\n" -"Kalorier" - -#: glade/pytrainer.glade:3010 -msgid "Month" -msgstr "Måned" - -#: glade/pytrainer.glade:3354 -msgid "999" -msgstr "999" - -#: glade/pytrainer.glade:3577 -msgid " <b>Year:</b>" -msgstr "<b>År</b>" - -#: glade/pytrainer.glade:3721 -msgid "Year" -msgstr "År" - -#: glade/pytrainer.glade:3764 -msgid "label154" -msgstr "mærkat154" - -#: glade/pytrainer.glade:3801 -msgid "<b>Title:</b>" -msgstr "<b>Titel:</b>" - -#: glade/pytrainer.glade:3846 -msgid "Search" -msgstr "Søg" - -#: glade/pytrainer.glade:3893 -msgid "Columns" -msgstr "Kolonner" - -#: glade/pytrainer.glade:3968 -msgid "label155" -msgstr "mærkat155" - -#: glade/pytrainer.glade:4145 -msgid " <b>Name:</b>" -msgstr " <b>Navn:</b>" - -#: glade/pytrainer.glade:4173 -msgid " <b>Description:</b>" -msgstr " <b>Beskrivelse</b>" - -#: glade/pytrainer.glade:4201 -msgid " <b>Latitude: </b>" -msgstr " <b>Breddegrad:</b>" - -#: glade/pytrainer.glade:4229 -msgid " <b>Longitude:</b>" -msgstr " <b>Længdegrad:</b>" - -#: glade/pytrainer.glade:4257 -msgid " <b>Type:</b>" -msgstr " <b>Type:</b>" - -#: glade/pytrainer.glade:4329 -msgid "" -"Font\n" -"Restaurant\n" -"Scenic Area\n" -"Summit" -msgstr "" -"Font\n" -"Restaurant\n" -"Naturskønt område\n" -"Møde" - -#: glade/pytrainer.glade:4354 -msgid "<b> Waypoint: </b>" -msgstr "<b> Waypoint: </b>" - -#: glade/pytrainer.glade:4439 -msgid "label-2147483648" -msgstr "mærkat-2147483648" - -#: glade/pytrainer.glade:4487 -msgid "label162" -msgstr "mærkat162" - -#: glade/pytrainer.glade:4627 -msgid "label163" -msgstr "mærkat163" - -#: glade/pytrainer.glade:4652 glade/pytrainer.glade:5684 -msgid "New Entry" -msgstr "Nyt data sæt" - -#: glade/pytrainer.glade:4700 pytrainer/gui/windowmain.py:52 -#: pytrainer/gui/windowmain.py:376 pytrainer/gui/dialogselecttrack.py:36 -msgid "Date" -msgstr "Dato" - -#: glade/pytrainer.glade:4865 pytrainer/gui/windowmain.py:52 -#: pytrainer/gui/windowmain.py:375 -msgid "Title" -msgstr "Titel" - -#: glade/pytrainer.glade:4923 -msgid "GPX file" -msgstr "GPX fil" - -#: glade/pytrainer.glade:4985 -msgid "Calculate Values" -msgstr "Beregn værdier" - -#: glade/pytrainer.glade:5018 -msgid "Beats avg (bpm)" -msgstr "Gennemsnitlig puls " - -#: glade/pytrainer.glade:5074 -msgid "Distance (Km)" -msgstr "Afstand (km)" - -#: glade/pytrainer.glade:5124 pytrainer/gui/windowmain.py:52 -#: pytrainer/gui/windowmain.py:379 -msgid "Time" -msgstr "Tid" - -#: glade/pytrainer.glade:5278 -msgid "Average (km/h)" -msgstr "Gennemsnit (km/t)" - -#: glade/pytrainer.glade:5328 -msgid "Calculate Distance" -msgstr "Beregn distance" - -#: glade/pytrainer.glade:5348 -msgid "Calculate Time" -msgstr "Beregn tid" - -#: glade/pytrainer.glade:5368 -msgid "Calculate Average" -msgstr "Beregn gennemsnit" - -#: glade/pytrainer.glade:5409 pytrainer/gui/windowmain.py:382 -msgid "Calories" -msgstr "Kalorier" - -#: glade/pytrainer.glade:5615 -msgid "<b>Comments</b>" -msgstr "<b>Kommentarer</b>" - -#: glade/pytrainer.glade:5789 glade/pytrainer.glade:6083 -msgid "Profile" -msgstr "Profil" - -#: glade/pytrainer.glade:5835 -msgid "Name" -msgstr "Navn" - -#: glade/pytrainer.glade:5863 -msgid "Gender" -msgstr "Køn" - -#: glade/pytrainer.glade:5891 -msgid "Weight" -msgstr "Vægt" - -#: glade/pytrainer.glade:5919 -msgid "Height" -msgstr "Højde" - -#: glade/pytrainer.glade:6010 -msgid "Age" -msgstr "Alder" - -#: glade/pytrainer.glade:6113 -msgid "<b>Database</b>" -msgstr "<b>Database</b>" - -#: glade/pytrainer.glade:6147 -msgid "Database Type" -msgstr "Database Type" - -#: glade/pytrainer.glade:6175 -msgid "Database Host" -msgstr "Database Host" - -#: glade/pytrainer.glade:6224 -msgid "Database Pass" -msgstr "Database Password" - -#: glade/pytrainer.glade:6273 -msgid "Database User " -msgstr "Database Brugernavn " - -#: glade/pytrainer.glade:6322 -msgid "Database Name" -msgstr "Database Navn" - -#: glade/pytrainer.glade:6403 -msgid "Database" -msgstr "Database" - -#: glade/pytrainer.glade:6441 -msgid "<b>Sport list</b>" -msgstr "<b>Liste over sportsgrene</b>" - -#: glade/pytrainer.glade:6592 -msgid "llist" -msgstr "Liste" - -#: glade/pytrainer.glade:6621 -msgid "<b>Add new Sport</b>" -msgstr "<b>Tilføj ny Sportsgren</b>" - -#: glade/pytrainer.glade:6781 -msgid "new" -msgstr "ny" - -#: glade/pytrainer.glade:6816 -msgid "<b>Delete sport</b>" -msgstr "<b>Slet sportsgren</b>" - -#: glade/pytrainer.glade:6879 -msgid "" -"You are going to remove a sport. When you delete a \n" -"sport you delete the records asociated. Are you sure \n" -"that you want do it?" -msgstr "" -"Du er ved at fjerne en sportsgren. Når du sletter en\n" -"sportsgrenså sletter du de tilhørende data sæt. Er du sikker\\ " -"på at du ønsker dette ?" - -#: glade/pytrainer.glade:7016 -msgid "delete" -msgstr "Slet" - -#: glade/pytrainer.glade:7051 -msgid "<b>Edit sport</b>" -msgstr "<b>Rediger sportsgren</b>" - -#: glade/pytrainer.glade:7114 -msgid "New name" -msgstr "Nyt navn" - -#: glade/pytrainer.glade:7243 -msgid "edit" -msgstr "Rediger" - -#: glade/pytrainer.glade:7272 -msgid "Sports" -msgstr "Sportsgrene" - -#: glade/pytrainer.glade:7377 -msgid "Calendar" -msgstr "Kalender" - -#: glade/pytrainer.glade:7503 -msgid "pytrainer" -msgstr "pytrainer" - -#: glade/pytrainer.glade:7504 -msgid "(c) Fiz Vazquez <vu...@si...>" -msgstr "(c) Fiz Vazquez <vu...@si...>" - -#: glade/pytrainer.glade:7505 -msgid "The free sport trainning center" -msgstr "Det frie sports trænings center" - -#: glade/pytrainer.glade:7506 -msgid "" -"(C) Fiz Vazquez\n" -"\n" -" This program is free software; you can redistribute \n" -" it and/or modify it under the terms of the GNU \n" -" General Public License as published by the Free \n" -" Software Foundation; either version 2 of the License, \n" -" or (at your option) any later version.\n" -"\n" -" This program is distributed in the hope that it will be \n" -" useful, but WITHOUT ANY WARRANTY; without even the\n" -" implied warranty of MERCHANTABILITY or FITNESS FOR \n" -" A PARTICULAR PURPOSE. See the GNU General Public \n" -" License <http://www.opensource.org/gpl-license.html>\n" -" for more details.\n" -"\n" -" You can found the license on Debian systems in the file\n" -" /usr/share/common-licenses/GPL\n" -msgstr "" -"(C) Fiz Vazquez\n" -"\n" -" Dette program er fri software; Du må videredistribuere\n" -" det og/eller ændre det under betingelserne fra GNU \n" -" General Public License som den er publiceret af \"the Free \n" -" Software Foundation\"; enten version 2 af licensen, \n" -" eller (hvis du ønsker det) en hvilken som helst senere version.\n" -"\n" -" Dette program er distribueret med håbet om at det vil \n" -" være brugbart, men UDEN NOGEN GARANTI; uden selv den \n" -" implicitte garanti for SALGBARHED eller EGNETHED tIL\n " -"ET GIVET SPECIFIKT FORMÅL. Se GNU General Public \n" -" License <http://www.opensource.org/gpl-license.html>\n" -" for yderligere detaljer.\n" -"\n" -" Du kan finde licensen på Debian systemer i filen\n" -" /usr/share/common-licenses/GPL\n" - -#: glade/pytrainer.glade:7526 -msgid "pytrainer.e-oss.net" -msgstr "pytrainer.e-oss.net" - -#: glade/pytrainer.glade:7528 -msgid "" -"Catalan: Eloi Crespillo Itchart <el...@ik...>\n" -"Czech: Lobus Pokorny <sp...@se...>\n" -"French: Dj <dj...@dj...>\n" -"Norwegian: Havard Davidsen <hav...@gm...>\n" -"Polish: Seweryn Kokot <sk...@po...>\n" -"german: Aleks <al...@sc...>\n" -"Spanish: Fiz vazquez <vu...@si...>" -msgstr "" -"Katalansk: Eloi Crespillo Itchart <el...@ik...>\n" -"Tjekkisk: Lobus Pokorny <sp...@se...>\n" -"Fransk: Dj <dj...@dj...>\n" -"Norsk: Havard Davidsen <hav...@gm...>\n" -"Polsk: Seweryn Kokot <sk...@po...>\n" -"Tysk: Aleks <al...@sc...>\n" -"Spansk: Fiz vazquez <vu...@si...> " -"Dansk<ikke opgivet>" - -#: glade/pytrainer.glade:7619 -msgid "Edit Record" -msgstr "Rediger data sæt" - -#: glade/pytrainer.glade:7640 -msgid "Show graph in classic view" -msgstr "Vis graf i klassisk billede" - -#: glade/pytrainer.glade:7676 -msgid "warning" -msgstr "Advarsel" - -#: glade/pytrainer.glade:7802 -msgid "window2" -msgstr "Vindue2" - -#: glade/pytrainer.glade:7878 glade/pytrainer.glade:8228 -msgid "<b>Name:</b>" -msgstr "<b>Navn:</b>" - -#: glade/pytrainer.glade:7906 glade/pytrainer.glade:8256 -msgid "<b>Description:</b>" -msgstr "<b>Beskrivelse:</b>" - -#: glade/pytrainer.glade:7934 glade/pytrainer.glade:8284 -msgid "<b>Status:</b>" -msgstr "<b>Status:</b>" - -#: glade/pytrainer.glade:7962 -msgid "name-entry" -msgstr "Navne-indtastning" - -#: glade/pytrainer.glade:7990 glade/pytrainer.glade:8340 -msgid "description-entry" -msgstr "Beskrivelses indtastning" - -#: glade/pytrainer.glade:8018 glade/pytrainer.glade:8368 -msgid "status-entry" -msgstr "status-indtastning" - -#: glade/pytrainer.glade:8153 -msgid "Plugins" -msgstr "Plugins" - -#: glade/pytrainer.glade:8312 -msgid "nameEntry" -msgstr "navneIndtastning" - -#: glade/pytrainer.glade:8511 -msgid "Select track record" -msgstr "Vælg track data sæt" - -#: pytrainer/main.py:90 -msgid "No Active Plugins" -msgstr "Ingen aktive plugins" - -#: pytrainer/main.py:99 -msgid "No Active Extensions" -msgstr "Ingen aktive udvidelser" - -#: pytrainer/main.py:208 -msgid "You are going to remove one database entry. Are you sure yo want do it?" -msgstr "Du er ved at fjerne en database post. Er du sikker på at du vil gøre det ?" - -#: pytrainer/main.py:219 -msgid "You are going to remove one waypoint. Are you sure yo want do it?" -msgstr "Du er ved at fjerne et waypoint. Er du sikker på at du vil gøre det?" - -#: pytrainer/lib/date.py:72 -msgid "January" -msgstr "Januar" - -#: pytrainer/lib/date.py:73 -msgid "Febrary" -msgstr "Februar" - -#: pytrainer/lib/date.py:74 -msgid "March" -msgstr "Marts" - -#: pytrainer/lib/date.py:75 -msgid "April" -msgstr "April" - -#: pytrainer/lib/date.py:76 -msgid "May" -msgstr "Maj" - -#: pytrainer/lib/date.py:77 -msgid "June" -msgstr "Juni" - -#: pytrainer/lib/date.py:78 -msgid "July" -msgstr "Juli" - -#: pytrainer/lib/date.py:79 -msgid "August" -msgstr "August" - -#: pytrainer/lib/date.py:80 -msgid "September" -msgstr "September" - -#: pytrainer/lib/date.py:81 -msgid "October" -msgstr "Oktober" - -#: pytrainer/lib/date.py:82 -msgid "November" -msgstr "November" - -#: pytrainer/lib/date.py:83 -msgid "December" -msgstr "December" - -#: pytrainer/yeargraph.py:37 pytrainer/yeargraph.py:39 -#: pytrainer/yeargraph.py:41 pytrainer/yeargraph.py:43 -#: pytrainer/yeargraph.py:45 -msgid "month" -msgstr "måned" - -#: pytrainer/yeargraph.py:37 pytrainer/monthgraph.py:37 -msgid "kilometers" -msgstr "kilometer" - -#: pytrainer/yeargraph.py:37 -msgid "monthly kilometers" -msgstr "kilometer pr. måned" - -#: pytrainer/yeargraph.py:39 pytrainer/monthgraph.py:39 -msgid "time in hours" -msgstr "Tid i timer" - -#: pytrainer/yeargraph.py:39 -msgid "monthly time" -msgstr "Timer pr. måned" - -#: pytrainer/yeargraph.py:41 pytrainer/monthgraph.py:41 -msgid "beats per minute" -msgstr "Slag pr. minut" - -#: pytrainer/yeargraph.py:41 -msgid "monthly beats" -msgstr "Slag pr. måned" - -#: pytrainer/yeargraph.py:43 pytrainer/monthgraph.py:43 -msgid "average (hm/h)" -msgstr "gennemsnit (?/t)" - -#: pytrainer/yeargraph.py:43 -msgid "monthly averages" -msgstr "Månedlige gennemsnit" - -#: pytrainer/yeargraph.py:45 pytrainer/monthgraph.py:45 -msgid "calories" -msgstr "kalorier" - -#: pytrainer/yeargraph.py:45 -msgid "monthly calories" -msgstr "Kalorier pr. måned" - -#: pytrainer/gui/windowmain.py:49 pytrainer/gui/windowmain.py:52 -#: pytrainer/gui/windowmain.py:56 -msgid "id" -msgstr "id" - -#: pytrainer/gui/windowmain.py:49 -msgid "Kilometer" -msgstr "Kilometer" - -#: pytrainer/gui/windowmain.py:52 pytrainer/gui/windowmain.py:377 -msgid "Distance" -msgstr "Distance" - -#: pytrainer/gui/windowmain.py:52 pytrainer/gui/windowmain.py:380 -msgid "Beats" -msgstr "Slag" - -#: pytrainer/gui/windowmain.py:52 pytrainer/gui/windowmain.py:381 -msgid "Average" -msgstr "Gennemsnit" - -#: pytrainer/gui/windowmain.py:56 -msgid "Waypoint" -msgstr "Waypoint" - -#: pytrainer/gui/windowplugins.py:72 pytrainer/gui/windowextensions.py:70 -msgid "Active" -msgstr "Aktiv" - -#: pytrainer/gui/windowplugins.py:74 pytrainer/gui/windowextensions.py:72 -msgid "unActive" -msgstr "ikke-aktiv" - -#: pytrainer/gui/windowplugins.py:83 pytrainer/gui/windowextensions.py:81 -#, python-format -msgid "%s settings" -msgstr "%s settings" - -#: pytrainer/gui/windowplugins.py:106 pytrainer/gui/windowextensions.py:104 -#: pytrainer/gui/windowextensions.py:117 -msgid "Ok" -msgstr "Ok" - -#: pytrainer/gui/dialogselecttrack.py:36 -msgid "Track Name" -msgstr "Track Navn" - -#: pytrainer/daygraph.py:48 pytrainer/daygraph.py:50 -#: pytrainer/recordgraph.py:48 pytrainer/recordgraph.py:50 -msgid "Distance (km)" -msgstr "Distance (km)" - -#: pytrainer/daygraph.py:48 pytrainer/recordgraph.py:48 -msgid "Height (m)" -msgstr "Højde (m)" - -#: pytrainer/daygraph.py:48 pytrainer/recordgraph.py:48 -msgid "Stage Profile" -msgstr "Træningspas fart profil" - -#: pytrainer/daygraph.py:50 pytrainer/recordgraph.py:50 -msgid "Velocity (Km/h)" -msgstr "Hastighed (Km/t)" - -#: pytrainer/daygraph.py:50 pytrainer/recordgraph.py:50 -msgid "velocity" -msgstr "hastighed" - -#: pytrainer/monthgraph.py:37 pytrainer/monthgraph.py:39 -#: pytrainer/monthgraph.py:41 pytrainer/monthgraph.py:43 -#: pytrainer/monthgraph.py:45 -msgid "day" -msgstr "dag" - -#: pytrainer/monthgraph.py:37 -msgid "daily kilometers" -msgstr "kilometer pr. dag" - -#: pytrainer/monthgraph.py:39 -msgid "daily time" -msgstr "tid pr. dag" - -#: pytrainer/monthgraph.py:41 -msgid "daily beats" -msgstr "slag pr. dag" - -#: pytrainer/monthgraph.py:43 -msgid "daily averages" -msgstr "daglige gennemsnit" - -#: pytrainer/monthgraph.py:45 -msgid "daily calories" -msgstr "kalorier pr. dag" - -#: pytrainer/record.py:190 -msgid "" -"The gpx file seems to have several track records. Press cancel to select a " -"track record. Press Ok to load all of them as a single track record." -msgstr "gpx filen ser ud til at indeholde flere track data sæt. Tryk fortryd for at vælge et track datasæt; Tryk Ok for at hente dem alle som et enkelt track datasæt." - -#: pytrainer/waypoint.py:67 -msgid "" -"The gpx file seems to be a several days records. Perhaps you will need to " -"edit your gpx file" -msgstr "gpx filen ser ud til at indeholde data sæt for flere dage. Måske bliver du nødt til at redigere din gpx fil." - Deleted: pytrainer/trunk/locale/de/LC_MESSAGES/pytrainer_de.pot =================================================================== --- pytrainer/trunk/locale/de/LC_MESSAGES/pytrainer_de.pot 2010-01-06 21:47:54 UTC (rev 471) +++ pytrainer/trunk/locale/de/LC_MESSAGES/pytrainer_de.pot 2010-01-08 18:43:31 UTC (rev 472) @@ -1,1192 +0,0 @@ -# German translations for vud package. -# Copyright (C) 2008 THE vud'S COPYRIGHT HOLDER -# This file is distributed under the same license as the vud package. -# Fiz Vazquez <vu...@si...>, 2008. -# -msgid "" -msgstr "" -"Project-Id-Version: vud 1\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-03-03 19:57+0100\n" -"PO-Revision-Date: 2008-03-03 19:57+0100\n" -"Last-Translator: Fiz Vazquez <vu...@si...>\n" -"Language-Team: German\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" - -#: glade/pytrainer.glade:10 -msgid "window1" -msgstr "" - -#: glade/pytrainer.glade:50 -msgid "_File" -msgstr "" - -#: glade/pytrainer.glade:74 -msgid "_Export as Text Separated by Commas" -msgstr "" - -#: glade/pytrainer.glade:114 -msgid "_Edit" -msgstr "" - -#: glade/pytrainer.glade:136 -msgid "_View" -msgstr "" - -#: glade/pytrainer.glade:145 -msgid " _Classic View" -msgstr "" - -#: glade/pytrainer.glade:156 -msgid " _List View" -msgstr "" - -#: glade/pytrainer.glade:168 -msgid " _Waypoints Editor" -msgstr "" - -#: glade/pytrainer.glade:184 -msgid "Tools" -msgstr "" - -#: glade/pytrainer.glade:194 glade/pytrainer.glade:12298 -msgid "Extensions" -msgstr "" - -#: glade/pytrainer.glade:204 -msgid "GPS Device Plugins" -msgstr "" - -#: glade/pytrainer.glade:218 -msgid "_Help" -msgstr "" - -#: glade/pytrainer.glade:338 pytrainer/gui/windowmain.py:49 -#: pytrainer/gui/windowmain.py:52 pytrainer/gui/windowmain.py:471 -#: pytrainer/gui/windowprofile.py:67 -msgid "Sport" -msgstr "" - -#: glade/pytrainer.glade:364 -msgid "All Sports" -msgstr "" - -#: glade/pytrainer.glade:473 glade/pytrainer.glade:838 -#: glade/pytrainer.glade:866 -msgid " " -msgstr "" - -#: glade/pytrainer.glade:501 glade/pytrainer.glade:894 -msgid " " -msgstr "" - -#: glade/pytrainer.glade:529 -msgid "<b>Sport:</b>" -msgstr "" - -#: glade/pytrainer.glade:557 glade/pytrainer.glade:2996 -#: glade/pytrainer.glade:4124 glade/pytrainer.glade:5419 -msgid "<b>Time:</b>" -msgstr "" - -#: glade/pytrainer.glade:586 glade/pytrainer.glade:3193 -#: glade/pytrainer.glade:4294 glade/pytrainer.glade:5643 -msgid "<b>Speed:</b>" -msgstr "" - -#: glade/pytrainer.glade:614 glade/pytrainer.glade:3502 -#: glade/pytrainer.glade:4658 glade/pytrainer.glade:5813 -msgid "<b>Pace:</b>" -msgstr "" - -#: glade/pytrainer.glade:642 -msgid "<b>Ascent:</b>" -msgstr "" - -#: glade/pytrainer.glade:670 -msgid "<b>Comments:</b>" -msgstr "" - -#: glade/pytrainer.glade:698 glade/pytrainer.glade:1381 -#: glade/pytrainer.glade:3249 glade/pytrainer.glade:3306 -#: glade/pytrainer.glade:4350 glade/pytrainer.glade:4519 -#: glade/pytrainer.glade:5699 glade/pytrainer.glade:5727 -msgid "km/h" -msgstr "" - -#: glade/pytrainer.glade:726 glade/pytrainer.glade:1091 -#: glade/pytrainer.glade:3530 glade/pytrainer.glade:3586 -#: glade/pytrainer.glade:4714 glade/pytrainer.glade:4742 -#: glade/pytrainer.glade:5870 glade/pytrainer.glade:5898 -msgid "min/km" -msgstr "" - -#: glade/pytrainer.glade:754 glade/pytrainer.glade:1147 -msgid "m" -msgstr "" - -#: glade/pytrainer.glade:782 -msgid " " -msgstr "" - -#: glade/pytrainer.glade:810 glade/pytrainer.glade:1119 -#: glade/pytrainer.glade:2042 glade/pytrainer.glade:2070 -#: glade/pytrainer.glade:2098 glade/pytrainer.glade:2266 -#: glade/pytrainer.glade:3698 glade/pytrainer.glade:4854 -msgid " " -msgstr "" - -#: glade/pytrainer.glade:922 -msgid "<b>Date:</b>" -msgstr "" - -#: glade/pytrainer.glade:950 glade/pytrainer.glade:2968 -#: glade/pytrainer.glade:4096 glade/pytrainer.glade:5391 -msgid "<b>Distance:</b>" -msgstr "" - -#: glade/pytrainer.glade:979 -msgid "<b>Max Speed</b>" -msgstr "" - -#: glade/pytrainer.glade:1007 glade/pytrainer.glade:3558 -#: glade/pytrainer.glade:4686 glade/pytrainer.glade:5842 -msgid "<b>Max Pace:</b>" -msgstr "" - -#: glade/pytrainer.glade:1035 -msgid "<b>Descent:</b>" -msgstr "" - -#: glade/pytrainer.glade:1063 -msgid " " -msgstr "" - -#: glade/pytrainer.glade:1213 glade/pytrainer.glade:2912 -#: glade/pytrainer.glade:4040 glade/pytrainer.glade:5615 -msgid "Km" -msgstr "" - -#: glade/pytrainer.glade:1246 glade/pytrainer.glade:1296 -#: glade/pytrainer.glade:1346 glade/pytrainer.glade:3030 -#: glade/pytrainer.glade:3080 glade/pytrainer.glade:3130 -#: glade/pytrainer.glade:4208 glade/pytrainer.glade:4258 -#: glade/pytrainer.glade:5503 glade/pytrainer.glade:5553 -msgid "00" -msgstr "" - -#: glade/pytrainer.glade:1271 glade/pytrainer.glade:1321 -#: glade/pytrainer.glade:3055 glade/pytrainer.glade:3105 -#: glade/pytrainer.glade:4183 glade/pytrainer.glade:4233 -#: glade/pytrainer.glade:5478 glade/pytrainer.glade:5528 -#: glade/pytrainer.glade:7648 glade/pytrainer.glade:7693 -msgid ":" -msgstr "" - -#: glade/pytrainer.glade:1415 glade/pytrainer.glade:2377 -#: glade/pytrainer.glade:2939 glade/pytrainer.glade:3221 -#: glade/pytrainer.glade:3362 glade/pytrainer.glade:3446 -#: glade/pytrainer.glade:3726 glade/pytrainer.glade:3754 -#: glade/pytrainer.glade:4067 glade/pytrainer.glade:4322 -#: glade/pytrainer.glade:4406 glade/pytrainer.glade:4602 -#: glade/pytrainer.glade:4882 glade/pytrainer.glade:5222 -#: glade/pytrainer.glade:5306 glade/pytrainer.glade:5362 -#: glade/pytrainer.glade:5671 glade/pytrainer.glade:5954 -#: glade/pytrainer.glade:5982 glade/pytrainer.glade:6010 -#: glade/pytrainer.glade:6038 -msgid " " -msgstr "" - -#: glade/pytrainer.glade:1522 -msgid " <b>Title:</b>" -msgstr "" - -#: glade/pytrainer.glade:1636 -msgid "" -"Profile\n" -"Speed\n" -"Pace\n" -"Heart Rate" -msgstr "" - -#: glade/pytrainer.glade:1655 glade/pytrainer.glade:5040 -#: glade/pytrainer.glade:6196 -msgid "Versus" -msgstr "" - -#: glade/pytrainer.glade:1680 -msgid "" -"None\n" -"Profile\n" -"Speed\n" -"Pace\n" -"Heart Rate\n" -msgstr "" - -#: glade/pytrainer.glade:1845 -msgid "<b>Beats:</b>" -msgstr "" - -#: glade/pytrainer.glade:1873 glade/pytrainer.glade:3334 -#: glade/pytrainer.glade:4378 glade/pytrainer.glade:5194 -msgid "<b>Calories: </b>" -msgstr "" - -#: glade/pytrainer.glade:1901 glade/pytrainer.glade:3614 -#: glade/pytrainer.glade:4798 glade/pytrainer.glade:5926 -msgid "<b>Max Beats:</b>" -msgstr "" - -#: glade/pytrainer.glade:1929 -msgid "<b>HR Zones Method:</b>" -msgstr "" - -#: glade/pytrainer.glade:1958 -msgid "<b>HR Zone5:</b>" -msgstr "" - -#: glade/pytrainer.glade:1986 glade/pytrainer.glade:2350 -msgid " bpm" -msgstr "" - -#: glade/pytrainer.glade:2014 -msgid " Cal" -msgstr "" - -#: glade/pytrainer.glade:2126 -msgid "<b>HR Zone4:</b>" -msgstr "" - -#: glade/pytrainer.glade:2154 -msgid "<b>HR Zone3:</b>" -msgstr "" - -#: glade/pytrainer.glade:2182 -msgid "<b>HR Zone2:</b>" -msgstr "" - -#: glade/pytrainer.glade:2210 -msgid "<b>HR Zone1:</b>" -msgstr "" - -#: glade/pytrainer.glade:2238 glade/pytrainer.glade:2294 -#: glade/pytrainer.glade:2322 glade/pytrainer.glade:3670 -#: glade/pytrainer.glade:4491 glade/pytrainer.glade:4826 -msgid " " -msgstr "" - -#: glade/pytrainer.glade:2405 glade/pytrainer.glade:2432 -#: glade/pytrainer.glade:2460 glade/pytrainer.glade:2488 -#: glade/pytrainer.glade:2516 glade/pytrainer.glade:3474 -#: glade/pytrainer.glade:3642 glade/pytrainer.glade:4630 -#: glade/pytrainer.glade:4770 glade/pytrainer.glade:5334 -#: glade/pytrainer.glade:5755 -msgid "bpm" -msgstr "" - -#: glade/pytrainer.glade:2544 -msgid " " -msgstr "" - -#: glade/pytrainer.glade:2582 -msgid " <b>Heart Rate:</b>" -msgstr "" - -#: glade/pytrainer.glade:2759 glade/pytrainer.glade:7010 -#: glade/pytrainer.glade:10877 -msgid "label-2147483648" -msgstr "" - -#: glade/pytrainer.glade:2797 -msgid "label-2147483647" -msgstr "" - -#: glade/pytrainer.glade:2853 -msgid "Record" -msgstr "" - -#: glade/pytrainer.glade:3278 glade/pytrainer.glade:4463 -#: glade/pytrainer.glade:5784 -msgid "<b>Max Speed:</b>" -msgstr "" - -#: glade/pytrainer.glade:3390 glade/pytrainer.glade:4434 -#: glade/pytrainer.glade:5250 -msgid "Cal" -msgstr "" - -#: glade/pytrainer.glade:3418 glade/pytrainer.glade:4574 -#: glade/pytrainer.glade:5278 -msgid "<b>Beats avg:</b>" -msgstr "" - -#: glade/pytrainer.glade:3792 -msgid " <b>Date:</b>" -msgstr "" - -#: glade/pytrainer.glade:3867 -msgid "Value" -msgstr "" - -#: glade/pytrainer.glade:3892 -msgid "" -"Stage Profile\n" -"Stage Velocity\n" -"Stage Profile/velocity" -msgstr "" - -#: glade/pytrainer.glade:3981 -msgid "Day" -msgstr "" - -#: glade/pytrainer.glade:4158 glade/pytrainer.glade:5453 -msgid "000" -msgstr "" - -#: glade/pytrainer.glade:4547 glade/pytrainer.glade:7846 -msgid " " -msgstr "" - -#: glade/pytrainer.glade:4920 -msgid " <b>Month:</b>" -msgstr "" - -#: glade/pytrainer.glade:5020 glade/pytrainer.glade:6176 -msgid "" -"Kilometers\n" -"Time\n" -"Beats\n" -"Average\n" -"Calories" -msgstr "" - -#: glade/pytrainer.glade:5065 glade/pytrainer.glade:6221 -msgid "" -"None\n" -"Kilometers\n" -"Time\n" -"Beats\n" -"Average\n" -"Calories" -msgstr "" - -#: glade/pytrainer.glade:5135 -msgid "Month" -msgstr "" - -#: glade/pytrainer.glade:6076 -msgid " <b>Year:</b>" -msgstr "" - -#: glade/pytrainer.glade:6291 -msgid "Year" -msgstr "" - -#: glade/pytrainer.glade:6334 -msgid "label154" -msgstr "" - -#: glade/pytrainer.glade:6371 -msgid "<b>Title:</b>" -msgstr "" - -#: glade/pytrainer.glade:6416 -msgid "Search" -msgstr "" - -#: glade/pytrainer.glade:6463 -msgid "Columns" -msgstr "" - -#: glade/pytrainer.glade:6538 -msgid "label155" -msgstr "" - -#: glade/pytrainer.glade:6672 -msgid "Type:" -msgstr "" - -#: glade/pytrainer.glade:6700 -msgid "" -"Font\n" -"Restaurant\n" -"Scenic Area\n" -"Summit" -msgstr "" - -#: glade/pytrainer.glade:6721 -msgid "Latitude: " -msgstr "" - -#: glade/pytrainer.glade:6749 -msgid " Name:" -msgstr "" - -#: glade/pytrainer.glade:6777 -msgid "Longitude:" -msgstr "" - -#: glade/pytrainer.glade:6805 glade/pytrainer.glade:12486 -#: glade/pytrainer.glade:12809 -msgid "Description:" -msgstr "" - -#: glade/pytrainer.glade:6925 -msgid "<b> Waypoint: </b>" -msgstr "" - -#: glade/pytrainer.glade:7058 -msgid "label162" -msgstr "" - -#: glade/pytrainer.glade:7198 -msgid "label163" -msgstr "" - -#: glade/pytrainer.glade:7223 -msgid "New Entry" -msgstr "" - -#: glade/pytrainer.glade:7296 -msgid "Title:" -msgstr "" - -#: glade/pytrainer.glade:7345 -msgid "GPX File:" -msgstr "" - -#: glade/pytrainer.glade:7415 -msgid "Calculate Values" -msgstr "" - -#: glade/pytrainer.glade:7434 -msgid "Sport:" -msgstr "" - -#: glade/pytrainer.glade:7485 -msgid "<b>Main</b>" -msgstr "" - -#: glade/pytrainer.glade:7546 -msgid "Distance (Km):" -msgstr "" - -#: glade/pytrainer.glade:7575 glade/pytrainer.glade:7772 -#: glade/pytrainer.glade:8053 glade/pytrainer.glade:8299 -#: glade/pytrainer.glade:8767 glade/pytrainer.glade:11515 -msgid "Calculate" -msgstr "" - -#: glade/pytrainer.glade:7594 -msgid "Time:" -msgstr "" - -#: glade/pytrainer.glade:7792 -msgid "Date:" -msgstr "" - -#: glade/pytrainer.glade:7912 glade/pytrainer.glade:11565 -msgid "<b>General</b>" -msgstr "" - -#: glade/pytrainer.glade:7973 -msgid "Max (km/h):" -msgstr "" - -#: glade/pytrainer.glade:8024 -msgid "Velocity (km/h)" -msgstr "" - -#: glade/pytrainer.glade:8099 -msgid "<b>Velocity</b>" -msgstr "" - -#: glade/pytrainer.glade:8135 -msgid "Quick Entry" -msgstr "" - -#: glade/pytrainer.glade:8195 -msgid "Max (min/km):" -msgstr "" - -#: glade/pytrainer.glade:8247 -msgid "Pace (min/km):" -msgstr "" - -#: glade/pytrainer.glade:8322 -msgid "<b>Pace</b>" -msgstr "" - -#: glade/pytrainer.glade:8383 -msgid "Ascent:" -msgstr "" - -#: glade/pytrainer.glade:8435 -msgid "Descent:" -msgstr "" - -#: glade/pytrainer.glade:8490 -msgid "<b>Accumulated Altitude Change</b>" -msgstr "" - -#: glade/pytrainer.glade:8551 -msgid "Max (bpm):" -msgstr "" - -#: glade/pytrainer.glade:8580 -msgid "Heart rate:" -msgstr "" - -#: glade/pytrainer.glade:8654 pytrainer/gui/windowmain.py:475 -#: pytrainer/monthgraph.py:77 -msgid "Calories" -msgstr "" - -#: glade/pytrainer.glade:8705 -msgid "" -"<small><b>Note:</b> In order to calculate the calories you must set the " -"sport MET (in Preferences->Sport) </small>" -msgstr "" - -#: glade/pytrainer.glade:8822 -msgid "<b>Heart Rate</b>" -msgstr "" - -#: glade/pytrainer.glade:8858 -msgid "Advanced" -msgstr "" - -#: glade/pytrainer.glade:8955 -msgid "<b>Comments</b>" -msgstr "" - -#: glade/pytrainer.glade:8984 -msgid "Comments" -msgstr "" - -#: glade/pytrainer.glade:9089 -msgid "Preferences" -msgstr "" - -#: glade/pytrainer.glade:9163 -msgid "Metric system" -msgstr "" - -#: glade/pytrainer.glade:9185 -msgid "U.S. customary units" -msgstr "" - -#: glade/pytrainer.glade:9211 -msgid "<b>System of Measurement</b>" -msgstr "" - -#: glad... [truncated message content] |
From: <jb...@us...> - 2010-01-06 21:48:01
|
Revision: 471 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=471&view=rev Author: jblance Date: 2010-01-06 21:47:54 +0000 (Wed, 06 Jan 2010) Log Message: ----------- Add GPX support to unified import Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowimportdata.py pytrainer/trunk/pytrainer/main.py Added Paths: ----------- pytrainer/trunk/import/file_gpxplus.py Added: pytrainer/trunk/import/file_gpxplus.py =================================================================== --- pytrainer/trunk/import/file_gpxplus.py (rev 0) +++ pytrainer/trunk/import/file_gpxplus.py 2010-01-06 21:47:54 UTC (rev 471) @@ -0,0 +1,145 @@ +# -*- coding: iso-8859-1 -*- + +#Copyright (C) Fiz Vazquez vu...@si... +# Modified by dgranda + +#This program is free software; you can redistribute it and/or +#modify it under the terms of the GNU General Public License +#as published by the Free Software Foundation; either version 2 +#of the License, or (at your option) any later version. + +#This program is distributed in the hope that it will be useful, +#but WITHOUT ANY WARRANTY; without even the implied warranty of +#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +#GNU General Public License for more details. + +#You should have received a copy of the GNU General Public License +#along with this program; if not, write to the Free Software +#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +import logging +import os +#import StringIO +from lxml import etree +import dateutil.parser +from dateutil.tz import * # for tzutc() + +#from pytrainer.lib.xmlUtils import XMLParser +#from pytrainer.gui.dialogs import fileChooserDialog, guiFlush +from pytrainer.lib.system import checkConf + +class gpxplus(): + def __init__(self, parent = None, data_path = None): + self.parent = parent + self.conf = checkConf() + self.tmpdir = self.conf.getValue("tmpdir") + self.main_data_path = data_path + self.data_path = os.path.dirname(__file__) + self.xmldoc = None + self.activitiesSummary = [] + + def getXmldoc(self): + ''' Function to return parsed xmlfile ''' + return self.xmldoc + + def getFileType(self): + return _("GPS eXchange file") + + def getActivitiesSummary(self): + return self.activitiesSummary + + def testFile(self, filename): + logging.debug('>>') + logging.debug("Testing " + filename) + #Check if file is a GPX + #try: + while True: + #parse as xml + xmldoc = etree.parse(filename) + #Parse XML schema + xmlschema_doc = etree.parse(self.main_data_path+"schemas/Topografix_gpx11.xsd") + xmlschema = etree.XMLSchema(xmlschema_doc) + if (xmlschema.validate(xmldoc)): + #Valid gpx file + self.xmldoc = xmldoc + startTime = self.getDateTime(self.startTimeFromFile(xmldoc)) + indatabase = self.inDatabase(xmldoc, startTime) + sport = self.getSport(xmldoc) + duration = self.getDetails(xmldoc, startTime) + distance = "" + self.activitiesSummary.append( (0, + indatabase, + startTime[1].strftime("%Y-%m-%dT%H:%M:%S"), + distance , + str(duration), + sport, + ) ) + return True + #except: + #Not gpx file + # return False + return False + + def getDateTime(self, time_): + # Time can be in multiple formats + # - zulu 2009-12-15T09:00Z + # - local ISO8601 2009-12-15T10:00+01:00 + if time_ is None or time_ == "": + return (None, None) + dateTime = dateutil.parser.parse(time_) + timezone = dateTime.tzname() + if timezone == 'UTC': #got a zulu time + local_dateTime = dateTime.astimezone(tzlocal()) #datetime with localtime offset (from OS) + else: + local_dateTime = dateTime #use datetime as supplied + utc_dateTime = dateTime.astimezone(tzutc()) #datetime with 00:00 offset + #print utc_dateTime, local_dateTime + return (utc_dateTime,local_dateTime) + + def inDatabase(self, tree, startTime): + #comparing date and start time (sport may have been changed in DB after import) + time = startTime + if time is None: + return False + time = time[0].strftime("%Y-%m-%dT%H:%M:%SZ") + if self.parent.parent.ddbb.select("records","*","date_time_utc=\"%s\"" % (time)): + return True + else: + return False + + def getDetails(self, tree, startTime): + root = tree.getroot() + #Get all times from file + times = root.findall(".//{http://www.topografix.com/GPX/1/1}time") + time = times[-1].text + return self.getDateTime(time)[0]-startTime[0] + + def getSport(self, tree): + #No sport in GPX file + return None + + def startTimeFromFile(self, tree): + """ Function to return the first time element from a GPX 1.1 file """ + root = tree.getroot() + timeElement = root.find(".//{http://www.topografix.com/GPX/1/1}time") + if timeElement is not None: + return timeElement.text + return None + + def getGPXFile(self, ID): + """ + Generate GPX file based on activity ID + + Returns (sport, GPX filename) + """ + sport = None + gpxFile = None + if ID == "0": #Only one activity in file + gpxFile = "%s/gpx-%s.gpx" % (self.tmpdir, ID) + sport = self.getSport(self.xmldoc) + self.createGPXfile(gpxFile, self.xmldoc) + return sport, gpxFile + + def createGPXfile(self, gpxfile, tree): + tree.write(gpxfile, xml_declaration=True) + Modified: pytrainer/trunk/pytrainer/gui/windowimportdata.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowimportdata.py 2010-01-06 09:53:15 UTC (rev 470) +++ pytrainer/trunk/pytrainer/gui/windowimportdata.py 2010-01-06 21:47:54 UTC (rev 471) @@ -144,7 +144,7 @@ else: info = gtk.Label(_("This tool was not found on the system") ) info.set_alignment(0,0.5) - location = gtk.LinkButton(toolClass.getSourceLocation(), _("Tool Homepage")) + location = gtk.LinkButton(toolClass.getSourceLocation(), toolName +_(" Homepage")) info.set_sensitive(0) toolTable.attach(info, 0, 1, 0, 1, xoptions=gtk.EXPAND|gtk.FILL, xpadding=5) toolTable.attach(location, 1, 2, 0, 1, xoptions=gtk.EXPAND|gtk.FILL, xpadding=5) Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-01-06 09:53:15 UTC (rev 470) +++ pytrainer/trunk/pytrainer/main.py 2010-01-06 21:47:54 UTC (rev 471) @@ -101,7 +101,7 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.0_svn#469" + self.version ="1.7.0_svn#471" self.date = Date() # Checking profile self.profile = Profile(self.data_path,self) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-01-06 09:53:21
|
Revision: 470 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=470&view=rev Author: jblance Date: 2010-01-06 09:53:15 +0000 (Wed, 06 Jan 2010) Log Message: ----------- Unified import - start of device import functionality Modified Paths: -------------- pytrainer/trunk/glade/importdata.glade pytrainer/trunk/pytrainer/gui/windowimportdata.py Added Paths: ----------- pytrainer/trunk/import/tool_gant.py pytrainer/trunk/import/tool_garmintools.py pytrainer/trunk/import/tool_gpsbabel.py Modified: pytrainer/trunk/glade/importdata.glade =================================================================== --- pytrainer/trunk/glade/importdata.glade 2010-01-05 22:36:39 UTC (rev 469) +++ pytrainer/trunk/glade/importdata.glade 2010-01-06 09:53:15 UTC (rev 470) @@ -30,15 +30,22 @@ <property name="visible">True</property> <property name="left_padding">12</property> <child> - <placeholder/> + <widget class="GtkVBox" id="vboxImportTools"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <child> + <placeholder/> + </child> + </widget> </child> </widget> </child> <child> - <widget class="GtkLabel" id="label1"> + <widget class="GtkLabel" id="labelImportDeviceTools"> <property name="visible">True</property> - <property name="label" translatable="yes"><b>frame1</b></property> + <property name="label" translatable="yes"><b>Tools</b></property> <property name="use_markup">True</property> + <property name="single_line_mode">True</property> </widget> <packing> <property name="type">label_item</property> @@ -53,16 +60,30 @@ <widget class="GtkHBox" id="hboxDeviceButtons"> <property name="visible">True</property> <child> - <placeholder/> + <widget class="GtkButton" id="buttonDeviceToolRescan"> + <property name="label" translatable="yes">Rescan</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip" translatable="yes">Rescan system for available tools</property> + <signal name="clicked" handler="on_buttonDeviceToolRescan_clicked"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">10</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> </child> <child> - <widget class="GtkButton" id="buttonDeviceCancel"> - <property name="label">gtk-cancel</property> + <widget class="GtkButton" id="buttonDeviceClose"> + <property name="label">gtk-close</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="use_stock">True</property> - <signal name="clicked" handler="on_buttonDeviceCancel_clicked"/> + <signal name="clicked" handler="on_buttonDeviceClose_clicked"/> </widget> <packing> <property name="expand">False</property> @@ -226,18 +247,19 @@ <packing> <property name="expand">False</property> <property name="fill">False</property> + <property name="padding">10</property> <property name="pack_type">end</property> <property name="position">1</property> </packing> </child> <child> - <widget class="GtkButton" id="buttonFileCancel"> + <widget class="GtkButton" id="buttonFileClose"> <property name="label">gtk-close</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="use_stock">True</property> - <signal name="clicked" handler="on_buttonFileCancel_clicked"/> + <signal name="clicked" handler="on_buttonFileClose_clicked"/> </widget> <packing> <property name="expand">False</property> @@ -372,7 +394,7 @@ <property name="expand">False</property> <property name="fill">False</property> <property name="pack_type">end</property> - <property name="position">1</property> + <property name="position">2</property> </packing> </child> <child> @@ -388,6 +410,22 @@ <property name="fill">False</property> <property name="padding">10</property> <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkButton" id="buttonOptionsClose"> + <property name="label">gtk-close</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_buttonOptionsClose_clicked"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> <property name="position">0</property> </packing> </child> Added: pytrainer/trunk/import/tool_gant.py =================================================================== --- pytrainer/trunk/import/tool_gant.py (rev 0) +++ pytrainer/trunk/import/tool_gant.py 2010-01-06 09:53:15 UTC (rev 470) @@ -0,0 +1,68 @@ +# -*- coding: iso-8859-1 -*- + +#Copyright (C) Fiz Vazquez vu...@si... +# Modified by dgranda + +#This program is free software; you can redistribute it and/or +#modify it under the terms of the GNU General Public License +#as published by the Free Software Foundation; either version 2 +#of the License, or (at your option) any later version. + +#This program is distributed in the hope that it will be useful, +#but WITHOUT ANY WARRANTY; without even the implied warranty of +#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +#GNU General Public License for more details. + +#You should have received a copy of the GNU General Public License +#along with this program; if not, write to the Free Software +#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +import logging +import os, sys, commands +import StringIO +from lxml import etree +import dateutil.parser +from dateutil.tz import * # for tzutc() + +from pytrainer.lib.system import checkConf + +class gant(): + def __init__(self, parent = None, data_path = None): + self.parent = parent + self.conf = checkConf() + self.tmpdir = self.conf.getValue("tmpdir") + self.main_data_path = data_path + self.data_path = os.path.dirname(__file__) + + def getName(self): + return _("Gant") + + def getVersion(self): + return None + + def getSourceLocation(self): + return "http://cgit.get-open.com/cgit.cgi/gant/" + + def deviceExists(self): + return True + + def isPresent(self): + if self.getVersion(): + return True + else: + return False + + def getDateTime(self, time_): + # Time can be in multiple formats + # - zulu 2009-12-15T09:00Z + # - local ISO8601 2009-12-15T10:00+01:00 + if time_ is None or time_ == "": + return (None, None) + dateTime = dateutil.parser.parse(time_) + timezone = dateTime.tzname() + if timezone == 'UTC': #got a zulu time + local_dateTime = dateTime.astimezone(tzlocal()) #datetime with localtime offset (from OS) + else: + local_dateTime = dateTime #use datetime as supplied + utc_dateTime = dateTime.astimezone(tzutc()) #datetime with 00:00 offset + return (utc_dateTime,local_dateTime) Added: pytrainer/trunk/import/tool_garmintools.py =================================================================== --- pytrainer/trunk/import/tool_garmintools.py (rev 0) +++ pytrainer/trunk/import/tool_garmintools.py 2010-01-06 09:53:15 UTC (rev 470) @@ -0,0 +1,77 @@ +# -*- coding: iso-8859-1 -*- + +#Copyright (C) Fiz Vazquez vu...@si... +# Modified by dgranda + +#This program is free software; you can redistribute it and/or +#modify it under the terms of the GNU General Public License +#as published by the Free Software Foundation; either version 2 +#of the License, or (at your option) any later version. + +#This program is distributed in the hope that it will be useful, +#but WITHOUT ANY WARRANTY; without even the implied warranty of +#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +#GNU General Public License for more details. + +#You should have received a copy of the GNU General Public License +#along with this program; if not, write to the Free Software +#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +import logging +import os, sys, commands +import StringIO +from lxml import etree +import dateutil.parser +from dateutil.tz import * # for tzutc() + +from pytrainer.lib.system import checkConf + +class garmintools(): + def __init__(self, parent = None, data_path = None): + self.parent = parent + self.conf = checkConf() + self.tmpdir = self.conf.getValue("tmpdir") + self.main_data_path = data_path + self.data_path = os.path.dirname(__file__) + + def getName(self): + return _("Garmintools") + + def getVersion(self): + outstatus = commands.getstatusoutput('which garmin_save_runs') + if outstatus[0] == 0: #Found garmin_save_runs in path + path = "Unknown" + return path + else: + return None + + def getSourceLocation(self): + return "http://code.google.com/p/garmintools/" + + def deviceExists(self): + outstatus = commands.getstatusoutput('garmin_get_info') + if outstatus[0] is not 0 or outstatus[1].startswith("garmin unit could not be opened"): + return False + else: + return True + + def isPresent(self): + if self.getVersion(): + return True + else: + return False + + def getDateTime(self, time_): + # Time can be in multiple formats + # - zulu 2009-12-15T09:00Z + # - local ISO8601 2009-12-15T10:00+01:00 + if time_ is None or time_ == "": + return (None, None) + dateTime = dateutil.parser.parse(time_) + timezone = dateTime.tzname() + if timezone == 'UTC': #got a zulu time + local_dateTime = dateTime.astimezone(tzlocal()) #datetime with localtime offset (from OS) + else: + local_dateTime = dateTime #use datetime as supplied + utc_dateTime = dateTime.astimezone(tzutc()) #datetime with 00:00 offset + return (utc_dateTime,local_dateTime) Added: pytrainer/trunk/import/tool_gpsbabel.py =================================================================== --- pytrainer/trunk/import/tool_gpsbabel.py (rev 0) +++ pytrainer/trunk/import/tool_gpsbabel.py 2010-01-06 09:53:15 UTC (rev 470) @@ -0,0 +1,84 @@ +# -*- coding: iso-8859-1 -*- + +#Copyright (C) Fiz Vazquez vu...@si... +# Modified by dgranda + +#This program is free software; you can redistribute it and/or +#modify it under the terms of the GNU General Public License +#as published by the Free Software Foundation; either version 2 +#of the License, or (at your option) any later version. + +#This program is distributed in the hope that it will be useful, +#but WITHOUT ANY WARRANTY; without even the implied warranty of +#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +#GNU General Public License for more details. + +#You should have received a copy of the GNU General Public License +#along with this program; if not, write to the Free Software +#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +import logging +import os, sys, commands +import StringIO +from lxml import etree +import dateutil.parser +from dateutil.tz import * # for tzutc() + +from pytrainer.lib.system import checkConf + +class gpsbabel(): + def __init__(self, parent = None, data_path = None): + self.parent = parent + self.conf = checkConf() + self.tmpdir = self.conf.getValue("tmpdir") + self.main_data_path = data_path + self.data_path = os.path.dirname(__file__) + + def getName(self): + return _("GPSBabel") + + def getVersion(self): + result = commands.getstatusoutput('gpsbabel -V') + if result[0] == 0: + version = result[1].split() + try: + return version[2] + except: + logging.error("Unexpected result from gpsbabel -V") + return None + return None + + def getSourceLocation(self): + return "http://www.gpsbabel.org/" + + def deviceExists(self): + try: + #TODO Check if this is correct??? + outmod = commands.getstatusoutput('/sbin/lsmod | grep garmin_gps') + if outmod[0]==256: #there is no garmin_gps module loaded + return False + else: + return True + except: + return False + + def isPresent(self): + if self.getVersion(): + return True + else: + return False + + def getDateTime(self, time_): + # Time can be in multiple formats + # - zulu 2009-12-15T09:00Z + # - local ISO8601 2009-12-15T10:00+01:00 + if time_ is None or time_ == "": + return (None, None) + dateTime = dateutil.parser.parse(time_) + timezone = dateTime.tzname() + if timezone == 'UTC': #got a zulu time + local_dateTime = dateTime.astimezone(tzlocal()) #datetime with localtime offset (from OS) + else: + local_dateTime = dateTime #use datetime as supplied + utc_dateTime = dateTime.astimezone(tzutc()) #datetime with 00:00 offset + return (utc_dateTime,local_dateTime) Modified: pytrainer/trunk/pytrainer/gui/windowimportdata.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowimportdata.py 2010-01-05 22:36:39 UTC (rev 469) +++ pytrainer/trunk/pytrainer/gui/windowimportdata.py 2010-01-06 09:53:15 UTC (rev 470) @@ -24,8 +24,6 @@ import logging from lxml import etree -from pytrainer.gui.warning import Warning - class WindowImportdata(SimpleGladeApp): def __init__(self, data_path = None, parent=None, config=None): self.data_path = data_path @@ -36,6 +34,7 @@ self.configuration = config self.store = None self.processClass = None + self.toolsDetected = False #SimpleGladeApp.__init__(self, data_path+glade_path, root, domain) def run(self): @@ -71,6 +70,14 @@ return context_id def init_gpsdevice_tab(self): + #Only detect tools once (or if requested) + if not self.toolsDetected: + #Remove all components in vbox - in case of re-detection + for child in self.vboxImportTools.get_children(): + print "removing ", child + self.vboxImportTools.remove(child) + self.detect_tools() + self.toolsDetected = True return def init_file_tab(self): @@ -92,8 +99,59 @@ else: self.radiobuttonTabGPSDevice.set_active(1) return + + def detect_tools(self): + """ + Iterate through all tool files from import directory + Each file contains information on a particular tool + and knows how to determine if the tool is present on the system + and what configuration options are needed for the tool + + Currently displays the tool info and config grayed out if tool is not present + """ + logging.debug('>>') + self.updateStatusbar(self.statusbarDevice, "Checking for tools") + #Get import tool_* files + fileList = glob.glob(self.data_path+"import/tool_*.py") + for toolFile in fileList: + index = fileList.index(toolFile) + directory, filename = os.path.split(toolFile) + filename = filename.rstrip('.py') + classname = filename.lstrip('tool_') + #Import module + sys.path.insert(0, self.data_path+"import") + module = __import__(filename) + toolMain = getattr(module, classname) + #Instantiate module + toolClass = toolMain(self.parent, self.data_path) + #Get info from class + toolName = toolClass.getName() + toolTable = gtk.Table() + toolFrame = gtk.Frame(label=toolName) + toolFrame.add(toolTable) + if toolClass.isPresent(): + version = gtk.Label("Version: " + toolClass.getVersion()) + version.set_alignment(0,0) + if toolClass.deviceExists(): + deviceExists = gtk.Label(_("GPS device found") ) + else: + deviceExists = gtk.Label(_("GPS device <b>not</b> found")) + deviceExists.set_alignment(0,0) + deviceExists.set_use_markup(True) + toolTable.attach(version, 0, 1, 0, 1, xoptions=gtk.EXPAND|gtk.FILL, xpadding=5) + toolTable.attach(deviceExists, 0, 1, 1, 2, xoptions=gtk.EXPAND|gtk.FILL, xpadding=5) + toolFrame.set_sensitive(1) + else: + info = gtk.Label(_("This tool was not found on the system") ) + info.set_alignment(0,0.5) + location = gtk.LinkButton(toolClass.getSourceLocation(), _("Tool Homepage")) + info.set_sensitive(0) + toolTable.attach(info, 0, 1, 0, 1, xoptions=gtk.EXPAND|gtk.FILL, xpadding=5) + toolTable.attach(location, 1, 2, 0, 1, xoptions=gtk.EXPAND|gtk.FILL, xpadding=5) + #toolFrame.set_sensitive(0) + self.vboxImportTools.pack_start(toolFrame, expand=False, fill=False, padding=5) + self.win_importdata.show_all() - def validateFile(self, import_filename): """ Iterate through all supported types of file by reading processing files from import directory @@ -247,7 +305,7 @@ def close_window(self): self.win_importdata.hide() - + self.win_importdata.destroy() ############################ ## Window signal handlers ## @@ -307,11 +365,12 @@ else: #Selected file not understood by any of the process files self.updateStatusbar(self.statusbarImportFile, _("Unknown file type") ) - #Display warning + #Display error msg = _("File selected is of unknown or unsupported file type") - warning = Warning(self.data_path) - warning.set_text(msg) - warning.run() + md = gtk.MessageDialog(self.win_importdata, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, msg) + md.set_title("Error") + md.run() + md.destroy() def on_buttonClearFile_clicked(self, widget): self.init_tab(1) @@ -342,15 +401,24 @@ self.updateStatusbar(self.statusbarImportFile, msgImporting) self.importSelectedActivities(selectedActivities) self.updateStatusbar(self.statusbarImportFile, msgImported) - warning = Warning(self.data_path) - warning.set_text(msgImpored) - warning.set_title(_("Import Success")) - warning.run() + + #Display informational dialog box + md = gtk.MessageDialog(self.win_importdata, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO, gtk.BUTTONS_CLOSE, msgImported) + md.set_title(_("Import Success")) + md.run() + md.destroy() + self.buttonFileImport.set_sensitive(0) #Disable import button - def on_buttonFileCancel_clicked(self, widget): + def on_buttonFileClose_clicked(self, widget): self.close_window() - def on_buttonDeviceCancel_clicked(self, widget): + def on_buttonDeviceClose_clicked(self, widget): self.close_window() + def on_buttonOptionsClose_clicked(self, widget): + self.close_window() + + def on_buttonDeviceToolRescan_clicked(self, widget): + self.toolsDetected = False + self.init_gpsdevice_tab() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-01-05 22:37:03
|
Revision: 469 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=469&view=rev Author: jblance Date: 2010-01-05 22:36:39 +0000 (Tue, 05 Jan 2010) Log Message: ----------- Minor updates to unified import - file tab, warning gui updated to allow title to be set Modified Paths: -------------- pytrainer/trunk/glade/importdata.glade pytrainer/trunk/glade/warning.glade pytrainer/trunk/pytrainer/gui/warning.py pytrainer/trunk/pytrainer/gui/windowimportdata.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/glade/importdata.glade =================================================================== --- pytrainer/trunk/glade/importdata.glade 2010-01-05 21:21:28 UTC (rev 468) +++ pytrainer/trunk/glade/importdata.glade 2010-01-05 22:36:39 UTC (rev 469) @@ -18,26 +18,77 @@ <property name="can_focus">True</property> <signal name="switch_page" handler="on_notebookMainTabs_switch_page"/> <child> - <widget class="GtkFrame" id="frame1"> + <widget class="GtkVBox" id="vboxImportFromDevice"> <property name="visible">True</property> - <property name="label_xalign">0</property> + <property name="orientation">vertical</property> <child> - <widget class="GtkAlignment" id="alignment1"> + <widget class="GtkFrame" id="frameImportFromDevice"> <property name="visible">True</property> - <property name="left_padding">12</property> + <property name="label_xalign">0</property> <child> + <widget class="GtkAlignment" id="alignment1"> + <property name="visible">True</property> + <property name="left_padding">12</property> + <child> + <placeholder/> + </child> + </widget> + </child> + <child> + <widget class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>frame1</b></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="type">label_item</property> + </packing> + </child> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkHBox" id="hboxDeviceButtons"> + <property name="visible">True</property> + <child> <placeholder/> </child> + <child> + <widget class="GtkButton" id="buttonDeviceCancel"> + <property name="label">gtk-cancel</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_buttonDeviceCancel_clicked"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> </child> <child> - <widget class="GtkLabel" id="label7"> + <widget class="GtkStatusbar" id="statusbarDevice"> <property name="visible">True</property> - <property name="label" translatable="yes"><b>frame1</b></property> - <property name="use_markup">True</property> + <property name="spacing">2</property> + <property name="has_resize_grip">False</property> </widget> <packing> - <property name="type">label_item</property> + <property name="expand">False</property> + <property name="pack_type">end</property> + <property name="position">0</property> </packing> </child> </widget> @@ -161,16 +212,16 @@ </packing> </child> <child> - <widget class="GtkHBox" id="hboxImportButton"> + <widget class="GtkHBox" id="hboxImportButtons"> <property name="visible">True</property> <child> - <widget class="GtkButton" id="buttonImport"> + <widget class="GtkButton" id="buttonFileImport"> <property name="label" translatable="yes">Import</property> <property name="visible">True</property> <property name="sensitive">False</property> <property name="can_focus">True</property> <property name="receives_default">True</property> - <signal name="clicked" handler="on_buttonImport_clicked"/> + <signal name="clicked" handler="on_buttonFileImport_clicked"/> </widget> <packing> <property name="expand">False</property> @@ -180,13 +231,13 @@ </packing> </child> <child> - <widget class="GtkButton" id="buttonCancel"> + <widget class="GtkButton" id="buttonFileCancel"> <property name="label">gtk-close</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="use_stock">True</property> - <signal name="clicked" handler="on_buttonCancel_clicked"/> + <signal name="clicked" handler="on_buttonFileCancel_clicked"/> </widget> <packing> <property name="expand">False</property> @@ -310,12 +361,12 @@ <widget class="GtkHBox" id="hboxOptionButtons"> <property name="visible">True</property> <child> - <widget class="GtkButton" id="buttonReset"> + <widget class="GtkButton" id="buttonOptionsReset"> <property name="label" translatable="yes">Reset</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> - <signal name="clicked" handler="on_buttonReset_clicked"/> + <signal name="clicked" handler="on_buttonOptionsReset_clicked"/> </widget> <packing> <property name="expand">False</property> @@ -325,12 +376,12 @@ </packing> </child> <child> - <widget class="GtkButton" id="buttonSave"> + <widget class="GtkButton" id="buttonOptionsSave"> <property name="label" translatable="yes">Save</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> - <signal name="clicked" handler="on_buttonSave_clicked"/> + <signal name="clicked" handler="on_buttonOptionsSave_clicked"/> </widget> <packing> <property name="expand">False</property> Modified: pytrainer/trunk/glade/warning.glade =================================================================== --- pytrainer/trunk/glade/warning.glade 2010-01-05 21:21:28 UTC (rev 468) +++ pytrainer/trunk/glade/warning.glade 2010-01-05 22:36:39 UTC (rev 469) @@ -5,6 +5,7 @@ <widget class="GtkDialog" id="warning"> <property name="visible">True</property> <property name="title" translatable="yes">Warning</property> + <property name="resizable">False</property> <property name="modal">True</property> <property name="window_position">mouse</property> <property name="icon">logo_mini.png</property> Modified: pytrainer/trunk/pytrainer/gui/warning.py =================================================================== --- pytrainer/trunk/pytrainer/gui/warning.py 2010-01-05 21:21:28 UTC (rev 468) +++ pytrainer/trunk/pytrainer/gui/warning.py 2010-01-05 22:36:39 UTC (rev 469) @@ -32,6 +32,9 @@ if okmethod == None: self.cancelbutton1.hide() + def set_title(self, title): + self.warning.set_title(title) + def set_text(self, msg): self.warningText.set_text(msg) Modified: pytrainer/trunk/pytrainer/gui/windowimportdata.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowimportdata.py 2010-01-05 21:21:28 UTC (rev 468) +++ pytrainer/trunk/pytrainer/gui/windowimportdata.py 2010-01-05 22:36:39 UTC (rev 469) @@ -48,7 +48,22 @@ else: self.defaulttab = int(self.defaulttab) self.notebookMainTabs.set_current_page(self.defaulttab) + self.init_tab(self.defaulttab) + def init_tab(self, page): + if page == 0: + #'Import from GPS Device' tab + self.init_gpsdevice_tab() + elif page == 1: + #'Import from File' tab + self.init_file_tab() + elif page ==2: + #'Options' tab + self.init_options_tab() + else: + #unknown tab + pass + def updateStatusbar(self, statusbar, text, context_id = None): if context_id is None: context_id = statusbar.get_context_id(text) @@ -59,8 +74,15 @@ return def init_file_tab(self): + self.filechooserbuttonSelectFile.unselect_all() + self.updateStatusbar(self.statusbarImportFile, _("No file selected") ) + self.processClass = None + if self.store is None: + self.store = self.build_tree_view() + else: + self.store.clear() self.buttonClearFile.set_sensitive(0) - self.buttonImport.set_sensitive(0) + self.buttonFileImport.set_sensitive(0) return def init_options_tab(self): @@ -146,25 +168,25 @@ Sets the state of the checkbox to true or false. """ store[path][1] = not store[path][1] - self.buttonImport.set_sensitive(0) + self.buttonFileImport.set_sensitive(0) for item in store: if item[1]: #Only enable import button if at least one activity is selected - self.buttonImport.set_sensitive(1) + self.buttonFileImport.set_sensitive(1) return def treeviewImportEvents_setCheckboxes(self, state): """ Sets or unsets all checkboxes """ - if self.store is None: + if self.store is None or len(self.store) == 0: return for item in self.store: item[1] = state if state: - self.buttonImport.set_sensitive(1) + self.buttonFileImport.set_sensitive(1) else: - self.buttonImport.set_sensitive(0) + self.buttonFileImport.set_sensitive(0) def saveOptions(self): """ @@ -223,6 +245,10 @@ self.store[path][6] = notes path +=1 + def close_window(self): + self.win_importdata.hide() + + ############################ ## Window signal handlers ## ############################ @@ -240,30 +266,18 @@ self.treeviewImportEvents_setCheckboxes(True) def on_win_importdata_delete_event(self, widget, window): - self.win_importdata.hide() + """ Windows closed """ + self.close_window() def on_notebookMainTabs_switch_page(self, notebook, page, new_page): - if new_page == 0: - #Switched to 'Import from GPS Device' tab - self.init_gpsdevice_tab() - elif new_page == 1: - #Switched to 'Import from File' tab - self.init_file_tab() - elif new_page ==2: - #Switched to 'Options' tab - self.init_options_tab() - else: - #Switched to unknown tab - pass + self.init_tab(new_page) def on_filechooserbuttonSelectFile_file_set(self, widget): self.buttonClearFile.set_sensitive(1) #Enable clear button - self.buttonImport.set_sensitive(0) #Disable import button + self.buttonFileImport.set_sensitive(0) #Disable import button self.updateStatusbar(self.statusbarImportFile, "" ) #Clear status bar - #Build treeview - if self.store is None: - self.store = self.build_tree_view() - else: + #Clear store + if self.store is not None: self.store.clear() #Validate file self.processClass = self.validateFile(self.filechooserbuttonSelectFile.get_filename()) @@ -274,7 +288,7 @@ for activity in activitiesSummary: if not activity[1]: #Activity selected, so enable import button - self.buttonImport.set_sensitive(1) + self.buttonFileImport.set_sensitive(1) note = "" else: note = _("Found in database") @@ -300,32 +314,43 @@ warning.run() def on_buttonClearFile_clicked(self, widget): - self.filechooserbuttonSelectFile.unselect_all() - self.updateStatusbar(self.statusbarImportFile, _("No file selected") ) - self.processClass = None - self.store.clear() + self.init_tab(1) - def on_buttonSave_clicked(self, widget): + def on_buttonOptionsSave_clicked(self, widget): self.updateStatusbar(self.statusbarOptions, "Saving options") self.saveOptions() self.updateStatusbar(self.statusbarOptions, "Options saved") - def on_buttonReset_clicked(self, widget): + def on_buttonOptionsReset_clicked(self, widget): #GPS Device is default self.defaulttab = 0 #Redisplay tab self.init_options_tab() self.updateStatusbar(self.statusbarOptions, "") - def on_buttonImport_clicked(self, widget): + def on_buttonFileImport_clicked(self, widget): #Import selected activities selectedActivities = self.getSelectedActivities() - if len(selectedActivities) > 0: - self.updateStatusbar(self.statusbarImportFile, "Importing %d activities" % len(selectedActivities)) + selectedCount = len(selectedActivities) + if selectedCount > 0: + if selectedCount == 1: + msgImporting = _("Importing one activity") + msgImported = _("Imported one activity") + else: + msgImporting = _("Importing %d activities" % selectedCount) + msgImported = _("Imported %d activities" % selectedCount) + self.updateStatusbar(self.statusbarImportFile, msgImporting) self.importSelectedActivities(selectedActivities) - self.updateStatusbar(self.statusbarImportFile, "Imported %d activities" % len(selectedActivities)) - self.buttonImport.set_sensitive(0) #Disable import button - #self.updateStatusbar(self.statusbarImportFile, "buttonImport clicked") + self.updateStatusbar(self.statusbarImportFile, msgImported) + warning = Warning(self.data_path) + warning.set_text(msgImpored) + warning.set_title(_("Import Success")) + warning.run() + self.buttonFileImport.set_sensitive(0) #Disable import button - def on_buttonCancel_clicked(self, widget): - self.win_importdata.hide() + def on_buttonFileCancel_clicked(self, widget): + self.close_window() + + def on_buttonDeviceCancel_clicked(self, widget): + self.close_window() + Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-01-05 21:21:28 UTC (rev 468) +++ pytrainer/trunk/pytrainer/main.py 2010-01-05 22:36:39 UTC (rev 469) @@ -101,7 +101,7 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.0_svn#468" + self.version ="1.7.0_svn#469" self.date = Date() # Checking profile self.profile = Profile(self.data_path,self) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |