From: <jb...@us...> - 2009-12-25 22:59:48
|
Revision: 435 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=435&view=rev Author: jblance Date: 2009-12-25 22:59:39 +0000 (Fri, 25 Dec 2009) Log Message: ----------- Update TCXv2 plugin to cater for files with multiple activities per file Modified Paths: -------------- pytrainer/trunk/plugins/garmin-tcxv2/garmin-tcxv2.py pytrainer/trunk/plugins/garmin-tcxv2/translate.xsl pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/plugins/garmin-tcxv2/garmin-tcxv2.py =================================================================== --- pytrainer/trunk/plugins/garmin-tcxv2/garmin-tcxv2.py 2009-12-17 09:20:40 UTC (rev 434) +++ pytrainer/trunk/plugins/garmin-tcxv2/garmin-tcxv2.py 2009-12-25 22:59:39 UTC (rev 435) @@ -51,15 +51,19 @@ importfiles = [] if not selectedFiles: #Nothing selected return importfiles - for filename in selectedFiles: - if self.valid_input_file(filename): - if not self.inDatabase(filename): - sport = self.getSport(filename) - gpxfile = "%s/garmin-tcxv2-%d.gpx" % (self.tmpdir, len(importfiles)) - self.createGPXfile(gpxfile, filename) - importfiles.append((gpxfile, sport)) - else: - logging.debug("%s already in database. Skipping import." % (filename,) ) + for filename in selectedFiles: #Multiple files + if self.valid_input_file(filename): #TODO could consolidate tree generation here + tree = etree.ElementTree(file=filename) + #Possibly multiple entries in file + activities = self.getActivities(tree) + for activity in activities: + if not self.inDatabase(activity): + sport = self.getSport(activity) + gpxfile = "%s/garmin-tcxv2-%d.gpx" % (self.tmpdir, len(importfiles)) + self.createGPXfile(gpxfile, activity) + importfiles.append((gpxfile, sport)) + else: + logging.debug("File:%s activity %d already in database. Skipping import." % (filename, activities.index(activity)) ) else: logging.info("File %s failed validation" % (filename)) logging.debug("<<") @@ -76,42 +80,46 @@ validator = xmlValidator() return validator.validateXSL(filename, xslfile) - def inDatabase(self, filename): + def getActivities(self, tree): + '''Function to return all activities in Garmin training center version 2 file + ''' + root = tree.getroot() + activities = root.findall(".//{http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2}Activity") + return activities + + def inDatabase(self, activity): #comparing date and start time (sport may have been changed in DB after import) - time = self.detailsFromTCX(filename) + time = self.detailsFromTCX(activity) if self.parent.parent.ddbb.select("records","*","date_time_utc=\"%s\"" % (time)): return True else: return False - def getSport(self, filename): + def getSport(self, activity): #return sport from file or overide if present if self.sport: return self.sport - tree = etree.ElementTree(file=filename) - root = tree.getroot() - sportElement = root.find(".//{http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2}Activity") + #sportElement = activity.find(".//{http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2}Activity") try: - sport = sportElement.get("Sport") + sport = activity.get("Sport") except: sport = "import" return sport - def detailsFromTCX(self, filename): - tree = etree.ElementTree(file=filename) - root = tree.getroot() - timeElement = root.find(".//{http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2}Id") + def detailsFromTCX(self, activity): + timeElement = activity.find(".//{http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2}Id") if timeElement is None: return None else: return timeElement.text - def createGPXfile(self, gpxfile, filename): + def createGPXfile(self, gpxfile, activity): """ Function to transform a Garmin Training Center v2 Track to a valid GPX+ file """ xslt_doc = etree.parse(self.data_path+"/translate.xsl") transform = etree.XSLT(xslt_doc) - xml_doc = etree.parse(filename) + #xml_doc = etree.parse(filename) + xml_doc = activity result_tree = transform(xml_doc) result_tree.write(gpxfile, xml_declaration=True) Modified: pytrainer/trunk/plugins/garmin-tcxv2/translate.xsl =================================================================== --- pytrainer/trunk/plugins/garmin-tcxv2/translate.xsl 2009-12-17 09:20:40 UTC (rev 434) +++ pytrainer/trunk/plugins/garmin-tcxv2/translate.xsl 2009-12-25 22:59:39 UTC (rev 435) @@ -17,8 +17,8 @@ xmlns:gpxdata="http://www.cluetrust.com/XML/GPXDATA/1/0" > <xsl:value-of select="$newline"/> - <xsl:variable name="sport"><xsl:value-of select="t:TrainingCenterDatabase/t:Activities/t:Activity/@Sport"/></xsl:variable> - <xsl:variable name="time"><xsl:value-of select="t:TrainingCenterDatabase/t:Activities/t:Activity/t:Id"/></xsl:variable> + <xsl:variable name="sport"><xsl:value-of select="t:Activity/@Sport"/></xsl:variable> + <xsl:variable name="time"><xsl:value-of select="t:Activity/t:Id"/></xsl:variable> <xsl:variable name="name"><xsl:value-of select="$sport"/><xsl:value-of select="substring($time, 1,10)"/></xsl:variable> <metadata><xsl:value-of select="$newline"/> <name><xsl:value-of select="$name"/></name><xsl:value-of select="$newline"/> @@ -26,7 +26,7 @@ <time><xsl:value-of select="$time"/></time><xsl:value-of select="$newline"/> </metadata><xsl:value-of select="$newline"/> <trk><xsl:value-of select="$newline"/> - <xsl:for-each select="t:TrainingCenterDatabase/t:Activities/t:Activity/t:Lap"> + <xsl:for-each select="t:Activity/t:Lap"> <trkseg><xsl:value-of select="$newline"/> <xsl:variable name="calories"><xsl:value-of select="t:Calories"/></xsl:variable> <xsl:for-each select="t:Track/t:Trackpoint"> @@ -61,7 +61,7 @@ <!-- Lap Data --> <xsl:value-of select="$newline"/> <extensions><xsl:value-of select="$newline"/> - <xsl:for-each select="t:TrainingCenterDatabase/t:Activities/t:Activity/t:Lap"> + <xsl:for-each select="t:Activity/t:Lap"> <xsl:variable name="vIndex"> <xsl:number count="t:Lap"/> </xsl:variable> @@ -70,7 +70,7 @@ <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> <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)"/></xsl:variable> + <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> <xsl:variable name="endlon"><xsl:value-of select="t:Track/t:Trackpoint[number($cnt)]/t:Position/t:LongitudeDegrees"/></xsl:variable> <gpxdata:endPoint lat="{$endlat}" lon="{$endlon}"/><xsl:value-of select="$newline"/> Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2009-12-17 09:20:40 UTC (rev 434) +++ pytrainer/trunk/pytrainer/main.py 2009-12-25 22:59:39 UTC (rev 435) @@ -97,7 +97,7 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.7.0_svn#434" + self.version ="1.7.0_svn#435" self.date = Date() main_dir = os.path.realpath(os.path.dirname(__file__)) #why? sys.path.insert(0, main_dir) #why? This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |