From: <jb...@us...> - 2010-10-12 20:30:02
|
Revision: 661 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=661&view=rev Author: jblance Date: 2010-10-12 20:29:55 +0000 (Tue, 12 Oct 2010) Log Message: ----------- Committing Arnd updates to listview Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/lib/listview.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/record.py Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2010-10-12 10:30:51 UTC (rev 660) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-10-12 20:29:55 UTC (rev 661) @@ -1054,7 +1054,7 @@ self.listsearch.past = self.lsa_past.get_active() self.listsearch.duration = self.lsa_duration.get_active() self.listsearch.distance = self.lsa_distance.get_active() - self.parent.searchListView(self.listsearch.condition) + self.parent.refreshListView(self.listsearch.condition) def create_menulist(self,column_names): i=0 @@ -1444,7 +1444,8 @@ self.classicarea.hide() self.athletearea.hide() self.selected_view = "listview" - self.parent.refreshListView() + #self.parent.refreshListView() + self.parent.refreshListView(self.listsearch.condition) self.listarea.show() def on_athleteview_activate(self,widget): Modified: pytrainer/trunk/pytrainer/lib/listview.py =================================================================== --- pytrainer/trunk/pytrainer/lib/listview.py 2010-10-12 10:30:51 UTC (rev 660) +++ pytrainer/trunk/pytrainer/lib/listview.py 2010-10-12 20:29:55 UTC (rev 661) @@ -9,10 +9,12 @@ def __init__(self, parent = None, pytrainer_main = None): self.parent = parent self.pytrainer_main = pytrainer_main + """ Initialize all query parameters to valid default values""" self.title = '' self.sport = 0 - self.past = None - self.duration = None + self.past = 0 + self.duration = 0 + self.distance = 0 self.listSport = self.pytrainer_main.profile.getSportList() self.listPast = [['All Time', -99999], ['Last 4 Weeks', -31], ['Last 6 Months', -183], ['Last 12 Months', -366]] @@ -20,7 +22,16 @@ ['<1 Hour', [0,3600]], ['1-2 Hours', [3600,7200]], ['>2 Hours', [7200,999999]]] - + + #if self.pytrainer_main.profile.prf_us_system == True: + self.listDistanceUS = [['All Distances', [0.0,999999.9]], + ['<1 mi', [0.0, 1.609344]], + ['1-5 mi', [1.609344, 8.04672]], + ['5-10 mi', [8.04672, 16.09344]], + ['10-20 mi', [16.09344, 32.18688]], + ['20-50 mi', [32.18688, 80.4672]], + ['>50 mi', [80.4672, 999999.9]]] + self.listDistance = [['All Distances', [0.0,999999.9]], ['<1 km', [0.0, 1.0]], ['1-5 km', [1.0, 5.0]], Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-10-12 10:30:51 UTC (rev 660) +++ pytrainer/trunk/pytrainer/main.py 2010-10-12 20:29:55 UTC (rev 661) @@ -50,7 +50,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#660" + self.version ="1.7.2_svn#661" self.DB_version = 5 #Process command line options self.startup_options = self.get_options() @@ -298,7 +298,8 @@ def refreshListRecords(self): logging.debug('>>') #Refresh list view - self.refreshListView() + #self.refreshListView() # old variant + self.refreshListView(self.windowmain.listsearch.condition) #Refresh list records date = self.date.getDate() record_list = self.record.getrecordList(date) @@ -312,25 +313,19 @@ self.athlete.refresh() self.windowmain.actualize_athleteview(self.athlete) logging.debug('<<') - - def refreshListView(self): + + def refreshListView(self,condition=None): logging.debug('>>') - record_list = self.record.getAllRecordList() + record_list = self.record.getRecordListByCondition(condition) self.windowmain.actualize_listview(record_list) logging.debug('<<') - + def refreshWaypointView(self,default_waypoint=None,redrawmap=1): logging.debug('>>') waypoint_list = self.waypoint.getAllWaypoints() self.windowmain.actualize_waypointview(waypoint_list,default_waypoint,redrawmap) logging.debug('<<') - def searchListView(self,condition): - logging.debug('>>') - record_list = self.record.getRecordListByCondition(condition) - self.windowmain.actualize_listview(record_list) - logging.debug('<<') - def editExtensions(self): logging.debug('>>') before = self.extension.getActiveExtensions() Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2010-10-12 10:30:51 UTC (rev 660) +++ pytrainer/trunk/pytrainer/record.py 2010-10-12 20:29:55 UTC (rev 661) @@ -440,9 +440,12 @@ def getRecordListByCondition(self,condition): logging.debug('--') - return self.pytrainer_main.ddbb.select("records,sports", - "date,distance,average,title,sports.name,id_record,time,beats,calories", - "sports.id_sports = records.sport and %s" %condition) + if condition is None: + return self.getAllRecordList() + else: + return self.pytrainer_main.ddbb.select("records,sports", + "date,distance,average,title,sports.name,id_record,time,beats,calories", + "sports.id_sports = records.sport and %s" %condition) def getRecordDayList(self,date): logging.debug('>>') This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-10-12 22:18:51
|
Revision: 662 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=662&view=rev Author: jblance Date: 2010-10-12 22:18:45 +0000 (Tue, 12 Oct 2010) Log Message: ----------- Added duration (int) to record table, updated DB check to populate and newrecord to populate, updated listview to use duration instead of time Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/ddbb.py pytrainer/trunk/pytrainer/lib/listview.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-10-12 20:29:55 UTC (rev 661) +++ pytrainer/trunk/pytrainer/lib/ddbb.py 2010-10-12 22:18:45 UTC (rev 662) @@ -31,6 +31,7 @@ "sport":"integer", "distance":"float", "time":"varchar(200)", + "duration": "integer", "beats":"float", "average":"float", "calories":"int", @@ -313,6 +314,7 @@ #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() + self.populate_duration_from_time() logging.debug('<<') def createDatabaseBackup(self): @@ -332,6 +334,23 @@ for table in tablesList.keys(): pass + def populate_duration_from_time(self): + ''' + Populate duration from time field + only for empty durations and where time can be parsed as an int + ''' + logging.debug('--') + listOfRecords = self.select_dict("records",('id_record','time'), "duration is NULL") + print("Found %d records in DB without date_time_local field populated" % (len(listOfRecords) ) ) + for record in listOfRecords: + try: + duration = int(record['time']) + except Exception as e: + print "Error parsing time (%s) as int for record_id: %s" % (record['time'], record['id_record']) + continue + print "setting record %s duration to %d" % (record['id_record'], duration) + data = {'duration': duration} + self.update_dict("records",data ,"id_record = %d"%record['id_record']) def populate_date_time_local(self): ''' Populate date_time_local and date from date_time_utc Modified: pytrainer/trunk/pytrainer/lib/listview.py =================================================================== --- pytrainer/trunk/pytrainer/lib/listview.py 2010-10-12 20:29:55 UTC (rev 661) +++ pytrainer/trunk/pytrainer/lib/listview.py 2010-10-12 22:18:45 UTC (rev 662) @@ -72,7 +72,7 @@ if self.listDuration[self.duration][1]: _dur_min = int(self.listDuration[self.duration][1][0]) _dur_max = int(self.listDuration[self.duration][1][1]) - _here = "(time between %s and %s)" % (_dur_min, _dur_max) + _here = "(duration between %s and %s)" % (_dur_min, _dur_max) if _add_and: _search += " and " + _here else: Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-10-12 20:29:55 UTC (rev 661) +++ pytrainer/trunk/pytrainer/main.py 2010-10-12 22:18:45 UTC (rev 662) @@ -50,8 +50,8 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#661" - self.DB_version = 5 + self.version ="1.7.2_svn#662" + self.DB_version = 6 #Process command line options self.startup_options = self.get_options() #Setup logging Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2010-10-12 20:29:55 UTC (rev 661) +++ pytrainer/trunk/pytrainer/record.py 2010-10-12 22:18:45 UTC (rev 662) @@ -144,7 +144,7 @@ logging.debug('>>') time = self.date.time2second(list_options["rcd_time"]) average = self.parseFloatRecord(list_options["rcd_average"]) - keys= "date,sport,distance,time,beats,comments,average,calories,title,upositive,unegative,maxspeed,maxpace,pace,maxbeats,date_time_utc,date_time_local" + keys= "date,sport,distance,time,beats,comments,average,calories,title,upositive,unegative,maxspeed,maxpace,pace,maxbeats,date_time_utc,date_time_local, duration" if (list_options["rcd_beats"] == ""): list_options["rcd_beats"] = 0 @@ -169,6 +169,7 @@ self.parseFloatRecord(list_options["rcd_maxbeats"]), list_options["date_time_utc"], list_options["date_time_local"], + time, ) logging.debug('<<') return keys,values @@ -443,6 +444,7 @@ if condition is None: return self.getAllRecordList() else: + print "condition: ", condition return self.pytrainer_main.ddbb.select("records,sports", "date,distance,average,title,sports.name,id_record,time,beats,calories", "sports.id_sports = records.sport and %s" %condition) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-10-14 20:46:53
|
Revision: 664 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=664&view=rev Author: jblance Date: 2010-10-14 20:46:47 +0000 (Thu, 14 Oct 2010) Log Message: ----------- Formating improvements to List View from Arnd Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2010-10-13 22:30:44 UTC (rev 663) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-10-14 20:46:47 UTC (rev 664) @@ -227,17 +227,41 @@ self.sportlist.set_active(0) logging.debug("<<") + def render_duration(self, column, cell, model, iter): + orig = cell.get_property('text') + new = orig + if orig[:4] == ' 0:0': + new = orig[4:] + elif orig[:3] == ' 0:': + new = orig[3:] + cell.set_property('text', new) + def create_treeview(self,treeview,column_names): i=0 for column_index, column_name in enumerate(column_names): - column = gtk.TreeViewColumn(column_name, gtk.CellRendererText(), text=column_index) + #column = gtk.TreeViewColumn(column_name, gtk.CellRendererText(), text=column_index) + column = gtk.TreeViewColumn(column_name) + renderer = gtk.CellRendererText() + column.pack_start(renderer, expand=False) + column.add_attribute(renderer, 'text', column_index) column.set_resizable(True) - if i==0: + column.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE) + if i in (3,5,6,7,8): + renderer.set_property('xalign', 1.0) + + if i == 0: column.set_visible(False) - # experimental az - if column_name =='time': - print 'found Time' - column.set_alignment(0) + elif i == 3: # distance to 2 decimals + column.set_cell_data_func(renderer, + lambda column, cell, model, iter:cell.set_property('text', '%.2f' % + float(model.get_value(iter,column.get_sort_column_id())))) + elif i == 7: # speed to one decimal + column.set_cell_data_func(renderer, + lambda column, cell, model, iter:cell.set_property('text', '%.1f' % + float(model.get_value(iter,column.get_sort_column_id())))) + elif i == 5: # duration, erase leading zeros + column.set_cell_data_func(renderer, self.render_duration) + column.set_sort_column_id(i) treeview.append_column(column) i+=1 Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-10-13 22:30:44 UTC (rev 663) +++ pytrainer/trunk/pytrainer/main.py 2010-10-14 20:46:47 UTC (rev 664) @@ -50,7 +50,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#663" + self.version ="1.7.2_svn#664" self.DB_version = 6 #Process command line options self.startup_options = self.get_options() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-10-28 21:47:24
|
Revision: 666 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=666&view=rev Author: jblance Date: 2010-10-28 21:47:17 +0000 (Thu, 28 Oct 2010) Log Message: ----------- Update to DB code to support MySQL better Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/ddbb.py pytrainer/trunk/pytrainer/lib/mysqlUtils.py pytrainer/trunk/pytrainer/lib/sqliteUtils.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-10-28 01:35:18 UTC (rev 665) +++ pytrainer/trunk/pytrainer/lib/ddbb.py 2010-10-28 21:47:17 UTC (rev 666) @@ -44,8 +44,8 @@ "maxpace":"float", "pace":"float", "maxbeats":"float", - "date_time_local":"varchar2(20)", - "date_time_utc":"varchar2(20)", + "date_time_local":"varchar(20)", + "date_time_utc":"varchar(20)", }, "sports":{ "id_sports":"integer primary key autoincrement", "name":"varchar(100)", @@ -82,7 +82,9 @@ "maxhr": "integer", }, } +tablesDefaultData = { "sports": [({ "name":"Mountain Bike" } ), ( {"name": "Bike"}), ({"name": "Run"}) ]} + class DDBB: def __init__(self, configuration, pytrainer_main=None): self.pytrainer_main = pytrainer_main @@ -103,16 +105,15 @@ self.ddbbObject = Sql(ddbb_host,ddbb,ddbb_user,ddbb_pass,self.configuration) def connect(self): - #si devolvemos 1 ha ido todo con exito : return 1 if all successful - #con 0 es que no estaba la bbdd creada : 0 is DB not created - #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() - self.ddbbObject.connect() - self.ddbbObject.createTables() - var = 1 - return var + connection_ok, connection_msg = self.ddbbObject.connect() + if not connection_ok: + print "ERROR: Unable to connect to database" + print connection_msg + sys.exit(connection_ok) + #Do a quick check to ensure all tables are present in DB + if not self.checkDBTables(): + #Some tables missing - do DB check + self.checkDBIntegrity() def disconnect(self): self.ddbbObject.disconnect() @@ -271,20 +272,34 @@ sql = "select %s from %s order by %s Desc limit 0,1" %(id,table,id) ret_val = self.ddbbObject.freeExec(sql) return ret_val[0][0] + + def checkDBTables(self): + '''Quick check that all expected tables existing in DB + return True if OK, False if any tables are missing + ''' + global tablesList + logging.debug('>>') + tablesDB = self.ddbbObject.getTableList() + #Check Tables + for entry in tablesList: + if entry not in tablesDB: + return False + return True def checkDBIntegrity(self): - """17.11.2009 - dgranda + '''17.11.2009 - dgranda Retrieves tables and columns from database, checks current ones and adds something if missed. New in version 1.7.0 args: none - returns: none""" + returns: none''' global tablesList + global tablesDefaultData logging.debug('>>') logging.info('Checking PyTrainer database') - if self.ddbb_type != "sqlite": - logging.error('Support for MySQL database is decommissioned, please migrate to SQLite. Exiting check') - exit(-2) + #if self.ddbb_type != "sqlite": + # logging.error('Support for MySQL database is decommissioned, please migrate to SQLite. Exiting check') + # exit(-2) try: - tablesDBT = self.ddbbObject.select("sqlite_master","name", "type IN ('table','view') AND name NOT LIKE 'sqlite_%' ORDER BY name") + tablesDBT = self.ddbbObject.getTableList() except: logging.error('Not able to retrieve which tables are in DB. Printing traceback') traceback.print_exc() @@ -297,7 +312,7 @@ # Create a compressed copy of current DB try: - self.createDatabaseBackup() + self.ddbbObject.createDatabaseBackup() except: logging.error('Not able to make a copy of current DB. Printing traceback and exiting') traceback.print_exc() @@ -308,6 +323,11 @@ if entry not in tablesDB: logging.warn('Table '+str(entry)+' does not exist in DB') self.ddbbObject.createTableDefault(entry,tablesList[entry]) + #Check if this table has default data to add.. + if entry in tablesDefaultData: + logging.debug("Adding default data to %s" % entry) + for data_dict in tablesDefaultData[entry]: + self.insert_dict(entry, data_dict) else: self.ddbbObject.checkTable(entry,tablesList[entry]) @@ -317,16 +337,6 @@ self.populate_duration_from_time() logging.debug('<<') - def createDatabaseBackup(self): - logging.debug('>>') - logging.debug('Database path: '+str(self.ddbb_path)) - result = commands.getstatusoutput('gzip -c '+self.ddbb_path+' > '+self.ddbb_path+'_`date +%Y%m%d_%H%M`.gz') - if result[0] != 0: - raise Exception, "Copying current database does not work, error #"+str(result[0]) - else: - logging.info('Database backup successfully created') - logging.debug('<<') - def checkDBDataValues(self): ''' Check all data in DB and report values that do not match the type ''' global tablesList Modified: pytrainer/trunk/pytrainer/lib/mysqlUtils.py =================================================================== --- pytrainer/trunk/pytrainer/lib/mysqlUtils.py 2010-10-28 01:35:18 UTC (rev 665) +++ pytrainer/trunk/pytrainer/lib/mysqlUtils.py 2010-10-28 21:47:17 UTC (rev 666) @@ -18,160 +18,226 @@ #along with this program; if not, write to the Free Software #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -#import _mysql +import _mysql_exceptions import MySQLdb -from logs import Log +import logging # Fixed some issues with MySql tables creation (email from Jonas Liljenfeldt) class Sql: - def __init__(self,host=None, ddbb = None, user = None, password = None, configuration = None): - self.ddbb_user = user - self.ddbb_pass = password - self.ddbb_host = host - self.ddbb = ddbb - self.db = None - self.log = Log() - - 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. - try: - self.db=MySQLdb.connect( - host=self.ddbb_host, - user=self.ddbb_user, - passwd=self.ddbb_pass, - db=self.ddbb) - self.select("records","id_record","1=1 limit 0,1") - return 1 - except: - try: - self.createTables() - return 0 - except: - return -1 - - def disconnect(self): - self.db.close() - - def createDDBB(self): - self.db.query("create database %s" %self.ddbb) + def __init__(self,host=None, ddbb = None, user = None, password = None, configuration = None): + self.ddbb_user = user + self.ddbb_pass = password + self.ddbb_host = host + self.ddbb = ddbb + self.db = None + + 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. + try: + self.db=MySQLdb.connect( + host=self.ddbb_host, + user=self.ddbb_user, + passwd=self.ddbb_pass, + db=self.ddbb) + return (True, "OK") + except _mysql_exceptions.OperationalError as e: + error_no, error_description = e + print "ERROR: An error occured while connecting to MySQL DB (%s) %s" % (error_no, error_description) + if error_no == 1049: + #Unknown DB - try to create? + print "Unknown DB given, attempting to create a new DB" + try: + #Connect to DB without specifying the DB + self.db=MySQLdb.connect(host=self.ddbb_host, user=self.ddbb_user, passwd=self.ddbb_pass) + #Create DB + self.createDDBB() + #Reconnect to new DB + self.db=MySQLdb.connect(host=self.ddbb_host, user=self.ddbb_user, passwd=self.ddbb_pass, db=self.ddbb) + return (True, "OK") + except Exception as e: + #No good - so stop + print type(e) + print e + logging.error("Unable to connect to MySQL DB") + return (False, "Unable to connect to MySQL DB") + except Exception as e: + logging.error("Unable to connect to MySQL DB") + print "ERROR: Unable to connect to MySQL DB" + print type(e) + print e + return (False, "Unable to connect to MySQL DB") + + def disconnect(self): + self.db.close() + + def createDDBB(self): + self.db.query("create database %s" %self.ddbb) + + def getTableList(self): + return self.freeExec('show tables') + + def createTableDefault(self,tableName,columns): + ''' + Creates a new table in database given name and column name and data types. New in version 1.7.0 + args: + tableName - string with name of the table + columns - dictionary containing column names and data types coming from definition + returns: none''' + #print self, tableName, columns + logging.debug('>>') + logging.info('Creating '+str(tableName)+' table with default values') + logging.debug('Columns definition: '+str(columns)) + cur = self.db.cursor() + sql = 'CREATE TABLE %s (' %(tableName) + for entry in columns: + if columns[entry].find('autoincrement') != -1: + logging.debug("have a autoincrement field") + fieldtype = columns[entry].replace('autoincrement', 'auto_increment') + sql += '%s %s,' %(entry,fieldtype) + else: + sql += '%s %s,' %(entry,columns[entry]) + # Removing trailing comma + sql = sql.rstrip(',') + sql = sql+");" + logging.debug('SQL sentence: '+str(sql)) + #print sql + cur.execute(sql) + logging.debug('<<') - def createTables(self): - #creamos la tabla sports - self.db.query("""CREATE TABLE `sports` ( - `id_sports` INT( 11 ) NOT NULL AUTO_INCREMENT , - `name` VARCHAR( 100 ) NOT NULL , - `weight` FLOAT NOT NULL , - `met` FLOAT NOT NULL , - INDEX ( `id_sports` ) - ) ENGINE = MYISAM ;""") + def insert(self,table, cells, values): + val = values + count = 0 + string = "" + for i in val: + if count>0: + string+="," + string+="""\"%s\"""" %i + count = count+1 + sql = '''insert into %s (%s) values (%s)''' %(table,cells,string) + self.db.query(sql) - #creamos la tabla records - self.db.query("""CREATE TABLE `records` ( - `id_record` INT( 11 ) NOT NULL AUTO_INCREMENT , - `date` DATE NOT NULL , - `sport` INT( 11 ) NOT NULL , - `distance` FLOAT NOT NULL , - `time` VARCHAR( 200 ) NOT NULL , - `beats` FLOAT NOT NULL , - `average` FLOAT NOT NULL , - `calories` INT( 11 ) NOT NULL , - `comments` TEXT NOT NULL , - `gpslog` VARCHAR( 200 ) NOT NULL , - `title` VARCHAR( 200 ) NOT NULL , - `upositive` FLOAT NOT NULL , - `unegative` FLOAT NOT NULL , - `maxspeed` FLOAT NOT NULL, - maxpace FLOAT NOT NULL, - pace FLOAT NOT NULL, - maxbeats FLOAT NOT NULL, - date_time_utc VARCHAR( 20 ) NOT NULL , - INDEX ( `id_record` ) - ) ENGINE = MYISAM ;""") - - #creamos la tabla waypoints - sql = """CREATE TABLE waypoints ( - id_waypoint INT(11) NOT NULL AUTO_INCREMENT , - lat float NOT NULL, - lon float NOT NULL, - ele float NOT NULL, - time date NOT NULL, - name varchar (200) NOT NULL, - sym varchar (200) NOT NULL, - comment varchar (240) NOT NULL, - INDEX (id_waypoint) - ) ENGINE = MYISAM ;""" - self.db.query(sql) - - self.insert("sports","name",["Mountain Bike"]) - self.insert("sports","name",["Bike"]) - self.insert("sports","name",["Run"]) - def addWaipoints2ddbb(self): - sql = """CREATE TABLE waypoints ( - id_waypoint INT(11) NOT NULL AUTO_INCREMENT , - lat float NOT NULL, - lon float NOT NULL, - ele float NOT NULL, - time date NOT NULL, - name varchar (200) NOT NULL, - sym varchar (200) NOT NULL, - comment varchar (240) NOT NULL, - INDEX (id_waypoint) - ) ENGINE = MYISAM ;""" - self.db.query(sql) + def freeExec(self,sql): + #self.db.query(sql) + cur = self.db.cursor() + cur.execute(sql) + retorno = [] + for row in cur.fetchall(): + retorno.append(row) + self.db.commit() + return retorno + + def delete(self,table,condition): + sql = "delete from %s where %s" %(table,condition) + self.db.query(sql) - def insert(self,table, cells, values): - val = values - count = 0 - string = "" - for i in val: - if count>0: - string+="," - string+="""\"%s\"""" %i - count = count+1 - self.db.query("""insert into %s (%s) values (%s)""" %(table,cells,string)) + def select(self,table,cells,condition, mod=None): + if condition != None: + self.db.query("""select %s from %s where %s""" %(cells,table,condition)) + else: + self.db.query("""select %s from %s """ %(cells,table)) + r = self.db.store_result() + retorno = [] + while 1==1: + sublist = r.fetch_row() + if len(sublist)>0: + retorno.append(sublist[0]) + else: + break + return retorno - def freeExec(self,sql): - #self.db.query(sql) - self.log.run(sql) - cur = self.db.cursor() - cur.execute(sql) - retorno = [] - for row in cur.fetchall(): - retorno.append(row) - self.db.commit() - return retorno - - def delete(self,table,condition): - sql = "delete from %s where %s" %(table,condition) - self.db.query(sql) + def update (self,table,cells,values,condition): + cells = cells.split(",") + count = 0 + string = "" + for val in values: + if count>0: + string+="," + string += """%s="%s" """ %(cells[count],values[count]) + count = count+1 - def select(self,table,cells,condition, mod=None): - if condition != None: - self.db.query("""select %s from %s where %s""" %(cells,table,condition)) - else: - self.db.query("""select %s from %s """ %(cells,table)) - r = self.db.store_result() - retorno = [] - while 1==1: - sublist = r.fetch_row() - if len(sublist)>0: - retorno.append(sublist[0]) - else: - break - return retorno + string +=" where %s" %condition + sql = "update %s set %s" %(table,string) + self.db.query(sql) + + def checkTable(self,tableName,columns): + ''' + Checks column names and values from table and adds something if missed. New in version 1.7.0 + args: + tableName - string with name of the table + columns - dictionary containing column names and data types coming from definition + returns: none''' + logging.debug('>>') + logging.info('Inspecting '+str(tableName)+' table') + logging.debug('Columns definition: '+str(columns)) - def update (self,table,cells,values,condition): - cells = cells.split(",") - count = 0 - string = "" - for val in values: - if count>0: - string+="," - string += """%s="%s" """ %(cells[count],values[count]) - count = count+1 + # Retrieving data from DB + tableInfo = self.retrieveTableInfo(tableName) + logging.debug('Raw data retrieved from DB '+str(tableName)+': '+str(tableInfo)) + #print('Raw data retrieved from DB '+str(tableName)+': '+str(tableInfo)) + #Raw data retrieved from DB sports: [('met', 'float', 'YES', '', None, ''), ('id_sports', 'int(11)', 'NO', 'PRI', None, 'auto_increment'), ('max_pace', 'int(11)', 'YES', '', None, ''), ('name', 'varchar(100)', 'YES', '', None, ''), ('weight', 'float', 'YES', '', None, '')] - string +=" where %s" %condition - sql = "update %s set %s" %(table,string) - self.db.query(sql) + # Comparing data retrieved from DB with what comes from definition + columnsDB = {} + for field in tableInfo: + newField = {field[0]:field[1]} + columnsDB.update(newField) + logging.debug('Useful data retrieved from '+str(tableName)+' in DB: '+str(columnsDB)) + #print('Useful data retrieved from '+str(tableName)+' in DB: '+str(columnsDB)) + + # http://mail.python.org/pipermail/python-list/2002-May/141458.html + #tempDict = dict(zip(columns,columns)) + tempDict = dict(columns) + #Test for columns that are in DB that shouldn't be + result = [x for x in columnsDB if x not in tempDict] + #Test for columns that are not in the DB that should be + result2 = [x for x in tempDict if x not in columnsDB] + + logging.debug("Columns in DB that shouldnt be: "+str(result)) + logging.debug("Columns missing from DB: "+str(result2)) + + table_ok = True + if len(result) > 0: + logging.debug('Found columns in DB that should not be: '+ str(result)) + table_ok = False + for entry in result: + logging.debug('Column '+ str(entry) +' in DB but not in definition') + print "Column %s in DB but not in definition - please fix manually" % (str(entry)) + print "#TODO need to add auto fix code" + sys.exit(1) + if len(result2) > 0: # may have also different data type + logging.debug('Found columns missed in DB: '+ str(result2)) + table_ok = False + for entry in result2: + logging.debug('Column '+ str(entry) +' not found in DB') + self.addColumn(tableName,str(entry),columns[entry]) + if table_ok: + logging.info('Table '+ str(tableName) +' is OK') + logging.debug('<<') + + def retrieveTableInfo(self,tableName): + cur = self.db.cursor() + sql = "desc %s;" %tableName + cur.execute(sql) + tableInfo = [] + for row in cur: + tableInfo.append(row) + return tableInfo + return + + def addColumn(self,tableName,columnName,dataType): + if dataType.find('autoincrement') != -1: + dataType = dataType.replace('autoincrement', 'auto_increment') + sql = "alter table %s add %s %s" %(tableName,columnName,dataType) + logging.debug("Trying SQL: %s" % sql) + try: + self.freeExec(sql) + except: + logging.error('Not able to add/change column '+columnName+' to table '+tableName) + traceback.print_exc() + + def createDatabaseBackup(self): + logging.debug('>>') + logging.info("Unable to create backup for MySQL DB") + logging.debug('<<') Modified: pytrainer/trunk/pytrainer/lib/sqliteUtils.py =================================================================== --- pytrainer/trunk/pytrainer/lib/sqliteUtils.py 2010-10-28 01:35:18 UTC (rev 665) +++ pytrainer/trunk/pytrainer/lib/sqliteUtils.py 2010-10-28 21:47:17 UTC (rev 666) @@ -19,7 +19,7 @@ #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. import logging -import sys, traceback +import sys, traceback, commands try: from sqlite3 import dbapi2 as sqlite except ImportError: @@ -27,89 +27,39 @@ from pysqlite2 import dbapi2 as sqlite logging.info('Using pysqlite2 module to access DB. Think about upgrading to python 2.5!') -from logs import Log - class Sql: def __init__(self,host=None, ddbb = None, user = None, password = None, configuration = None): self.db = None confdir = configuration.confdir self.ddbb = "%s/pytrainer.ddbb" %confdir - self.log = Log() def connect(self): #si devolvemos 1 ha ido todo con exito self.db = sqlite.connect(self.ddbb) + return (True, "OK") #probamos si estan las tablas creadas, y sino.. las creamos - try: + '''try: self.select("records","id_record","1=1 limit 0,1") except: self.createTables() - return 1 + return 1''' def disconnect(self): self.db.close() def createDDBB(self): pass + + def getTableList(self): + return self.select("sqlite_master","name", "type IN ('table','view') AND name NOT LIKE 'sqlite_%' ORDER BY name") - 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 ( - id_sports integer primary key autoincrement, - name varchar (100), - weight float, - met float - );""" - cur.execute(sql) - - #creamos la tabla records - sql = """CREATE TABLE records ( - id_record integer primary key autoincrement , - date date, - sport integer, - distance float, - time varchar (200), - beats float, - average float, - calories int, - comments text, - gpslog varchar(200), - title varchar(200), - upositive float, - unegative float, - maxspeed float, - maxpace float, - pace float, - maxbeats float, - date_time_utc varchar2(20) - ) ;""" - cur.execute(sql) - - #creamos la tabla waypoints - sql = """CREATE TABLE waypoints ( - id_waypoint integer primary key autoincrement , - lat float, - lon float, - ele float, - comment varchar (240), - time date, - name varchar (200), - sym varchar (200) - ) ;""" - cur.execute(sql) - - self.insert("sports","name",["Mountain Bike"]); - self.insert("sports","name",["Bike"]); - self.insert("sports","name",["Run"]); - def createTableDefault(self,tableName,columns): - """22.11.2009 - dgranda + '''22.11.2009 - dgranda Creates a new table in database given name and column name and data types. New in version 1.7.0 args: tableName - string with name of the table columns - dictionary containing column names and data types coming from definition - returns: none""" + returns: none''' logging.debug('>>') logging.info('Creating '+str(tableName)+' table with default values') logging.debug('Columns definition: '+str(columns)) @@ -123,21 +73,7 @@ logging.debug('SQL sentence: '+str(sql)) cur.execute(sql) logging.debug('<<') - - def addWaipoints2ddbb(self): #TODO Remove? - cur = self.db.cursor() - sql = """CREATE TABLE waypoints ( - id_waypoint integer primary key autoincrement , - lat float, - lon float, - ele float, - comment varchar (240), - time date, - name varchar (200), - sym varchar (200) - ) ;""" - cur.execute(sql) - + def insert(self,table, cells, values): cur = self.db.cursor() val = values @@ -149,13 +85,11 @@ string+="""\"%s\"""" %i count = count+1 sql = "insert into %s (%s) values (%s)" %(table,cells,string) - self.log.run(sql) cur.execute(sql) self.db.commit() def freeExec(self,sql): cur = self.db.cursor() - self.log.run(sql) cur.execute(sql) retorno = [] for row in cur: @@ -166,7 +100,6 @@ def delete(self,table,condition): cur = self.db.cursor() sql = "delete from %s where %s" %(table,condition) - self.log.run(sql) cur.execute(sql) self.db.commit() @@ -183,7 +116,6 @@ string +=" where %s" %condition sql = "update %s set %s" %(table,string) - self.log.run(sql) cur.execute(sql) self.db.commit() @@ -198,7 +130,6 @@ sql = "select %s from %s where %s" %(cells,table,condition) else: sql = "select %s from %s " %(cells,table)''' - self.log.run(sql) cur.execute(sql) retorno = [] for row in cur: @@ -206,19 +137,20 @@ return retorno def checkTable(self,tableName,columns): - """19.11.2009 - dgranda + '''19.11.2009 - dgranda Checks column names and values from table and adds something if missed. New in version 1.7.0 args: tableName - string with name of the table columns - dictionary containing column names and data types coming from definition - returns: none""" + returns: none''' logging.debug('>>') logging.info('Inspecting '+str(tableName)+' table') logging.debug('Columns definition: '+str(columns)) # Retrieving data from DB tableInfo = self.retrieveTableInfo(tableName) - #logging.debug('Raw data retrieved from DB '+str(tableName)+': '+str(tableInfo)) + logging.debug('Raw data retrieved from DB '+str(tableName)+': '+str(tableInfo)) + #Raw data retrieved from DB laps: [(0, u'elapsed_time', u'varchar(20)', 0, None, 0), (1, u'record', u'integer', 0, None, 0), (2, u'end_lon', u'float', 0, None, 0), (3, u'lap_number', u'integer', 0, None, 0), (4, u'end_lat', u'float', 0, None, 0), (5, u'distance', u'float', 0, None, 0), (6, u'start_lon', u'float', 0, None, 0), (7, u'id_lap', u'integer', 0, None, 1), (8, u'calories', u'int', 0, None, 0), (9, u'start_lat', u'float', 0, None, 0)] # Comparing data retrieved from DB with what comes from definition columnsDB = {} @@ -226,7 +158,8 @@ newField = {field[1]:field[2]} columnsDB.update(newField) logging.debug('Useful data retrieved from '+str(tableName)+' in DB: '+str(columnsDB)) - + #Useful data retrieved from laps in DB: {u'elapsed_time': u'varchar(20)', u'record': u'integer', u'end_lon': u'float', u'start_lon': u'float', u'end_lat': u'float', u'distance': u'float', u'id_lap': u'integer', u'lap_number': u'integer', u'calories': u'int', u'start_lat': u'float'} + # http://mail.python.org/pipermail/python-list/2002-May/141458.html #tempDict = dict(zip(columns,columns)) tempDict = dict(columns) @@ -275,3 +208,13 @@ logging.error('Not able to add/change column '+columnName+' to table '+tableName) traceback.print_exc() + + def createDatabaseBackup(self): + logging.debug('>>') + logging.debug('Database path: '+str(self.ddbb)) + result = commands.getstatusoutput('gzip -c '+self.ddbb+' > '+self.ddbb+'_`date +%Y%m%d_%H%M`.gz') + if result[0] != 0: + raise Exception, "Copying current database does not work, error #"+str(result[0]) + else: + logging.info('Database backup successfully created') + logging.debug('<<') Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-10-28 01:35:18 UTC (rev 665) +++ pytrainer/trunk/pytrainer/main.py 2010-10-28 21:47:17 UTC (rev 666) @@ -50,7 +50,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#665" + self.version ="1.7.2_svn#666" self.DB_version = 6 #Process command line options self.startup_options = self.get_options() @@ -64,9 +64,10 @@ logging.debug('Checking configuration and profile...') self.profile = Profile(self.data_path,self) self.windowmain = None - self.ddbb = DDBB(self.profile) + self.ddbb = DDBB(self.profile, self) logging.debug('connecting to DDBB') self.ddbb.connect() + #Get user's DB version currentDB_version = self.profile.getValue("pytraining","DB_version") Modified: pytrainer/trunk/pytrainer/profile.py =================================================================== --- pytrainer/trunk/pytrainer/profile.py 2010-10-28 01:35:18 UTC (rev 665) +++ pytrainer/trunk/pytrainer/profile.py 2010-10-28 21:47:17 UTC (rev 666) @@ -78,7 +78,7 @@ self.config_file = self.conffile self.configuration = self._parse_config_file(self.config_file) logging.debug("Configuration retrieved: "+str(self.configuration)) - self.pytrainer_main.ddbb = DDBB(self, pytrainer_main=self.pytrainer_main) + #self.pytrainer_main.ddbb = DDBB(self, pytrainer_main=self.pytrainer_main) self._setZones() logging.debug("<<") @@ -273,12 +273,12 @@ def getSportList(self): logging.debug("--") - connection = self.pytrainer_main.ddbb.connect() - if (connection == 1): - logging.debug("retrieving sports info") - return self.pytrainer_main.ddbb.select("sports","name,met,weight,id_sports,max_pace",None) - else: - return connection + #connection = self.pytrainer_main.ddbb.connect() + #if (connection == 1): + logging.debug("retrieving sports info") + return self.pytrainer_main.ddbb.select("sports","name,met,weight,id_sports,max_pace",None) + #else: + # return connection def addNewSport(self,sport,met,weight,maxpace): """31.08.2008 - dgranda This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-10-28 22:12:02
|
Revision: 667 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=667&view=rev Author: jblance Date: 2010-10-28 22:11:55 +0000 (Thu, 28 Oct 2010) Log Message: ----------- Correction to date handling to work for mysql and sqlite Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/ddbb.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/monthgraph.py pytrainer/trunk/pytrainer/yeargraph.py Modified: pytrainer/trunk/pytrainer/lib/ddbb.py =================================================================== --- pytrainer/trunk/pytrainer/lib/ddbb.py 2010-10-28 21:47:17 UTC (rev 666) +++ pytrainer/trunk/pytrainer/lib/ddbb.py 2010-10-28 22:11:55 UTC (rev 667) @@ -44,8 +44,8 @@ "maxpace":"float", "pace":"float", "maxbeats":"float", - "date_time_local":"varchar(20)", - "date_time_utc":"varchar(20)", + "date_time_local":"varchar(40)", + "date_time_utc":"varchar(40)", }, "sports":{ "id_sports":"integer primary key autoincrement", "name":"varchar(100)", Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-10-28 21:47:17 UTC (rev 666) +++ pytrainer/trunk/pytrainer/main.py 2010-10-28 22:11:55 UTC (rev 667) @@ -50,7 +50,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#666" + self.version ="1.7.2_svn#667" self.DB_version = 6 #Process command line options self.startup_options = self.get_options() Modified: pytrainer/trunk/pytrainer/monthgraph.py =================================================================== --- pytrainer/trunk/pytrainer/monthgraph.py 2010-10-28 21:47:17 UTC (rev 666) +++ pytrainer/trunk/pytrainer/monthgraph.py 2010-10-28 22:11:55 UTC (rev 667) @@ -17,118 +17,123 @@ #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. from gui.drawArea import DrawArea +import dateutil class MonthGraph: - def __init__(self, vbox = None, window = None, combovalue = None, combovalue2 = None): - self.drawarea = DrawArea(vbox, window) - self.combovalue = combovalue - self.combovalue2 = combovalue2 + def __init__(self, vbox = None, window = None, combovalue = None, combovalue2 = None): + self.drawarea = DrawArea(vbox, window) + self.combovalue = combovalue + self.combovalue2 = combovalue2 - def drawgraph(self,values, daysInMonth): - xval = [] - yval = [] - xlab = [] - ylab = [] - tit = [] - col = [] - value_selected = self.combovalue.get_active() - value_selected2 = self.combovalue2.get_active() - if value_selected < 0: - self.combovalue.set_active(0) - value_selected = 0 - xlabel,ylabel,title,color = self.get_value_params(value_selected) - xvalues,yvalues = self.get_values(values,value_selected,daysInMonth) + def drawgraph(self,values, daysInMonth): + xval = [] + yval = [] + xlab = [] + ylab = [] + tit = [] + col = [] + value_selected = self.combovalue.get_active() + value_selected2 = self.combovalue2.get_active() + if value_selected < 0: + self.combovalue.set_active(0) + value_selected = 0 + xlabel,ylabel,title,color = self.get_value_params(value_selected) + xvalues,yvalues = self.get_values(values,value_selected,daysInMonth) - xval.append(xvalues) - yval.append(yvalues) - if value_selected2 < 0: - xlab.append("") - else: - xlab.append(xlabel) - ylab.append(ylabel) - tit.append(title) - col.append(color) - - if value_selected2 < 0: - self.combovalue2.set_active(0) - value_selected2 = 0 - if value_selected2 > 0: - value_selected2 = value_selected2-1 - xlabel,ylabel,title,color = self.get_value_params(value_selected2) - xvalues,yvalues = self.get_values(values,value_selected2,daysInMonth) - xval.append(xvalues) - yval.append(yvalues) - xlab.append(xlabel) - ylab.append(ylabel) - tit.append(title) - col.append(color) - self.drawarea.stadistics("bars",xval,yval,xlab,ylab,tit,col) + xval.append(xvalues) + yval.append(yvalues) + if value_selected2 < 0: + xlab.append("") + else: + xlab.append(xlabel) + ylab.append(ylabel) + tit.append(title) + col.append(color) + + if value_selected2 < 0: + self.combovalue2.set_active(0) + value_selected2 = 0 + if value_selected2 > 0: + value_selected2 = value_selected2-1 + xlabel,ylabel,title,color = self.get_value_params(value_selected2) + xvalues,yvalues = self.get_values(values,value_selected2,daysInMonth) + xval.append(xvalues) + yval.append(yvalues) + xlab.append(xlabel) + ylab.append(ylabel) + tit.append(title) + col.append(color) + self.drawarea.stadistics("bars",xval,yval,xlab,ylab,tit,col) - def get_value_params(self,value): - if value == 0: - return _("day"),_("Distance (km)"),_("Daily Distance"),"y" - elif value == 1: - return _("day"),_("Time (hours)"), _("Daily Time"),"b" - elif value == 2: - return _("day"),_("Average Heart Rate (bpm)"), _("Daily Average Heart Rate"),"r" - elif value == 3: - return _("day"),_("Average Speed (km/h)"), _("Daily Average Speed"),"g" - elif value == 4: - return _("day"),_("Calories"), _("Daily Calories"),"b" + def get_value_params(self,value): + if value == 0: + return _("day"),_("Distance (km)"),_("Daily Distance"),"y" + elif value == 1: + return _("day"),_("Time (hours)"), _("Daily Time"),"b" + elif value == 2: + return _("day"),_("Average Heart Rate (bpm)"), _("Daily Average Heart Rate"),"r" + elif value == 3: + return _("day"),_("Average Speed (km/h)"), _("Daily Average Speed"),"g" + elif value == 4: + return _("day"),_("Calories"), _("Daily Calories"),"b" - def get_values(self,values,value_selected,daysInMonth): - #hacemos una relacion entre el value_selected y los values / we make a relation between value_selected and the values - conv = { - 0: 1, #value 0 es kilometros (1) - 1: 2, #value 1 es tiempo (2) - 2: 3, #value 2 es pulsaciones(3) - 3: 5, #value 3 es media(5) - 4: 6 #value 4 es calorias(6) - } - list_values = {} - list_average = {} - for i in range(1,daysInMonth+1): - list_values[i]=0 - list_average[i]=0 + def get_values(self,values,value_selected,daysInMonth): + #hacemos una relacion entre el value_selected y los values / we make a relation between value_selected and the values + conv = { + 0: 1, #value 0 es kilometros (1) + 1: 2, #value 1 es tiempo (2) + 2: 3, #value 2 es pulsaciones(3) + 3: 5, #value 3 es media(5) + 4: 6 #value 4 es calorias(6) + } + list_values = {} + list_average = {} + for i in range(1,daysInMonth+1): + list_values[i]=0 + list_average[i]=0 - value_sel = conv[value_selected] - for value in values: - #si la opcion es tiempo lo pasamos a horas / if the option is time we passed it to hours - if (value_sel == 2): - graph_value = self.getFloatValue(value[value_sel])/3600 - else: - graph_value = self.getFloatValue(value[value_sel]) - - date = value[0] - year,month,day = date.split("-") + value_sel = conv[value_selected] + for value in values: + #si la opcion es tiempo lo pasamos a horas / if the option is time we passed it to hours + if (value_sel == 2): + graph_value = self.getFloatValue(value[value_sel])/3600 + else: + graph_value = self.getFloatValue(value[value_sel]) + + #TODO Sort date handling... + date = value[0] + try: + year,month,day = date.year, date.month, date.day + except AttributeError: + year,month,day = date.split("-") - #si es una opcion de suma de absolutos / if it is an option of sum of absolute - if ((value_selected == 0) or (value_selected==1) or (value_selected==4)): - list_values[int(day)] += graph_value - #si se trata de calcular medias / if one is to calculate averages: - else: - if graph_value is not None and graph_value != 0: - list_values[int(day)] += graph_value - list_average[int(day)] += 1 + #si es una opcion de suma de absolutos / if it is an option of sum of absolute + if ((value_selected == 0) or (value_selected==1) or (value_selected==4)): + list_values[int(day)] += graph_value + #si se trata de calcular medias / if one is to calculate averages: + else: + if graph_value is not None and graph_value != 0: + list_values[int(day)] += graph_value + list_average[int(day)] += 1 - xunits = [] - yunits = [] - for i in range (1,daysInMonth+1): - xunits.append(i) - yunits.append(float(0)) - - for value in list_values: - if ((value_selected == 0) or (value_selected==1) or (value_selected==4)): - yunits[value-1] = list_values[value] - else: - if list_average[value]>0: - yunits[value-1] = list_values[value]/list_average[value] + xunits = [] + yunits = [] + for i in range (1,daysInMonth+1): + xunits.append(i) + yunits.append(float(0)) + + for value in list_values: + if ((value_selected == 0) or (value_selected==1) or (value_selected==4)): + yunits[value-1] = list_values[value] + else: + if list_average[value]>0: + yunits[value-1] = list_values[value]/list_average[value] - return xunits,yunits - - def getFloatValue(self, value): - try: - return float(value) - except: - return float(0) + return xunits,yunits + + def getFloatValue(self, value): + try: + return float(value) + except: + return float(0) Modified: pytrainer/trunk/pytrainer/yeargraph.py =================================================================== --- pytrainer/trunk/pytrainer/yeargraph.py 2010-10-28 21:47:17 UTC (rev 666) +++ pytrainer/trunk/pytrainer/yeargraph.py 2010-10-28 22:11:55 UTC (rev 667) @@ -20,116 +20,119 @@ import calendar class YearGraph: - def __init__(self, vbox = None, window = None, combovalue = None, combovalue2 = None): - self.drawarea = DrawArea(vbox, window) - self.combovalue = combovalue - self.combovalue2 = combovalue2 + def __init__(self, vbox = None, window = None, combovalue = None, combovalue2 = None): + self.drawarea = DrawArea(vbox, window) + self.combovalue = combovalue + self.combovalue2 = combovalue2 - def drawgraph(self,values): - xval = [] - yval = [] - xlab = [] - ylab = [] - tit = [] - col = [] - value_selected = self.combovalue.get_active() - value_selected2 = self.combovalue2.get_active() - if value_selected < 0: - self.combovalue.set_active(0) - value_selected = 0 - monthsnumber,xlabel,ylabel,title,color = self.get_value_params(value_selected) - xvalues,yvalues = self.get_values(values,value_selected,monthsnumber) + def drawgraph(self,values): + xval = [] + yval = [] + xlab = [] + ylab = [] + tit = [] + col = [] + value_selected = self.combovalue.get_active() + value_selected2 = self.combovalue2.get_active() + if value_selected < 0: + self.combovalue.set_active(0) + value_selected = 0 + monthsnumber,xlabel,ylabel,title,color = self.get_value_params(value_selected) + xvalues,yvalues = self.get_values(values,value_selected,monthsnumber) - xval.append(xvalues) - yval.append(yvalues) - if value_selected2 < 0: - xlab.append("") - else: - xlab.append(xlabel) - ylab.append(ylabel) - tit.append(title) - col.append(color) + xval.append(xvalues) + yval.append(yvalues) + if value_selected2 < 0: + xlab.append("") + else: + xlab.append(xlabel) + ylab.append(ylabel) + tit.append(title) + col.append(color) - if value_selected2 < 0: - self.combovalue2.set_active(0) - value_selected2 = 0 - if value_selected2 > 0: - value_selected2 = value_selected2-1 - daysmonth,xlabel,ylabel,title,color = self.get_value_params(value_selected2) - xvalues,yvalues = self.get_values(values,value_selected2,daysmonth) - xval.append(xvalues) - yval.append(yvalues) - xlab.append(xlabel) - ylab.append(ylabel) - tit.append(title) - col.append(color) - self.drawarea.stadistics("bars",xval,yval,xlab,ylab,tit,col) + if value_selected2 < 0: + self.combovalue2.set_active(0) + value_selected2 = 0 + if value_selected2 > 0: + value_selected2 = value_selected2-1 + daysmonth,xlabel,ylabel,title,color = self.get_value_params(value_selected2) + xvalues,yvalues = self.get_values(values,value_selected2,daysmonth) + xval.append(xvalues) + yval.append(yvalues) + xlab.append(xlabel) + ylab.append(ylabel) + tit.append(title) + col.append(color) + self.drawarea.stadistics("bars",xval,yval,xlab,ylab,tit,col) - def get_value_params(self,value): - if value == 0: - return 12,_("month"),_("Distance (km)"),_("Monthly Distance"),"y" - elif value == 1: - return 12,_("month"),_("Time (hours)"), _("Monthly Time"),"b" - elif value == 2: - return 12,_("month"),_("Average Heart Rate (bpm)"), _("Monthly Average Heart Rate"),"r" - elif value == 3: - return 12,_("month"),_("Average Speed (km/h)"), _("Monthly Average Speed"),"g" - elif value == 4: - return 12,_("month"),_("Calories"), _("Monthly Calories"),"b" + def get_value_params(self,value): + if value == 0: + return 12,_("month"),_("Distance (km)"),_("Monthly Distance"),"y" + elif value == 1: + return 12,_("month"),_("Time (hours)"), _("Monthly Time"),"b" + elif value == 2: + return 12,_("month"),_("Average Heart Rate (bpm)"), _("Monthly Average Heart Rate"),"r" + elif value == 3: + return 12,_("month"),_("Average Speed (km/h)"), _("Monthly Average Speed"),"g" + elif value == 4: + return 12,_("month"),_("Calories"), _("Monthly Calories"),"b" - def get_values(self,values,value_selected,monthsnumber): - #hacemos una relacion entre el value_selected y los values - conv = { - 0: 1, #value 0 es kilometros (1) - 1: 2, #value 1 es tiempo (2) - 2: 3, #value 2 es pulsaciones(3) - 3: 5, #value 3 es media(5) - 4: 6 #value 4 es calorias(6) - } - list_values = {} - list_average = {} - tm_total = {} - for i in range(1,monthsnumber+1): - list_values[i]=0 - list_average[i]=0 - tm_total[i] = 0 - - value_sel = conv[value_selected] + def get_values(self,values,value_selected,monthsnumber): + #hacemos una relacion entre el value_selected y los values + conv = { + 0: 1, #value 0 es kilometros (1) + 1: 2, #value 1 es tiempo (2) + 2: 3, #value 2 es pulsaciones(3) + 3: 5, #value 3 es media(5) + 4: 6 #value 4 es calorias(6) + } + list_values = {} + list_average = {} + tm_total = {} + for i in range(1,monthsnumber+1): + list_values[i]=0 + list_average[i]=0 + tm_total[i] = 0 + + value_sel = conv[value_selected] - for value in values: - date = value[0] - year,month,day = date.split("-") - month = int(month) - #si la opcion es tiempo lo pasamos a horas / if the option is time we passed it to hours - if (value_sel == 2): - graph_value = self.getFloatValue(value[value_sel])/3600 - else: - graph_value = self.getFloatValue(value[value_sel]) + for value in values: + date = value[0] + try: + year,month,day = date.year, date.month, date.day + except AttributeError: + year,month,day = date.split("-") + month = int(month) + #si la opcion es tiempo lo pasamos a horas / if the option is time we passed it to hours + if (value_sel == 2): + graph_value = self.getFloatValue(value[value_sel])/3600 + else: + graph_value = self.getFloatValue(value[value_sel]) - #si es una opcion de suma de absolutos / if it is an option of sum of absolute - if ((value_selected == 0) or (value_selected==1) or (value_selected==4)): - list_values[int(month)] += graph_value - #si se trata de calcular medias / if one is to calculate averages: - else: - if graph_value is not None and graph_value != 0: - list_values[int(month)] += graph_value - list_average[int(month)] += 1 + #si es una opcion de suma de absolutos / if it is an option of sum of absolute + if ((value_selected == 0) or (value_selected==1) or (value_selected==4)): + list_values[int(month)] += graph_value + #si se trata de calcular medias / if one is to calculate averages: + else: + if graph_value is not None and graph_value != 0: + list_values[int(month)] += graph_value + list_average[int(month)] += 1 - xunits = [] - yunits = [] - for i in range (0,monthsnumber): - xunits.append(unicode(calendar.month_abbr[i+1])) - yunits.append(float(0)) - for value in list_values: - if ((value_selected == 0) or (value_selected==1) or (value_selected==4)): - yunits[value-1] = list_values[value] - else: - if list_average[value]>0: - yunits[value-1] = list_values[value]/list_average[value] - return xunits,yunits - - def getFloatValue(self, value): - try: - return float(value) - except: - return float(0) + xunits = [] + yunits = [] + for i in range (0,monthsnumber): + xunits.append(unicode(calendar.month_abbr[i+1])) + yunits.append(float(0)) + for value in list_values: + if ((value_selected == 0) or (value_selected==1) or (value_selected==4)): + yunits[value-1] = list_values[value] + else: + if list_average[value]>0: + yunits[value-1] = list_values[value]/list_average[value] + return xunits,yunits + + def getFloatValue(self, value): + try: + return float(value) + except: + return float(0) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-10-28 23:38:53
|
Revision: 668 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=668&view=rev Author: jblance Date: 2010-10-28 23:38:47 +0000 (Thu, 28 Oct 2010) Log Message: ----------- New menu item works for athlete data if in athlete view Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2010-10-28 22:11:55 UTC (rev 667) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-10-28 23:38:47 UTC (rev 668) @@ -251,7 +251,9 @@ cell.set_property('text', new) def render_float(self, column, cell, model, iter, format): - orig = cell.get_property('text') + #orig = cell.get_property('text') + #To deal with floats displayed with a comma instead of a dot + orig = model.get_value(iter, column.get_sort_column_id()) new = format % float(orig) cell.set_property('text', new) @@ -1370,7 +1372,11 @@ self.parent.exportCsv() def on_newrecord_clicked(self,widget): - self.parent.newRecord() + if self.selected_view == 'athlete': + #print 'New athlete' + self.on_athleteTreeView_edit( None, None) + else: + self.parent.newRecord() def on_edituser_activate(self,widget): self.parent.editProfile() Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-10-28 22:11:55 UTC (rev 667) +++ pytrainer/trunk/pytrainer/main.py 2010-10-28 23:38:47 UTC (rev 668) @@ -50,7 +50,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#667" + self.version ="1.7.2_svn#668" self.DB_version = 6 #Process command line options self.startup_options = self.get_options() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-10-31 22:19:35
|
Revision: 670 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=670&view=rev Author: jblance Date: 2010-10-31 22:19:28 +0000 (Sun, 31 Oct 2010) Log Message: ----------- Update date.py to deal with naive dates correctly Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/date.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/lib/date.py =================================================================== --- pytrainer/trunk/pytrainer/lib/date.py 2010-10-29 04:45:15 UTC (rev 669) +++ pytrainer/trunk/pytrainer/lib/date.py 2010-10-31 22:19:28 UTC (rev 670) @@ -178,13 +178,25 @@ # 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 + try: + dateTime = dateutil.parser.parse(time_) + except ValueError as e: + print "Unable to parse '%s' as a date time" % time_ + print e + logging.debug("Unable to parse %s as a date time" % time_) + logging.debug(str(e)) + return (None, None) + timezone = dateTime.tzinfo + if timezone is None: #got a naive time, so assume is local time + #print 'Naive time' + local_dateTime = dateTime.replace(tzinfo=tzlocal()) + elif timezone == tzutc(): #got a zulu time + #print 'zulu time' local_dateTime = dateTime.astimezone(tzlocal()) #datetime with localtime offset (from OS) else: + #print 'local time' local_dateTime = dateTime #use datetime as supplied - utc_dateTime = dateTime.astimezone(tzutc()) #datetime with 00:00 offset + utc_dateTime = local_dateTime.astimezone(tzutc()) #datetime with 00:00 offset #print utc_dateTime, local_dateTime return (utc_dateTime,local_dateTime) Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-10-29 04:45:15 UTC (rev 669) +++ pytrainer/trunk/pytrainer/main.py 2010-10-31 22:19:28 UTC (rev 670) @@ -50,7 +50,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#668" + self.version ="1.7.2_svn#670" self.DB_version = 6 #Process command line options self.startup_options = self.get_options() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-11-01 03:53:07
|
Revision: 672 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=672&view=rev Author: jblance Date: 2010-11-01 03:53:00 +0000 (Mon, 01 Nov 2010) Log Message: ----------- Fix for US unit display in record list view Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/lib/activity.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2010-10-31 22:34:54 UTC (rev 671) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-11-01 03:53:00 UTC (rev 672) @@ -93,7 +93,11 @@ pass self.record_list = [] #create the columns for the listdayrecord - columns = [{'name':_("id"), 'visible':False},{'name':_("Start"), }, {'name':_("Sport")},{'name':_("Kilometer")}] + if self.pytrainer_main.profile.prf_us_system: + distance_unit = _("Miles") + else: + distance_unit = _("Km") + columns = [{'name':_("id"), 'visible':False},{'name':_("Start"), }, {'name':_("Sport")},{'name':distance_unit}] self.create_treeview(self.recordTreeView,columns) #create the columns for the listarea # different codings for mean see eg http://de.wikipedia.org/wiki/%C3%98#Kodierung @@ -301,13 +305,13 @@ recordTime = dateTime.strftime("%X") recordDateTimeOffset = dateTime.strftime("%z") - self.record_distance.set_text("%0.2f" %activity.distance) - self.record_upositive.set_text("%0.2f" %activity.upositive) - self.record_unegative.set_text("%0.2f" %activity.unegative) - self.record_average.set_text("%0.2f" %activity.average) - self.record_maxspeed.set_text("%0.2f" %activity.maxspeed) - self.record_pace.set_text(Record().pace_from_float(activity.pace)) - self.record_maxpace.set_text(Record().pace_from_float(activity.maxpace)) + self.record_distance.set_text("%0.2f" %activity.get_value('distance')) + self.record_upositive.set_text("%0.2f" %activity.get_value('upositive')) + self.record_unegative.set_text("%0.2f" %activity.get_value('unegative')) + self.record_average.set_text("%0.2f" %activity.get_value('average')) + self.record_maxspeed.set_text("%0.2f" %activity.get_value('maxspeed')) + self.record_pace.set_text(activity.get_value('pace')) + self.record_maxpace.set_text(activity.get_value('maxpace')) self.record_sport.set_text(activity.sport_name) #self.record_date.set_text(str(date)) @@ -1559,6 +1563,7 @@ object) for i in record_list: #Get lap info + #Could get an activity from the pool here, but is slow?? id_record = i[8] laps = self.parent.record.getLaps(id_record) iter = store.append(None) @@ -1569,18 +1574,27 @@ localTime = dateutil.parser.parse(dateTime).strftime("%H:%M") else: localTime = "" + if self.pytrainer_main.profile.prf_us_system: + dist = km2miles(i[2]) + else: + dist = i[2] + distance = "%0.2f" % (float(dist) ) store.set ( iter, 0, int(i[8]), 1, str(localTime), 2, str(i[0]), - 3, str(i[2]) + 3, str(distance) #Needs to be US pref aware.... ) if laps is not None: for lap in laps: #"id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories, lap_number", lapNumber = "%s%d" % ( _("lap"), int(lap[9])+1 ) - distance = "%0.2f" % (float(lap[3]) / 1000.0) + if self.pytrainer_main.profile.prf_us_system: + dist = km2miles(lap[3]) + else: + dist = lap[3] + distance = "%0.2f" % (float(dist) / 1000.0) timeHours = int(float(lap[2]) / 3600) timeMin = int((float(lap[2]) / 3600.0 - timeHours) * 60) timeSec = float(lap[2]) - (timeHours * 3600) - (timeMin * 60) @@ -1600,8 +1614,7 @@ self.recordTreeView.set_model(store) if iterOne: self.recordTreeView.get_selection().select_iter(iterOne) - logging.debug("<<") - #if len(record_list)>0: + logging.debug("<<") def parseFloat(self,string): try: @@ -1612,8 +1625,10 @@ def actualize_calendar(self,record_list): logging.debug(">>") self.calendar.clear_marks() + #Mark each day that has activity for i in record_list: self.calendar.mark_day(int(i)) + #Turn on displaying of week numbers display_options = self.calendar.get_display_options() self.calendar.set_display_options(display_options|gtk.CALENDAR_SHOW_WEEK_NUMBERS) logging.debug("<<") Modified: pytrainer/trunk/pytrainer/lib/activity.py =================================================================== --- pytrainer/trunk/pytrainer/lib/activity.py 2010-10-31 22:34:54 UTC (rev 671) +++ pytrainer/trunk/pytrainer/lib/activity.py 2010-11-01 03:53:00 UTC (rev 672) @@ -30,6 +30,8 @@ class Activity: ''' Class that knows everything about a particular activity + + All values are stored in the class (and DB) in metric and are converted as needed tracks - (list) tracklist from gpx tracklist - (list of dict) trackpoint data from gpx @@ -249,22 +251,22 @@ self.date_time = tmpDateTime.astimezone(tzlocal()) #datetime with localtime offset (using value from OS) self.starttime = self.date_time.strftime("%X") #Sort data that changes for the US etc - if self.us_system: - self.distance = km2miles(self._float(_dict['distance'])) - self.average = km2miles(self._float(_dict['average'])) - self.upositive = m2feet(self._float(_dict['upositive'])) - self.unegative = m2feet(self._float(_dict['unegative'])) - self.maxspeed = km2miles(self._float(_dict['maxspeed'])) - self.maxpace = pacekm2miles(self._float(_dict['maxpace'])) - self.pace = pacekm2miles(self._float(_dict['pace'])) - else: - self.distance = self._float(_dict['distance']) - self.average = self._float(_dict['average']) - self.upositive = self._float(_dict['upositive']) - self.unegative = self._float(_dict['unegative']) - self.maxspeed = self._float(_dict['maxspeed']) - self.maxpace = self._float(_dict['maxpace']) - self.pace = self._float(_dict['pace']) + #if self.us_system: + # self.distance = km2miles(self._float(_dict['distance'])) + # self.average = km2miles(self._float(_dict['average'])) + # self.upositive = m2feet(self._float(_dict['upositive'])) + # self.unegative = m2feet(self._float(_dict['unegative'])) + # self.maxspeed = km2miles(self._float(_dict['maxspeed'])) + # self.maxpace = pacekm2miles(self._float(_dict['maxpace'])) + # self.pace = pacekm2miles(self._float(_dict['pace'])) + #else: + self.distance = self._float(_dict['distance']) + self.average = self._float(_dict['average']) + self.upositive = self._float(_dict['upositive']) + self.unegative = self._float(_dict['unegative']) + self.maxspeed = self._float(_dict['maxspeed']) + self.maxpace = self._float(_dict['maxpace']) + self.pace = self._float(_dict['pace']) self.has_data = True else: raise Exception( "Error - multiple results from DB for id: %s" % self.id ) @@ -467,3 +469,109 @@ except: result = 0 return result + + def get_value(self, param): + ''' Function to get the value of various params in this activity instance + Automatically returns values converted to imperial if needed + ''' + if param == 'distance': + if self.us_system: + return km2miles(self.distance) + else: + return self.distance + elif param == 'average': + if self.us_system: + return km2miles(self.average) + else: + return self.average + elif param == 'upositive': + if self.us_system: + return m2feet(self.upositive) + else: + return self.upositive + elif param == 'unegative': + if self.us_system: + return m2feet(self.unegative) + else: + return self.unegative + elif param == 'maxspeed': + if self.us_system: + return km2miles(self.maxspeed) + else: + return self.maxspeed + elif param == 'maxpace': + if self.us_system: + return self.pace_from_float(pacekm2miles(self.maxpace)) + else: + return self.pace_from_float(self.maxpace) + elif param == 'pace': + if self.us_system: + return self.pace_from_float(pacekm2miles(self.pace)) + else: + return self.pace_from_float(self.pace) + else: + print "Unable to provide value for unknown parameter (%s) for activity" % param + + def set_value(self, param, value): + ''' Function to set the value of various params in this activity instance + Automatically converts from imperial if using them + ''' + _value = _float(value) + if param == 'distance': + if self.us_system: + self.distance = miles2mk(_value) + else: + self.distance = _value + elif param == 'average': + if self.us_system: + self.average = miles2mk(_value) + else: + self.average = _value + elif param == 'upositive': + if self.us_system: + self.upositive = feet2m(_value) + else: + self.upositive = _value + elif param == 'unegative': + if self.us_system: + self.unegative = feet2m(_value) + else: + self.unegative = _value + elif param == 'maxspeed': + if self.us_system: + self.maxspeed = miles2mk(_value) + else: + self.maxspeed = _value + elif param == 'maxpace': + if self.us_system: + _maxpace = pacemiles2mk(_value) + else: + _maxpace = _value + self.maxpace = self.pace_to_float(_maxpace) + elif param == 'pace': + if self.us_system: + _pace = pacemiles2mk(_value) + else: + _pace = _value + self.pace = self.pace_to_float(_pace) + else: + print "Unable to set value (%s) for unknown parameter (%s) for activity" % (str(value), param) + + + def pace_to_float(self, value): + '''Take a mm:ss or mm.ss and return float''' + value = value.replace(':', '.') + try: + value = float(value) + except ValueError: + value = None + return value + + def pace_from_float(self, value): + '''Helper to generate mm:ss from float representation mm.ss (or mm,ss?)''' + #Check that value supplied is a float + try: + _value = "%0.2f" % float(value) + except ValueError: + _value = str(value) + return _value.replace('.',':') Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-10-31 22:34:54 UTC (rev 671) +++ pytrainer/trunk/pytrainer/main.py 2010-11-01 03:53:00 UTC (rev 672) @@ -50,13 +50,14 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#670" + self.version ="1.7.2_svn#672" self.DB_version = 6 #Process command line options self.startup_options = self.get_options() #Setup logging self.set_logging(self.startup_options.log_level) logging.debug('>>') + logging.debug("PyTrainer version %s, DB version %s" % (self.version, self.DB_version)) self.data_path = data_path self.date = Date() self.ddbb = None @@ -309,8 +310,9 @@ self.refreshListView(self.windowmain.listsearch.condition) #Refresh list records date = self.date.getDate() - record_list = self.record.getrecordList(date) - self.windowmain.actualize_recordTreeView(record_list) + record_ids = self.record.getrecordList(date) + self.windowmain.actualize_recordTreeView(record_ids) + #Mark the monthly calendar to show which days have activity? record_list = self.record.getRecordDayList(date) self.windowmain.actualize_calendar(record_list) logging.debug('<<') This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-11-03 03:53:00
|
Revision: 675 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=675&view=rev Author: jblance Date: 2010-11-03 03:52:54 +0000 (Wed, 03 Nov 2010) Log Message: ----------- Add heartrate as % of max to newgraph display Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/lib/activity.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/profile.py Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2010-11-03 03:18:31 UTC (rev 674) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-11-03 03:52:54 UTC (rev 675) @@ -445,8 +445,11 @@ data = activity.time_data else: print "x axis is unknown" + #Sort data + keys = data.keys() + keys.sort() #Populate Y axis data - for graphdata in data: + for graphdata in keys: #First Y axis... #Create button y1button = gtk.CheckButton(label=data[graphdata].title) Modified: pytrainer/trunk/pytrainer/lib/activity.py =================================================================== --- pytrainer/trunk/pytrainer/lib/activity.py 2010-11-03 03:18:31 UTC (rev 674) +++ pytrainer/trunk/pytrainer/lib/activity.py 2010-11-03 03:52:54 UTC (rev 675) @@ -408,6 +408,16 @@ xlabel=_("Time (seconds)") self.time_data['hr'] = GraphData(title=title,xlabel=xlabel, ylabel=ylabel) self.time_data['hr'].set_color('#00ff00', '#00ff00') + #Heartrate as % + maxhr = self.pytrainer_main.profile.getMaxHR() + title=_("Heart Rate (% of max)") + xlabel="%s (%s)" % (_('Distance'), self.distance_unit) + ylabel="%s (%s)" % (_('Heart Rate'), _('%')) + self.distance_data['hr_p'] = GraphData(title=title, xlabel=xlabel, ylabel=ylabel) + self.distance_data['hr_p'].set_color('#00ff00', '#00ff00') + xlabel=_("Time (seconds)") + self.time_data['hr_p'] = GraphData(title=title,xlabel=xlabel, ylabel=ylabel) + self.time_data['hr_p'].set_color('#00ff00', '#00ff00') #Cadence title=_("Cadence") xlabel="%s (%s)" % (_('Distance'), self.distance_unit) @@ -432,6 +442,7 @@ self.distance_data['speed'].addPoints(x=km2miles(track['elapsed_distance']), y=km2miles(track['velocity'])) self.distance_data['pace'].addPoints(x=km2miles(track['elapsed_distance']), y=pacekm2miles(pace)) self.distance_data['hr'].addPoints(x=km2miles(track['elapsed_distance']), y=track['hr']) + self.distance_data['hr_p'].addPoints(x=km2miles(track['elapsed_distance']), y=float(track['hr'])/maxhr*100) self.distance_data['cadence'].addPoints(x=km2miles(track['elapsed_distance']), y=track['cadence']) self.time_data['elevation'].addPoints(x=track['time_elapsed'], y=m2feet(track['ele'])) self.time_data['cor_elevation'].addPoints(x=track['time_elapsed'], y=m2feet(track['correctedElevation'])) @@ -443,12 +454,14 @@ self.distance_data['speed'].addPoints(x=track['elapsed_distance'], y=track['velocity']) self.distance_data['pace'].addPoints(x=track['elapsed_distance'], y=pace) self.distance_data['hr'].addPoints(x=track['elapsed_distance'], y=track['hr']) + self.distance_data['hr_p'].addPoints(x=track['elapsed_distance'], y=float(track['hr'])/maxhr*100) self.distance_data['cadence'].addPoints(x=track['elapsed_distance'], y=track['cadence']) self.time_data['elevation'].addPoints(x=track['time_elapsed'], y=track['ele']) self.time_data['cor_elevation'].addPoints(x=track['time_elapsed'], y=track['correctedElevation']) self.time_data['speed'].addPoints(x=track['time_elapsed'], y=track['velocity']) self.time_data['pace'].addPoints(x=track['time_elapsed'], y=pace) self.time_data['hr'].addPoints(x=track['time_elapsed'], y=track['hr']) + self.time_data['hr_p'].addPoints(x=track['time_elapsed'], y=float(track['hr'])/maxhr*100) self.time_data['cadence'].addPoints(x=track['time_elapsed'], y=track['cadence']) #Remove data with no values for item in self.distance_data.keys(): Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-11-03 03:18:31 UTC (rev 674) +++ pytrainer/trunk/pytrainer/main.py 2010-11-03 03:52:54 UTC (rev 675) @@ -50,7 +50,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#674" + self.version ="1.7.2_svn#675" self.DB_version = 6 #Process command line options self.startup_options = self.get_options() Modified: pytrainer/trunk/pytrainer/profile.py =================================================================== --- pytrainer/trunk/pytrainer/profile.py 2010-11-03 03:18:31 UTC (rev 674) +++ pytrainer/trunk/pytrainer/profile.py 2010-11-03 03:52:54 UTC (rev 675) @@ -25,313 +25,321 @@ from lib.ddbb import DDBB class Profile: - def __init__(self, data_path = None, parent = None): - logging.debug(">>") - self.pytrainer_main = parent - self.data_path = data_path - self.xml_tree = None - self.home = None - self.tmpdir = None - self.confdir = None - self.conffile = None - self.gpxdir = None - self.extensiondir = None - self.plugindir = None - #Set configuration parameters - self._setHome() - self._setConfFiles() - self._setTempDir() - self._setExtensionDir() - self._setPluginDir() - self._setGpxDir() + def __init__(self, data_path = None, parent = None): + logging.debug(">>") + self.pytrainer_main = parent + self.data_path = data_path + self.xml_tree = None + self.home = None + self.tmpdir = None + self.confdir = None + self.conffile = None + self.gpxdir = None + self.extensiondir = None + self.plugindir = None + #Set configuration parameters + self._setHome() + self._setConfFiles() + self._setTempDir() + self._setExtensionDir() + self._setPluginDir() + self._setGpxDir() - #Clear temp dir - logging.debug("clearing tmp directory %s" % self.tmpdir) - self._clearTempDir() + #Clear temp dir + logging.debug("clearing tmp directory %s" % self.tmpdir) + self._clearTempDir() - #Profile Options and Defaults - self.profile_options = { - "prf_name":"default", - "prf_gender":"", - "prf_weight":"", - "prf_height":"", - "prf_age":"", - "prf_ddbb":"sqlite", - "prf_ddbbhost":"", - "prf_ddbbname":"", - "prf_ddbbuser":"", - "prf_ddbbpass":"", - "version":"0.0", - "DB_version":"0", - "prf_us_system":"False", - "prf_hrzones_karvonen":"False", - "prf_maxhr":"", - "prf_minhr":"", - "auto_launch_file_selection":"False", - "import_default_tab":"0", - "default_viewer":"0", - "window_size":"800, 640", - "activitypool_size": "10", - } + #Profile Options and Defaults + self.profile_options = { + "prf_name":"default", + "prf_gender":"", + "prf_weight":"", + "prf_height":"", + "prf_age":"", + "prf_ddbb":"sqlite", + "prf_ddbbhost":"", + "prf_ddbbname":"", + "prf_ddbbuser":"", + "prf_ddbbpass":"", + "version":"0.0", + "DB_version":"0", + "prf_us_system":"False", + "prf_hrzones_karvonen":"False", + "prf_maxhr":"", + "prf_minhr":"", + "auto_launch_file_selection":"False", + "import_default_tab":"0", + "default_viewer":"0", + "window_size":"800, 640", + "activitypool_size": "10", + } - #Parse pytrainer configuration file - self.config_file = self.conffile - self.configuration = self._parse_config_file(self.config_file) - logging.debug("Configuration retrieved: "+str(self.configuration)) - #self.pytrainer_main.ddbb = DDBB(self, pytrainer_main=self.pytrainer_main) - self._setZones() - logging.debug("<<") + #Parse pytrainer configuration file + self.config_file = self.conffile + self.configuration = self._parse_config_file(self.config_file) + logging.debug("Configuration retrieved: "+str(self.configuration)) + #self.pytrainer_main.ddbb = DDBB(self, pytrainer_main=self.pytrainer_main) + self._setZones() + logging.debug("<<") - def _setHome(self): - if sys.platform == "linux2": - variable = 'HOME' - elif sys.platform == "win32": - variable = 'USERPROFILE' - else: - print "Unsupported sys.platform: %s." % sys.platform - sys.exit(1) - self.home = os.environ[variable] + def _setHome(self): + if sys.platform == "linux2": + variable = 'HOME' + elif sys.platform == "win32": + variable = 'USERPROFILE' + else: + print "Unsupported sys.platform: %s." % sys.platform + sys.exit(1) + self.home = os.environ[variable] - def _setTempDir(self): - self.tmpdir = self.confdir+"/tmp" - if not os.path.isdir(self.tmpdir): - os.mkdir(self.tmpdir) + def _setTempDir(self): + self.tmpdir = self.confdir+"/tmp" + if not os.path.isdir(self.tmpdir): + os.mkdir(self.tmpdir) - def _clearTempDir(self): - """Function to clear out the tmp directory that pytrainer uses - will only remove files - """ - if not os.path.isdir(self.tmpdir): - return - else: - files = os.listdir(self.tmpdir) - for name in files: - fullname = (os.path.join(self.tmpdir, name)) - if os.path.isfile(fullname): - os.remove(os.path.join(self.tmpdir, name)) + def _clearTempDir(self): + """Function to clear out the tmp directory that pytrainer uses + will only remove files + """ + if not os.path.isdir(self.tmpdir): + return + else: + files = os.listdir(self.tmpdir) + for name in files: + fullname = (os.path.join(self.tmpdir, name)) + if os.path.isfile(fullname): + os.remove(os.path.join(self.tmpdir, name)) - def _setConfFiles(self): - if sys.platform == "win32": - self.confdir = self.home+"/pytrainer" - elif sys.platform == "linux2": - self.confdir = self.home+"/.pytrainer" - else: - print "Unsupported sys.platform: %s." % sys.platform - sys.exit(1) - self.conffile = self.confdir+"/conf.xml" - if not os.path.isdir(self.confdir): - os.mkdir(self.confdir) + def _setConfFiles(self): + if sys.platform == "win32": + self.confdir = self.home+"/pytrainer" + elif sys.platform == "linux2": + self.confdir = self.home+"/.pytrainer" + else: + print "Unsupported sys.platform: %s." % sys.platform + sys.exit(1) + self.conffile = self.confdir+"/conf.xml" + if not os.path.isdir(self.confdir): + os.mkdir(self.confdir) - def _setGpxDir(self): - self.gpxdir = self.confdir+"/gpx" - if not os.path.isdir(self.gpxdir): - os.mkdir(self.gpxdir) + def _setGpxDir(self): + self.gpxdir = self.confdir+"/gpx" + if not os.path.isdir(self.gpxdir): + os.mkdir(self.gpxdir) - def _setExtensionDir(self): - self.extensiondir = self.confdir+"/extensions" - if not os.path.isdir(self.extensiondir): - os.mkdir(self.extensiondir) + def _setExtensionDir(self): + self.extensiondir = self.confdir+"/extensions" + if not os.path.isdir(self.extensiondir): + os.mkdir(self.extensiondir) - def _setPluginDir(self): - self.plugindir = self.confdir+"/plugins" - if not os.path.isdir(self.plugindir): - os.mkdir(self.plugindir) + def _setPluginDir(self): + self.plugindir = self.confdir+"/plugins" + if not os.path.isdir(self.plugindir): + os.mkdir(self.plugindir) - def _setZones(self): - maxhr = self.getValue("pytraining","prf_maxhr") - resthr = self.getValue("pytraining","prf_minhr") - try: - maxhr = int(self.getValue("pytraining","prf_maxhr")) - resthr = int(self.getValue("pytraining","prf_minhr")) - except Exception as e: - logging.debug(str(e)) - maxhr = 220 - resthr = 65 + def _setZones(self): + #maxhr = self.getValue("pytraining","prf_maxhr") + #resthr = self.getValue("pytraining","prf_minhr") + try: + maxhr = int(self.getValue("pytraining","prf_maxhr")) + resthr = int(self.getValue("pytraining","prf_minhr")) + except Exception as e: + logging.debug(str(e)) + maxhr = 220 + resthr = 65 + self.maxhr = maxhr + self.rethr = resthr - if self.getValue("pytraining","prf_hrzones_karvonen")=="True": - #karvonen method - targethr1 = ((maxhr - resthr) * 0.50) + resthr - targethr2 = ((maxhr - resthr) * 0.60) + resthr - targethr3 = ((maxhr - resthr) * 0.70) + resthr - targethr4 = ((maxhr - resthr) * 0.80) + resthr - targethr5 = ((maxhr - resthr) * 0.90) + resthr - targethr6 = maxhr - else: - #not karvonen method - targethr1 = maxhr * 0.50 - targethr2 = maxhr * 0.60 - targethr3 = maxhr * 0.70 - targethr4 = maxhr * 0.80 - targethr5 = maxhr * 0.90 - targethr6 = maxhr + if self.getValue("pytraining","prf_hrzones_karvonen")=="True": + #karvonen method + targethr1 = ((maxhr - resthr) * 0.50) + resthr + targethr2 = ((maxhr - resthr) * 0.60) + resthr + targethr3 = ((maxhr - resthr) * 0.70) + resthr + targethr4 = ((maxhr - resthr) * 0.80) + resthr + targethr5 = ((maxhr - resthr) * 0.90) + resthr + targethr6 = maxhr + else: + #not karvonen method + targethr1 = maxhr * 0.50 + targethr2 = maxhr * 0.60 + targethr3 = maxhr * 0.70 + targethr4 = maxhr * 0.80 + targethr5 = maxhr * 0.90 + targethr6 = maxhr - self.zone1 = (targethr1,targethr2,"#ffff99",_("Moderate activity")) - self.zone2 = (targethr2,targethr3,"#ffcc00",_("Weight Control")) - self.zone3 = (targethr3,targethr4,"#ff9900",_("Aerobic")) - self.zone4 = (targethr4,targethr5,"#ff6600",_("Anaerobic")) - self.zone5 = (targethr5,targethr6,"#ff0000",_("VO2 MAX")) + self.zone1 = (targethr1,targethr2,"#ffff99",_("Moderate activity")) + self.zone2 = (targethr2,targethr3,"#ffcc00",_("Weight Control")) + self.zone3 = (targethr3,targethr4,"#ff9900",_("Aerobic")) + self.zone4 = (targethr4,targethr5,"#ff6600",_("Anaerobic")) + self.zone5 = (targethr5,targethr6,"#ff0000",_("VO2 MAX")) + + def getMaxHR(self): + return self.maxhr + + def getRestHR(self): + return self.resthr - def getZones(self): - return self.zone5,self.zone4,self.zone3,self.zone2,self.zone1 + def getZones(self): + return self.zone5,self.zone4,self.zone3,self.zone2,self.zone1 - def getConfFile(self): - if not os.path.isfile(self.conffile): - return False - else: - return self.conffile + def getConfFile(self): + if not os.path.isfile(self.conffile): + return False + else: + return self.conffile - def _parse_config_file(self, config_file): - ''' - Parse the xml configuration file and convert to a dict + def _parse_config_file(self, config_file): + ''' + Parse the xml configuration file and convert to a dict - returns: dict with option as key - ''' - if config_file is None: - logging.error("Configuration file value not set") - logging.error("Fatal error, exiting") - exit(-3) - if not os.path.isfile(config_file): #File not found - logging.error("Configuration '%s' file does not exist" % config_file) - logging.info("No profile found. Creating default one") - self.setProfile(self.profile_options) - if os.stat(config_file)[stat.ST_SIZE] == 0: #File is empty - logging.error("Configuration '%s' file is empty" % config_file) - logging.info("Creating default profile") - self.setProfile(self.profile_options) - logging.debug("Attempting to parse content from "+ config_file) - try: - parser = etree.XMLParser(encoding='UTF8', recover=True) - self.xml_tree = etree.parse(config_file, parser=parser) - #Have a populated xml tree, get pytraining node (root) and convert it to a dict - pytraining_tag = self.xml_tree.getroot() - config = {} - config_needs_update = False - for key, default in self.profile_options.items(): - value = pytraining_tag.get(key) - #If property is not found, set it to the default - if value is None: - config_needs_update = True - value = default - config[key] = value - #Added a property, so update config - if config_needs_update: - self.setProfile(config) - #Set shorthand var for units of measurement - self.prf_us_system = True if config["prf_us_system"] == "True" else False - return config - except Exception as e: - logging.error("Error parsing file: %s. Exiting" % config_file) - logging.error(str(e)) - logging.error("Fatal error, exiting") - exit(-3) + returns: dict with option as key + ''' + if config_file is None: + logging.error("Configuration file value not set") + logging.error("Fatal error, exiting") + exit(-3) + if not os.path.isfile(config_file): #File not found + logging.error("Configuration '%s' file does not exist" % config_file) + logging.info("No profile found. Creating default one") + self.setProfile(self.profile_options) + if os.stat(config_file)[stat.ST_SIZE] == 0: #File is empty + logging.error("Configuration '%s' file is empty" % config_file) + logging.info("Creating default profile") + self.setProfile(self.profile_options) + logging.debug("Attempting to parse content from "+ config_file) + try: + parser = etree.XMLParser(encoding='UTF8', recover=True) + self.xml_tree = etree.parse(config_file, parser=parser) + #Have a populated xml tree, get pytraining node (root) and convert it to a dict + pytraining_tag = self.xml_tree.getroot() + config = {} + config_needs_update = False + for key, default in self.profile_options.items(): + value = pytraining_tag.get(key) + #If property is not found, set it to the default + if value is None: + config_needs_update = True + value = default + config[key] = value + #Added a property, so update config + if config_needs_update: + self.setProfile(config) + #Set shorthand var for units of measurement + self.prf_us_system = True if config["prf_us_system"] == "True" else False + return config + except Exception as e: + logging.error("Error parsing file: %s. Exiting" % config_file) + logging.error(str(e)) + logging.error("Fatal error, exiting") + exit(-3) - def getIntValue(self, tag, variable, default=0): - ''' Function to return conf value as int - returns - -- default if cannot convert to int - -- None if variable not found - ''' - result = self.getValue(tag, variable) - if result is None: - return None - try: - result = int(result) - except Exception as e: - logging.debug(str(e)) - result = default - return result + def getIntValue(self, tag, variable, default=0): + ''' Function to return conf value as int + returns + -- default if cannot convert to int + -- None if variable not found + ''' + result = self.getValue(tag, variable) + if result is None: + return None + try: + result = int(result) + except Exception as e: + logging.debug(str(e)) + result = default + return result - def getValue(self, tag, variable): - if tag != "pytraining": - print "ERROR - pytraining is the only profile tag supported" - return None - elif not self.configuration.has_key(variable): - return None - return self.configuration[variable] + def getValue(self, tag, variable): + if tag != "pytraining": + print "ERROR - pytraining is the only profile tag supported" + return None + elif not self.configuration.has_key(variable): + return None + return self.configuration[variable] - def setValue(self, tag, variable, value, delay_write=False): - logging.debug(">>") - if tag != "pytraining": - print "ERROR - pytraining is the only profile tag supported" - logging.debug("Setting %s to %s" % (variable, value)) - if self.xml_tree is None: - #new config file.... - self.xml_tree = etree.parse(StringIO('''<?xml version='1.0' encoding='UTF-8'?><pytraining />''')) - self.xml_tree.getroot().set(variable, value.decode('utf-8')) - if not delay_write: - logging.debug("Writting...") - self.xml_tree.write(self.config_file, xml_declaration=True, encoding='UTF-8') - logging.debug("<<") + def setValue(self, tag, variable, value, delay_write=False): + logging.debug(">>") + if tag != "pytraining": + print "ERROR - pytraining is the only profile tag supported" + logging.debug("Setting %s to %s" % (variable, value)) + if self.xml_tree is None: + #new config file.... + self.xml_tree = etree.parse(StringIO('''<?xml version='1.0' encoding='UTF-8'?><pytraining />''')) + self.xml_tree.getroot().set(variable, value.decode('utf-8')) + if not delay_write: + logging.debug("Writting...") + self.xml_tree.write(self.config_file, xml_declaration=True, encoding='UTF-8') + logging.debug("<<") - def setProfile(self,list_options): - logging.debug(">>") - for option, value in list_options.items(): - logging.debug("Adding "+option+"|"+value) - self.setValue("pytraining",option,value,delay_write=True) - self.xml_tree.write(self.config_file, xml_declaration=True, encoding='UTF-8') - logging.debug("<<") + def setProfile(self,list_options): + logging.debug(">>") + for option, value in list_options.items(): + logging.debug("Adding "+option+"|"+value) + self.setValue("pytraining",option,value,delay_write=True) + self.xml_tree.write(self.config_file, xml_declaration=True, encoding='UTF-8') + logging.debug("<<") - def getSportList(self): - logging.debug("--") - #connection = self.pytrainer_main.ddbb.connect() - #if (connection == 1): - logging.debug("retrieving sports info") - return self.pytrainer_main.ddbb.select("sports","name,met,weight,id_sports,max_pace",None) - #else: - # return connection + def getSportList(self): + logging.debug("--") + #connection = self.pytrainer_main.ddbb.connect() + #if (connection == 1): + logging.debug("retrieving sports info") + return self.pytrainer_main.ddbb.select("sports","name,met,weight,id_sports,max_pace",None) + #else: + # return connection - def addNewSport(self,sport,met,weight,maxpace): - """31.08.2008 - dgranda - It adds a new sport. - arguments: - sport: sport's name - met: - weight: - returns: id_sports from new sport""" - logging.debug(">>") - logging.debug("Adding new sport: "+sport+"|"+weight+"|"+met+"|"+maxpace) - sport = [sport,met,weight,maxpace] - self.pytrainer_main.ddbb.insert("sports","name,met,weight,max_pace",sport) - sport_id = self.pytrainer_main.ddbb.select("sports","id_sports","name=\"%s\"" %(sport)) - logging.debug("<<") - return sport_id + def addNewSport(self,sport,met,weight,maxpace): + """31.08.2008 - dgranda + It adds a new sport. + arguments: + sport: sport's name + met: + weight: + returns: id_sports from new sport""" + logging.debug(">>") + logging.debug("Adding new sport: "+sport+"|"+weight+"|"+met+"|"+maxpace) + sport = [sport,met,weight,maxpace] + self.pytrainer_main.ddbb.insert("sports","name,met,weight,max_pace",sport) + sport_id = self.pytrainer_main.ddbb.select("sports","id_sports","name=\"%s\"" %(sport)) + logging.debug("<<") + return sport_id - def delSport(self,sport): - logging.debug(">>") - condition = "name=\"%s\"" %sport - id_sport = self.pytrainer_main.ddbb.select("sports","id_sports",condition)[0][0] - logging.debug("removing records from sport "+ sport + " (id_sport: "+str(id_sport)+")") - self.pytrainer_main.ddbb.delete("records","sport=\"%d\""%id_sport) - self.pytrainer_main.ddbb.delete("sports","id_sports=\"%d\""%id_sport) - logging.debug("<<") + def delSport(self,sport): + logging.debug(">>") + condition = "name=\"%s\"" %sport + id_sport = self.pytrainer_main.ddbb.select("sports","id_sports",condition)[0][0] + logging.debug("removing records from sport "+ sport + " (id_sport: "+str(id_sport)+")") + self.pytrainer_main.ddbb.delete("records","sport=\"%d\""%id_sport) + self.pytrainer_main.ddbb.delete("sports","id_sports=\"%d\""%id_sport) + logging.debug("<<") - def updateSport(self,oldnamesport,newnamesport,newmetsport,newweightsport,newmaxpace=None): - logging.debug("--") - self.pytrainer_main.ddbb.update("sports","name,met,weight,max_pace",[newnamesport,newmetsport,newweightsport, newmaxpace],"name=\"%s\""%oldnamesport) + def updateSport(self,oldnamesport,newnamesport,newmetsport,newweightsport,newmaxpace=None): + logging.debug("--") + self.pytrainer_main.ddbb.update("sports","name,met,weight,max_pace",[newnamesport,newmetsport,newweightsport, newmaxpace],"name=\"%s\""%oldnamesport) - def getSportInfo(self,namesport): - logging.debug("--") - return self.pytrainer_main.ddbb.select("sports","name,met,weight,max_pace","name=\"%s\""%namesport)[0] + def getSportInfo(self,namesport): + logging.debug("--") + return self.pytrainer_main.ddbb.select("sports","name,met,weight,max_pace","name=\"%s\""%namesport)[0] - def build_ddbb(self): - logging.debug("--") - self.pytrainer_main.ddbb.build_ddbb() + def build_ddbb(self): + logging.debug("--") + self.pytrainer_main.ddbb.build_ddbb() - def editProfile(self): - logging.debug(">>") - from gui.windowprofile import WindowProfile - logging.debug("retrieving configuration data") - #Refresh configuration - self.configuration = self._parse_config_file(self.config_file) - profilewindow = WindowProfile(self.data_path, self, pytrainer_main=self.pytrainer_main) - logging.debug("setting data values") - profilewindow.setValues(self.configuration) - profilewindow.run() - self.configuration = self._parse_config_file(self.config_file) - logging.debug("<<") + def editProfile(self): + logging.debug(">>") + from gui.windowprofile import WindowProfile + logging.debug("retrieving configuration data") + #Refresh configuration + self.configuration = self._parse_config_file(self.config_file) + profilewindow = WindowProfile(self.data_path, self, pytrainer_main=self.pytrainer_main) + logging.debug("setting data values") + profilewindow.setValues(self.configuration) + profilewindow.run() + self.configuration = self._parse_config_file(self.config_file) + logging.debug("<<") - def actualize_mainsportlist(self): - logging.debug("--") - self.pytrainer_main.refreshMainSportList() + def actualize_mainsportlist(self): + logging.debug("--") + self.pytrainer_main.refreshMainSportList() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-11-03 08:36:56
|
Revision: 676 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=676&view=rev Author: jblance Date: 2010-11-03 08:36:49 +0000 (Wed, 03 Nov 2010) Log Message: ----------- Fix for HR percent graph so does not error in hr is None - thanks to Arnd Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/activity.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/lib/activity.py =================================================================== --- pytrainer/trunk/pytrainer/lib/activity.py 2010-11-03 03:52:54 UTC (rev 675) +++ pytrainer/trunk/pytrainer/lib/activity.py 2010-11-03 08:36:49 UTC (rev 676) @@ -30,7 +30,7 @@ class Activity: ''' Class that knows everything about a particular activity - + All values are stored in the class (and DB) in metric and are converted as needed tracks - (list) tracklist from gpx @@ -128,7 +128,7 @@ self.y2_limits_u = (None, None) self.show_laps = False logging.debug("<<") - + def __str__(self): return ''' tracks (%s) @@ -182,7 +182,7 @@ self.distance_unit, self.speed_unit, self.distance_data, self.time_data, self.height_unit, self.pace_unit, self.gpx_file, self.gpx, self.sport_name, self.sport_id, self.title, self.date, self.time, self.time_tuple, self.beats, - self.maxbeats, self.comments, self.calories, self.id_record, self.date_time_local, + self.maxbeats, self.comments, self.calories, self.id_record, self.date_time_local, self.date_time_utc, self.date_time, self.starttime, self.distance, self.average, self.upositive, self.unegative, self.maxspeed, self.maxpace, self.pace, self.has_data, self.x_axis, self.x_limits, self.y1_limits, self.y2_limits, self.x_limits_u, self.y1_limits_u, @@ -436,13 +436,17 @@ except Exception as e: #print type(e), e pace = 0 + try: + hr_p = float(track['hr'])/maxhr*100 + except: + hr_p = 0 if self.us_system: self.distance_data['elevation'].addPoints(x=km2miles(track['elapsed_distance']), y=m2feet(track['ele'])) self.distance_data['cor_elevation'].addPoints(x=km2miles(track['elapsed_distance']), y=m2feet(track['correctedElevation'])) self.distance_data['speed'].addPoints(x=km2miles(track['elapsed_distance']), y=km2miles(track['velocity'])) self.distance_data['pace'].addPoints(x=km2miles(track['elapsed_distance']), y=pacekm2miles(pace)) self.distance_data['hr'].addPoints(x=km2miles(track['elapsed_distance']), y=track['hr']) - self.distance_data['hr_p'].addPoints(x=km2miles(track['elapsed_distance']), y=float(track['hr'])/maxhr*100) + self.distance_data['hr_p'].addPoints(x=km2miles(track['elapsed_distance']), y=hr_p) self.distance_data['cadence'].addPoints(x=km2miles(track['elapsed_distance']), y=track['cadence']) self.time_data['elevation'].addPoints(x=track['time_elapsed'], y=m2feet(track['ele'])) self.time_data['cor_elevation'].addPoints(x=track['time_elapsed'], y=m2feet(track['correctedElevation'])) @@ -454,14 +458,14 @@ self.distance_data['speed'].addPoints(x=track['elapsed_distance'], y=track['velocity']) self.distance_data['pace'].addPoints(x=track['elapsed_distance'], y=pace) self.distance_data['hr'].addPoints(x=track['elapsed_distance'], y=track['hr']) - self.distance_data['hr_p'].addPoints(x=track['elapsed_distance'], y=float(track['hr'])/maxhr*100) + self.distance_data['hr_p'].addPoints(x=track['elapsed_distance'], y=hr_p) self.distance_data['cadence'].addPoints(x=track['elapsed_distance'], y=track['cadence']) self.time_data['elevation'].addPoints(x=track['time_elapsed'], y=track['ele']) self.time_data['cor_elevation'].addPoints(x=track['time_elapsed'], y=track['correctedElevation']) self.time_data['speed'].addPoints(x=track['time_elapsed'], y=track['velocity']) self.time_data['pace'].addPoints(x=track['time_elapsed'], y=pace) self.time_data['hr'].addPoints(x=track['time_elapsed'], y=track['hr']) - self.time_data['hr_p'].addPoints(x=track['time_elapsed'], y=float(track['hr'])/maxhr*100) + self.time_data['hr_p'].addPoints(x=track['time_elapsed'], y=hr_p) self.time_data['cadence'].addPoints(x=track['time_elapsed'], y=track['cadence']) #Remove data with no values for item in self.distance_data.keys(): @@ -487,7 +491,7 @@ except: result = 0 return result - + def get_value(self, param): ''' Function to get the value of various params in this activity instance Automatically returns values converted to imperial if needed @@ -529,7 +533,7 @@ return self.pace_from_float(self.pace) else: print "Unable to provide value for unknown parameter (%s) for activity" % param - + def set_value(self, param, value): ''' Function to set the value of various params in this activity instance Automatically converts from imperial if using them @@ -574,8 +578,8 @@ self.pace = self.pace_to_float(_pace) else: print "Unable to set value (%s) for unknown parameter (%s) for activity" % (str(value), param) - - + + def pace_to_float(self, value): '''Take a mm:ss or mm.ss and return float''' value = value.replace(':', '.') Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-11-03 03:52:54 UTC (rev 675) +++ pytrainer/trunk/pytrainer/main.py 2010-11-03 08:36:49 UTC (rev 676) @@ -50,7 +50,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#675" + self.version ="1.7.2_svn#676" self.DB_version = 6 #Process command line options self.startup_options = self.get_options() @@ -68,8 +68,8 @@ self.ddbb = DDBB(self.profile, self) logging.debug('connecting to DDBB') self.ddbb.connect() - + #Get user's DB version currentDB_version = self.profile.getValue("pytraining","DB_version") logging.debug("Current DB version: "+str(currentDB_version)) @@ -322,13 +322,13 @@ self.athlete.refresh() self.windowmain.actualize_athleteview(self.athlete) logging.debug('<<') - + def refreshListView(self,condition=None): logging.debug('>>') record_list = self.record.getRecordListByCondition(condition) self.windowmain.actualize_listview(record_list) logging.debug('<<') - + def refreshWaypointView(self,default_waypoint=None,redrawmap=1): logging.debug('>>') waypoint_list = self.waypoint.getAllWaypoints() @@ -426,7 +426,7 @@ warning.run() self.refreshListRecords() logging.debug('<<') - + def removeWaypoint(self,id_waypoint, confirm = False): logging.debug('>>') if confirm: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-11-07 20:59:34
|
Revision: 681 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=681&view=rev Author: jblance Date: 2010-11-07 20:59:28 +0000 (Sun, 07 Nov 2010) Log Message: ----------- Bug fixes for sports filtering from Patrick Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/record.py Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2010-11-07 10:59:44 UTC (rev 680) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-11-07 20:59:28 UTC (rev 681) @@ -1410,6 +1410,7 @@ logging.debug("--") if self.sportlist.get_active() != self.activeSport: self.activeSport = self.sportlist.get_active() + self.parent.refreshListRecords() self.parent.refreshGraphView(self.selected_view) else: logging.debug("on_sportlist_changed called with no change") Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-11-07 10:59:44 UTC (rev 680) +++ pytrainer/trunk/pytrainer/main.py 2010-11-07 20:59:28 UTC (rev 681) @@ -50,7 +50,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#678" + self.version ="1.7.2_svn#681" self.DB_version = 6 #Process command line options self.startup_options = self.get_options() Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2010-11-07 10:59:44 UTC (rev 680) +++ pytrainer/trunk/pytrainer/record.py 2010-11-07 20:59:28 UTC (rev 681) @@ -487,7 +487,7 @@ if not id_sport: records = self.pytrainer_main.ddbb.select("records","date","date LIKE '"+year+"-"+month+"-%'") else: - records = self.ddbb.select("records","date","date LIKE \"%s-%s-%%\" and sport=\"%s\"" %(year,month,id_sport)) + records = self.pytrainer_main.ddbb.select("records","date","date LIKE \"%s-%s-%%\" and sport=\"%s\"" %(year,month,id_sport)) logging.debug('Found '+str(len(records))+' entries') day_list = [] for i in records: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-11-07 21:14:36
|
Revision: 682 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=682&view=rev Author: jblance Date: 2010-11-07 21:14:30 +0000 (Sun, 07 Nov 2010) Log Message: ----------- Updates for heartrate pie chart from Patrick Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/drawArea.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/gui/drawArea.py =================================================================== --- pytrainer/trunk/pytrainer/gui/drawArea.py 2010-11-07 20:59:28 UTC (rev 681) +++ pytrainer/trunk/pytrainer/gui/drawArea.py 2010-11-07 21:14:30 UTC (rev 682) @@ -384,8 +384,8 @@ logging.debug("Figure: %s" % str(figure) ) axis = figure.add_subplot(111) - labels = ["rest"] - colors = ["#ffffff"] + labels = [] + colors = [] frac0 = 0 frac1 = 0 frac2 = 0 @@ -393,25 +393,69 @@ frac4 = 0 frac5 = 0 for zone in zones: - labels.append(zone[3]) - colors.append(zone[2]) + labels.insert(0,zone[3]) + colors.insert(0,zone[2]) + labels.insert(0,_("rest")) + colors.insert(0,"#ffffff") + for value in yvalues[0]: - if value < zones[4][0]: + if value <= zones[4][0]: frac0+=1 - elif value > zones[4][0] and value < zones[4][1]: + elif value > zones[4][0] and value <= zones[4][1]: frac1+=1 - elif value > zones[3][0] and value < zones[3][1]: + elif value > zones[3][0] and value <= zones[3][1]: frac2+=1 - elif value > zones[2][0] and value < zones[2][1]: + elif value > zones[2][0] and value <= zones[2][1]: frac3+=1 - elif value > zones[1][0] and value < zones[1][1]: + elif value > zones[1][0] and value <= zones[1][1]: frac4+=1 - elif value > zones[0][0] and value < zones[0][1]: + elif value > zones[0][0] and value <= zones[0][1]: frac5+=1 - fracs = [frac0,frac1,frac2,frac3,frac4, frac5] - explode=(0, 0, 0, 0,0,0) + fracs = [] + explode=[] + if frac5 == 0: + labels.pop(5) + colors.pop(5) + else: + fracs.insert(0, frac5) + explode.insert(0, 0) + + if frac4 == 0: + labels.pop(4) + colors.pop(4) + else: + fracs.insert(0, frac4) + explode.insert(0, 0) + + if frac3 == 0: + labels.pop(3) + colors.pop(3) + else: + fracs.insert(0, frac3) + explode.insert(0, 0) + + if frac2 == 0: + labels.pop(2) + colors.pop(2) + else: + fracs.insert(0, frac2) + explode.insert(0, 0) + + if frac1 == 0: + labels.pop(1) + colors.pop(1) + else: + fracs.insert(0, frac1) + explode.insert(0, 0) + + if frac0 == 0: + labels.pop(0) + colors.pop(0) + else: + fracs.insert(0, frac0) + explode.insert(0, 0) axis.pie(fracs, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%', shadow=True) canvas = FigureCanvasGTK(figure) # a gtk.DrawingArea Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-11-07 20:59:28 UTC (rev 681) +++ pytrainer/trunk/pytrainer/main.py 2010-11-07 21:14:30 UTC (rev 682) @@ -50,7 +50,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#681" + self.version ="1.7.2_svn#682" self.DB_version = 6 #Process command line options self.startup_options = self.get_options() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-11-07 21:40:46
|
Revision: 683 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=683&view=rev Author: jblance Date: 2010-11-07 21:40:39 +0000 (Sun, 07 Nov 2010) Log Message: ----------- New units/conversion helper functions from Arnd - WIP Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowrecord.py pytrainer/trunk/pytrainer/lib/unitsconversor.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/gui/windowrecord.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowrecord.py 2010-11-07 21:14:30 UTC (rev 682) +++ pytrainer/trunk/pytrainer/gui/windowrecord.py 2010-11-07 21:40:39 UTC (rev 683) @@ -24,6 +24,7 @@ from filechooser import FileChooser from pytrainer.lib.date import Date +from pytrainer.lib.unitsconversor import * import pytrainer.record import dateutil.parser from dateutil.tz import * # for tzutc() @@ -33,6 +34,8 @@ logging.debug(">>") self.parent = parent self.pytrainer_main = parent.pytrainer_main + self.us = self.pytrainer_main.profile.prf_us_system + logging.debug("Using US system: "+ str(self.us)) self.data_path = data_path glade_path="glade/newrecord.glade" root = "newrecord" @@ -74,7 +77,8 @@ if title != None: self.rcd_title.set_text(title) if distance != None: - self.rcd_distance.set_text(distance) + #self.rcd_distance.set_text(distance) + myset_text(rcd_distance, 'distance', distance, us=self.us, round=2) if time != None: self.setTime(time) if distance!=None and time!=None: @@ -85,6 +89,13 @@ self.rcd_unegative.set_text(unegative) if calories != None: self.rcd_calories.set_text(calories) + #populate labels with units + # test only + if self.us: + self.label8.set_text('Distance (mi)') + else: + self.label8.set_text('Distance (km)') + self._init_equipment(equipment, equipment_service) logging.debug("<<") @@ -324,7 +335,8 @@ self.rcd_min.set_value(m) self.rcd_second.set_value(s) self.rcd_date.set_text(activity.date) - self.rcd_distance.set_text("%.2f"%activity.distance) + #self.rcd_distance.set_text("%.2f"%activity.distance) + myset_text(self.rcd_distance, 'distance', activity.distance, us=self.us, round=2) self.rcd_average.set_text("%.2f"%activity.average) self.rcd_calories.set_text("%s"%activity.calories) self.rcd_beats.set_text("%s"%activity.beats) @@ -643,7 +655,8 @@ pass def set_distance(self,distance): - self.rcd_distance.set_text("%0.2f" %distance) + #self.rcd_distance.set_text("%0.2f" %distance) + myset_text(rcd_distance, 'distance', distance, us=self.us, round=2) def set_maxspeed(self,vel): self.rcd_maxvel.set_text("%0.2f" %vel) Modified: pytrainer/trunk/pytrainer/lib/unitsconversor.py =================================================================== --- pytrainer/trunk/pytrainer/lib/unitsconversor.py 2010-11-07 21:14:30 UTC (rev 682) +++ pytrainer/trunk/pytrainer/lib/unitsconversor.py 2010-11-07 21:40:39 UTC (rev 683) @@ -16,6 +16,19 @@ #along with this program; if not, write to the Free Software #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +'''def _set_units(self): + if self.us_system: + self.distance_unit = _("miles") + self.speed_unit = _("miles/h") + self.pace_unit = _("min/mile") + self.height_unit = _("feet") + else: + self.distance_unit = _("km") + self.speed_unit = _("km/h") + self.pace_unit = _("min/km") + self.height_unit = _("m") + self.units = { 'distance': self.distance_unit, 'average': self.speed_unit, 'upositive': self.height_unit, 'unegative': self.height_unit, 'maxspeed': self.speed_unit, 'pace': self.pace_unit, 'maxpace': self.pace_unit }''' + def km2miles(kilometers): try: km = float(kilometers) @@ -71,3 +84,98 @@ return m/2.20462262 except Exception as e: return 0.0 + +def myset_text(gtkentry, quantity, value, **kwargs): + _us = False + _round = False + _value = value + + if kwargs.has_key('us'): + if kwargs['us'] == True: + _us = True + if kwargs.has_key('units'): + if kwargs['units']: + _units = True + if kwargs.has_key('round'): + _round = True + _round_digits = kwargs['round'] + + print 'set_text via myset_text()' + print quantity, _value + # quantity=physical quantitiy like 'distance' or 'speed' + # here we should call the universal 'conversion prepare for output' filter + # need the same for get_text + _value = filter_inout(quantity, _value, 'out', us=_us, round=_round_digits) + _value = str(_value) + gtkentry.set_text(_value) + +def myget_text(gtkentry, quantity, **kwargs): + _us = False + _round = False + _value = gtkentry.get_text() + + if kwargs.has_key('us'): + if kwargs['us'] == True: + _us = True + if kwargs.has_key('units'): + if kwargs['units']: + _units = True + if kwargs.has_key('round'): + _round = True + _round_digits = kwargs['round'] + + _value = float(_value) + _value = filter_inout(quantity, _value, 'in', us=_us) + return float(_value) + +def filter_inout(param, values, direction,**kwargs): + """ """ + units = {'distance' : ['km','mi'] , 'speed' : ['km/h', 'mph'], + 'pace' : ['min/km','min/mi'], 'height' : ['m', 'ft']} + + if direction == 'out': #all comes from metric + myexp = 1 + else: + myexp = -1 + if not type(values) == list: + _list = False + values_return = [values] + else: + _list = True + values_return = values + _units = False + _round = False + _round_digits = 99 + #print kwargs + _us = False + if kwargs.has_key('us'): + if kwargs['us'] == True: + _us = True + if kwargs.has_key('units'): + if kwargs['units']: + _units = True + if kwargs.has_key('round'): + _round = True + _round_digits = kwargs['round'] + + if _us: #if us: + if param in ['distance', 'speed']: + values_return = [x * (0.6213711**myexp) for x in values_return] + elif param in ['pace']: + values_return = [x * (1.609344**myexp) for x in values_return] + elif param in ['height']: + values_return = [x * (3.2808399**myexp) for x in values_return] + + if _round: + values_return = [round(x, _round_digits) for x in values_return] + + if _units: + if _us: + values_return = [str(x) + ' ' + units[param][1] for x in values_return] + else: + values_return = [str(x) + ' ' + units[param][0] for x in values_return] + + if not _list: + return values_return[0] + else: + return values_return Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-11-07 21:14:30 UTC (rev 682) +++ pytrainer/trunk/pytrainer/main.py 2010-11-07 21:40:39 UTC (rev 683) @@ -50,7 +50,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#682" + self.version ="1.7.2_svn#683" self.DB_version = 6 #Process command line options self.startup_options = self.get_options() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-11-10 02:32:55
|
Revision: 687 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=687&view=rev Author: jblance Date: 2010-11-10 02:32:48 +0000 (Wed, 10 Nov 2010) Log Message: ----------- Adding new metric/imperial conversion utility Modified Paths: -------------- pytrainer/trunk/pytrainer/main.py Added Paths: ----------- pytrainer/trunk/pytrainer/lib/singleton.py pytrainer/trunk/pytrainer/lib/uc.py Added: pytrainer/trunk/pytrainer/lib/singleton.py =================================================================== --- pytrainer/trunk/pytrainer/lib/singleton.py (rev 0) +++ pytrainer/trunk/pytrainer/lib/singleton.py 2010-11-10 02:32:48 UTC (rev 687) @@ -0,0 +1,21 @@ +# -*- coding: iso-8859-1 -*- + +#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. + +class Singleton (object): + def __new__(cls, *args, **kwargs): + if not hasattr(cls, 'self'): + cls.self = object.__new__(cls) + return cls.self Added: pytrainer/trunk/pytrainer/lib/uc.py =================================================================== --- pytrainer/trunk/pytrainer/lib/uc.py (rev 0) +++ pytrainer/trunk/pytrainer/lib/uc.py 2010-11-10 02:32:48 UTC (rev 687) @@ -0,0 +1,77 @@ +# -*- coding: iso-8859-1 -*- + +#This program is free software; you can redistribute it and/or +#modify it under the terms of the GNU General Public License +#as published by the Free Software Foundation; either version 2 +#of the License, or (at your option) any later version. + +#This program is distributed in the hope that it will be useful, +#but WITHOUT ANY WARRANTY; without even the implied warranty of +#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +#GNU General Public License for more details. + +#You should have received a copy of the GNU General Public License +#along with this program; if not, write to the Free Software +#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +from pytrainer.lib.singleton import Singleton + +""" Units of physical quantities [metric, imperial] """ +uc_units = {'distance' : ['km','mi'] , 'speed' : ['km/h', 'mph'], + 'pace' : ['min/km','min/mi'], 'height' : ['m', 'ft'], + 'weight': ['kg', 'lb']} + +""" Conversion factors from metric to imperial, units as in uc_units """ +uc_factors = {'distance' : 0.621371192, 'speed': 0.621371192, 'pace':1.609344, + 'height': 3.2808399, 'weight': 2.204624} + +class UC(Singleton): + """ + When instantiated first time us is assigned, otherwise not. + Can be called with or w/o argument. + us = False; metric system + us = True ; imperial system + """ + def __init__(self, *args): + _us = False + if args: + if args[0] in [True, False]: + _us = args[0] + if not hasattr(self, 'us'): + self.us = _us + + def __str__(self): + if self.us: + return 'imperial' + else: + return 'metric' + + def set_us(self, us): + self.us = us + + def get_unit(self, quantity): + if self.us: + return uc_units[quantity][1] + else: + return uc_units[quantity][0] + + unit_distance = property(lambda self: self.get_unit('distance') ) + unit_speed = property( lambda self: self.get_unit('speed') ) + unit_pace = property( lambda self: self.get_unit('pace') ) + unit_height = property( lambda self: self.get_unit('height') ) + unit_weight = property( lambda self: self.get_unit('weight') ) + + def sys2usr(self, quantity, value): + """gives value of physical quantity (metric) in users system""" + if self.us: + return value * uc_factors[quantity] + else: + return value + + def usr2sys(self, quantity, value): + """takes value (users system) and convert to metric (sys)""" + if self.us: + return value / uc_factors[quantity] + else: + return value + Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-11-10 02:21:52 UTC (rev 686) +++ pytrainer/trunk/pytrainer/main.py 2010-11-10 02:32:48 UTC (rev 687) @@ -50,7 +50,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#683" + self.version ="1.7.2_svn#687" self.DB_version = 6 #Process command line options self.startup_options = self.get_options() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <aza...@us...> - 2010-11-11 08:56:51
|
Revision: 696 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=696&view=rev Author: azapletal Date: 2010-11-11 08:56:45 +0000 (Thu, 11 Nov 2010) Log Message: ----------- Simplification of UC class Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/uc.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/lib/uc.py =================================================================== --- pytrainer/trunk/pytrainer/lib/uc.py 2010-11-11 02:45:54 UTC (rev 695) +++ pytrainer/trunk/pytrainer/lib/uc.py 2010-11-11 08:56:45 UTC (rev 696) @@ -27,16 +27,12 @@ class UC(Singleton): """ - When instantiated first time us is assigned, otherwise not. - Can be called with or w/o argument. + When instantiated first time us is assigned to False, otherwise not. us = False; metric system us = True ; imperial system """ - def __init__(self, *args): + def __init__(self): _us = False - if args: - if args[0] in [True, False]: - _us = args[0] if not hasattr(self, 'us'): self.us = _us Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-11-11 02:45:54 UTC (rev 695) +++ pytrainer/trunk/pytrainer/main.py 2010-11-11 08:56:45 UTC (rev 696) @@ -50,7 +50,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#692" + self.version ="1.7.2_svn#696" self.DB_version = 6 #Process command line options self.startup_options = self.get_options() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <aza...@us...> - 2010-11-11 13:24:51
|
Revision: 700 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=700&view=rev Author: azapletal Date: 2010-11-11 13:24:45 +0000 (Thu, 11 Nov 2010) Log Message: ----------- Fix for unitsconversor (temporary, WIP) Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/unitsconversor.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/lib/unitsconversor.py =================================================================== --- pytrainer/trunk/pytrainer/lib/unitsconversor.py 2010-11-11 11:32:47 UTC (rev 699) +++ pytrainer/trunk/pytrainer/lib/unitsconversor.py 2010-11-11 13:24:45 UTC (rev 700) @@ -105,8 +105,11 @@ # quantity=physical quantitiy like 'distance' or 'speed' # here we should call the universal 'conversion prepare for output' filter # need the same for get_text - _value = filter_inout(quantity, _value, 'out', us=_us, round=_round_digits) - _value = str(_value) + try: + _value = filter_inout(quantity, _value, 'out', us=_us, round=_round_digits) + _value = str(_value) + except: + _value = '' gtkentry.set_text(_value) def myget_text(gtkentry, quantity, **kwargs): Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-11-11 11:32:47 UTC (rev 699) +++ pytrainer/trunk/pytrainer/main.py 2010-11-11 13:24:45 UTC (rev 700) @@ -50,7 +50,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#696" + self.version ="1.7.2_svn#700" self.DB_version = 6 #Process command line options self.startup_options = self.get_options() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <aza...@us...> - 2010-11-11 22:06:11
|
Revision: 702 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=702&view=rev Author: azapletal Date: 2010-11-11 22:06:05 +0000 (Thu, 11 Nov 2010) Log Message: ----------- Improved uc and introduced to profile Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowrecord.py pytrainer/trunk/pytrainer/lib/uc.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/profile.py Modified: pytrainer/trunk/pytrainer/gui/windowrecord.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowrecord.py 2010-11-11 20:01:23 UTC (rev 701) +++ pytrainer/trunk/pytrainer/gui/windowrecord.py 2010-11-11 22:06:05 UTC (rev 702) @@ -28,6 +28,7 @@ import pytrainer.record import dateutil.parser from dateutil.tz import * # for tzutc() +from pytrainer.lib.uc import UC class WindowRecord(SimpleGladeApp): def __init__(self, equipment_service, data_path = None, listSport = None, parent = None, date = None, title=None, distance=None, time=None, upositive=None, unegative=None, bpm=None, calories=None, comment=None, windowTitle=None, equipment=[]): @@ -35,6 +36,7 @@ self.parent = parent self.pytrainer_main = parent.pytrainer_main self.us = self.pytrainer_main.profile.prf_us_system + self.uc = UC() logging.debug("Using US system: "+ str(self.us)) self.data_path = data_path glade_path="glade/newrecord.glade" @@ -91,11 +93,11 @@ self.rcd_calories.set_text(calories) #populate labels with units # test only - if self.us: - self.label8.set_text('Distance (mi)') - else: - self.label8.set_text('Distance (km)') - + #if self.us: + # self.label8.set_text('Distance (mi)') + #else: + # self.label8.set_text('Distance (km)') + self.label8.set_text('Distance [%s]' %self.uc.unit_distance) self._init_equipment(equipment, equipment_service) logging.debug("<<") Modified: pytrainer/trunk/pytrainer/lib/uc.py =================================================================== --- pytrainer/trunk/pytrainer/lib/uc.py 2010-11-11 20:01:23 UTC (rev 701) +++ pytrainer/trunk/pytrainer/lib/uc.py 2010-11-11 22:06:05 UTC (rev 702) @@ -27,7 +27,7 @@ class UC(Singleton): """ - When instantiated first time us is assigned to False, otherwise not. + When instantiated first time us is assigned to False. us = False; metric system us = True ; imperial system """ @@ -69,5 +69,15 @@ if self.us: return value / uc_factors[quantity] else: - return value - + return value + + def distance(self, value): + return self.sys2usr('distance', value) + def speed(self, value): + return self.sys2usr('speed', value) + def pace(self, value): + return self.sys2usr('pace', value) + def height(self, value): + return self.sys2usr('height', value) + def weight(self, value): + return self.sys2usr('weight', value) Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-11-11 20:01:23 UTC (rev 701) +++ pytrainer/trunk/pytrainer/main.py 2010-11-11 22:06:05 UTC (rev 702) @@ -50,7 +50,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#700" + self.version ="1.7.2_svn#702" self.DB_version = 6 #Process command line options self.startup_options = self.get_options() Modified: pytrainer/trunk/pytrainer/profile.py =================================================================== --- pytrainer/trunk/pytrainer/profile.py 2010-11-11 20:01:23 UTC (rev 701) +++ pytrainer/trunk/pytrainer/profile.py 2010-11-11 22:06:05 UTC (rev 702) @@ -23,6 +23,7 @@ from lxml import etree from lib.ddbb import DDBB +from lib.uc import UC class Profile: def __init__(self, data_path = None, parent = None): @@ -37,6 +38,7 @@ self.gpxdir = None self.extensiondir = None self.plugindir = None + self.uc = UC() #Set configuration parameters self._setHome() self._setConfFiles() @@ -79,6 +81,7 @@ self.configuration = self._parse_config_file(self.config_file) logging.debug("Configuration retrieved: "+str(self.configuration)) #self.pytrainer_main.ddbb = DDBB(self, pytrainer_main=self.pytrainer_main) + self.uc.set_us(self.prf_us_system) self._setZones() logging.debug("<<") @@ -277,6 +280,7 @@ logging.debug("Adding "+option+"|"+value) self.setValue("pytraining",option,value,delay_write=True) self.xml_tree.write(self.config_file, xml_declaration=True, encoding='UTF-8') + self.uc.set_us(list_options['prf_us_system']) logging.debug("<<") def getSportList(self): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <aza...@us...> - 2010-11-12 07:28:04
|
Revision: 703 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=703&view=rev Author: azapletal Date: 2010-11-12 07:27:52 +0000 (Fri, 12 Nov 2010) Log Message: ----------- More type-checking and error handling in UC Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/uc.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/lib/uc.py =================================================================== --- pytrainer/trunk/pytrainer/lib/uc.py 2010-11-11 22:06:05 UTC (rev 702) +++ pytrainer/trunk/pytrainer/lib/uc.py 2010-11-12 07:27:52 UTC (rev 703) @@ -28,13 +28,12 @@ class UC(Singleton): """ When instantiated first time us is assigned to False. - us = False; metric system - us = True ; imperial system + us = False; user system is metric + us = True ; user system is imperial """ def __init__(self): - _us = False if not hasattr(self, 'us'): - self.us = _us + self.us = False def __str__(self): if self.us: @@ -43,7 +42,8 @@ return 'metric' def set_us(self, us): - self.us = us + if type(us) == bool: + self.us = us def get_unit(self, quantity): if self.us: @@ -58,19 +58,28 @@ unit_weight = property( lambda self: self.get_unit('weight') ) def sys2usr(self, quantity, value): - """gives value of physical quantity (metric) in users system""" + """ Gives value of physical quantity (metric) in users system""" + try: + _val = float(value) + except ValueError: + return None if self.us: - return value * uc_factors[quantity] + return _val * uc_factors[quantity] else: - return value + return _val def usr2sys(self, quantity, value): - """takes value (users system) and convert to metric (sys)""" + """ Takes value (users system) and convert to metric (sys)""" + try: + _val = float(value) + except ValueError: + return None if self.us: - return value / uc_factors[quantity] + return _val / uc_factors[quantity] else: - return value - + return _val + + """ Aliases for sys2usr """ def distance(self, value): return self.sys2usr('distance', value) def speed(self, value): Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-11-11 22:06:05 UTC (rev 702) +++ pytrainer/trunk/pytrainer/main.py 2010-11-12 07:27:52 UTC (rev 703) @@ -50,7 +50,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#702" + self.version ="1.7.2_svn#703" self.DB_version = 6 #Process command line options self.startup_options = self.get_options() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <aza...@us...> - 2010-11-12 21:33:40
|
Revision: 705 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=705&view=rev Author: azapletal Date: 2010-11-12 21:33:27 +0000 (Fri, 12 Nov 2010) Log Message: ----------- Unit conversion support for Listview (WIP) Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/lib/listview.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2010-11-12 14:56:56 UTC (rev 704) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-11-12 21:33:27 UTC (rev 705) @@ -49,7 +49,9 @@ from pytrainer.gui.drawGraph import DrawGraph from pytrainer.gui.windowcalendar import WindowCalendar from pytrainer.lib.listview import ListSearch +from pytrainer.lib.uc import UC + class Main(SimpleGladeApp): def __init__(self, data_path = None, parent = None, version = None, gpxDir = None): def url_hook(dialog, url): @@ -66,6 +68,7 @@ SimpleGladeApp.__init__(self, self.data_path+glade_path, root, domain) + self.uc = UC() self.popup = PopupMenu(data_path,self) self.block = False self.activeSport = None @@ -104,11 +107,11 @@ columns=[ {'name':_("id"), 'visible':False}, {'name':_("Title")}, {'name':_("Date")}, - {'name':_("Distance"), 'xalign':1.0, 'format_float':'%.2f'}, + {'name':_("Distance"), 'xalign':1.0, 'format_float':'%.2f', 'quantity': 'distance'}, {'name':_("Sport")}, {'name':_("Time"), 'xalign':1.0, 'format_duration':True}, {'name':_(u"\u2300 HR"), 'xalign':1.0}, - {'name':_(u"\u2300 Speed"), 'xalign':1.0, 'format_float':'%.1f'}, + {'name':_(u"\u2300 Speed"), 'xalign':1.0, 'format_float':'%.1f', 'quantity': 'speed'}, {'name':_("Calories"), 'xalign':1.0} ] self.create_treeview(self.allRecordTreeView,columns) @@ -247,12 +250,12 @@ new = orig[3:] cell.set_property('text', new) - def render_float(self, column, cell, model, iter, format): - #orig = cell.get_property('text') - #To deal with floats displayed with a comma instead of a dot - orig = model.get_value(iter, column.get_sort_column_id()) - new = format % float(orig) - cell.set_property('text', new) + def render_float(self, column, cell, model, iter, data): + _format, _quantity = data + _val = model.get_value(iter, column.get_sort_column_id()) + _val = self.uc.sys2usr(_quantity, _val) + _val_str = _format % float(_val) + cell.set_property('text', _val_str) def create_treeview(self,treeview,columns): for column_index, column_dict in enumerate(columns): @@ -267,7 +270,7 @@ if 'visible' in column_dict: column.set_visible(column_dict['visible']) if 'format_float' in column_dict: - column.set_cell_data_func(renderer, self.render_float, column_dict['format_float']) + column.set_cell_data_func(renderer, self.render_float, [column_dict['format_float'], column_dict['quantity']]) if 'format_duration' in column_dict and column_dict['format_duration']: column.set_cell_data_func(renderer, self.render_duration) column.set_sort_column_id(column_index) Modified: pytrainer/trunk/pytrainer/lib/listview.py =================================================================== --- pytrainer/trunk/pytrainer/lib/listview.py 2010-11-12 14:56:56 UTC (rev 704) +++ pytrainer/trunk/pytrainer/lib/listview.py 2010-11-12 21:33:27 UTC (rev 705) @@ -1,14 +1,26 @@ import datetime -import math -#LISTPAST = [['All Time', -99999], ['Last 4 Weeks', -31], -# ['Last 6 Months', -183], ['Last 12 Months', -366]] - +UC_LISTDISTANCE = {False : [['All Distances', [0.0,999999.9]], + ['<1 km', [0.0, 1.0]], + ['1-5 km', [1.0, 5.0]], + ['5-20 km', [5.0, 20.0]], + ['20-50 km', [20.0, 50.0]], + ['50-100 km', [50.0, 100.0]], + ['>100 km', [100.0, 999999.9]]] , + True : [['All Distances', [0.0,999999.9]], + ['<1 mi', [0.0, 1.609344]], + ['1-5 mi', [1.609344, 8.04672]], + ['5-10 mi', [8.04672, 16.09344]], + ['10-20 mi', [16.09344, 32.18688]], + ['20-50 mi', [32.18688, 80.4672]], + ['>50 mi', [80.4672, 999999.9]]] + } class ListSearch(object): """ Builds SQLite condition out of search parameters""" def __init__(self, parent = None, pytrainer_main = None): self.parent = parent self.pytrainer_main = pytrainer_main + self.uc = self.pytrainer_main.uc """ Initialize all query parameters to valid default values""" self.title = '' self.sport = 0 @@ -16,14 +28,16 @@ self.duration = 0 self.distance = 0 self.listSport = self.pytrainer_main.profile.getSportList() + self.listPast = [['All Time', -99999], ['Last 4 Weeks', -31], ['Last 6 Months', -183], ['Last 12 Months', -366]] + self.listDuration = [['All Durations', [0,999999]], ['<1 Hour', [0,3600]], ['1-2 Hours', [3600,7200]], ['>2 Hours', [7200,999999]]] - - #if self.pytrainer_main.profile.prf_us_system == True: + + """ self.listDistanceUS = [['All Distances', [0.0,999999.9]], ['<1 mi', [0.0, 1.609344]], ['1-5 mi', [1.609344, 8.04672]], @@ -39,6 +53,9 @@ ['20-50 km', [20.0, 50.0]], ['50-100 km', [50.0, 100.0]], ['>100 km', [100.0, 999999.9]]] + """ + + self.listDistance = UC_LISTDISTANCE[self.uc.us] #print self.listDistance self.setup_lsa_sport() self.setup_lsa_past() @@ -89,19 +106,18 @@ _add_and = True #print _search return _search + + """ + def get_listDistance(self): - def get_listDistance(self): - """ Not Finished. Eperimentally. Goal: compute distance intervals - for each sport individually from average and standard deviation. - """ _all = ['All Distances', [0.0, 99999.9]] _back = [] _back.append( [_all] ) for sp in self.listSport: _back.append( [_all] ) return _back + """ - condition = property(get_condition) #listDuration = property(get_listDuration) Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-11-12 14:56:56 UTC (rev 704) +++ pytrainer/trunk/pytrainer/main.py 2010-11-12 21:33:27 UTC (rev 705) @@ -46,11 +46,12 @@ from lib.date import Date from activitypool import ActivityPool from lib.ddbb import DDBB +from lib.uc import UC class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#704" + self.version ="1.7.2_svn#705" self.DB_version = 6 #Process command line options self.startup_options = self.get_options() @@ -64,6 +65,7 @@ # Checking profile logging.debug('Checking configuration and profile...') self.profile = Profile(self.data_path,self) + self.uc = UC() self.windowmain = None self.ddbb = DDBB(self.profile, self) logging.debug('connecting to DDBB') This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2010-11-19 18:08:59
|
Revision: 716 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=716&view=rev Author: dgranda Date: 2010-11-19 18:08:53 +0000 (Fri, 19 Nov 2010) Log Message: ----------- Retrieving a real list with DB tables, comparison was failing in ddbb.checkDBTables and executing unnecessary DB backup copies and checks. Check mysql 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-11-19 16:23:44 UTC (rev 715) +++ pytrainer/trunk/pytrainer/lib/ddbb.py 2010-11-19 18:08:53 UTC (rev 716) @@ -26,6 +26,7 @@ from pytrainer.lib.date import Date #Define the tables and their columns that should be in the database +#Obviously, this is not a list but a dict -> TODO: ammend name to avoid confusion!!! tablesList = { "records":{ "id_record":"integer primary key autoincrement", "date":"date", "sport":"integer", @@ -293,8 +294,10 @@ global tablesList logging.debug('>>') tablesDB = self.ddbbObject.getTableList() + logging.debug('Tables in DB: '+str(tablesDB)); #Check Tables for entry in tablesList: + logging.debug("Entry: "+entry) if entry not in tablesDB: return False return True @@ -312,15 +315,12 @@ # logging.error('Support for MySQL database is decommissioned, please migrate to SQLite. Exiting check') # exit(-2) try: - tablesDBT = self.ddbbObject.getTableList() + tablesDB = self.ddbbObject.getTableList() except: logging.error('Not able to retrieve which tables are in DB. Printing traceback') traceback.print_exc() exit(-1) - tablesDB = [] # Database retrieves a list with tuples ¿? - for entry in tablesDBT: - tablesDB.append(entry[0]) logging.debug('Found '+ str(len(tablesDB))+' tables in DB: '+ str(tablesDB)) # Create a compressed copy of current DB Modified: pytrainer/trunk/pytrainer/lib/sqliteUtils.py =================================================================== --- pytrainer/trunk/pytrainer/lib/sqliteUtils.py 2010-11-19 16:23:44 UTC (rev 715) +++ pytrainer/trunk/pytrainer/lib/sqliteUtils.py 2010-11-19 18:08:53 UTC (rev 716) @@ -51,7 +51,12 @@ pass def getTableList(self): - return self.select("sqlite_master","name", "type IN ('table','view') AND name NOT LIKE 'sqlite_%' ORDER BY name") + tmpList = self.select("sqlite_master","name", "type IN ('table','view') AND name NOT LIKE 'sqlite_%' ORDER BY name") + # The instruction above returns a list of tuples, going for a simple list + newList = [] + for entry in tmpList: + newList.append(entry[0]) + return newList def createTableDefault(self,tableName,columns): '''22.11.2009 - dgranda Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-11-19 16:23:44 UTC (rev 715) +++ pytrainer/trunk/pytrainer/main.py 2010-11-19 18:08:53 UTC (rev 716) @@ -53,7 +53,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#713" + self.version ="1.7.2_svn#715" self.DB_version = 6 #Process command line options self.startup_options = self.get_options() @@ -75,16 +75,18 @@ logging.debug('connecting to DDBB') self.ddbb.connect() - #Get user's DB version currentDB_version = self.profile.getValue("pytraining","DB_version") logging.debug("Current DB version: "+str(currentDB_version)) # DB check can be triggered either via new version (mandatory) or as runtime parameter (--check) - if self.startup_options.check: # User requested check + if self.startup_options.check: + logging.debug("Checking DB as per user's request") self.sanityCheck() - elif currentDB_version is None: # No stored DB version - check DB etc + elif currentDB_version is None: + logging.debug("No stored DB version. Checking DB") self.sanityCheck() - elif self.DB_version > int(currentDB_version): # DB version expected is newer than user's version - check DB etc + elif self.DB_version > int(currentDB_version): + logging.debug("DB version newer than user's version") self.sanityCheck() else: logging.info('No sanity check requested') This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-11-21 22:50:34
|
Revision: 721 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=721&view=rev Author: jblance Date: 2010-11-21 22:50:28 +0000 (Sun, 21 Nov 2010) Log Message: ----------- Add average speed per lap and heartrate zones to graphing Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/drawGraph.py pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/lib/activity.py pytrainer/trunk/pytrainer/lib/graphdata.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/gui/drawGraph.py =================================================================== --- pytrainer/trunk/pytrainer/gui/drawGraph.py 2010-11-21 21:35:00 UTC (rev 720) +++ pytrainer/trunk/pytrainer/gui/drawGraph.py 2010-11-21 22:50:28 UTC (rev 721) @@ -111,6 +111,15 @@ else: self.ax2.axvspan(datalist.x_values[i], datalist.x_values[i]+datalist.bar_widths[i], alpha=0.15, facecolor=datalist.y2linecolor) i += 1 + elif datalist.graphType == "hspan": + i = 0 + while i < len(datalist.x_values): + #print datalist.x_values[i] , datalist.y_values[i], datalist.labels[i], datalist.colors[i] + if not y2: + self.ax1.axhspan(datalist.x_values[i], datalist.y_values[i], alpha=0.25, facecolor=datalist.colors[i], label=datalist.labels[i]) + else: + self.ax2.axhspan(datalist.x_values[i], datalist.y_values[i], alpha=0.25, facecolor=datalist.colors[i], label=datalist.labels[i]) + i += 1 elif datalist.graphType == "date": if not y2: self.ax1.plot_date(datalist.x_values, datalist.y_values, color=datalist.linecolor, label=datalist.ylabel, alpha=0.5) Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2010-11-21 21:35:00 UTC (rev 720) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-11-21 22:50:28 UTC (rev 721) @@ -485,27 +485,35 @@ y1button.connect("toggled", self.on_y1change, y1box, graphdata, activity) #Attach button to container y1box.attach(y1button, 0, 1, row, row+1, xoptions=gtk.EXPAND|gtk.FILL) - #Create a color choser - y1color = gtk.ColorButton() - #Set color to current activity color - _color = gtk.gdk.color_parse(data[graphdata].linecolor) - y1color.set_color(_color) - #Connect handler for color state changes - y1color.connect("color-set", self.on_y1colorchange, y1box, graphdata, activity) - #Attach to container - y1box.attach(y1color, 1, 2, row, row+1) + if data[graphdata].linecolor is not None: + #Create a color choser + y1color = gtk.ColorButton() + #Set color to current activity color + _color = gtk.gdk.color_parse(data[graphdata].linecolor) + y1color.set_color(_color) + #Connect handler for color state changes + y1color.connect("color-set", self.on_y1colorchange, y1box, graphdata, activity) + #Attach to container + y1box.attach(y1color, 1, 2, row, row+1) + else: + blanklabel = gtk.Label("") + y1box.attach(blanklabel, 1, 2, row, row+1) #Second Y axis y2button = gtk.CheckButton(label=data[graphdata].title) y2button.set_active(data[graphdata].show_on_y2) y2button.connect("toggled", self.on_y2change, y2box, graphdata, activity) y2box.attach(y2button, 0, 1, row, row+1, xoptions=gtk.EXPAND|gtk.FILL) - y2color = gtk.ColorButton() - _color = gtk.gdk.color_parse(data[graphdata].y2linecolor) - y2color.set_color(_color) - y2color.connect("color-set", self.on_y2colorchange, y2box, graphdata, activity) - #Attach to container - y2box.attach(y2color, 1, 2, row, row+1) + if data[graphdata].y2linecolor is not None: + y2color = gtk.ColorButton() + _color = gtk.gdk.color_parse(data[graphdata].y2linecolor) + y2color.set_color(_color) + y2color.connect("color-set", self.on_y2colorchange, y2box, graphdata, activity) + #Attach to container + y2box.attach(y2color, 1, 2, row, row+1) + else: + blanklabel = gtk.Label("") + y2box.attach(blanklabel, 1, 2, row, row+1) row += 1 y1Frame.add(y1box) Modified: pytrainer/trunk/pytrainer/lib/activity.py =================================================================== --- pytrainer/trunk/pytrainer/lib/activity.py 2010-11-21 21:35:00 UTC (rev 720) +++ pytrainer/trunk/pytrainer/lib/activity.py 2010-11-21 22:50:28 UTC (rev 721) @@ -316,6 +316,17 @@ self.time_data['pace_lap'] = GraphData(title=title, xlabel=xlabel, ylabel=ylabel) self.time_data['pace_lap'].set_color('#99CCFF', '#99CCFF') self.time_data['pace_lap'].graphType = "bar" + #Speed + title=_("Speed by Lap") + xlabel="%s (%s)" % (_('Distance'), self.distance_unit) + ylabel="%s (%s)" % (_('Speed'), self.speed_unit) + self.distance_data['speed_lap'] = GraphData(title=title, xlabel=xlabel, ylabel=ylabel) + self.distance_data['speed_lap'].set_color('#336633', '#336633') + self.distance_data['speed_lap'].graphType = "bar" + xlabel=_("Time (seconds)") + self.time_data['speed_lap'] = GraphData(title=title, xlabel=xlabel, ylabel=ylabel) + self.time_data['speed_lap'].set_color('#336633', '#336633') + self.time_data['speed_lap'].graphType = "bar" for lap in self.laps: time = float( lap['elapsed_time'].decode('utf-8') ) # time in sql is a unicode string dist = lap['distance']/1000 #distance in km @@ -323,19 +334,27 @@ pace = time/(60*dist) #min/km except ZeroDivisionError: pace = 0.0 + try: + avg_speed = dist/(time/3600) # km/hr + except: + avg_speed = 0.0 if self.pace_limit is not None and pace > self.pace_limit: logging.debug("Pace (%s) exceeds limit (%s). Setting to 0" % (str(pace), str(self.pace_limit))) pace = 0.0 - logging.debug("Time: %f, Dist: %f, Pace: %f" % (time, dist, pace) ) + logging.debug("Time: %f, Dist: %f, Pace: %f, Speed: %f" % (time, dist, pace, avg_speed) ) self.lap_time.addBars(x=time, y=10) if self.us_system: self.lap_distance.addBars(x=km2miles(dist), y=10) self.distance_data['pace_lap'].addBars(x=km2miles(dist), y=pacekm2miles(pace)) self.time_data['pace_lap'].addBars(x=time, y=pacekm2miles(pace)) + self.distance_data['speed_lap'].addBars(x=km2miles(dist), y=km2miles(avg_speed)) + self.time_data['speed_lap'].addBars(x=time, y=km2miles(avg_speed)) else: self.lap_distance.addBars(x=dist, y=10) self.distance_data['pace_lap'].addBars(x=dist, y=pace) self.time_data['pace_lap'].addBars(x=time, y=pace) + self.distance_data['speed_lap'].addBars(x=dist, y=avg_speed) + self.time_data['speed_lap'].addBars(x=time, y=avg_speed) logging.debug("<<") def _get_laps_from_gpx(self): @@ -485,6 +504,21 @@ logging.debug( "No values for %s. Removing...." % item ) del self.time_data[item] logging.debug("<<") + #Add Heartrate zones graphs + if 'hr' in self.distance_data: + zones = self.pytrainer_main.profile.getZones() + title=_("Heart Rate zone") + xlabel="%s (%s)" % (_('Distance'), self.distance_unit) + ylabel="%s (%s)" % (_('Heart Rate'), _('bpm')) + self.distance_data['hr_z'] = GraphData(title=title, xlabel=xlabel, ylabel=ylabel) + self.distance_data['hr_z'].graphType = "hspan" + self.distance_data['hr_z'].set_color(None, None) + xlabel=_("Time (seconds)") + self.time_data['hr_z'] = GraphData(title=title,xlabel=xlabel, ylabel=ylabel) + self.time_data['hr_z'].set_color(None, None) + for zone in zones: + self.distance_data['hr_z'].addPoints(x=zone[0], y=zone[1], label=zone[3], color=zone[2]) + self.time_data['hr_z'].addPoints(x=zone[0], y=zone[1], label=zone[3], color=zone[2]) def _float(self, value): try: Modified: pytrainer/trunk/pytrainer/lib/graphdata.py =================================================================== --- pytrainer/trunk/pytrainer/lib/graphdata.py 2010-11-21 21:35:00 UTC (rev 720) +++ pytrainer/trunk/pytrainer/lib/graphdata.py 2010-11-21 22:50:28 UTC (rev 721) @@ -28,6 +28,8 @@ self.title = title self.ylabel = ylabel self.xlabel = xlabel + self.labels = [] + self.colors = [] self.x_values = [] self.bar_bottoms = [] self.bar_widths = [] @@ -43,7 +45,7 @@ self.show_on_y1 = False self.show_on_y2 = False logging.debug('<<') - + def addBars(self, x=None, y=None): if x is None or y is None: #logging.debug("Must supply both x and y data points, got x:'%s' y:'%s'" % (str(x), str(y))) @@ -64,7 +66,7 @@ self.y_values.append(y) self.bar_bottoms.append(0) - def addPoints(self, x=None, y=None): + def addPoints(self, x=None, y=None, label=None, color=None): #if x is None or y is None or x is "": if not x or not y: #logging.debug("Must supply both x and y data points, got x:'%s' y:'%s'" % (str(x), str(y))) @@ -72,6 +74,10 @@ #print('Adding point: %s %s' % (str(x), str(y))) self.x_values.append(x) self.y_values.append(y) + if label is not None: + self.labels.append(label) + if color is not None: + self.colors.append(color) if self.max_x_value is None or x > self.max_x_value: self.max_x_value = x if self.min_x_value is None or x < self.min_x_value: @@ -106,10 +112,10 @@ ''' _color = self.get_color(y1color) _color2 = self.get_color(y2color) - if _color is not None: - self.linecolor = _color - if _color2 is not None: - self.y2linecolor = _color2 + #if _color is not None: + self.linecolor = _color + #if _color2 is not None: + self.y2linecolor = _color2 def __len__(self): if self.x_values is None: Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-11-21 21:35:00 UTC (rev 720) +++ pytrainer/trunk/pytrainer/main.py 2010-11-21 22:50:28 UTC (rev 721) @@ -53,7 +53,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#715" + self.version ="1.7.2_svn#721" self.DB_version = 6 #Process command line options self.startup_options = self.get_options() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-11-21 23:26:41
|
Revision: 722 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=722&view=rev Author: jblance Date: 2010-11-21 23:26:35 +0000 (Sun, 21 Nov 2010) Log Message: ----------- Fix mysql code to match changes to sqlite tablelist handling Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/mysqlUtils.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/lib/mysqlUtils.py =================================================================== --- pytrainer/trunk/pytrainer/lib/mysqlUtils.py 2010-11-21 22:50:28 UTC (rev 721) +++ pytrainer/trunk/pytrainer/lib/mysqlUtils.py 2010-11-21 23:26:35 UTC (rev 722) @@ -76,7 +76,11 @@ self.db.query("create database %s" %self.ddbb) def getTableList(self): - return self.freeExec('show tables') + tables = [] + result = self.freeExec('show tables') + for row in result: + tables.append(row[0]) + return tables def createTableDefault(self,tableName,columns): ''' Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-11-21 22:50:28 UTC (rev 721) +++ pytrainer/trunk/pytrainer/main.py 2010-11-21 23:26:35 UTC (rev 722) @@ -53,7 +53,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#721" + self.version ="1.7.2_svn#722" self.DB_version = 6 #Process command line options self.startup_options = self.get_options() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-11-22 21:36:21
|
Revision: 724 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=724&view=rev Author: jblance Date: 2010-11-22 21:36:15 +0000 (Mon, 22 Nov 2010) Log Message: ----------- Fix to stop crash on editing record with empty distance - ticket 73 Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowrecord.py pytrainer/trunk/pytrainer/lib/uc.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/gui/windowrecord.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowrecord.py 2010-11-22 02:00:38 UTC (rev 723) +++ pytrainer/trunk/pytrainer/gui/windowrecord.py 2010-11-22 21:36:15 UTC (rev 724) @@ -348,7 +348,10 @@ #self.rcd_distance.set_text("%.2f"%activity.distance) #myset_text(self.rcd_distance, 'distance', activity.distance, us=self.us, round=2) - self.rcd_distance.set_text("%.2f" %self.uc.distance(activity.distance)) + if activity.distance is not None: + self.rcd_distance.set_text("%.2f" %self.uc.distance(activity.distance)) + else: + self.rcd_distance.set_text("") self.rcd_average.set_text("%.2f" %self.uc.speed(activity.average)) self.rcd_calories.set_text("%s"%activity.calories) self.rcd_beats.set_text("%s"%activity.beats) Modified: pytrainer/trunk/pytrainer/lib/uc.py =================================================================== --- pytrainer/trunk/pytrainer/lib/uc.py 2010-11-22 02:00:38 UTC (rev 723) +++ pytrainer/trunk/pytrainer/lib/uc.py 2010-11-22 21:36:15 UTC (rev 724) @@ -61,7 +61,7 @@ """ Gives value of physical quantity (metric) in users system""" try: _val = float(value) - except ValueError: + except (ValueError, TypeError): return None if self.us: return _val * uc_factors[quantity] @@ -72,7 +72,7 @@ """ Takes value (users system) and convert to metric (sys)""" try: _val = float(value) - except ValueError: + except (ValueError, TypeError): return None if self.us: return _val / uc_factors[quantity] Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-11-22 02:00:38 UTC (rev 723) +++ pytrainer/trunk/pytrainer/main.py 2010-11-22 21:36:15 UTC (rev 724) @@ -53,7 +53,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#722" + self.version ="1.7.2_svn#724" self.DB_version = 6 #Process command line options self.startup_options = self.get_options() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-11-22 22:05:47
|
Revision: 725 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=725&view=rev Author: jblance Date: 2010-11-22 22:05:41 +0000 (Mon, 22 Nov 2010) Log Message: ----------- Update record summary after edit - ticket 79 Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/popupmenu.py pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/gui/popupmenu.py =================================================================== --- pytrainer/trunk/pytrainer/gui/popupmenu.py 2010-11-22 21:36:15 UTC (rev 724) +++ pytrainer/trunk/pytrainer/gui/popupmenu.py 2010-11-22 22:05:41 UTC (rev 725) @@ -31,7 +31,7 @@ self.popup.popup( None, None, None, event_button, time) def on_editrecord_activate(self,widget): - self.parent.parent.editRecord(self.id_record) + self.parent.parent.editRecord(self.id_record, self.parent.selected_view) def on_showclassic_activate(self,widget): self.parent.classicview_item.set_active(True) Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2010-11-22 21:36:15 UTC (rev 724) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-11-22 22:05:41 UTC (rev 725) @@ -641,9 +641,9 @@ distance = km2miles(distance) maxspeed = km2miles(maxspeed) - if tbeats > 0: + if tbeats > 0 and timeinseconds > 0: tbeats = tbeats/(timeinseconds/60/60) - if distance > 0: + if distance > 0 and timeinseconds > 0: average = distance/(timeinseconds/60/60) if maxspeed > 0: maxpace = "%d:%02d" %((3600/maxspeed)/60,(3600/maxspeed)%60) @@ -656,9 +656,15 @@ self.day_hour.set_text("%d" %hour) self.day_minute.set_text("%02d" %min) self.day_second.set_text("%02d" %sec) - self.day_beats.set_text("%0.2f" %tbeats) + if tbeats: + self.day_beats.set_text("%0.2f" %tbeats) + else: + self.day_beats.set_text("") self.day_maxbeats.set_text("%0.2f" %maxbeats) - self.day_average.set_text("%0.2f" %average) + if average: + self.day_average.set_text("%0.2f" %average) + else: + self.day_average.set_text("") self.day_maxspeed.set_text("%0.2f" %maxspeed) self.day_pace.set_text("%s" %pace) self.day_maxpace.set_text("%s" %maxpace) @@ -1406,7 +1412,7 @@ def on_edit_clicked(self,widget): selected,iter = self.recordTreeView.get_selection().get_selected() id_record = selected.get_value(iter,0) - self.parent.editRecord(id_record) + self.parent.editRecord(id_record, self.selected_view) def on_remove_clicked(self,widget): selected,iter = self.recordTreeView.get_selection().get_selected() @@ -1700,7 +1706,7 @@ def on_recordTree_clicked(self,widget,num,num2): selected,iter = self.recordTreeView.get_selection().get_selected() - self.parent.editRecord(selected.get_value(iter,0)) + self.parent.editRecord(selected.get_value(iter,0), self.selected_view) ### athleteview events ### def on_athleteTreeView_button_press_event(self, treeview, event): Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-11-22 21:36:15 UTC (rev 724) +++ pytrainer/trunk/pytrainer/main.py 2010-11-22 22:05:41 UTC (rev 725) @@ -53,7 +53,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#724" + self.version ="1.7.2_svn#725" self.DB_version = 6 #Process command line options self.startup_options = self.get_options() @@ -407,12 +407,14 @@ self.refreshListRecords() logging.debug('<<') - def editRecord(self, id_record): + def editRecord(self, id_record, view=None): logging.debug('>>') list_sport = self.profile.getSportList() logging.debug('id_record: '+str(id_record)+' | list_sport: '+str(list_sport)) self.record.editRecord(id_record,list_sport) self.refreshListRecords() + if view is not None: + self.refreshGraphView(view) logging.debug('<<') def removeRecord(self, id_record, confirm = False): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jb...@us...> - 2010-11-23 01:45:21
|
Revision: 728 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=728&view=rev Author: jblance Date: 2010-11-23 01:45:14 +0000 (Tue, 23 Nov 2010) Log Message: ----------- Fix sport filtering to work with non consecutive sport_ids Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/record.py Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2010-11-22 22:32:44 UTC (rev 727) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2010-11-23 01:45:14 UTC (rev 728) @@ -1439,8 +1439,8 @@ def on_sportlist_changed(self,widget): logging.debug("--") - if self.sportlist.get_active() != self.activeSport: - self.activeSport = self.sportlist.get_active() + if self.sportlist.get_active_text() != self.activeSport: + self.activeSport = self.sportlist.get_active_text() self.parent.refreshListRecords() self.parent.refreshGraphView(self.selected_view) else: Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2010-11-22 22:32:44 UTC (rev 727) +++ pytrainer/trunk/pytrainer/main.py 2010-11-23 01:45:14 UTC (rev 728) @@ -53,7 +53,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.7.2_svn#727" + self.version ="1.7.2_svn#728" self.DB_version = 6 #Process command line options self.startup_options = self.get_options() @@ -235,20 +235,23 @@ elif view=="day": logging.debug('day view') sport = self.windowmain.activeSport - record_list = self.record.getrecordList(date_selected, sport) + sport_id = self.record.getSportId(sport) + record_list = self.record.getrecordList(date_selected, sport_id) self.windowmain.actualize_dayview(record_list=record_list) #selected,iter = self.windowmain.recordTreeView.get_selection().get_selected() elif view=="week": logging.debug('week view') date_ini, date_end = self.date.getWeekInterval(date_selected, self.profile.prf_us_system) sport = self.windowmain.activeSport - record_list = self.record.getrecordPeriod(date_ini, date_end, sport) + sport_id = self.record.getSportId(sport) + record_list = self.record.getrecordPeriod(date_ini, date_end, sport_id) self.windowmain.actualize_weekview(record_list, date_ini, date_end) elif view=="month": logging.debug('month view') date_ini, date_end = self.date.getMonthInterval(date_selected) sport = self.windowmain.activeSport - record_list = self.record.getrecordPeriodSport(date_ini, date_end,sport) + sport_id = self.record.getSportId(sport) + record_list = self.record.getrecordPeriodSport(date_ini, date_end,sport_id) nameMonth, daysInMonth = self.date.getNameMonth(date_selected) self.windowmain.actualize_monthview(record_list, nameMonth) self.windowmain.actualize_monthgraph(record_list, daysInMonth) @@ -256,8 +259,9 @@ logging.debug('year view') date_ini, date_end = self.date.getYearInterval(date_selected) sport = self.windowmain.activeSport + sport_id = self.record.getSportId(sport) year = self.date.getYear(date_selected) - record_list = self.record.getrecordPeriodSport(date_ini, date_end,sport) + record_list = self.record.getrecordPeriodSport(date_ini, date_end,sport_id) self.windowmain.actualize_yearview(record_list, year) self.windowmain.actualize_yeargraph(record_list) elif view=="listview": @@ -311,7 +315,8 @@ self.refreshListView(self.windowmain.listsearch.condition) #Refresh list records date = self.date.getDate() - id_sport = self.windowmain.activeSport + sport = self.windowmain.activeSport + id_sport = self.record.getSportId(sport) record_ids = self.record.getrecordList(date, id_sport) self.windowmain.actualize_recordTreeView(record_ids) #Mark the monthly calendar to show which days have activity? Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2010-11-22 22:32:44 UTC (rev 727) +++ pytrainer/trunk/pytrainer/record.py 2010-11-23 01:45:14 UTC (rev 728) @@ -427,7 +427,7 @@ add: attribute to add or not the sport to db returns: id_sports from provided sport""" logging.debug('>>') - sport_id=1 + sport_id=None if sport == "" or sport is None: return sport_id try: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |