Index: ow/tests/views/test_user.py
===================================================================
--- ow/tests/views/test_user.py	(revision 2f8a48f0eded1be10dbb2771b302dfb9c1ddbd0b)
+++ ow/tests/views/test_user.py	(revision 421f05f48c5d18f659fbf167e4267039b6ff4fb1)
@@ -1,3 +1,4 @@
 import os
+import json
 from datetime import datetime, timedelta, timezone
 from shutil import copyfileobj
@@ -583,2 +584,51 @@
         assert 'jack.black@example.net' not in request.root.emails
         assert 'JackBlack' not in request.root.all_nicknames
+
+    def test_week_stats_no_stats(self, dummy_request, john):
+        response = user_views.week_stats(john, dummy_request)
+        assert isinstance(response, Response)
+        assert response.content_type == 'application/json'
+        # the body is a valid json-encoded stream
+        obj = json.loads(response.body)
+        assert obj == [
+            {'distance': 0, 'elevation': 0, 'name': 'Mon',
+             'time': '00', 'workouts': 0},
+            {'distance': 0, 'elevation': 0, 'name': 'Tue',
+             'time': '00', 'workouts': 0},
+            {'distance': 0, 'elevation': 0, 'name': 'Wed',
+             'time': '00', 'workouts': 0},
+            {'distance': 0, 'elevation': 0, 'name': 'Thu',
+             'time': '00', 'workouts': 0},
+            {'distance': 0, 'elevation': 0, 'name': 'Fri',
+             'time': '00', 'workouts': 0},
+            {'distance': 0, 'elevation': 0, 'name': 'Sat',
+             'time': '00', 'workouts': 0},
+            {'distance': 0, 'elevation': 0, 'name': 'Sun',
+             'time': '00', 'workouts': 0}
+        ]
+
+    def test_week_stats(self, dummy_request, john):
+        workout = Workout(
+            start=datetime.now(timezone.utc),
+            duration=timedelta(minutes=60),
+            distance=30,
+            elevation=540
+        )
+        john.add_workout(workout)
+        response = user_views.week_stats(john, dummy_request)
+        assert isinstance(response, Response)
+        assert response.content_type == 'application/json'
+        # the body is a valid json-encoded stream
+        obj = json.loads(response.body)
+        assert len(obj) == 7
+        for day in obj:
+            if datetime.now(timezone.utc).strftime('%a') == day['name']:
+                day['distance'] == 30
+                day['elevation'] == 540
+                day['time'] == '01'
+                day['workouts'] == 1
+            else:
+                day['distance'] == 0
+                day['elevation'] == 0
+                day['time'] == '00'
+                day['workouts'] == 0
Index: ow/views/user.py
===================================================================
--- ow/views/user.py	(revision 2f8a48f0eded1be10dbb2771b302dfb9c1ddbd0b)
+++ ow/views/user.py	(revision 421f05f48c5d18f659fbf167e4267039b6ff4fb1)
@@ -1,3 +1,5 @@
+import json
 from calendar import month_name
+from datetime import datetime
 
 from pyramid.httpexceptions import HTTPFound
@@ -17,4 +19,5 @@
 from ..models.root import OpenWorkouts
 from ..views.renderers import OWFormRenderer
+from ..utilities import timedelta_to_hms
 
 _ = TranslationStringFactory('OpenWorkouts')
@@ -223,2 +226,24 @@
         return HTTPFound(location=request.resource_url(context, 'profile'))
     return {'form': OWFormRenderer(form)}
+
+
+@view_config(
+    context=User,
+    permission='view',
+    name='week')
+def week_stats(context, request):
+    stats = context.week_stats
+    json_stats = []
+    for day in stats:
+        hms = timedelta_to_hms(stats[day]['time'])
+        day_stats = {
+            'name': day.strftime('%a'),
+            'time': str(hms[0]).zfill(2),
+            'distance': int(round(stats[day]['distance'])),
+            'elevation': int(stats[day]['elevation']),
+            'workouts': stats[day]['workouts']
+        }
+        json_stats.append(day_stats)
+    return Response(content_type='application/json',
+                    charset='utf-8',
+                    body=json.dumps(json_stats))
