- Timestamp:
- Jan 25, 2019, 12:38:55 AM (5 years ago)
- Branches:
- current, feature/docs, master
- Children:
- 421f05f
- Parents:
- 6d1b54b
- Location:
- ow/models
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
ow/models/user.py
r6d1b54b r2f8a48f 1 1 from decimal import Decimal 2 from datetime import datetime, timedelta, timezone 2 3 from uuid import uuid1 3 4 from operator import attrgetter … … 8 9 9 10 from ow.catalog import get_catalog, reindex_object 11 from ow.utilities import get_week_days 10 12 11 13 … … 136 138 tree[year][month][sport] += 1 137 139 return tree 140 141 def stats(self, year=None, month=None): 142 year = year or datetime.now().year 143 stats = { 144 'workouts': 0, 145 'time': timedelta(seconds=0), 146 'distance': Decimal(0), 147 'elevation': Decimal(0), 148 'sports': {} 149 } 150 151 for workout in self.workouts(year=year, month=month): 152 stats['workouts'] += 1 153 stats['time'] += workout.duration or timedelta(seconds=0) 154 stats['distance'] += workout.distance or Decimal(0) 155 stats['elevation'] += workout.uphill or Decimal(0) 156 157 if workout.sport not in stats['sports']: 158 stats['sports'][workout.sport] = { 159 'workouts': 0, 160 'time': timedelta(seconds=0), 161 'distance': Decimal(0), 162 'elevation': Decimal(0), 163 } 164 165 stats['sports'][workout.sport]['workouts'] += 1 166 stats['sports'][workout.sport]['time'] += ( 167 workout.duration or timedelta(0)) 168 stats['sports'][workout.sport]['distance'] += ( 169 workout.distance or Decimal(0)) 170 stats['sports'][workout.sport]['elevation'] += ( 171 workout.uphill or Decimal(0)) 172 173 return stats 174 175 def get_week_stats(self, day): 176 """ 177 Return some stats for the week the given day is in. 178 """ 179 week = get_week_days(day) 180 181 # filter workouts 182 workouts = [] 183 for workout in self.workouts(): 184 if week[0].date() <= workout.start.date() <= week[-1].date(): 185 workouts.append(workout) 186 187 # build stats 188 stats = {} 189 for week_day in week: 190 stats[week_day] = { 191 'workouts': 0, 192 'time': timedelta(0), 193 'distance': Decimal(0), 194 'elevation': Decimal(0), 195 'sports': {} 196 } 197 for workout in workouts: 198 if workout.start.date() == week_day.date(): 199 day = stats[week_day] # less typing, avoid long lines 200 day['workouts'] += 1 201 day['time'] += workout.duration or timedelta(seconds=0) 202 day['distance'] += workout.distance or Decimal(0) 203 day['elevation'] += workout.uphill or Decimal(0) 204 if workout.sport not in day['sports']: 205 day['sports'][workout.sport] = { 206 'workouts': 0, 207 'time': timedelta(seconds=0), 208 'distance': Decimal(0), 209 'elevation': Decimal(0), 210 } 211 day['sports'][workout.sport]['workouts'] += 1 212 day['sports'][workout.sport]['time'] += ( 213 workout.duration or timedelta(0)) 214 day['sports'][workout.sport]['distance'] += ( 215 workout.distance or Decimal(0)) 216 day['sports'][workout.sport]['elevation'] += ( 217 workout.uphill or Decimal(0)) 218 219 return stats 220 221 @property 222 def week_stats(self): 223 """ 224 Helper that returns the week stats for the current week 225 """ 226 return self.get_week_stats(datetime.now(timezone.utc)) 227 228 @property 229 def week_totals(self): 230 week_stats = self.week_stats 231 return { 232 'distance': sum([week_stats[t]['distance'] for t in week_stats]), 233 'time': sum([week_stats[t]['time'] for t in week_stats], 234 timedelta()) 235 } -
ow/models/workout.py
r6d1b54b r2f8a48f 13 13 create_blob, 14 14 mps_to_kmph, 15 save_map_screenshot 15 save_map_screenshot, 16 timedelta_to_hms 16 17 ) 17 18 … … 110 111 111 112 def split_duration(self): 112 hours, remainder = divmod(int(self.duration.total_seconds()), 3600) 113 minutes, seconds = divmod(remainder, 60) 114 return hours, minutes, seconds 113 return timedelta_to_hms(self.duration) 115 114 116 115 @property
Note: See TracChangeset
for help on using the changeset viewer.