From bc5ad4109d0320226bb7e757d1c9e39106d83ab4 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 21 May 2021 14:17:50 +0200 Subject: [PATCH] passing tests --- filename | 7 +- rowers/mytypes.py | 34 ---------- rowers/stravastuff.py | 113 +------------------------------ rowers/tasks.py | 37 ++-------- rowers/tests/mocks.py | 10 +++ rowers/tests/test_async_tasks.py | 20 +----- rowers/tests/test_imports.py | 31 ++++++--- rowers/tests/viewnames.csv | 9 --- rowers/utils.py | 39 +++++++++++ 9 files changed, 84 insertions(+), 216 deletions(-) diff --git a/filename b/filename index c4492c6b..5fa57cea 100644 --- a/filename +++ b/filename @@ -26,4 +26,9 @@ May-21-2021 09:30:31 Upload to C2 user 1 May-21-2021 09:30:31 {"type": "water", "date": "2016-05-20 13:50:26", "stroke_count": 189, "timezone": "Europe/Amsterdam", "distance": 2000, "time": 5400, "weight_class": "H", "comments": null, "stroke_rate": 21, "drag_factor": 104, "heart_rate": {"average": 148, "max": 156}, "stroke_data": [{"t": 32, "d": 131, "p": 2628, "spm": 19, "hr": 127}, {"t": 32, "d": 131, "p": 2394, "spm": 19, "hr": 127}, {"t": 61, "d": 210, "p": 1991, "spm": 20, "hr": 128}, {"t": 92, "d": 303, "p": 1764, "spm": 20, "hr": 129}, {"t": 121, "d": 390, "p": 1685, "spm": 20, "hr": 130}, {"t": 151, "d": 482, "p": 1639, "spm": 21, "hr": 131}, {"t": 181, "d": 576, "p": 1620, "spm": 20, "hr": 131}, {"t": 209, "d": 664, "p": 1597, "spm": 20, "hr": 132}, {"t": 238, "d": 755, "p": 1601, "spm": 21, "hr": 132}, {"t": 269, "d": 851, "p": 1589, "spm": 20, "hr": 132}, {"t": 296, "d": 950, "p": 1524, "spm": 21, "hr": 132}, {"t": 323, "d": 1050, "p": 1408, "spm": 22, "hr": 133}, {"t": 351, "d": 1153, "p": 1379, "spm": 21, "hr": 134}, {"t": 380, "d": 1258, "p": 1365, "spm": 21, "hr": 135}, {"t": 408, "d": 1366, "p": 1342, "spm": 21, "hr": 136}, {"t": 436, "d": 1472, "p": 1331, "spm": 22, "hr": 137}, {"t": 464, "d": 1576, "p": 1324, "spm": 22, "hr": 139}, {"t": 491, "d": 1678, "p": 1344, "spm": 21, "hr": 140}, {"t": 519, "d": 1785, "p": 1332, "spm": 22, "hr": 140}, {"t": 546, "d": 1885, "p": 1317, "spm": 21, "hr": 141}, {"t": 575, "d": 1993, "p": 1338, "spm": 21, "hr": 141}, {"t": 602, "d": 2094, "p": 1328, "spm": 22, "hr": 142}, {"t": 628, "d": 2194, "p": 1328, "spm": 22, "hr": 142}, {"t": 657, "d": 2302, "p": 1337, "spm": 22, "hr": 143}, {"t": 683, "d": 2402, "p": 1340, "spm": 22, "hr": 144}, {"t": 710, "d": 2501, "p": 1331, "spm": 23, "hr": 145}, {"t": 734, "d": 2596, "p": 1326, "spm": 23, "hr": 145}, {"t": 763, "d": 2703, "p": 1324, "spm": 23, "hr": 145}, {"t": 790, "d": 2806, "p": 1332, "spm": 22, "hr": 145}, {"t": 817, "d": 2907, "p": 1331, "spm": 22, "hr": 144}, {"t": 844, "d": 3008, "p": 1333, "spm": 23, "hr": 145}, {"t": 871, "d": 3111, "p": 1325, "spm": 22, "hr": 145}, {"t": 897, "d": 3212, "p": 1312, "spm": 22, "hr": 145}, {"t": 926, "d": 3319, "p": 1330, "spm": 21, "hr": 145}, {"t": 953, "d": 3420, "p": 1328, "spm": 22, "hr": 146}, {"t": 980, "d": 3524, "p": 1328, "spm": 22, "hr": 146}, {"t": 1008, "d": 3630, "p": 1321, "spm": 22, "hr": 146}, {"t": 1036, "d": 3734, "p": 1324, "spm": 22, "hr": 147}, {"t": 1063, "d": 3839, "p": 1322, "spm": 22, "hr": 147}, {"t": 1092, "d": 3946, "p": 1326, "spm": 22, "hr": 147}, {"t": 1119, "d": 4050, "p": 1335, "spm": 21, "hr": 147}, {"t": 1146, "d": 4153, "p": 1325, "spm": 22, "hr": 148}, {"t": 1176, "d": 4260, "p": 1329, "spm": 22, "hr": 148}, {"t": 1203, "d": 4365, "p": 1333, "spm": 21, "hr": 148}, {"t": 1231, "d": 4469, "p": 1335, "spm": 22, "hr": 148}, {"t": 1256, "d": 4569, "p": 1312, "spm": 22, "hr": 149}, {"t": 1284, "d": 4676, "p": 1316, "spm": 22, "hr": 149}, {"t": 1313, "d": 4785, "p": 1315, "spm": 22, "hr": 150}, {"t": 1341, "d": 4890, "p": 1318, "spm": 21, "hr": 150}, {"t": 1367, "d": 4991, "p": 1336, "spm": 21, "hr": 150}, {"t": 1397, "d": 5100, "p": 1329, "spm": 22, "hr": 150}, {"t": 1423, "d": 5199, "p": 1323, "spm": 22, "hr": 149}, {"t": 1451, "d": 5306, "p": 1327, "spm": 22, "hr": 149}, {"t": 1478, "d": 5408, "p": 1337, "spm": 22, "hr": 149}, {"t": 1505, "d": 5508, "p": 1334, "spm": 22, "hr": 148}, {"t": 1532, "d": 5608, "p": 1348, "spm": 22, "hr": 148}, {"t": 1559, "d": 5710, "p": 1333, "spm": 22, "hr": 147}, {"t": 1584, "d": 5807, "p": 1330, "spm": 22, "hr": 147}, {"t": 1612, "d": 5912, "p": 1329, "spm": 22, "hr": 147}, {"t": 1639, "d": 6014, "p": 1330, "spm": 22, "hr": 147}, {"t": 1666, "d": 6114, "p": 1321, "spm": 23, "hr": 147}, {"t": 1693, "d": 6218, "p": 1328, "spm": 23, "hr": 147}, {"t": 1720, "d": 6321, "p": 1317, "spm": 22, "hr": 147}, {"t": 1747, "d": 6423, "p": 1319, "spm": 22, "hr": 147}, {"t": 1772, "d": 6520, "p": 1310, "spm": 23, "hr": 148}, {"t": 1801, "d": 6627, "p": 1297, "spm": 23, "hr": 148}, {"t": 1826, "d": 6731, "p": 1296, "spm": 23, "hr": 148}, {"t": 1854, "d": 6836, "p": 1295, "spm": 22, "hr": 149}, {"t": 1880, "d": 6938, "p": 1297, "spm": 22, "hr": 149}, {"t": 1905, "d": 7038, "p": 1292, "spm": 22, "hr": 149}, {"t": 1934, "d": 7147, "p": 1297, "spm": 23, "hr": 150}, {"t": 1960, "d": 7249, "p": 1296, "spm": 22, "hr": 150}, {"t": 1987, "d": 7352, "p": 1306, "spm": 23, "hr": 151}, {"t": 2014, "d": 7454, "p": 1307, "spm": 22, "hr": 151}, {"t": 2041, "d": 7560, "p": 1291, "spm": 23, "hr": 151}, {"t": 2067, "d": 7663, "p": 1294, "spm": 22, "hr": 150}, {"t": 2094, "d": 7765, "p": 1300, "spm": 22, "hr": 150}, {"t": 2120, "d": 7869, "p": 1295, "spm": 23, "hr": 150}, {"t": 2147, "d": 7972, "p": 1290, "spm": 22, "hr": 150}, {"t": 2174, "d": 8078, "p": 1288, "spm": 23, "hr": 150}, {"t": 2201, "d": 8182, "p": 1286, "spm": 23, "hr": 150}, {"t": 2226, "d": 8284, "p": 1282, "spm": 22, "hr": 150}, {"t": 2254, "d": 8392, "p": 1279, "spm": 23, "hr": 150}, {"t": 2281, "d": 8496, "p": 1288, "spm": 23, "hr": 151}, {"t": 2307, "d": 8601, "p": 1272, "spm": 22, "hr": 151}, {"t": 2333, "d": 8703, "p": 1272, "spm": 22, "hr": 152}, {"t": 2361, "d": 8811, "p": 1280, "spm": 22, "hr": 152}, {"t": 2388, "d": 8917, "p": 1284, "spm": 23, "hr": 152}, {"t": 2415, "d": 9021, "p": 1293, "spm": 22, "hr": 152}, {"t": 2444, "d": 9131, "p": 1299, "spm": 22, "hr": 152}, {"t": 2472, "d": 9239, "p": 1309, "spm": 22, "hr": 153}, {"t": 2500, "d": 9346, "p": 1307, "spm": 21, "hr": 154}, {"t": 2528, "d": 9454, "p": 1320, "spm": 21, "hr": 154}, {"t": 2556, "d": 9560, "p": 1318, "spm": 21, "hr": 155}, {"t": 2585, "d": 9667, "p": 1326, "spm": 21, "hr": 155}, {"t": 2613, "d": 9774, "p": 1330, "spm": 21, "hr": 156}, {"t": 2641, "d": 9881, "p": 1310, "spm": 21, "hr": 156}, {"t": 2669, "d": 9988, "p": 1316, "spm": 21, "hr": 156}, {"t": 2698, "d": 10096, "p": 1327, "spm": 21, "hr": 156}, {"t": 2727, "d": 10206, "p": 1338, "spm": 21, "hr": 156}, {"t": 2757, "d": 10315, "p": 1345, "spm": 20, "hr": 156}, {"t": 2786, "d": 10425, "p": 1347, "spm": 21, "hr": 156}, {"t": 2815, "d": 10533, "p": 1347, "spm": 20, "hr": 155}, {"t": 2844, "d": 10641, "p": 1339, "spm": 21, "hr": 155}, {"t": 2874, "d": 10753, "p": 1354, "spm": 20, "hr": 155}, {"t": 2904, "d": 10861, "p": 1375, "spm": 20, "hr": 155}, {"t": 2935, "d": 10975, "p": 1359, "spm": 21, "hr": 155}, {"t": 2964, "d": 11085, "p": 1344, "spm": 20, "hr": 155}, {"t": 2993, "d": 11192, "p": 1353, "spm": 20, "hr": 155}, {"t": 3024, "d": 11306, "p": 1353, "spm": 20, "hr": 155}, {"t": 3054, "d": 11413, "p": 1353, "spm": 20, "hr": 155}, {"t": 3083, "d": 11524, "p": 1354, "spm": 21, "hr": 155}, {"t": 3113, "d": 11633, "p": 1367, "spm": 20, "hr": 155}, {"t": 3140, "d": 11738, "p": 1360, "spm": 20, "hr": 154}, {"t": 3170, "d": 11848, "p": 1342, "spm": 21, "hr": 154}, {"t": 3200, "d": 11958, "p": 1343, "spm": 21, "hr": 153}, {"t": 3229, "d": 12066, "p": 1357, "spm": 21, "hr": 152}, {"t": 3259, "d": 12173, "p": 1358, "spm": 21, "hr": 153}, {"t": 3287, "d": 12278, "p": 1363, "spm": 21, "hr": 152}, {"t": 3315, "d": 12387, "p": 1354, "spm": 21, "hr": 152}, {"t": 3345, "d": 12495, "p": 1334, "spm": 21, "hr": 151}, {"t": 3374, "d": 12601, "p": 1359, "spm": 20, "hr": 151}, {"t": 3403, "d": 12709, "p": 1357, "spm": 21, "hr": 151}, {"t": 3432, "d": 12818, "p": 1346, "spm": 21, "hr": 150}, {"t": 3461, "d": 12927, "p": 1355, "spm": 20, "hr": 151}, {"t": 3490, "d": 13034, "p": 1358, "spm": 20, "hr": 151}, {"t": 3519, "d": 13143, "p": 1357, "spm": 21, "hr": 151}, {"t": 3549, "d": 13252, "p": 1343, "spm": 21, "hr": 151}, {"t": 3578, "d": 13361, "p": 1352, "spm": 20, "hr": 152}, {"t": 3607, "d": 13469, "p": 1348, "spm": 21, "hr": 152}, {"t": 3636, "d": 13574, "p": 1358, "spm": 20, "hr": 152}, {"t": 3665, "d": 13681, "p": 1368, "spm": 21, "hr": 152}, {"t": 3694, "d": 13790, "p": 1355, "spm": 20, "hr": 152}, {"t": 3723, "d": 13895, "p": 1346, "spm": 21, "hr": 153}, {"t": 3751, "d": 13999, "p": 1369, "spm": 21, "hr": 152}, {"t": 3780, "d": 14107, "p": 1367, "spm": 20, "hr": 152}, {"t": 3811, "d": 14220, "p": 1364, "spm": 20, "hr": 152}, {"t": 3840, "d": 14328, "p": 1358, "spm": 20, "hr": 151}, {"t": 3869, "d": 14436, "p": 1344, "spm": 21, "hr": 151}, {"t": 3898, "d": 14544, "p": 1353, "spm": 20, "hr": 152}, {"t": 3927, "d": 14651, "p": 1351, "spm": 21, "hr": 151}, {"t": 3956, "d": 14759, "p": 1345, "spm": 21, "hr": 152}, {"t": 3984, "d": 14866, "p": 1336, "spm": 21, "hr": 152}, {"t": 4014, "d": 14974, "p": 1354, "spm": 21, "hr": 153}, {"t": 4043, "d": 15082, "p": 1363, "spm": 20, "hr": 153}, {"t": 4073, "d": 15192, "p": 1350, "spm": 20, "hr": 154}, {"t": 4102, "d": 15300, "p": 1351, "spm": 21, "hr": 154}, {"t": 4131, "d": 15409, "p": 1357, "spm": 20, "hr": 153}, {"t": 4159, "d": 15513, "p": 1351, "spm": 21, "hr": 153}, {"t": 4190, "d": 15626, "p": 1343, "spm": 21, "hr": 153}, {"t": 4219, "d": 15733, "p": 1359, "spm": 20, "hr": 153}, {"t": 4248, "d": 15842, "p": 1364, "spm": 20, "hr": 152}, {"t": 4276, "d": 15946, "p": 1345, "spm": 21, "hr": 152}, {"t": 4307, "d": 16060, "p": 1351, "spm": 21, "hr": 152}, {"t": 4334, "d": 16162, "p": 1369, "spm": 20, "hr": 152}, {"t": 4365, "d": 16274, "p": 1362, "spm": 21, "hr": 152}, {"t": 4394, "d": 16380, "p": 1349, "spm": 21, "hr": 152}, {"t": 4424, "d": 16492, "p": 1353, "spm": 20, "hr": 151}, {"t": 4453, "d": 16602, "p": 1353, "spm": 20, "hr": 152}, {"t": 4482, "d": 16708, "p": 1357, "spm": 20, "hr": 151}, {"t": 4511, "d": 16814, "p": 1361, "spm": 21, "hr": 151}, {"t": 4540, "d": 16921, "p": 1361, "spm": 21, "hr": 151}, {"t": 4568, "d": 17025, "p": 1358, "spm": 21, "hr": 150}, {"t": 4598, "d": 17137, "p": 1349, "spm": 21, "hr": 150}, {"t": 4627, "d": 17244, "p": 1344, "spm": 21, "hr": 150}, {"t": 4656, "d": 17351, "p": 1358, "spm": 20, "hr": 150}, {"t": 4685, "d": 17456, "p": 1361, "spm": 21, "hr": 150}, {"t": 4713, "d": 17563, "p": 1358, "spm": 21, "hr": 150}, {"t": 4740, "d": 17662, "p": 1357, "spm": 20, "hr": 151}, {"t": 4770, "d": 17771, "p": 1369, "spm": 22, "hr": 150}, {"t": 4798, "d": 17875, "p": 1369, "spm": 21, "hr": 150}, {"t": 4826, "d": 17977, "p": 1362, "spm": 22, "hr": 150}, {"t": 4855, "d": 18084, "p": 1361, "spm": 21, "hr": 150}, {"t": 4882, "d": 18184, "p": 1367, "spm": 21, "hr": 149}, {"t": 4910, "d": 18289, "p": 1344, "spm": 22, "hr": 149}, {"t": 4940, "d": 18399, "p": 1356, "spm": 21, "hr": 149}, {"t": 4968, "d": 18505, "p": 1357, "spm": 21, "hr": 148}, {"t": 4997, "d": 18612, "p": 1346, "spm": 21, "hr": 148}, {"t": 5027, "d": 18719, "p": 1354, "spm": 21, "hr": 147}, {"t": 5056, "d": 18826, "p": 1366, "spm": 20, "hr": 147}, {"t": 5084, "d": 18933, "p": 1363, "spm": 20, "hr": 148}, {"t": 5114, "d": 19043, "p": 1348, "spm": 21, "hr": 149}, {"t": 5144, "d": 19154, "p": 1336, "spm": 20, "hr": 149}, {"t": 5174, "d": 19262, "p": 1364, "spm": 20, "hr": 150}, {"t": 5203, "d": 19373, "p": 1361, "spm": 20, "hr": 151}, {"t": 5231, "d": 19478, "p": 1348, "spm": 20, "hr": 152}, {"t": 5262, "d": 19591, "p": 1355, "spm": 20, "hr": 152}, {"t": 5291, "d": 19698, "p": 1361, "spm": 20, "hr": 153}, {"t": 5320, "d": 19806, "p": 1353, "spm": 21, "hr": 153}, {"t": 5349, "d": 19914, "p": 1353, "spm": 21, "hr": 153}, {"t": 5372, "d": 20000, "p": 1340, "spm": 21, "hr": 154}], "workout": {"splits": [{"type": "distance", "time": 1397, "distance": 510, "heart_rate": {"average": 141}, "stroke_rate": 21}, {"type": "distance", "time": 1301, "distance": 499, "heart_rate": {"average": 150}, "stroke_rate": 22}, {"type": "distance", "time": 1344, "distance": 498, "heart_rate": {"average": 152}, "stroke_rate": 20}, {"type": "distance", "time": 1328, "distance": 491, "heart_rate": {"average": 150}, "stroke_rate": 20}]}} May-21-2021 09:30:32 User 1, C2 ID 33991243 May-21-2021 09:30:32 {"distance": 13878, "user_id": 457764, "ranked": false, "weight_class": "L", "verified": false, "workout_type": false, "comments": "\n from speedcoach2v2.15 via rowsandall.com", "heart_rate": {"max": 158, "average": 156}, "source": "rowingdata", "date_utc": "2018-06-30 05:31:01", "time_formatted": "1:21:16.7", "time": 48767, "date": "2018-06-30 07:31:01", "timezone": "Europe/Prague", "type": "water", "id": 33991243, "stroke_data": true} -May-21-2021 09:30:32 Time zone Europe/Prague, stardatetime 2018-06-30 06:09:44.300000+02:00, duration 01:21:16.6 \ No newline at end of file +May-21-2021 09:30:32 Time zone Europe/Prague, stardatetime 2018-06-30 06:09:44.300000+02:00, duration 01:21:16.6 +May-21-2021 09:40:10 Upload to C2 user 1 +May-21-2021 09:40:10 {"type": "water", "date": "2016-05-20 13:50:26", "stroke_count": 189, "timezone": "Europe/Amsterdam", "distance": 2000, "time": 5400, "weight_class": "H", "comments": null, "stroke_rate": 21, "drag_factor": 104, "heart_rate": {"average": 148, "max": 156}, "stroke_data": [{"t": 32, "d": 131, "p": 2628, "spm": 19, "hr": 127}, {"t": 32, "d": 131, "p": 2394, "spm": 19, "hr": 127}, {"t": 61, "d": 210, "p": 1991, "spm": 20, "hr": 128}, {"t": 92, "d": 303, "p": 1764, "spm": 20, "hr": 129}, {"t": 121, "d": 390, "p": 1685, "spm": 20, "hr": 130}, {"t": 151, "d": 482, "p": 1639, "spm": 21, "hr": 131}, {"t": 181, "d": 576, "p": 1620, "spm": 20, "hr": 131}, {"t": 209, "d": 664, "p": 1597, "spm": 20, "hr": 132}, {"t": 238, "d": 755, "p": 1601, "spm": 21, "hr": 132}, {"t": 269, "d": 851, "p": 1589, "spm": 20, "hr": 132}, {"t": 296, "d": 950, "p": 1524, "spm": 21, "hr": 132}, {"t": 323, "d": 1050, "p": 1408, "spm": 22, "hr": 133}, {"t": 351, "d": 1153, "p": 1379, "spm": 21, "hr": 134}, {"t": 380, "d": 1258, "p": 1365, "spm": 21, "hr": 135}, {"t": 408, "d": 1366, "p": 1342, "spm": 21, "hr": 136}, {"t": 436, "d": 1472, "p": 1331, "spm": 22, "hr": 137}, {"t": 464, "d": 1576, "p": 1324, "spm": 22, "hr": 139}, {"t": 491, "d": 1678, "p": 1344, "spm": 21, "hr": 140}, {"t": 519, "d": 1785, "p": 1332, "spm": 22, "hr": 140}, {"t": 546, "d": 1885, "p": 1317, "spm": 21, "hr": 141}, {"t": 575, "d": 1993, "p": 1338, "spm": 21, "hr": 141}, {"t": 602, "d": 2094, "p": 1328, "spm": 22, "hr": 142}, {"t": 628, "d": 2194, "p": 1328, "spm": 22, "hr": 142}, {"t": 657, "d": 2302, "p": 1337, "spm": 22, "hr": 143}, {"t": 683, "d": 2402, "p": 1340, "spm": 22, "hr": 144}, {"t": 710, "d": 2501, "p": 1331, "spm": 23, "hr": 145}, {"t": 734, "d": 2596, "p": 1326, "spm": 23, "hr": 145}, {"t": 763, "d": 2703, "p": 1324, "spm": 23, "hr": 145}, {"t": 790, "d": 2806, "p": 1332, "spm": 22, "hr": 145}, {"t": 817, "d": 2907, "p": 1331, "spm": 22, "hr": 144}, {"t": 844, "d": 3008, "p": 1333, "spm": 23, "hr": 145}, {"t": 871, "d": 3111, "p": 1325, "spm": 22, "hr": 145}, {"t": 897, "d": 3212, "p": 1312, "spm": 22, "hr": 145}, {"t": 926, "d": 3319, "p": 1330, "spm": 21, "hr": 145}, {"t": 953, "d": 3420, "p": 1328, "spm": 22, "hr": 146}, {"t": 980, "d": 3524, "p": 1328, "spm": 22, "hr": 146}, {"t": 1008, "d": 3630, "p": 1321, "spm": 22, "hr": 146}, {"t": 1036, "d": 3734, "p": 1324, "spm": 22, "hr": 147}, {"t": 1063, "d": 3839, "p": 1322, "spm": 22, "hr": 147}, {"t": 1092, "d": 3946, "p": 1326, "spm": 22, "hr": 147}, {"t": 1119, "d": 4050, "p": 1335, "spm": 21, "hr": 147}, {"t": 1146, "d": 4153, "p": 1325, "spm": 22, "hr": 148}, {"t": 1176, "d": 4260, "p": 1329, "spm": 22, "hr": 148}, {"t": 1203, "d": 4365, "p": 1333, "spm": 21, "hr": 148}, {"t": 1231, "d": 4469, "p": 1335, "spm": 22, "hr": 148}, {"t": 1256, "d": 4569, "p": 1312, "spm": 22, "hr": 149}, {"t": 1284, "d": 4676, "p": 1316, "spm": 22, "hr": 149}, {"t": 1313, "d": 4785, "p": 1315, "spm": 22, "hr": 150}, {"t": 1341, "d": 4890, "p": 1318, "spm": 21, "hr": 150}, {"t": 1367, "d": 4991, "p": 1336, "spm": 21, "hr": 150}, {"t": 1397, "d": 5100, "p": 1329, "spm": 22, "hr": 150}, {"t": 1423, "d": 5199, "p": 1323, "spm": 22, "hr": 149}, {"t": 1451, "d": 5306, "p": 1327, "spm": 22, "hr": 149}, {"t": 1478, "d": 5408, "p": 1337, "spm": 22, "hr": 149}, {"t": 1505, "d": 5508, "p": 1334, "spm": 22, "hr": 148}, {"t": 1532, "d": 5608, "p": 1348, "spm": 22, "hr": 148}, {"t": 1559, "d": 5710, "p": 1333, "spm": 22, "hr": 147}, {"t": 1584, "d": 5807, "p": 1330, "spm": 22, "hr": 147}, {"t": 1612, "d": 5912, "p": 1329, "spm": 22, "hr": 147}, {"t": 1639, "d": 6014, "p": 1330, "spm": 22, "hr": 147}, {"t": 1666, "d": 6114, "p": 1321, "spm": 23, "hr": 147}, {"t": 1693, "d": 6218, "p": 1328, "spm": 23, "hr": 147}, {"t": 1720, "d": 6321, "p": 1317, "spm": 22, "hr": 147}, {"t": 1747, "d": 6423, "p": 1319, "spm": 22, "hr": 147}, {"t": 1772, "d": 6520, "p": 1310, "spm": 23, "hr": 148}, {"t": 1801, "d": 6627, "p": 1297, "spm": 23, "hr": 148}, {"t": 1826, "d": 6731, "p": 1296, "spm": 23, "hr": 148}, {"t": 1854, "d": 6836, "p": 1295, "spm": 22, "hr": 149}, {"t": 1880, "d": 6938, "p": 1297, "spm": 22, "hr": 149}, {"t": 1905, "d": 7038, "p": 1292, "spm": 22, "hr": 149}, {"t": 1934, "d": 7147, "p": 1297, "spm": 23, "hr": 150}, {"t": 1960, "d": 7249, "p": 1296, "spm": 22, "hr": 150}, {"t": 1987, "d": 7352, "p": 1306, "spm": 23, "hr": 151}, {"t": 2014, "d": 7454, "p": 1307, "spm": 22, "hr": 151}, {"t": 2041, "d": 7560, "p": 1291, "spm": 23, "hr": 151}, {"t": 2067, "d": 7663, "p": 1294, "spm": 22, "hr": 150}, {"t": 2094, "d": 7765, "p": 1300, "spm": 22, "hr": 150}, {"t": 2120, "d": 7869, "p": 1295, "spm": 23, "hr": 150}, {"t": 2147, "d": 7972, "p": 1290, "spm": 22, "hr": 150}, {"t": 2174, "d": 8078, "p": 1288, "spm": 23, "hr": 150}, {"t": 2201, "d": 8182, "p": 1286, "spm": 23, "hr": 150}, {"t": 2226, "d": 8284, "p": 1282, "spm": 22, "hr": 150}, {"t": 2254, "d": 8392, "p": 1279, "spm": 23, "hr": 150}, {"t": 2281, "d": 8496, "p": 1288, "spm": 23, "hr": 151}, {"t": 2307, "d": 8601, "p": 1272, "spm": 22, "hr": 151}, {"t": 2333, "d": 8703, "p": 1272, "spm": 22, "hr": 152}, {"t": 2361, "d": 8811, "p": 1280, "spm": 22, "hr": 152}, {"t": 2388, "d": 8917, "p": 1284, "spm": 23, "hr": 152}, {"t": 2415, "d": 9021, "p": 1293, "spm": 22, "hr": 152}, {"t": 2444, "d": 9131, "p": 1299, "spm": 22, "hr": 152}, {"t": 2472, "d": 9239, "p": 1309, "spm": 22, "hr": 153}, {"t": 2500, "d": 9346, "p": 1307, "spm": 21, "hr": 154}, {"t": 2528, "d": 9454, "p": 1320, "spm": 21, "hr": 154}, {"t": 2556, "d": 9560, "p": 1318, "spm": 21, "hr": 155}, {"t": 2585, "d": 9667, "p": 1326, "spm": 21, "hr": 155}, {"t": 2613, "d": 9774, "p": 1330, "spm": 21, "hr": 156}, {"t": 2641, "d": 9881, "p": 1310, "spm": 21, "hr": 156}, {"t": 2669, "d": 9988, "p": 1316, "spm": 21, "hr": 156}, {"t": 2698, "d": 10096, "p": 1327, "spm": 21, "hr": 156}, {"t": 2727, "d": 10206, "p": 1338, "spm": 21, "hr": 156}, {"t": 2757, "d": 10315, "p": 1345, "spm": 20, "hr": 156}, {"t": 2786, "d": 10425, "p": 1347, "spm": 21, "hr": 156}, {"t": 2815, "d": 10533, "p": 1347, "spm": 20, "hr": 155}, {"t": 2844, "d": 10641, "p": 1339, "spm": 21, "hr": 155}, {"t": 2874, "d": 10753, "p": 1354, "spm": 20, "hr": 155}, {"t": 2904, "d": 10861, "p": 1375, "spm": 20, "hr": 155}, {"t": 2935, "d": 10975, "p": 1359, "spm": 21, "hr": 155}, {"t": 2964, "d": 11085, "p": 1344, "spm": 20, "hr": 155}, {"t": 2993, "d": 11192, "p": 1353, "spm": 20, "hr": 155}, {"t": 3024, "d": 11306, "p": 1353, "spm": 20, "hr": 155}, {"t": 3054, "d": 11413, "p": 1353, "spm": 20, "hr": 155}, {"t": 3083, "d": 11524, "p": 1354, "spm": 21, "hr": 155}, {"t": 3113, "d": 11633, "p": 1367, "spm": 20, "hr": 155}, {"t": 3140, "d": 11738, "p": 1360, "spm": 20, "hr": 154}, {"t": 3170, "d": 11848, "p": 1342, "spm": 21, "hr": 154}, {"t": 3200, "d": 11958, "p": 1343, "spm": 21, "hr": 153}, {"t": 3229, "d": 12066, "p": 1357, "spm": 21, "hr": 152}, {"t": 3259, "d": 12173, "p": 1358, "spm": 21, "hr": 153}, {"t": 3287, "d": 12278, "p": 1363, "spm": 21, "hr": 152}, {"t": 3315, "d": 12387, "p": 1354, "spm": 21, "hr": 152}, {"t": 3345, "d": 12495, "p": 1334, "spm": 21, "hr": 151}, {"t": 3374, "d": 12601, "p": 1359, "spm": 20, "hr": 151}, {"t": 3403, "d": 12709, "p": 1357, "spm": 21, "hr": 151}, {"t": 3432, "d": 12818, "p": 1346, "spm": 21, "hr": 150}, {"t": 3461, "d": 12927, "p": 1355, "spm": 20, "hr": 151}, {"t": 3490, "d": 13034, "p": 1358, "spm": 20, "hr": 151}, {"t": 3519, "d": 13143, "p": 1357, "spm": 21, "hr": 151}, {"t": 3549, "d": 13252, "p": 1343, "spm": 21, "hr": 151}, {"t": 3578, "d": 13361, "p": 1352, "spm": 20, "hr": 152}, {"t": 3607, "d": 13469, "p": 1348, "spm": 21, "hr": 152}, {"t": 3636, "d": 13574, "p": 1358, "spm": 20, "hr": 152}, {"t": 3665, "d": 13681, "p": 1368, "spm": 21, "hr": 152}, {"t": 3694, "d": 13790, "p": 1355, "spm": 20, "hr": 152}, {"t": 3723, "d": 13895, "p": 1346, "spm": 21, "hr": 153}, {"t": 3751, "d": 13999, "p": 1369, "spm": 21, "hr": 152}, {"t": 3780, "d": 14107, "p": 1367, "spm": 20, "hr": 152}, {"t": 3811, "d": 14220, "p": 1364, "spm": 20, "hr": 152}, {"t": 3840, "d": 14328, "p": 1358, "spm": 20, "hr": 151}, {"t": 3869, "d": 14436, "p": 1344, "spm": 21, "hr": 151}, {"t": 3898, "d": 14544, "p": 1353, "spm": 20, "hr": 152}, {"t": 3927, "d": 14651, "p": 1351, "spm": 21, "hr": 151}, {"t": 3956, "d": 14759, "p": 1345, "spm": 21, "hr": 152}, {"t": 3984, "d": 14866, "p": 1336, "spm": 21, "hr": 152}, {"t": 4014, "d": 14974, "p": 1354, "spm": 21, "hr": 153}, {"t": 4043, "d": 15082, "p": 1363, "spm": 20, "hr": 153}, {"t": 4073, "d": 15192, "p": 1350, "spm": 20, "hr": 154}, {"t": 4102, "d": 15300, "p": 1351, "spm": 21, "hr": 154}, {"t": 4131, "d": 15409, "p": 1357, "spm": 20, "hr": 153}, {"t": 4159, "d": 15513, "p": 1351, "spm": 21, "hr": 153}, {"t": 4190, "d": 15626, "p": 1343, "spm": 21, "hr": 153}, {"t": 4219, "d": 15733, "p": 1359, "spm": 20, "hr": 153}, {"t": 4248, "d": 15842, "p": 1364, "spm": 20, "hr": 152}, {"t": 4276, "d": 15946, "p": 1345, "spm": 21, "hr": 152}, {"t": 4307, "d": 16060, "p": 1351, "spm": 21, "hr": 152}, {"t": 4334, "d": 16162, "p": 1369, "spm": 20, "hr": 152}, {"t": 4365, "d": 16274, "p": 1362, "spm": 21, "hr": 152}, {"t": 4394, "d": 16380, "p": 1349, "spm": 21, "hr": 152}, {"t": 4424, "d": 16492, "p": 1353, "spm": 20, "hr": 151}, {"t": 4453, "d": 16602, "p": 1353, "spm": 20, "hr": 152}, {"t": 4482, "d": 16708, "p": 1357, "spm": 20, "hr": 151}, {"t": 4511, "d": 16814, "p": 1361, "spm": 21, "hr": 151}, {"t": 4540, "d": 16921, "p": 1361, "spm": 21, "hr": 151}, {"t": 4568, "d": 17025, "p": 1358, "spm": 21, "hr": 150}, {"t": 4598, "d": 17137, "p": 1349, "spm": 21, "hr": 150}, {"t": 4627, "d": 17244, "p": 1344, "spm": 21, "hr": 150}, {"t": 4656, "d": 17351, "p": 1358, "spm": 20, "hr": 150}, {"t": 4685, "d": 17456, "p": 1361, "spm": 21, "hr": 150}, {"t": 4713, "d": 17563, "p": 1358, "spm": 21, "hr": 150}, {"t": 4740, "d": 17662, "p": 1357, "spm": 20, "hr": 151}, {"t": 4770, "d": 17771, "p": 1369, "spm": 22, "hr": 150}, {"t": 4798, "d": 17875, "p": 1369, "spm": 21, "hr": 150}, {"t": 4826, "d": 17977, "p": 1362, "spm": 22, "hr": 150}, {"t": 4855, "d": 18084, "p": 1361, "spm": 21, "hr": 150}, {"t": 4882, "d": 18184, "p": 1367, "spm": 21, "hr": 149}, {"t": 4910, "d": 18289, "p": 1344, "spm": 22, "hr": 149}, {"t": 4940, "d": 18399, "p": 1356, "spm": 21, "hr": 149}, {"t": 4968, "d": 18505, "p": 1357, "spm": 21, "hr": 148}, {"t": 4997, "d": 18612, "p": 1346, "spm": 21, "hr": 148}, {"t": 5027, "d": 18719, "p": 1354, "spm": 21, "hr": 147}, {"t": 5056, "d": 18826, "p": 1366, "spm": 20, "hr": 147}, {"t": 5084, "d": 18933, "p": 1363, "spm": 20, "hr": 148}, {"t": 5114, "d": 19043, "p": 1348, "spm": 21, "hr": 149}, {"t": 5144, "d": 19154, "p": 1336, "spm": 20, "hr": 149}, {"t": 5174, "d": 19262, "p": 1364, "spm": 20, "hr": 150}, {"t": 5203, "d": 19373, "p": 1361, "spm": 20, "hr": 151}, {"t": 5231, "d": 19478, "p": 1348, "spm": 20, "hr": 152}, {"t": 5262, "d": 19591, "p": 1355, "spm": 20, "hr": 152}, {"t": 5291, "d": 19698, "p": 1361, "spm": 20, "hr": 153}, {"t": 5320, "d": 19806, "p": 1353, "spm": 21, "hr": 153}, {"t": 5349, "d": 19914, "p": 1353, "spm": 21, "hr": 153}, {"t": 5372, "d": 20000, "p": 1340, "spm": 21, "hr": 154}], "workout": {"splits": [{"type": "distance", "time": 1397, "distance": 510, "heart_rate": {"average": 141}, "stroke_rate": 21}, {"type": "distance", "time": 1301, "distance": 499, "heart_rate": {"average": 150}, "stroke_rate": 22}, {"type": "distance", "time": 1344, "distance": 498, "heart_rate": {"average": 152}, "stroke_rate": 20}, {"type": "distance", "time": 1328, "distance": 491, "heart_rate": {"average": 150}, "stroke_rate": 20}]}} +May-21-2021 09:40:10 User 1, C2 ID 33991243 +May-21-2021 09:40:10 {"distance": 13878, "user_id": 457764, "ranked": false, "weight_class": "L", "verified": false, "workout_type": false, "comments": "\n from speedcoach2v2.15 via rowsandall.com", "heart_rate": {"max": 158, "average": 156}, "source": "rowingdata", "date_utc": "2018-06-30 05:31:01", "time_formatted": "1:21:16.7", "time": 48767, "date": "2018-06-30 07:31:01", "timezone": "Europe/Prague", "type": "water", "id": 33991243, "stroke_data": true} +May-21-2021 09:40:10 Time zone Europe/Prague, stardatetime 2018-06-30 06:09:44.300000+02:00, duration 01:21:16.6 \ No newline at end of file diff --git a/rowers/mytypes.py b/rowers/mytypes.py index 89ddb6af..881cd311 100644 --- a/rowers/mytypes.py +++ b/rowers/mytypes.py @@ -183,38 +183,6 @@ stcollection = ( stmapping = {key:value for key,value in Reverse(stcollection)} -rkcollection = ( - ('water','Rowing'), - ('rower','Rowing'), - ('skierg','Cross-Country Skiing'), - ('bike','Cycling'), - ('bikeerg','Cycling'), - ('dynamic','Rowing'), - ('slides','Rowing'), - ('paddle','Other:Paddling'), - ('snow','Cross-Country Skiing'), - ('coastal','Rowing'), - ('c-boat','Rowing'), - ('churchboat','Rowing'), - ('Ride','Cycling'), - ('Run','Running'), - ('NordicSki','Cross-Country Skiing'), - ('Swim','Swimming'), - ('Hike','Hiking'), - ('Walk','Walking'), - ('Canoeing','Other'), - ('Crossfit','CrossFit'), - ('StandUpPaddling','Other'), - ('IceSkate','Skating'), - ('WeightTraining','Other'), - ('InlineSkate','Skating'), - ('Kayaking','Other'), - ('Workout','Other'), - ('other','Other'), - ('Yoga','Other'), -) - -rkmapping = {key:value for key,value in Reverse(rkcollection)} polarcollection = ( ('water','Rowing'), @@ -320,7 +288,6 @@ stravamappinginv = {value:key for key,value in Reverse(stravacollection) if valu stmappinginv = {value:key for key,value in Reverse(stcollection) if value is not None} -rkmappinginv = {value:key for key,value in Reverse(rkcollection) if value is not None} polarmappinginv = {value:key for key,value in Reverse(polarcollection) if value is not None} @@ -365,7 +332,6 @@ workoutsources = ( ('strava','strava'), ('concept2','concept2'), ('sporttracks','sporttracks'), - ('runkeeper','runkeeper'), ('mapmyfitness','mapmyfitness'), ('csv','painsled'), ('tcx','tcx'), diff --git a/rowers/stravastuff.py b/rowers/stravastuff.py index 7e13afbd..46ae20df 100644 --- a/rowers/stravastuff.py +++ b/rowers/stravastuff.py @@ -382,118 +382,9 @@ def async_get_workout(user,stravaid): return job # Get a Strava workout summary data and stroke data by ID -def get_workout(user,stravaid,do_async=False): - if do_async: # pragma: no cover - res = async_get_workout(user,stravaid) - return {},pd.DataFrame() - try: - thetoken = strava_open(user) - except NoTokenError: # pragma: no cover - s = "Token error" - return custom_exception_handler(401,s) +def get_workout(user,stravaid,do_async=True): + return async_get_workout(user,stravaid) - r = Rower.objects.get(user=user) - if (r.stravatoken == '') or (r.stravatoken is None): # pragma: no cover - s = "Token doesn't exist. Need to authorize" - return custom_exception_handler(401,s) - elif (r.stravatokenexpirydate is not None and timezone.now()>r.stravatokenexpirydate): # pragma: no cover - s = "Token expired. Needs to refresh." - return custom_exception_handler(401,s) - else: - # ready to fetch. Hurray - fetchresolution = 'high' - series_type = 'time' - authorizationstring = str('Bearer ' + r.stravatoken) - headers = {'Authorization': authorizationstring, - 'user-agent': 'sanderroosendaal', - 'Content-Type': 'application/json', - 'resolution': 'medium',} - url = "https://www.strava.com/api/v3/activities/"+str(stravaid) - workoutsummary = requests.get(url,headers=headers).json() - - workoutsummary['timezone'] = "Etc/UTC" - try: - startdatetime = workoutsummary['start_date'] - except KeyError: # pragma: no cover - startdatetime = timezone.now() - - spm = get_strava_stream(r,'cadence',stravaid) - hr = get_strava_stream(r,'heartrate',stravaid) - t = get_strava_stream(r,'time',stravaid) - velo = get_strava_stream(r,'velocity_smooth',stravaid) - d = get_strava_stream(r,'distance',stravaid) - coords = get_strava_stream(r,'latlng',stravaid) - power = get_strava_stream(r,'watts',stravaid) - - if t is not None: - nr_rows = len(t) - else: # pragma: no cover - duration = int(workoutsummary['elapsed_time']) - t = pd.Series(range(duration+1)) - - nr_rows = len(t) - - - if nr_rows == 0: # pragma: no cover - return (0,"Error: Time data had zero length") - - if d is None: # pragma: no cover - d = 0*t - - if spm is None: # pragma: no cover - spm = np.zeros(nr_rows) - - if power is None: # pragma: no cover - power = np.zeros(nr_rows) - - if hr is None: # pragma: no cover - hr = np.zeros(nr_rows) - - if velo is None: # pragma: no cover - velo = np.zeros(nr_rows) - - dt = np.diff(t).mean() - wsize = round(5./dt) - - velo2 = ewmovingaverage(velo,wsize) - - if coords is not None: - try: - lat = coords[:,0] - lon = coords[:,1] - except IndexError: # pragma: no cover - lat = np.zeros(len(t)) - lon = np.zeros(len(t)) - else: # pragma: no cover - lat = np.zeros(len(t)) - lon = np.zeros(len(t)) - - - - - strokelength = velo*60./(spm) - strokelength[np.isinf(strokelength)] = 0.0 - - - pace = 500./(1.0*velo2) - pace[np.isinf(pace)] = 0.0 - - df = pd.DataFrame({'t':10*t, - 'd':10*d, - 'p':10*pace, - 'spm':spm, - 'hr':hr, - 'lat':lat, - 'lon':lon, - 'power':power, - 'strokelength':strokelength, - }) - - - - # startdatetime = datetime.datetime.strptime(startdatetime,"%Y-%m-%d-%H:%M:%S") - - return [workoutsummary,df] # Generate Workout data for Strava (a TCX file) def createstravaworkoutdata(w,dozip=True): diff --git a/rowers/tasks.py b/rowers/tasks.py index 35293887..710f77e0 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -66,6 +66,7 @@ from django.utils import timezone from django.utils.html import strip_tags from rowers.utils import deserialize_list,ewmovingaverage,wavg,dologging +import rowers.utils as utils from rowers.emails import htmlstrip from rowers import mytypes @@ -317,20 +318,6 @@ def handle_sporttracks_sync(workoutid,url,headers,data,debug=False,**kwargs): return 1 -@app.task -def handle_runkeeper_sync(workoutid,url,headers,data,debug=False,**kwargs): - response = requests.post(url,headers=headers,data=data) - if response.status_code not in [200,201]: # pragma: no cover - return 0 - - uri = response.headers["Location"] - - tester = re.compile('^\/fitnessActivities\/(\d+)$') - id = int(tester.match(uri).group(1)) - - res = update_workout_field_sql(workoutid,'uploadedtorunkeeper',id,debug=debug) - - return 1 @app.task def handle_strava_sync(stravatoken,workoutid,filename,name,activity_type,description,debug=False,**kwargs): @@ -3008,10 +2995,7 @@ def handle_c2_async_workout(alldata,userid,c2token,c2id,delaysec,defaulttimezone c2id = data['id'] workouttype = data['type'] verified = data['verified'] - try: - startdatetime = iso8601.parse_date(data['date_utc']) - except: # pragma: no cover - startdatetime = iso8601.parse_date(data['date']) + weightclass = data['weight_class'] s = 'User {userid}, C2 ID {c2id}'.format(userid=userid,c2id=c2id) @@ -3035,16 +3019,8 @@ def handle_c2_async_workout(alldata,userid,c2token,c2id,delaysec,defaulttimezone # Create CSV file name and save data to CSV file csvfilename ='media/Import_'+str(c2id)+'.csv.gz' - totaltime = data['time']/10. - duration = totaltime_sec_to_string(totaltime) - starttimeunix = arrow.get(startdatetime).timestamp()-totaltime - startdatetime = arrow.get(starttimeunix) + startdatetime,starttime,workoutdate,duration,starttimeunix,timezone = utils.get_startdatetime_from_c2data(data) - try: - timezone = pytz.timezone(data['timezone']) - except UnknownTimeZoneError: - timezone = 'UTC' - startdatetime = startdatetime.astimezone(timezone) s = 'Time zone {timezone}, stardatetime {startdatetime}, duration {duration}'.format( timezone=timezone,startdatetime=startdatetime, @@ -3053,12 +3029,7 @@ def handle_c2_async_workout(alldata,userid,c2token,c2id,delaysec,defaulttimezone - workoutdate = startdatetime.astimezone( - timezone - ).strftime('%Y-%m-%d') - starttime = startdatetime.astimezone( - timezone - ).strftime('%H:%M:%S') + try: notes = data['comments'] diff --git a/rowers/tests/mocks.py b/rowers/tests/mocks.py index 7dea2622..10e2e1d9 100644 --- a/rowers/tests/mocks.py +++ b/rowers/tests/mocks.py @@ -334,6 +334,16 @@ def mocked_getsmallrowdata_db(*args, **kwargs): return df +def mocked_getsmallrowdata_db_updatecp(*args, **kwargs): + df = pd.read_csv('rowers/tests/testdata/colsfromdb.csv') + + return df + +def mocked_getsmallrowdata_db_setcp(*args, **kwargs): + df = pd.read_csv('rowers/tests/testdata/colsfromdb.csv') + + return df + def mocked_getsmallrowdata_db_water(*args, **kwargs): df = pd.read_csv('rowers/tests/testdata/colsfromdb.csv') diff --git a/rowers/tests/test_async_tasks.py b/rowers/tests/test_async_tasks.py index 745880ca..a327a1c6 100644 --- a/rowers/tests/test_async_tasks.py +++ b/rowers/tests/test_async_tasks.py @@ -462,22 +462,6 @@ class AsyncTaskTests(TestCase): res = tasks.handle_sporttracks_sync(1,url,headers,json.dumps(data,default=sporttracksstuff.default)) self.assertEqual(res,1) - @patch('rowers.runkeeperstuff.requests.post', side_effect=mocked_requests) - @patch('rowers.runkeeperstuff.requests.get', side_effect=mocked_requests) - def test_runkeeper_sync(self, mock_get, mock_post): - authorizationstring = str('Bearer aap') - headers = {'Authorization': authorizationstring, - 'user-agent': 'sanderroosendaal', - 'Content-Type': 'application/vnd.com.runkeeper.NewFitnessActivity+json', - 'Content-Length':'nnn'} - - url = "https://api.runkeeper.com/fitnessActivities" - - data = runkeeperstuff.createrunkeeperworkoutdata(self.wwater) - - - res = tasks.handle_runkeeper_sync(1,url,headers,json.dumps(data,default=sporttracksstuff.default)) - self.assertEqual(res,1) @patch('rowers.c2stuff.requests.post',side_effect=mocked_requests) @patch('rowers.c2stuff.requests.get',side_effect=mocked_requests) @@ -518,14 +502,14 @@ class AsyncTaskTests(TestCase): self.assertEqual(res,1) - @patch('rowers.dataprepnodjango.getsmallrowdata_db') + @patch('rowers.dataprepnodjango.getsmallrowdata_db_updatecp') def test_handle_updatecp(self,mocked_getsmallrowdata_db): rower_id = 1 workoutids = [1] res = tasks.handle_updatecp(rower_id,workoutids) self.assertEqual(res,1) - @patch('rowers.dataprepnodjango.getsmallrowdata_db') + @patch('rowers.dataprepnodjango.getsmallrowdata_db_setcp') def test_handle_setcp(self,mocked_getsmallrowdata_db): strokesdf = pd.read_csv('rowers/tests/testdata/uhfull.csv') filename = 'rowers/tests/testdata/temp/pq.gz' diff --git a/rowers/tests/test_imports.py b/rowers/tests/test_imports.py index 260e8c97..e3e863f8 100644 --- a/rowers/tests/test_imports.py +++ b/rowers/tests/test_imports.py @@ -19,6 +19,8 @@ from rowers import stravastuff import urllib import json +import rowers.utils as utils + from django.db import transaction import rowers.garmin_stuff as gs @@ -326,7 +328,7 @@ class C2Objects(DjangoTestCase): def test_c2_import_tz(self, mock_get, mocked_sqlalchemy): response = self.c.get('/rowers/workout/c2import/22/',follow=True) - expected_url = '/rower/workout/c2list/' + expected_url = '/rowers/workout/c2list/' self.assertRedirects(response, expected_url=expected_url, @@ -334,8 +336,10 @@ class C2Objects(DjangoTestCase): self.assertEqual(response.status_code, 200) - w = Workout.objects.get(id=2) - self.assertEqual(w.timezone,'Europe/Prague') + with open('rowers/tests/testdata/c2_timezone.json','r') as infile: + data = json.load(infile) + timezone = str(utils.get_timezone_from_c2data(data['data'])) + self.assertEqual(timezone,'Europe/Prague') @patch('rowers.c2stuff.requests.get', side_effect=mocked_requests) @@ -343,7 +347,7 @@ class C2Objects(DjangoTestCase): def test_c2_import_tz3(self, mock_get, mocked_sqlalchemy): response = self.c.get('/rowers/workout/c2import/32/',follow=True) - expected_url = '/rower/workout/c2list/' + expected_url = '/rowers/workout/c2list/' self.assertRedirects(response, expected_url=expected_url, @@ -351,15 +355,18 @@ class C2Objects(DjangoTestCase): self.assertEqual(response.status_code, 200) - w = Workout.objects.get(id=2) - self.assertEqual(w.timezone,'UTC') + with open('rowers/tests/testdata/c2_timezonebad.json','r') as infile: + data = json.load(infile) + + timezone = str(utils.get_timezone_from_c2data(data['data'])) + self.assertEqual(timezone,'UTC') @patch('rowers.c2stuff.requests.get', side_effect=mocked_requests) @patch('rowers.dataprep.create_engine') def test_c2_import_tz2(self, mock_get, mocked_sqlalchemy): response = self.c.get('/rowers/workout/c2import/31/',follow=True) - expected_url = '/rower/workout/c2list/' + expected_url = '/rowers/workout/c2list/' self.assertRedirects(response, expected_url=expected_url, @@ -367,10 +374,14 @@ class C2Objects(DjangoTestCase): self.assertEqual(response.status_code, 200) - w = Workout.objects.get(id=2) - self.assertEqual(w.timezone,'Europe/Amsterdam') + with open('rowers/tests/testdata/c2_timezone2.json','r') as infile: + data = json.load(infile) - self.assertEqual(w.starttime.strftime("%H:%M:%S"),"20:04:56") + timezone = str(utils.get_timezone_from_c2data(data['data'])) + self.assertEqual(timezone,'Europe/Amsterdam') + + startdatetime,starttime,workoutdate,duration,starttimeunix,timezone = utils.get_startdatetime_from_c2data(data['data']) + self.assertEqual(starttime,"20:04:55") diff --git a/rowers/tests/viewnames.csv b/rowers/tests/viewnames.csv index 8d399ca0..6f14f22d 100644 --- a/rowers/tests/viewnames.csv +++ b/rowers/tests/viewnames.csv @@ -94,14 +94,10 @@ 104,127,workout_sporttracksimport_view,list workouts to be imported (test stops at notokenerror),TRUE,302,basic,302,302,basic,403,403,coach,302,403,FALSE,TRUE,FALSE,TRUE,TRUE, 105,129,workout_getsporttracksworkout_all,gets all C2 workouts (now redirects due to NoTokenError,TRUE,302,basic,302,302,FALSE,302,302,FALSE,302,302,FALSE,FALSE,FALSE,TRUE,TRUE, 106,130,workout_polarimport_view,list workouts to be imported (test stops at notokenerror),TRUE,302,basic,302,302,basic,403,403,coach,302,403,FALSE,TRUE,FALSE,TRUE,TRUE, -107,132,workout_runkeeperimport_view,list workouts to be imported (test stops at notokenerror),TRUE,302,basic,302,302,basic,403,403,coach,302,403,FALSE,TRUE,FALSE,TRUE,TRUE, -108,134,workout_underarmourimport_view,list workouts to be imported (test stops at notokenerror),TRUE,302,basic,302,302,basic,403,403,coach,302,403,FALSE,TRUE,FALSE,TRUE,TRUE, 109,135,workout_c2_upload_view,uploads workout to C2,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,TRUE,FALSE,FALSE, 110,136,workout_strava_upload_view,uploads workout to C2,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,TRUE,FALSE,FALSE, 111,137,workout_recalcsummary_view,recalculates workout summary,TRUE,403,basic,302,403,basic,403,403,coach,302,403,FALSE,FALSE,TRUE,TRUE,TRUE, 112,138,workout_sporttracks_upload_view,uploads workout to C2,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,TRUE,FALSE,FALSE, -113,139,workout_runkeeper_upload_view,uploads workout to C2,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,TRUE,FALSE,FALSE, -114,140,workout_underarmour_upload_view,uploads workout to C2,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,TRUE,FALSE,FALSE, 115,141,workout_tp_upload_view,uploads workout to C2,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,TRUE,FALSE,FALSE, 116,142,multi_compare_view,compare workouts ,TRUE,302,basic,302,403,basic,302,403,coach,302,302,FALSE,FALSE,TRUE,TRUE,TRUE, 117,145,alerts_view,view alerts,TRUE,302,basic,200,403,basic,403,403,coach,200,302,FALSE,TRUE,FALSE,TRUE,TRUE, @@ -151,11 +147,8 @@ 165,210,rower_revokeapp_view,revoke app,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, 166,211,rower_strava_authorize,authorize on strava,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, 167,212,rower_sporttracks_authorize,authorize on sporttracks,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, -168,213,rower_underarmour_authorize,authorize on UA,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, 169,214,rower_tp_authorize,authorize on TP,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, -170,215,rower_runkeeper_authorize,authorize on RK,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, 171,216,rower_sporttracks_token_refresh,refresh token,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, -172,217,rower_underarmour_token_refresh,refresh token,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, 173,218,rower_tp_token_refresh,refresh token,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, 174,219,rower_c2_token_refresh,refresh token,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, 175,220,rower_favoritecharts_view,See favorite charts,TRUE,302,pro,200,302,pro,403,403,coach,200,403,FALSE,TRUE,FALSE,TRUE,TRUE, @@ -232,9 +225,7 @@ 247,343,rower_process_callback,Tested in specific test suite,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, 248,344,rower_process_stravacallback,Tested in specific test suite,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, 249,345,rower_process_sporttrackscallback,Tested in specific test suite,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, -250,346,rower_process_underarmourcallback,Tested in specific test suite,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, 251,347,rower_process_polarcallback,Tested in specific test suite,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, -252,348,rower_process_runkeepercallback,Tested in specific test suite,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, 253,349,rower_process_tpcallback,Tested in specific test suite,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, 254,350,rower_process_twittercallback,Tested in specific test suite,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, 255,351,set_language,Set language,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, diff --git a/rowers/utils.py b/rowers/utils.py index e9781a8a..6ef5e013 100644 --- a/rowers/utils.py +++ b/rowers/utils.py @@ -26,6 +26,11 @@ import requests from django.http import HttpResponse import humanize +from pytz.exceptions import UnknownTimeZoneError +import pytz +import iso8601 +from iso8601 import ParseError +import arrow lbstoN = 4.44822 @@ -1232,3 +1237,37 @@ def intervals_to_string(vals, units, typ): s = s[1:] return s + +def get_timezone_from_c2data(data): + + try: + timezone = pytz.timezone(data['timezone']) + except UnknownTimeZoneError: + timezone = pytz.utc + except KeyError: + timezone = pytz.utc + + return timezone + + +def get_startdatetime_from_c2data(data): + timezone = get_timezone_from_c2data(data) + try: + startdatetime = iso8601.parse_date(data['date_utc']) + except: # pragma: no cover + startdatetime = iso8601.parse_date(data['date']) + + totaltime = data['time']/10. + duration = totaltime_sec_to_string(totaltime) + starttimeunix = arrow.get(startdatetime).timestamp()-totaltime + startdatetime = arrow.get(starttimeunix) + startdatetime = startdatetime.astimezone(timezone) + + workoutdate = startdatetime.astimezone( + timezone + ).strftime('%Y-%m-%d') + starttime = startdatetime.astimezone( + timezone + ).strftime('%H:%M:%S') + + return startdatetime,starttime,workoutdate,duration,starttimeunix,timezone