From: <jb...@us...> - 2009-12-17 09:20:48
|
Revision: 434 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=434&view=rev Author: jblance Date: 2009-12-17 09:20:40 +0000 (Thu, 17 Dec 2009) Log Message: ----------- Some local date work - added display of date time to record, moved to dateutils parsing in gpx Modified Paths: -------------- pytrainer/trunk/glade/pytrainer.glade pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/lib/gpx.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/record.py Modified: pytrainer/trunk/glade/pytrainer.glade =================================================================== --- pytrainer/trunk/glade/pytrainer.glade 2009-12-14 10:16:39 UTC (rev 433) +++ pytrainer/trunk/glade/pytrainer.glade 2009-12-17 09:20:40 UTC (rev 434) @@ -459,7 +459,7 @@ <child> <widget class="GtkTable" id="table13"> <property name="visible">True</property> - <property name="n_rows">9</property> + <property name="n_rows">10</property> <property name="n_columns">6</property> <property name="homogeneous">False</property> <property name="row_spacing">6</property> @@ -522,6 +522,34 @@ </child> <child> + <widget class="GtkLabel" id="record_calories"> + <property name="visible">True</property> + <property name="label" translatable="yes"> </property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">1</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> <widget class="GtkLabel" id="ddsddsdsdsds"> <property name="visible">True</property> <property name="label" translatable="yes"><b>Sport:</b></property> @@ -663,9 +691,9 @@ </child> <child> - <widget class="GtkLabel" id="label11140"> + <widget class="GtkLabel" id="label11144"> <property name="visible">True</property> - <property name="label" translatable="yes"><b>Comments:</b></property> + <property name="label" translatable="yes"><b>Calories:</b></property> <property name="use_underline">False</property> <property name="use_markup">True</property> <property name="justify">GTK_JUSTIFY_LEFT</property> @@ -689,6 +717,33 @@ <property name="y_options"></property> </packing> </child> + <child> + <widget class="GtkLabel" id="label11140"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>Comments:</b></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">6</property> + <property name="bottom_attach">7</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> <child> <widget class="GtkLabel" id="r_maxspeed_unit"> @@ -1056,6 +1111,90 @@ </child> <child> + <widget class="GtkLabel" id="label11145"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>Date Time:</b></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="record_datetime"> + <property name="visible">True</property> + <property name="label" translatable="yes"> </property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">1</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="left_attach">4</property> + <property name="right_attach">5</property> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="record_datetime_offset"> + <property name="visible">True</property> + <property name="label" translatable="yes">m</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">5</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="left_attach">5</property> + <property name="right_attach">6</property> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> <widget class="GtkLabel" id="record_pace"> <property name="visible">True</property> <property name="label" translatable="yes"> </property> @@ -1168,6 +1307,34 @@ </child> <child> + <widget class="GtkLabel" id="r_calories_unit"> + <property name="visible">True</property> + <property name="label" translatable="yes">Cal</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">5</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> <widget class="GtkScrolledWindow" id="scrolledwindow6"> <property name="visible">True</property> <property name="can_focus">True</property> @@ -1200,8 +1367,8 @@ <packing> <property name="left_attach">0</property> <property name="right_attach">6</property> - <property name="top_attach">6</property> - <property name="bottom_attach">7</property> + <property name="top_attach">7</property> + <property name="bottom_attach">8</property> </packing> </child> @@ -2093,7 +2260,7 @@ </child> <child> - <widget class="GtkLabel" id="record_calories"> + <widget class="GtkLabel" id="record_calories2"> <!-- not sure what this one is/... --> <property name="visible">True</property> <property name="label" translatable="yes"> </property> <property name="use_underline">False</property> Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2009-12-14 10:16:39 UTC (rev 433) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2009-12-17 09:20:40 UTC (rev 434) @@ -21,6 +21,9 @@ import datetime import matplotlib +import dateutil.parser +from dateutil.tz import * # for tzutc() + from SimpleGladeApp import * from popupmenu import PopupMenu from aboutdialog import About @@ -188,6 +191,17 @@ pace = self.parseFloat(record_list[14]) #to review maxspeed = self.parseFloat(record_list[12]) #to review maxpace = self.parseFloat(record_list[13]) + + #Get datetime from date_time_utc and create a local datetime... + #TODO get data from date_time_local and parse + dateTime = dateutil.parser.parse(record_list[16]) + 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 + recordDateTime = local_dateTime.strftime("%Y-%m-%d %H:%M:%S") + recordDateTimeOffset = local_dateTime.strftime("%z") if configuration.getValue("pytraining","prf_us_system") == "True": self.record_distance.set_text("%0.2f" %km2miles(distance)) @@ -214,6 +228,8 @@ self.record_minute.set_text("%02d" %min) self.record_second.set_text("%02d" %sec) self.record_calories.set_text("%0.0f" %calories) + self.record_datetime.set_text(recordDateTime) + self.record_datetime_offset.set_text(recordDateTimeOffset) self.record_title.set_text(title) buffer = self.record_comments.get_buffer() start,end = buffer.get_bounds() Modified: pytrainer/trunk/pytrainer/lib/gpx.py =================================================================== --- pytrainer/trunk/pytrainer/lib/gpx.py 2009-12-14 10:16:39 UTC (rev 433) +++ pytrainer/trunk/pytrainer/lib/gpx.py 2009-12-17 09:20:40 UTC (rev 434) @@ -28,6 +28,8 @@ import logging from xmlUtils import XMLParser from lxml import etree +import dateutil.parser +from dateutil.tz import * # for tzutc() # use of namespaces is mandatory if defined mainNS = string.Template(".//{http://www.topografix.com/GPX/1/1}$tag") @@ -92,7 +94,7 @@ timeResult = trk.find(timeTag) if timeResult is not None: time_ = timeResult.text # check timezone - mk_time = self.geDatetTime(time_) + mk_time = self.getDateTime(time_)[0] time_ = time.strftime("%Y-%m-%d", mk_time) else: time_ = _("No Data") @@ -101,22 +103,18 @@ return tracks def getDateTime(self, time_): - try: - theTime = datetime.strptime(time_, "%Y-%m-%dT%H:%M:%SZ") - return theTime - except: - pass - try: - #Time includes UTC offset... - #2009-12-02T12:58:55+01:00 - #TODO Need to sort time offset etc.... - offset = time_[-6:] - time_ = time_[:-6] #remove last 6 chars - ie UTC offset eg +01:00 - theTime = datetime.strptime(time_, "%Y-%m-%dT%H:%M:%S") - return theTime - except: - pass - return None + # 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) def getUnevenness(self): return self.upositive,self.unegative @@ -176,7 +174,7 @@ return retorno date_ = tree.find(timeTag).text - mk_time = self.getDateTime(date_) + mk_time = self.getDateTime(date_)[0] self.date = mk_time.strftime("%Y-%m-%d") for trkpoint in trkpoints: @@ -201,7 +199,7 @@ timeResult = trkpoint.find(timeTag) if timeResult is not None: date_ = timeResult.text - mk_time = self.getDateTime(date_) + mk_time = self.getDateTime(date_)[0] time_ = time.mktime(mk_time.timetuple()) #Convert date to seconds else: time_ = 1 @@ -286,14 +284,17 @@ Retrieves start time from a given gpx file args: - gpxFile: path to xml file (gpx format) - returns: string with start time - 2008-03-22T12:17:43Z or 2009-12-02T12:58:55+01:00 + returns: string with start time - 2008-03-22T12:17:43Z """ logging.debug(">>") date_time = self.tree.find(timeTag) #returns first instance found if date_time is None: print "Problems when retrieving start time from "+gpxFile+". Please check data integrity" return 0 - logging.debug(gpxFile+" | "+ date_time.text) + zuluDateTime = self.getDateTime(date_time.text)[0].strftime("%Y-%m-%dT%H:%M:%SZ") + logging.debug(gpxFile+" | "+ date_time.text +" | " + zuluDateTime) + print zuluDateTime + #return date_time.text logging.debug("<<") - return date_time.text + return zuluDateTime Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2009-12-14 10:16:39 UTC (rev 433) +++ pytrainer/trunk/pytrainer/main.py 2009-12-17 09:20:40 UTC (rev 434) @@ -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#433" + self.version ="1.7.0_svn#434" self.date = Date() main_dir = os.path.realpath(os.path.dirname(__file__)) #why? sys.path.insert(0, main_dir) #why? Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2009-12-14 10:16:39 UTC (rev 433) +++ pytrainer/trunk/pytrainer/record.py 2009-12-17 09:20:40 UTC (rev 434) @@ -244,13 +244,13 @@ def getrecordInfo(self,id_record): logging.debug('--') return self.ddbb.select("records,sports", - "sports.name,date,distance,time,beats,comments,average,calories,id_record,title,upositive,unegative,maxspeed,maxpace,pace,maxbeats", + "sports.name,date,distance,time,beats,comments,average,calories,id_record,title,upositive,unegative,maxspeed,maxpace,pace,maxbeats,date_time_utc", "id_record=\"%s\" and records.sport=sports.id_sports" %id_record) def getrecordList(self,date): logging.debug('--') return self.ddbb.select("records,sports", - "sports.name,date,distance,time,beats,comments,average,calories,id_record,maxspeed,maxbeats", + "sports.name,date,distance,time,beats,comments,average,calories,id_record,maxspeed,maxbeats,date_time_utc", "date=\"%s\" and records.sport=sports.id_sports" %date) def getrecordPeriod(self,date_ini, date_end, sport=None): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |