Exemple #1
0
 def on_calcdistance_clicked(self,widget):
     logging.debug(">>")
     try:
         hour = self.rcd_hour.get_value_as_int()
         min = self.rcd_min.get_value_as_int()
         sec = self.rcd_second.get_value_as_int()
         time = sec + (min*60) + (hour*3600)
         time_in_hour = time/3600.0
         # we need either pace or speed
         try:
             average = float(gtk_str(self.rcd_average.get_text()))
             distance = average*time_in_hour
             logging.debug("Time: %d seconds | Speed: %0.2f -> Distance: %0.3f km (mi)",
                           time, average, distance)
             pace = self.parent.pace_from_float(60/average)
             logging.debug("Setting pace: %s", pace)
             self.rcd_pace.set_text(pace)
         except:
             pace_dec = self.parent.pace_to_float(gtk_str(self.rcd_pace.get_text()))
             distance = time/(60.0*pace_dec)
             logging.debug("Time: %d seconds | Pace_dec: %0.2f -> Distance: %0.3f km (mi)",
                           time, pace_dec, distance)
             speed = distance/time_in_hour
             logging.debug("Setting average speed: %0.2f", speed)
             self.rcd_average.set_text("%0.2f" %speed)
         self.set_distance(distance) 
     except:
         logging.debug("Traceback: %s" % traceback.format_exc())
         pass
     logging.debug("<<")
Exemple #2
0
 def on_calctime_clicked(self,widget):
     logging.debug(">>")
     try:
         distance = float(gtk_str(self.rcd_distance.get_text())) # distance is mandatory!
         # we need either pace or speed
         try:
             average = float(gtk_str(self.rcd_average.get_text()))
             time_in_hour = distance/average
             logging.debug("Distance: %0.3f km (mi) | Speed: %0.2f -> Time: %.f hours",
                           distance, average, time_in_hour)
             pace = self.parent.pace_from_float(60/average)
             logging.debug("Setting pace: %s", pace)
             self.rcd_pace.set_text(pace)
         except:
             pace_dec = self.parent.pace_to_float(gtk_str(self.rcd_pace.get_text()))
             time_in_hour = pace_dec*distance/60.0
             logging.debug("Distance: %0.3f km (mi) | Pace_dec: %0.2f -> Time: %.f hours",
                           distance, pace_dec, time_in_hour)
             speed = distance/time_in_hour
             logging.debug("Setting average speed: %0.2f", speed)
             self.rcd_average.set_text("%0.2f" %speed)
         self.set_recordtime(time_in_hour)
     except:
         logging.debug("Traceback: %s" % traceback.format_exc())
         pass
     logging.debug("<<")
Exemple #3
0
 def on_calctime_clicked(self,widget):
     logging.debug(">>")
     try:
         distance = float(gtk_str(self.rcd_distance.get_text())) # distance is mandatory!
         # we need either pace or speed
         try:
             average = float(gtk_str(self.rcd_average.get_text()))
             time_in_hour = distance/average
             logging.debug("Distance: %0.3f km (mi) | Speed: %0.2f -> Time: %.f hours",
                           distance, average, time_in_hour)
             pace = self.parent.pace_from_float(60/average)
             logging.debug("Setting pace: %s", pace)
             self.rcd_pace.set_text(pace)
         except:
             pace_dec = self.parent.pace_to_float(gtk_str(self.rcd_pace.get_text()))
             time_in_hour = pace_dec*distance/60.0
             logging.debug("Distance: %0.3f km (mi) | Pace_dec: %0.2f -> Time: %.f hours",
                           distance, pace_dec, time_in_hour)
             speed = distance/time_in_hour
             logging.debug("Setting average speed: %0.2f", speed)
             self.rcd_average.set_text("%0.2f" %speed)
         self.set_recordtime(time_in_hour)
     except:
         logging.debug("Traceback: %s" % traceback.format_exc())
         pass
     logging.debug("<<")
Exemple #4
0
 def _confirm_add_equipment_clicked(self, widget):
     #FIXME input validation for numeric fields
     description = gtk_str(
         self._builder.get_object(
             "entryEquipmentAddDescription").get_text())
     life_expectancy = gtk_str(
         self._builder.get_object(
             "entryEquipmentAddLifeExpectancy").get_text())
     prior_usage = gtk_str(
         self._builder.get_object("entryEquipmentAddPriorUsage").get_text())
     active = self._builder.get_object(
         "checkbuttonEquipmentAddActive").get_active()
     notes_buffer = self._builder.get_object(
         "textviewEquipmentAddNotes").get_buffer()
     notes = gtk_str(
         notes_buffer.get_text(notes_buffer.get_start_iter(),
                               notes_buffer.get_end_iter(), True))
     new_equipment = Equipment()
     new_equipment.description = description
     new_equipment.active = bool(active)
     new_equipment.life_expectancy = int(life_expectancy)
     new_equipment.prior_usage = int(prior_usage)
     new_equipment.notes = notes
     self._equipment_store.add_equipment(new_equipment)
     self.show_page_equipment_list()
Exemple #5
0
 def on_newsport_accept_clicked(self, widget):
     sport = Sport()
     sport.name = gtk_str(self.newsportentry.get_text())
     sport.met = self._trim_to_null(gtk_str(self.newmetentry.get_text()))
     sport.weight = self._float_or_zero(
         gtk_str(self.newweightentry.get_text()))
     sport.max_pace = self._trim_to_null(gtk_str(
         self.newmaxpace.get_text()))
     sport.color = self.stored_color
     if sport.name.lower() in [
             s.name.lower() for s in self._sport_service.get_all_sports()
     ]:
         msg = "Sport '%s' already exists" % sport.name
         logging.error(msg)
         md = Gtk.MessageDialog(None, Gtk.DialogFlags.DESTROY_WITH_PARENT,
                                Gtk.MessageType.ERROR,
                                Gtk.ButtonsType.CLOSE, _(msg))
         md.set_title(_("Sport Creation Error"))
         md.run()
         md.destroy()
         return
     self._sport_service.store_sport(sport)
     self.pytrainer_main.refreshMainSportList()
     self.on_switch_page(None, None, 2)
     self.hidesportsteps()
     self.buttonbox.set_sensitive(1)
     self.sportlist.show()
Exemple #6
0
 def on_calcdistance_clicked(self,widget):
     logging.debug(">>")
     try:
         hour = self.rcd_hour.get_value_as_int()
         min = self.rcd_min.get_value_as_int()
         sec = self.rcd_second.get_value_as_int()
         time = sec + (min*60) + (hour*3600)
         time_in_hour = time/3600.0
         # we need either pace or speed
         try:
             average = float(gtk_str(self.rcd_average.get_text()))
             distance = average*time_in_hour
             logging.debug("Time: %d seconds | Speed: %0.2f -> Distance: %0.3f km (mi)",
                           time, average, distance)
             pace = self.parent.pace_from_float(60/average)
             logging.debug("Setting pace: %s", pace)
             self.rcd_pace.set_text(pace)
         except:
             pace_dec = self.parent.pace_to_float(gtk_str(self.rcd_pace.get_text()))
             distance = time/(60.0*pace_dec)
             logging.debug("Time: %d seconds | Pace_dec: %0.2f -> Distance: %0.3f km (mi)",
                           time, pace_dec, distance)
             speed = distance/time_in_hour
             logging.debug("Setting average speed: %0.2f", speed)
             self.rcd_average.set_text("%0.2f" %speed)
         self.set_distance(distance) 
     except:
         logging.debug("Traceback: %s" % traceback.format_exc())
         pass
     logging.debug("<<")
Exemple #7
0
 def on_options_ok_clicked(self, widget, response_id):
     if not response_id == Gtk.ResponseType.ACCEPT:
         return response_id
     self.description = gtk_str(self.entryList[0].get_text())
     if self.description == "":
         logging.debug("A description is required - setting to default")
         self.description = "Uploaded from pytrainer"
     self.tags = gtk_str(self.entryList[1].get_text())
     self.visibility = gtk_str(self.entryList[2].get_active_text())
     self.makeanon = self.entryList[3].get_active()
     logging.debug("Description: %s, tags: %s, visibility: %s, makeanon: %s" % ( self.description, self.tags, self.visibility, self.makeanon) )
Exemple #8
0
 def _confirm_edit_equipment_clicked(self, widget):
     item = self._get_selected_equipment_item()
     description_text = gtk_str(self._builder.get_object("entryEquipmentEditDescription").get_text())
     item.description = description_text
     item.life_expectancy = gtk_str(self._builder.get_object("entryEquipmentEditLifeExpectancy").get_text())
     item.prior_usage = gtk_str(self._builder.get_object("entryEquipmentEditPriorUsage").get_text())
     item.active = self._builder.get_object("checkbuttonEquipmentEditActive").get_active()
     notes_buffer = self._builder.get_object("textviewEquipmentEditNotes").get_buffer()
     notes_text = gtk_str(notes_buffer.get_text(notes_buffer.get_start_iter(),
                                                notes_buffer.get_end_iter(), True))
     item.notes = notes_text
     self._equipment_store.edit_equipment(self._get_selected_equipment_path(), item)
     self.show_page_equipment_list()
Exemple #9
0
 def on_treeviewEntries_row_activated(self, treeview, event):
     '''
      Callback to display details of different activity
     '''
     #Check for edited data in previous row
     if self.active_row is not None:
         #Check for edited data in comments
         buffer = self.rcd_comments.get_buffer()
         start,end = buffer.get_bounds()
         comments = gtk_str(buffer.get_text(start,end, True))
         self.activity_data[self.active_row]["rcd_comments"] = comments
         #Advanced tab items
         self.activity_data[self.active_row]["rcd_maxpace"] = gtk_str(self.rcd_maxpace.get_text())
         self.activity_data[self.active_row]["rcd_pace"] = gtk_str(self.rcd_pace.get_text())
         self.activity_data[self.active_row]["rcd_upositive"] = gtk_str(self.rcd_upositive.get_text())
         self.activity_data[self.active_row]["rcd_unegative"] = gtk_str(self.rcd_unegative.get_text())
         self.activity_data[self.active_row]["rcd_maxbeats"] = gtk_str(self.rcd_maxbeats.get_text())
         self.activity_data[self.active_row]["rcd_beats"] = gtk_str(self.rcd_beats.get_text())
         self.activity_data[self.active_row]["rcd_calories"] = gtk_str(self.rcd_calories.get_text())
     #Get row that was selected
     x = int(event.x)
     y = int(event.y)
     time = event.time
     pthinfo = treeview.get_path_at_pos(x, y)
     if pthinfo is not None:
         path, col, cellx, celly = pthinfo
         treeview.grab_focus()
         treeview.set_cursor(path, col, 0)
         while Gtk.events_pending(): # This allows the GUI to update
             Gtk.main_iteration()    # before completion of this entire action
         self.show_treeviewEntries_row(path[0])
Exemple #10
0
 def on_treeviewEntries_row_activated(self, treeview, event):
     '''
      Callback to display details of different activity
     '''
     #Check for edited data in previous row
     if self.active_row is not None:
         #Check for edited data in comments
         buffer = self.rcd_comments.get_buffer()
         start,end = buffer.get_bounds()
         comments = gtk_str(buffer.get_text(start,end, True))
         self.activity_data[self.active_row]["rcd_comments"] = comments
         #Advanced tab items
         self.activity_data[self.active_row]["rcd_maxpace"] = gtk_str(self.rcd_maxpace.get_text())
         self.activity_data[self.active_row]["rcd_pace"] = gtk_str(self.rcd_pace.get_text())
         self.activity_data[self.active_row]["rcd_upositive"] = gtk_str(self.rcd_upositive.get_text())
         self.activity_data[self.active_row]["rcd_unegative"] = gtk_str(self.rcd_unegative.get_text())
         self.activity_data[self.active_row]["rcd_maxbeats"] = gtk_str(self.rcd_maxbeats.get_text())
         self.activity_data[self.active_row]["rcd_beats"] = gtk_str(self.rcd_beats.get_text())
         self.activity_data[self.active_row]["rcd_calories"] = gtk_str(self.rcd_calories.get_text())
     #Get row that was selected
     x = int(event.x)
     y = int(event.y)
     time = event.time
     pthinfo = treeview.get_path_at_pos(x, y)
     if pthinfo is not None:
         path, col, cellx, celly = pthinfo
         treeview.grab_focus()
         treeview.set_cursor(path, col, 0)
         while Gtk.events_pending(): # This allows the GUI to update
             Gtk.main_iteration()    # before completion of this entire action
         self.show_treeviewEntries_row(path[0])
Exemple #11
0
 def on_editsport_accept_clicked(self,widget):
     oldnamesport = gtk_str(self.sportnameedit.get_text())
     sport = self._sport_service.get_sport_by_name(oldnamesport)
     sport.name = gtk_str(self.editsportentry.get_text())
     sport.weight = self._float_or_zero(gtk_str(self.editweightentry.get_text()))
     sport.met = self._trim_to_null(gtk_str(self.editmetentry.get_text()))
     sport.max_pace = self._trim_to_null(gtk_str(self.editmaxpace.get_text()))
     sport.color = self.stored_color
     self._sport_service.store_sport(sport)
     self.pytrainer_main.refreshMainSportList()
     self.on_switch_page(None,None,2)
     self.hidesportsteps()
     self.buttonbox.set_sensitive(1)
     self.sportlist.show()
Exemple #12
0
 def on_calcavs_clicked(self,widget):
     logging.debug(">>")
     hour = self.rcd_hour.get_value_as_int()
     min = self.rcd_min.get_value_as_int()
     sec = self.rcd_second.get_value_as_int()
     time = sec + (min*60) + (hour*3600)
     if time<1:
         logging.debug("Seems no time value (%s) has been entered, nothing to calculate.", time)
         return False
     distance = float(gtk_str(self.rcd_distance.get_text()))
     if distance<1:
         logging.debug("Seems no distance value (%s) has been entered, nothing to calculate.", distance)
         return False
     logging.debug("Time: %d seconds | Distance: %0.2f km (mi)", time, distance)
     # Average speed        
     average_speed = distance*3600.0/time
     logging.debug("Average speed: %0.2f", average_speed)
     self.rcd_average.set_text("%0.2f" %average_speed)
     # Average pace 
     dec_pace = 60/average_speed
     #Transform pace to mm:ss
     pace = self.parent.pace_from_float(dec_pace)
     logging.debug("Average pace: %s", pace)
     self.rcd_pace.set_text(pace)
     logging.debug("<<")
Exemple #13
0
 def on_rcd_distance_changed(self, widget):
     if self.mode == "multiple_activities" and self.active_row is not None:
         distance = gtk_str(self.rcd_distance.get_text())
         #Update distance in data store
         self.activity_data[self.active_row]["rcd_distance"] = distance
         #Update distance in treeview
         self.store[self.active_row][2] = distance
Exemple #14
0
 def on_rcd_sport_changed(self, widget):
     if self.mode == "multiple_activities" and self.active_row is not None:
         sport = gtk_str(self.rcd_sport.get_active_text())
         #Update sport in data store
         self.activity_data[self.active_row]["rcd_sport"] = sport
         #Update sport in treeview
         self.store[self.active_row][4] = sport
Exemple #15
0
 def on_rcd_distance_changed(self, widget):
     if self.mode == "multiple_activities" and self.active_row is not None:
         distance = gtk_str(self.rcd_distance.get_text())
         #Update distance in data store
         self.activity_data[self.active_row]["rcd_distance"] = distance
         #Update distance in treeview
         self.store[self.active_row][2] = distance
Exemple #16
0
 def on_calcavs_clicked(self,widget):
     logging.debug(">>")
     hour = self.rcd_hour.get_value_as_int()
     min = self.rcd_min.get_value_as_int()
     sec = self.rcd_second.get_value_as_int()
     time = sec + (min*60) + (hour*3600)
     if time<1:
         logging.debug("Seems no time value (%s) has been entered, nothing to calculate.", time)
         return False
     distance = float(gtk_str(self.rcd_distance.get_text()))
     if distance<1:
         logging.debug("Seems no distance value (%s) has been entered, nothing to calculate.", distance)
         return False
     logging.debug("Time: %d seconds | Distance: %0.2f km (mi)", time, distance)
     # Average speed        
     average_speed = distance*3600.0/time
     logging.debug("Average speed: %0.2f", average_speed)
     self.rcd_average.set_text("%0.2f" %average_speed)
     # Average pace 
     dec_pace = 60/average_speed
     #Transform pace to mm:ss
     pace = self.parent.pace_from_float(dec_pace)
     logging.debug("Average pace: %s", pace)
     self.rcd_pace.set_text(pace)
     logging.debug("<<")
Exemple #17
0
 def on_rcd_sport_changed(self, widget):
     if self.mode == "multiple_activities" and self.active_row is not None:
         sport = gtk_str(self.rcd_sport.get_active_text())
         #Update sport in data store
         self.activity_data[self.active_row]["rcd_sport"] = sport
         #Update sport in treeview
         self.store[self.active_row][4] = sport
Exemple #18
0
 def on_editsport_accept_clicked(self, widget):
     oldnamesport = gtk_str(self.sportnameedit.get_text())
     sport = self._sport_service.get_sport_by_name(oldnamesport)
     sport.name = gtk_str(self.editsportentry.get_text())
     sport.weight = self._float_or_zero(
         gtk_str(self.editweightentry.get_text()))
     sport.met = self._trim_to_null(gtk_str(self.editmetentry.get_text()))
     sport.max_pace = self._trim_to_null(
         gtk_str(self.editmaxpace.get_text()))
     sport.color = self.stored_color
     self._sport_service.store_sport(sport)
     self.pytrainer_main.refreshMainSportList()
     self.on_switch_page(None, None, 2)
     self.hidesportsteps()
     self.buttonbox.set_sensitive(1)
     self.sportlist.show()
Exemple #19
0
 def on_calculatemaxhr_clicked(self,widget=None):
     import datetime
     today = "%s"%datetime.date.today()
     year1,month1,day1 = today.split("-")
     year2,month2,day2 = gtk_str(self.prf_age.get_text()).split("-")
     diff = datetime.datetime(int(year1), int(month1), int(day1),0,0,0) - datetime.datetime(int(year2), int(month2), int(day2),0,0,0)
     self.prf_maxhr.set_text("%d" %(220-int(diff.days/365)))
Exemple #20
0
 def test_listsearch_sport(self):
     self.parent.lsa_sport.set_active(3)
     active = gtk_str(self.parent.lsa_sport.get_active_text())
     by_sport = list(
         self.main.record.getRecordListByCondition(
             self.parent.listsearch.condition))
     self.assertEqual(len(by_sport), 2)
     self.assertEqual(by_sport[0].sport.name, active)
Exemple #21
0
 def _confirm_add_equipment_clicked(self, widget):
     #FIXME input validation for numeric fields
     description = gtk_str(self._builder.get_object("entryEquipmentAddDescription").get_text())
     life_expectancy = gtk_str(self._builder.get_object("entryEquipmentAddLifeExpectancy").get_text())
     prior_usage = gtk_str(self._builder.get_object("entryEquipmentAddPriorUsage").get_text())
     active = self._builder.get_object("checkbuttonEquipmentAddActive").get_active()
     notes_buffer = self._builder.get_object("textviewEquipmentAddNotes").get_buffer()
     notes = gtk_str(notes_buffer.get_text(notes_buffer.get_start_iter(),
                                           notes_buffer.get_end_iter(), True))
     new_equipment = Equipment()
     new_equipment.description = description
     new_equipment.active = bool(active)
     new_equipment.life_expectancy = int(life_expectancy)
     new_equipment.prior_usage = int(prior_usage)
     new_equipment.notes = notes
     self._equipment_store.add_equipment(new_equipment)
     self.show_page_equipment_list()
Exemple #22
0
 def populateMultiWindow(self, activities):
     logging.debug(">>")
     self.mode = "multiple_activities"
     #activities (activity_id, start_time, distance, duration, sport, gpx_file, file_id)
     self.activity_data = []
     #Make treeview
     self.store = self.build_tree_view()
     #Add data
     for activity in activities:
         iter = self.store.append()
         self.store.set(
                 iter,
                 0, activity[0],
                 1, activity[1],
                 2, activity[2],
                 3, activity[3],
                 4, activity[4],
                 5, activity[5]
                 )
         details = {}
         details["complete"]  = False
         details["rcd_distance"] = activity[2]
         duration = activity[3]
         if duration.count(":") == 2:
             hours, mins, secs = duration.split(":")
         else:
             hours = mins = secs = 0
         #details["rcd_hour"] = float(hours)
         #details["rcd_min"] = float(mins)
         #details["rcd_second"] = float(secs)
         #details["rcd_time"] = (((float(hours) * 60) + float(mins)) * 60) + float(secs)
         details["activity_id"] = activity[0]
         details["rcd_time"] = (float(hours), float(mins), float(secs))
         if activity[4] is not None:
             details["rcd_sport"] = activity[4]
         else:
             # No sport was provided, preliminary set the current selection from window
             details["rcd_sport"] = gtk_str(self.rcd_sport.get_active_text())
         details["rcd_gpxfile"] = activity[5]
         details["file_id"] = activity[6]
         self.activity_data.append(details)
     self.scrolledwindowEntries.show_all()
     #Hide some of the buttons
     self.button25.hide() #GPX file "Open" button
     self.button24.hide() #GPX file "Calculate Values" button
     self.button10.hide() #Distance "Calculate" button
     self.button11.hide() #Duration "Calculate" button
     #self.button12.hide() #Velocity "Calculate" button
     self.button43.hide() #Pace "Calculate" button
     #Make GPX file 'unsensitive'
     self.rcd_gpxfile.set_sensitive(0)       
     while Gtk.events_pending(): # This allows the GUI to update
         Gtk.main_iteration()    # before completion of this entire action
     #Select first row and display details
     self.treeviewEntries.set_cursor(0)  
     self.show_treeviewEntries_row(0)
     logging.debug("<<")
Exemple #23
0
 def populateMultiWindow(self, activities):
     logging.debug(">>")
     self.mode = "multiple_activities"
     #activities (activity_id, start_time, distance, duration, sport, gpx_file, file_id)
     self.activity_data = []
     #Make treeview
     self.store = self.build_tree_view()
     #Add data
     for activity in activities:
         iter = self.store.append()
         self.store.set(
                 iter,
                 0, activity[0],
                 1, activity[1],
                 2, activity[2],
                 3, activity[3],
                 4, activity[4],
                 5, activity[5]
                 )
         details = {}
         details["complete"]  = False
         details["rcd_distance"] = activity[2]
         duration = activity[3]
         if duration.count(":") == 2:
             hours, mins, secs = duration.split(":")
         else:
             hours = mins = secs = 0
         #details["rcd_hour"] = float(hours)
         #details["rcd_min"] = float(mins)
         #details["rcd_second"] = float(secs)
         #details["rcd_time"] = (((float(hours) * 60) + float(mins)) * 60) + float(secs)
         details["activity_id"] = activity[0]
         details["rcd_time"] = (float(hours), float(mins), float(secs))
         if activity[4] is not None:
             details["rcd_sport"] = activity[4]
         else:
             # No sport was provided, preliminary set the current selection from window
             details["rcd_sport"] = gtk_str(self.rcd_sport.get_active_text())
         details["rcd_gpxfile"] = activity[5]
         details["file_id"] = activity[6]
         self.activity_data.append(details)
     self.scrolledwindowEntries.show_all()
     #Hide some of the buttons
     self.button25.hide() #GPX file "Open" button
     self.button24.hide() #GPX file "Calculate Values" button
     self.button10.hide() #Distance "Calculate" button
     self.button11.hide() #Duration "Calculate" button
     #self.button12.hide() #Velocity "Calculate" button
     self.button43.hide() #Pace "Calculate" button
     #Make GPX file 'unsensitive'
     self.rcd_gpxfile.set_sensitive(0)       
     while Gtk.events_pending(): # This allows the GUI to update
         Gtk.main_iteration()    # before completion of this entire action
     #Select first row and display details
     self.treeviewEntries.set_cursor(0)  
     self.show_treeviewEntries_row(0)
     logging.debug("<<")
Exemple #24
0
 def on_deletesport_clicked(self,widget):
     sport_name = gtk_str(self.sportnamedel.get_text())
     sport = self._sport_service.get_sport_by_name(sport_name)
     self._sport_service.remove_sport(sport)
     self.pytrainer_main.refreshMainSportList()
     self.on_switch_page(None,None,2)
     self.hidesportsteps()
     self.buttonbox.set_sensitive(1)
     self.sportlist.show()
Exemple #25
0
 def on_calculatemaxhr_clicked(self, widget=None):
     import datetime
     today = "%s" % datetime.date.today()
     year1, month1, day1 = today.split("-")
     year2, month2, day2 = gtk_str(self.prf_age.get_text()).split("-")
     diff = datetime.datetime(
         int(year1), int(month1), int(day1), 0, 0, 0) - datetime.datetime(
             int(year2), int(month2), int(day2), 0, 0, 0)
     self.prf_maxhr.set_text("%d" % (220 - int(diff.days / 365)))
Exemple #26
0
 def on_deletesport_clicked(self, widget):
     sport_name = gtk_str(self.sportnamedel.get_text())
     sport = self._sport_service.get_sport_by_name(sport_name)
     self._sport_service.remove_sport(sport)
     self.pytrainer_main.refreshMainSportList()
     self.on_switch_page(None, None, 2)
     self.hidesportsteps()
     self.buttonbox.set_sensitive(1)
     self.sportlist.show()
Exemple #27
0
 def setup_lsa_distance(self):
     liststore_lsa =  self.parent.lsa_distance.get_model() 
     if self.parent.lsa_distance.get_active() > 0:
         self.parent.lsa_distance.set_active(0) 
     firstEntry = gtk_str(self.parent.lsa_distance.get_active_text())
     liststore_lsa.clear() #Delete all items        
     for i in self.listDistance:
         liststore_lsa.append([i[0]])
     self.parent.lsa_distance.set_active(0)  
     #Add handler manually, so above changes do not trigger recursive loop
     self.parent.lsa_distance.connect("changed", self.parent.on_listareasearch_clicked)             
Exemple #28
0
 def setup_lsa_distance(self):
     liststore_lsa = self.parent.lsa_distance.get_model()
     if self.parent.lsa_distance.get_active() > 0:
         self.parent.lsa_distance.set_active(0)
     firstEntry = gtk_str(self.parent.lsa_distance.get_active_text())
     liststore_lsa.clear()  #Delete all items
     for i in self.listDistance:
         liststore_lsa.append([i[0]])
     self.parent.lsa_distance.set_active(0)
     #Add handler manually, so above changes do not trigger recursive loop
     self.parent.lsa_distance.connect("changed",
                                      self.parent.on_listareasearch_clicked)
Exemple #29
0
 def on_newsport_accept_clicked(self,widget):
     sport = Sport()
     sport.name = gtk_str(self.newsportentry.get_text())
     sport.met = self._trim_to_null(gtk_str(self.newmetentry.get_text()))
     sport.weight = self._float_or_zero(gtk_str(self.newweightentry.get_text()))
     sport.max_pace = self._trim_to_null(gtk_str(self.newmaxpace.get_text()))
     sport.color = self.stored_color
     if sport.name.lower() in [s.name.lower() for s in self._sport_service.get_all_sports()]:
         msg = "Sport '%s' already exists" % sport.name
         logging.error(msg)
         md = Gtk.MessageDialog(None, Gtk.DialogFlags.DESTROY_WITH_PARENT, Gtk.MessageType.ERROR, Gtk.ButtonsType.CLOSE, _(msg))
         md.set_title(_("Sport Creation Error"))
         md.run()
         md.destroy()
         return
     self._sport_service.store_sport(sport)
     self.pytrainer_main.refreshMainSportList()
     self.on_switch_page(None,None,2)
     self.hidesportsteps()
     self.buttonbox.set_sensitive(1)
     self.sportlist.show()
Exemple #30
0
 def setup_lsa_sport(self):
     liststore_lsa =  self.parent.lsa_sport.get_model() 
     if self.parent.lsa_sport.get_active() is not 0:
         self.parent.lsa_sport.set_active(0) #Set first item active if isnt
     firstEntry = gtk_str(self.parent.lsa_sport.get_active_text())
     liststore_lsa.clear() #Delete all items
     #Re-add "All Sports"
     liststore_lsa.append([firstEntry])
     #Re-add all sports in listSport
     for sport in self.listSport:
         liststore_lsa.append([sport.name])
     self.parent.lsa_sport.set_active(0)
     #Add handler manually, so above changes do not trigger recursive loop
     self.parent.lsa_sport.connect("changed", self.parent.on_listareasearch_clicked)
Exemple #31
0
 def _confirm_edit_equipment_clicked(self, widget):
     item = self._get_selected_equipment_item()
     description_text = gtk_str(
         self._builder.get_object(
             "entryEquipmentEditDescription").get_text())
     item.description = description_text
     item.life_expectancy = gtk_str(
         self._builder.get_object(
             "entryEquipmentEditLifeExpectancy").get_text())
     item.prior_usage = gtk_str(
         self._builder.get_object(
             "entryEquipmentEditPriorUsage").get_text())
     item.active = self._builder.get_object(
         "checkbuttonEquipmentEditActive").get_active()
     notes_buffer = self._builder.get_object(
         "textviewEquipmentEditNotes").get_buffer()
     notes_text = gtk_str(
         notes_buffer.get_text(notes_buffer.get_start_iter(),
                               notes_buffer.get_end_iter(), True))
     item.notes = notes_text
     self._equipment_store.edit_equipment(
         self._get_selected_equipment_path(), item)
     self.show_page_equipment_list()
Exemple #32
0
 def saveOptions(self):
     logging.debug(">>")
     list_options = {}
     logging.debug(self.conf_options)
     for i in self.conf_options.keys():
         if i == "default_viewer":
             if self.radiobuttonDefaultOSM.get_active():
                 list_options[i] = "1"
             else:
                 list_options[i] = "0"
         elif i == "prf_startscreen":
             ss_selected = "current_day"
             if self.radioButtonStartScreenLastEntry.get_active():
                 ss_selected = "last_entry"
             list_options[i] = ss_selected
         else:
             try:
                 var = getattr(self,i)
             except AttributeError as e:
                 continue
             if i == "prf_hrzones_karvonen" or i == "prf_us_system":
                 if var.get_active():
                     list_options[i] = "True"
                 else:
                     list_options[i] = "False"
             elif i == "prf_gender":
                 list_options[i] = self.gender_options[var.get_active()]
             elif i == "prf_ddbb":
                 list_options[i] = gtk_str(var.get_active_text())
             else:
                 list_options[i] = gtk_str(var.get_text())
         logging.info("Saving %s as %s" % (i, list_options[i]))
     logging.info("Updating profile...")
     self.parent.setProfile(list_options)
     self.parent.saveProfile()
     logging.debug("<<")
Exemple #33
0
 def saveOptions(self):
     logging.debug(">>")
     list_options = {}
     logging.debug(self.conf_options)
     for i in self.conf_options.keys():
         if i == "default_viewer":
             if self.radiobuttonDefaultOSM.get_active():
                 list_options[i] = "1"
             else:
                 list_options[i] = "0"
         elif i == "prf_startscreen":
             ss_selected = "current_day"
             if self.radioButtonStartScreenLastEntry.get_active():
                 ss_selected = "last_entry"
             list_options[i] = ss_selected
         else:
             try:
                 var = getattr(self, i)
             except AttributeError as e:
                 continue
             if i == "prf_hrzones_karvonen" or i == "prf_us_system":
                 if var.get_active():
                     list_options[i] = "True"
                 else:
                     list_options[i] = "False"
             elif i == "prf_gender":
                 list_options[i] = self.gender_options[var.get_active()]
             elif i == "prf_ddbb":
                 list_options[i] = gtk_str(var.get_active_text())
             else:
                 list_options[i] = gtk_str(var.get_text())
         logging.info("Saving %s as %s" % (i, list_options[i]))
     logging.info("Updating profile...")
     self.parent.setProfile(list_options)
     self.parent.saveProfile()
     logging.debug("<<")
Exemple #34
0
 def setup_lsa_sport(self):
     liststore_lsa = self.parent.lsa_sport.get_model()
     if self.parent.lsa_sport.get_active() is not 0:
         self.parent.lsa_sport.set_active(0)  #Set first item active if isnt
     firstEntry = gtk_str(self.parent.lsa_sport.get_active_text())
     liststore_lsa.clear()  #Delete all items
     #Re-add "All Sports"
     liststore_lsa.append([firstEntry])
     #Re-add all sports in listSport
     for sport in self.listSport:
         liststore_lsa.append([sport.name])
     self.parent.lsa_sport.set_active(0)
     #Add handler manually, so above changes do not trigger recursive loop
     self.parent.lsa_sport.connect("changed",
                                   self.parent.on_listareasearch_clicked)
Exemple #35
0
 def on_acceptSettings_clicked(self, widget, widget2):
     selected,iter = self.extensionsTree.get_selection().get_selected()
     prefs = self.parent.getExtensionConfParams(selected.get_value(iter,0))
     savedOptions = []
     i = 0
     for key in prefs.keys():
         try:
             savedOptions.append((key, gtk_str(self.entryList[i].get_text())))
         except:
             combobox = self.entryList[i]
             index = combobox.get_active()
             savedOptions.append((key,"%s" %index))
         i+=1
     self.prefwindow.hide()
     self.prefwindow = None
     self.parent.setExtensionConfParams(selected.get_value(iter,0),savedOptions)
     self.on_extensionsTree_clicked(None,None)
Exemple #36
0
 def on_acceptSettings_clicked(self, widget, widget2):
     selected,iter = self.pluginsTreeview.get_selection().get_selected()
     prefs = self.parent.getPluginConfParams(selected.get_value(iter,0))
     savedOptions = []
     i = 0
     for pref in prefs:
         try:
             savedOptions.append((pref[0], gtk_str(self.entryList[i].get_text())))
         except:
             combobox = self.entryList[i]
             index = combobox.get_active()
             savedOptions.append((pref[0],"%s" %index))
         i+=1
     self.prefwindow.hide()
     self.prefwindow = None
     self.parent.setPluginConfParams(selected.get_value(iter,0),savedOptions)
     self.on_pluginsTree_clicked(None,None)
Exemple #37
0
    def on_calculatemaxhr_clicked(self, widget=None):
        import datetime
        today = "%s" % datetime.date.today()
        year1, month1, day1 = today.split("-")

        # tell user that we can't calculate heart rate if age is not supplied
        try:
            year2, month2, day2 = gtk_str(self.prf_age.get_text()).split("-")
            date1 = datetime.datetime(int(year1), int(month1), int(day1), 0, 0,
                                      0)
            date2 = datetime.datetime(int(year2), int(month2), int(day2), 0, 0,
                                      0)
        except ValueError:
            msg = ("Unable to calculate max heart rate, please configure age "
                   "in the <i>Athlete</i> tab.")
            logging.error(msg)
            warning_dialog(text=_(msg),
                           title=_("Heart Rate Calculation Error"))
            return

        diff = date1 - date2
        self.prf_maxhr.set_text("%d" % (220 - int(diff.days / 365)))
 def on_pluginAcceptSettings_clicked(self, widget, pluginClass):
     '''
         Duplicate of plugin settings accept handler
     '''
     logging.debug('>>')
     prefs = self.plugins.getPluginConfParams(pluginClass)
     savedOptions = []
     i = 0
     for pref in prefs:
         try:
             savedOptions.append(
                 (pref[0], gtk_str(self.entryList[i].get_text())))
         except:
             combobox = self.entryList[i]
             index = combobox.get_active()
             savedOptions.append((pref[0], "%s" % index))
         i += 1
     self.prefwindow.hide()
     self.prefwindow = None
     self.plugins.setPluginConfParams(pluginClass, savedOptions)
     self.init_plugins_tab()
     logging.debug('<<')
Exemple #39
0
 def on_calccalories_clicked(self,widget):
     sport = gtk_str(self.rcd_sport.get_active_text())
     hour = self.rcd_hour.get_value_as_int()
     min = self.rcd_min.get_value_as_int()
     sec = self.rcd_second.get_value_as_int()
     hour += float(min)/60.0 + float(sec)/(60.0*60.0)
     weight = self.pytrainer_main.profile.getValue("pytraining","prf_weight")
     try:
         weight = float(weight)
     except:
         weight = 0.0
     try:
         met = float(self.parent.getSportMet(sport))
     except:
         met = None
     try:
         extraweight = self.parent.getSportWeight(sport)
         extraweight = float(extraweight)
     except:
         extraweight = 0.0
     if met is not None:
         calories = met*(weight+extraweight)*hour
         self.rcd_calories.set_text(str(calories))
Exemple #40
0
 def on_calccalories_clicked(self,widget):
     sport = gtk_str(self.rcd_sport.get_active_text())
     hour = self.rcd_hour.get_value_as_int()
     min = self.rcd_min.get_value_as_int()
     sec = self.rcd_second.get_value_as_int()
     hour += float(min)/60.0 + float(sec)/(60.0*60.0)
     weight = self.pytrainer_main.profile.getValue("pytraining","prf_weight")
     try:
         weight = float(weight)
     except:
         weight = 0.0
     try:
         met = float(self.parent.getSportMet(sport))
     except:
         met = None
     try:
         extraweight = self.parent.getSportWeight(sport)
         extraweight = float(extraweight)
     except:
         extraweight = 0.0
     if met is not None:
         calories = met*(weight+extraweight)*hour
         self.rcd_calories.set_text(str(calories))
Exemple #41
0
    def on_accept_clicked(self,widget):
        logging.debug(">>")
        if self.mode == "multiple_activities":
            logging.debug("multiple_activities")
            #Check for edited data in comments
            if self.active_row is not None:
                buffer = self.rcd_comments.get_buffer()
                start,end = buffer.get_bounds()
                comments = gtk_str(buffer.get_text(start,end, True))
                self.activity_data[self.active_row]["rcd_comments"] = comments
                #Advanced tab items
                self.activity_data[self.active_row]["rcd_maxpace"] = gtk_str(self.rcd_maxpace.get_text())
                self.activity_data[self.active_row]["rcd_pace"] = gtk_str(self.rcd_pace.get_text())
                self.activity_data[self.active_row]["rcd_upositive"] = gtk_str(self.rcd_upositive.get_text())
                self.activity_data[self.active_row]["rcd_unegative"] = gtk_str(self.rcd_unegative.get_text())
                self.activity_data[self.active_row]["rcd_maxbeats"] = gtk_str(self.rcd_maxbeats.get_text())
                self.activity_data[self.active_row]["rcd_beats"] = gtk_str(self.rcd_beats.get_text())
                self.activity_data[self.active_row]["rcd_calories"] = gtk_str(self.rcd_calories.get_text())
            row = 0 
            for activity in self.activity_data:
                index = self.activity_data.index(activity)
                if activity["complete"] is False:
                    #Did not view or modify this record - need to get all the details
                    logging.debug("Activity incomplete.. %s", activity["rcd_gpxfile"])
                    self.update_activity_data(row, activity["rcd_gpxfile"], activity["rcd_sport"])
                activity["rcd_title"] = activity["rcd_title"].replace("\"","'")
                #Add activity to DB etc
                laps = activity.pop("laps", ())
                selected_equipment_ids = self._get_selected_equipment_ids()
                self.activity_data[index]["db_id"] = self.parent.insertRecord(activity, laps, equipment=selected_equipment_ids)
                row += 1
            logging.debug("Processed %d rows of activity data", row)
        else:
            logging.debug("Single activity")
            list_options = {}
            trackSummary = {}
            list_options["rcd_date"] = gtk_str(self.rcd_date.get_text())
            list_options["rcd_sport"] = gtk_str(self.rcd_sport.get_active_text())
            list_options["rcd_distance"] = self.uc.usr2sys_str('distance',
                                                               gtk_str(self.rcd_distance.get_text()))
            list_options["rcd_beats"] = gtk_str(self.rcd_beats.get_text())
            list_options["rcd_average"] = self.uc.usr2sys_str('speed',
                                                              gtk_str(self.rcd_average.get_text()))
            list_options["rcd_calories"] = gtk_str(self.rcd_calories.get_text())
            list_options["rcd_title"] = gtk_str(self.rcd_title.get_text())
            list_options["rcd_gpxfile"] = gtk_str(self.rcd_gpxfile.get_text())
            list_options["rcd_upositive"] = self.uc.usr2sys_str('height',
                                                                gtk_str(self.rcd_upositive.get_text()))
            list_options["rcd_unegative"] = self.uc.usr2sys_str('height',
                                                                gtk_str(self.rcd_unegative.get_text()))
            list_options["rcd_maxbeats"] = gtk_str(self.rcd_maxbeats.get_text())
            # 2011.11.05 - dgranda
            # Pace is shown to user in mm:ss format
            # But pace in database is stored in a mixed way: 4.30 for 4:30 (4.5 in 'decimal'). This needs to be changed!!
            list_options["rcd_pace"] = self.uc.usr2sys_str('pace', gtk_str(self.rcd_pace.get_text()).replace(":","."))
            list_options["rcd_maxpace"] = self.uc.usr2sys_str('pace', gtk_str(self.rcd_maxpace.get_text()).replace(":","."))
            list_options["rcd_maxvel"] = self.uc.usr2sys_str('speed', gtk_str(self.rcd_maxvel.get_text()))
            list_options["rcd_time"] = [self.rcd_hour.get_value_as_int(),self.rcd_min.get_value_as_int(),self.rcd_second.get_value_as_int()]
            buffer = self.rcd_comments.get_buffer()
            start,end = buffer.get_bounds()
            comment = gtk_str(buffer.get_text(start,end, True))
            list_options["rcd_comments"] = comment
            selected_equipment_ids = self._get_selected_equipment_ids()
            # Added to change start time, only activities without GPX+ source file - dgranda 2011/06/10
            record_time = gtk_str(self.rcd_starttime.get_text())
            record_date = gtk_str(self.rcd_date.get_text())
            localtz = getLocalTZ()
            date = dateutil.parser.parse(record_date+" "+record_time+" "+localtz)
            local_date = str(date)
            utc_date = date.astimezone(tzutc()).strftime("%Y-%m-%dT%H:%M:%SZ")
            list_options["date_time_utc"] = utc_date
            list_options["date_time_local"] = local_date

            if self.mode == "newrecord":
                logging.debug('Track data: %s', list_options)
                if list_options["rcd_gpxfile"] != "":
                    logging.info('Adding new activity based on GPX file')
                    self.parent.insertRecord(list_options, None, selected_equipment_ids)
                else:
                    logging.info('Adding new activity based on provided data')
                    #Manual entry, calculate time info
                    record_time = gtk_str(self.rcd_starttime.get_text())
                    record_date = gtk_str(self.rcd_date.get_text())
                    localtz = getLocalTZ()
                    date = dateutil.parser.parse(record_date+" "+record_time+" "+localtz)
                    local_date = str(date)
                    utc_date = date.astimezone(tzutc()).strftime("%Y-%m-%dT%H:%M:%SZ")
                    list_options["date_time_utc"] = utc_date
                    list_options["date_time_local"] = local_date
                    self.parent.insertRecord(list_options, equipment=selected_equipment_ids)
            elif self.mode == "editrecord":
                self.parent.updateRecord(list_options, self.id_record, equipment=selected_equipment_ids)
        logging.debug("<<")
        self.close_window()
Exemple #42
0
 def on_calculatevalues_clicked(self,widget):
     gpxfile = gtk_str(self.rcd_gpxfile.get_text())
     if os.path.isfile(gpxfile):
         self.frameGeneral.set_sensitive(0)
         self.frameVelocity.set_sensitive(0) 
         self.parent.actualize_fromgpx(gpxfile)
Exemple #43
0
 def on_calendar_clicked(self,widget):
     calendardialog = WindowCalendar(self.data_path,self, date=gtk_str(self.rcd_date.get_text()))
     calendardialog.run()
Exemple #44
0
 def on_rcd_title_changed(self, widget):
     if self.mode == "multiple_activities" and self.active_row is not None:
         self.activity_data[self.active_row]["rcd_title"] = gtk_str(self.rcd_title.get_text())
Exemple #45
0
 def on_rcd_starttime_changed(self, widget):
     if self.mode == "multiple_activities" and self.active_row is not None:
         #Update start time in data store
         self.activity_data[self.active_row]["rcd_starttime"] = gtk_str(self.rcd_starttime.get_text())
    def on_buttonCSVImport_clicked(self, widget):
        logging.debug('>>')
        #Determine values
        dateCol = self.cbCSVDate.get_active()
        distanceCol = self.cbCSVDistance.get_active()
        durationCol = self.cbCSVDuration.get_active()
        titleCol = self.cbCSVTitle.get_active()
        sportCol = self.cbCSVSport.get_active()
        avgspeedCol = self.cbCSVAvgSpeed.get_active()
        maxspeedCol = self.cbCSVMaxSpeed.get_active()
        calCol = self.cbCSVCal.get_active()
        accCol = self.cbCSVAccent.get_active()
        desCol = self.cbCSVDescent.get_active()
        hrCol = self.cbCSVHR.get_active()
        maxHRCol = self.cbCSVMaxHR.get_active()
        paceCol = self.cbCSVPace.get_active()
        maxPaceCol = self.cbCSVMaxPace.get_active()
        commentsCol = self.cbCSVComments.get_active()

        if dateCol == 0:
            #Error need to have at least a date
            self.updateStatusbar(
                self.statusbarCSVImport,
                _("ERROR: Must define at least a date column"))
            return

        #Import...
        #Get selected file
        if not os.path.isfile(self.CSVfilename):
            return
        #Read as delimited file
        csvfile = open(self.CSVfilename, 'rb')
        reader = csv.reader(csvfile, delimiter=self.delimiter)
        #Process File

        for i, row in enumerate(reader):
            if self.has_header and i == 0:
                #Ignore first row
                continue
            if not row:
                continue
            data = Activity()
            #Determine dates
            _date = getDateTime(row[dateCol - 1])
            #year, month, day = date.split("-")
            date = _date[1].strftime("%Y-%m-%d")
            zuluDateTime = _date[0].strftime("%Y-%m-%dT%H:%M:%SZ")
            localDateTime = str(_date[1])
            data.date = _date[1].date()
            data.date_time_utc = zuluDateTime
            data.date_time_local = localDateTime
            if distanceCol:
                try:
                    data.distance = locale.atof(row[distanceCol - 1])
                except:
                    data.distance = 0
            else:
                data.distance = 0
            if durationCol:
                #calculate duration in sec...
                try:
                    _duration = row[durationCol - 1]
                except:
                    _duration = 0
                if _duration.count(':') == 2:
                    #Have 00:00:00 duration
                    h, m, s = _duration.split(':')
                    try:
                        durationSec = int(h) * 3600 + int(m) * 60 + int(s)
                    except:
                        logging.debug("Error calculating duration for '%s'" %
                                      _duration)
                        durationSec = None
                else:
                    try:
                        durationSec = locale.atoi(_duration)
                    except:
                        #Unknown duration
                        logging.debug("Could not determine duration for '%s'" %
                                      _duration)
                        durationSec = None
                if durationSec is not None:
                    data.duration = durationSec
                    data.time = str(durationSec)
            if titleCol:
                try:
                    data.title = row[titleCol - 1]
                except:
                    pass
            if self.checkbCSVForceSport.get_active():
                sport = self.pytrainer_main.record.getSport(gtk_str(
                    self.comboCSVForceSport.get_active_text()),
                                                            add=True)
                data.sport = sport
            elif sportCol:
                #retrieving sport id (adding sport if it doesn't exist yet)
                sport = self.pytrainer_main.record.getSport(row[sportCol - 1],
                                                            add=True)
                data.sport = sport
            else:
                self.comboCSVForceSport.set_active(0)
                sport = self.pytrainer_main.record.getSport(gtk_str(
                    self.comboCSVForceSport.get_active_text()),
                                                            add=True)
                data.sport = sport

            if avgspeedCol:
                #
                try:
                    data.average = locale.atof(row[avgspeedCol - 1])
                except:
                    pass
            if maxspeedCol:
                try:
                    data.maxspeed = locale.atof(row[maxspeedCol - 1])
                except:
                    pass
            if calCol:
                try:
                    data.calories = locale.atoi(row[calCol - 1])
                except:
                    pass
            if accCol:
                try:
                    data.upositive = locale.atof(row[accCol - 1])
                except:
                    pass
            if desCol:
                try:
                    data.unegative = locale.atof(row[desCol - 1])
                except:
                    pass
            if hrCol:
                try:
                    data.beats = locale.atof(row[hrCol - 1])
                except:
                    pass
            if maxHRCol:
                try:
                    data.maxbeats = locale.atof(row[maxHRCol - 1])
                except:
                    pass
            if paceCol:
                try:
                    data.pace = locale.atof(row[paceCol - 1])
                except:
                    pass
            if maxPaceCol:
                try:
                    data.maxpace = locale.atof(row[maxPaceCol - 1])
                except:
                    pass
            if commentsCol:
                try:
                    data.comments = row[commentsCol - -1]
                except:
                    pass

            #Insert into DB
            self.pytrainer_main.ddbb.session.add(data)
            self.pytrainer_main.ddbb.session.commit()
        #Display message....
        self.updateStatusbar(self.statusbarCSVImport,
                             _("Import completed. %d rows processed") % i)
        #Disable import button
        self.buttonCSVImport.set_sensitive(0)
        logging.debug('<<')
Exemple #47
0
 def on_prf_ddbb_changed(self, widget):
     i = gtk_str(self.prf_ddbb.get_active_text())
     if i == "sqlite":
         self._ddbb_value_deactive()
     else:
         self._ddbb_value_active()
Exemple #48
0
 def on_rcd_title_changed(self, widget):
     if self.mode == "multiple_activities" and self.active_row is not None:
         self.activity_data[self.active_row]["rcd_title"] = gtk_str(self.rcd_title.get_text())
Exemple #49
0
 def on_calendar_clicked(self,widget):
     calendardialog = WindowCalendar(self.data_path,self, date=gtk_str(self.rcd_date.get_text()))
     calendardialog.run()
Exemple #50
0
    def on_accept_clicked(self,widget):
        logging.debug(">>")
        if self.mode == "multiple_activities":
            logging.debug("multiple_activities")
            #Check for edited data in comments
            if self.active_row is not None:
                buffer = self.rcd_comments.get_buffer()
                start,end = buffer.get_bounds()
                comments = gtk_str(buffer.get_text(start,end, True))
                self.activity_data[self.active_row]["rcd_comments"] = comments
                #Advanced tab items
                self.activity_data[self.active_row]["rcd_maxpace"] = gtk_str(self.rcd_maxpace.get_text())
                self.activity_data[self.active_row]["rcd_pace"] = gtk_str(self.rcd_pace.get_text())
                self.activity_data[self.active_row]["rcd_upositive"] = gtk_str(self.rcd_upositive.get_text())
                self.activity_data[self.active_row]["rcd_unegative"] = gtk_str(self.rcd_unegative.get_text())
                self.activity_data[self.active_row]["rcd_maxbeats"] = gtk_str(self.rcd_maxbeats.get_text())
                self.activity_data[self.active_row]["rcd_beats"] = gtk_str(self.rcd_beats.get_text())
                self.activity_data[self.active_row]["rcd_calories"] = gtk_str(self.rcd_calories.get_text())
            row = 0 
            for activity in self.activity_data:
                index = self.activity_data.index(activity)
                if activity["complete"] is False:
                    #Did not view or modify this record - need to get all the details
                    logging.debug("Activity incomplete.. %s", activity["rcd_gpxfile"])
                    self.update_activity_data(row, activity["rcd_gpxfile"], activity["rcd_sport"])
                activity["rcd_title"] = activity["rcd_title"].replace("\"","'")
                #Add activity to DB etc
                laps = activity.pop("laps", ())
                selected_equipment_ids = self._get_selected_equipment_ids()
                self.activity_data[index]["db_id"] = self.parent.insertRecord(activity, laps, equipment=selected_equipment_ids)
                row += 1
            logging.debug("Processed %d rows of activity data", row)
        else:
            logging.debug("Single activity")
            list_options = {}
            trackSummary = {}
            list_options["rcd_date"] = gtk_str(self.rcd_date.get_text())
            list_options["rcd_sport"] = gtk_str(self.rcd_sport.get_active_text())
            list_options["rcd_distance"] = self.uc.usr2sys_str('distance',
                                                               gtk_str(self.rcd_distance.get_text()))
            list_options["rcd_beats"] = gtk_str(self.rcd_beats.get_text())
            list_options["rcd_average"] = self.uc.usr2sys_str('speed',
                                                              gtk_str(self.rcd_average.get_text()))
            list_options["rcd_calories"] = gtk_str(self.rcd_calories.get_text())
            list_options["rcd_title"] = gtk_str(self.rcd_title.get_text())
            list_options["rcd_gpxfile"] = gtk_str(self.rcd_gpxfile.get_text())
            list_options["rcd_upositive"] = self.uc.usr2sys_str('height',
                                                                gtk_str(self.rcd_upositive.get_text()))
            list_options["rcd_unegative"] = self.uc.usr2sys_str('height',
                                                                gtk_str(self.rcd_unegative.get_text()))
            list_options["rcd_maxbeats"] = gtk_str(self.rcd_maxbeats.get_text())
            # 2011.11.05 - dgranda
            # Pace is shown to user in mm:ss format
            # But pace in database is stored in a mixed way: 4.30 for 4:30 (4.5 in 'decimal'). This needs to be changed!!
            list_options["rcd_pace"] = self.uc.usr2sys_str('pace', gtk_str(self.rcd_pace.get_text()).replace(":","."))
            list_options["rcd_maxpace"] = self.uc.usr2sys_str('pace', gtk_str(self.rcd_maxpace.get_text()).replace(":","."))
            list_options["rcd_maxvel"] = self.uc.usr2sys_str('speed', gtk_str(self.rcd_maxvel.get_text()))
            list_options["rcd_time"] = [self.rcd_hour.get_value_as_int(),self.rcd_min.get_value_as_int(),self.rcd_second.get_value_as_int()]
            buffer = self.rcd_comments.get_buffer()
            start,end = buffer.get_bounds()
            comment = gtk_str(buffer.get_text(start,end, True))
            list_options["rcd_comments"] = comment
            selected_equipment_ids = self._get_selected_equipment_ids()
            # Added to change start time, only activities without GPX+ source file - dgranda 2011/06/10
            record_time = gtk_str(self.rcd_starttime.get_text())
            record_date = gtk_str(self.rcd_date.get_text())
            localtz = getLocalTZ()
            date = dateutil.parser.parse(record_date+" "+record_time+" "+localtz)
            local_date = str(date)
            utc_date = date.astimezone(tzutc()).strftime("%Y-%m-%dT%H:%M:%SZ")
            list_options["date_time_utc"] = utc_date
            list_options["date_time_local"] = local_date

            if self.mode == "newrecord":
                logging.debug('Track data: %s', list_options)
                if list_options["rcd_gpxfile"] != "":
                    logging.info('Adding new activity based on GPX file')
                    self.parent.insertRecord(list_options, None, selected_equipment_ids)
                else:
                    logging.info('Adding new activity based on provided data')
                    #Manual entry, calculate time info
                    record_time = gtk_str(self.rcd_starttime.get_text())
                    record_date = gtk_str(self.rcd_date.get_text())
                    localtz = getLocalTZ()
                    date = dateutil.parser.parse(record_date+" "+record_time+" "+localtz)
                    local_date = str(date)
                    utc_date = date.astimezone(tzutc()).strftime("%Y-%m-%dT%H:%M:%SZ")
                    list_options["date_time_utc"] = utc_date
                    list_options["date_time_local"] = local_date

                    try:
                        self.parent.insertRecord(
                                list_options,
                                equipment=selected_equipment_ids)
                    except ValueError:
                        msg = ("Unable to add an activity record without any "
                               "sports, please add a sport in preferences' "
                               "<i>Sports</i> tab.")
                        logging.error(msg)
                        warning_dialog(title=_("Error Adding Activity Record"), text=_(msg))

            elif self.mode == "editrecord":
                self.parent.updateRecord(list_options, self.id_record, equipment=selected_equipment_ids)
        logging.debug("<<")
        self.close_window()
Exemple #51
0
 def on_prf_ddbb_changed(self,widget):
     i = gtk_str(self.prf_ddbb.get_active_text())
     if i == "sqlite":
         self._ddbb_value_deactive()
     else:
         self._ddbb_value_active()
Exemple #52
0
 def on_rcd_starttime_changed(self, widget):
     if self.mode == "multiple_activities" and self.active_row is not None:
         #Update start time in data store
         self.activity_data[self.active_row]["rcd_starttime"] = gtk_str(self.rcd_starttime.get_text())
Exemple #53
0
 def on_calculatevalues_clicked(self,widget):
     gpxfile = gtk_str(self.rcd_gpxfile.get_text())
     if os.path.isfile(gpxfile):
         self.frameGeneral.set_sensitive(0)
         self.frameVelocity.set_sensitive(0) 
         self.parent.actualize_fromgpx(gpxfile)
    def on_buttonCSVProcess_clicked(self, widget):
        logging.debug('>>')
        #Get selected file
        self.CSVfilename = self.filechooserCSVImport.get_filename()
        if not os.path.isfile(self.CSVfilename):
            return
        #Determine delimiter
        if self.rbCSVTab.get_active():
            self.delimiter = "\t"
        elif self.rbCSVComma.get_active():
            self.delimiter = ","
        elif self.rbCSVOther.get_active():
            self.delimiter = gtk_str(self.entryCSVOther.get_text())
        else:
            self.delimiter = " "

        #Read as delimited file
        csvfile = open(self.CSVfilename, 'rb')
        #See if file has header row
        self.has_header = csv.Sniffer().has_header(csvfile.read(1024))
        csvfile.seek(0)
        reader = csv.DictReader(csvfile, delimiter=self.delimiter)
        #Read file to determine fields (must be a better way of doing this)
        for row in reader:
            pass
        #Build array of column names
        if self.has_header:
            #If the file has a header row, use the actual column names
            columns = reader.fieldnames
        else:
            #Otherwise just label them with numbers
            logging.debug(len(reader.fieldnames))
            columns = [
                _("Column %d") % x for x in range(0, len(reader.fieldnames))
            ]

        for column in columns:
            self.cbCSVDate.append_text(column)
            self.cbCSVDistance.append_text(column)
            self.cbCSVDuration.append_text(column)
            self.cbCSVTitle.append_text(column)
            self.cbCSVSport.append_text(column)
            self.cbCSVAvgSpeed.append_text(column)
            self.cbCSVMaxSpeed.append_text(column)
            self.cbCSVCal.append_text(column)
            self.cbCSVAccent.append_text(column)
            self.cbCSVDescent.append_text(column)
            self.cbCSVHR.append_text(column)
            self.cbCSVMaxHR.append_text(column)
            self.cbCSVPace.append_text(column)
            self.cbCSVMaxPace.append_text(column)
            self.cbCSVComments.append_text(column)
        self.cbCSVDate.set_active(0)
        self.cbCSVDistance.set_active(0)
        self.cbCSVDuration.set_active(0)
        self.cbCSVTitle.set_active(0)
        self.cbCSVSport.set_active(0)
        self.cbCSVAvgSpeed.set_active(0)
        self.cbCSVMaxSpeed.set_active(0)
        self.cbCSVCal.set_active(0)
        self.cbCSVAccent.set_active(0)
        self.cbCSVDescent.set_active(0)
        self.cbCSVHR.set_active(0)
        self.cbCSVMaxHR.set_active(0)
        self.cbCSVPace.set_active(0)
        self.cbCSVMaxPace.set_active(0)
        self.cbCSVComments.set_active(0)
        logging.debug('<<')