From 480bdd330e19bd0d1bc3695700b8f59bd8b366f9 Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 30 Dec 2020 22:07:43 +0100 Subject: [PATCH] API - return activity shorter id - #57 --- docs/api/activities.html | 98 +++++++------- docs/api/records.html | 8 +- docs/http-routingtable.html | 14 +- docs/objects.inv | Bin 1279 -> 1282 bytes docs/searchindex.js | 2 +- fittrackee/activities/activities.py | 128 ++++++++++-------- fittrackee/activities/models.py | 17 ++- fittrackee/activities/records.py | 8 +- fittrackee/activities/utils_id.py | 9 ++ .../activities/test_activities_api_0_get.py | 36 ++--- .../activities/test_activities_api_1_post.py | 40 +++--- .../activities/test_activities_api_2_patch.py | 89 ++++++------ .../test_activities_api_3_delete.py | 21 ++- .../tests/activities/test_activities_model.py | 8 +- .../tests/activities/test_records_api.py | 126 ++++++++--------- fittrackee/tests/activities/utils.py | 12 +- poetry.lock | 14 +- pyproject.toml | 1 + 18 files changed, 336 insertions(+), 295 deletions(-) create mode 100644 fittrackee/activities/utils_id.py diff --git a/docs/api/activities.html b/docs/api/activities.html index 6df48bed..c3784f18 100644 --- a/docs/api/activities.html +++ b/docs/api/activities.html @@ -162,7 +162,7 @@ "descent": null, "distance": 10.0, "duration": "0:17:04", - "id": "f03265f69fe0489b812fc7dc4deff55e", + "id": "kjxavSTUrJvoAh2wvCeGEF", "map": null, "max_alt": null, "max_speed": 10.0, @@ -176,7 +176,7 @@ "records": [ { "activity_date": "Mon, 01 Jan 2018 00:00:00 GMT", - "activity_id": "f03265f69fe0489b812fc7dc4deff55e", + "activity_id": "kjxavSTUrJvoAh2wvCeGEF", "id": 4, "record_type": "MS", "sport_id": 1, @@ -185,7 +185,7 @@ }, { "activity_date": "Mon, 01 Jan 2018 00:00:00 GMT", - "activity_id": "f03265f69fe0489b812fc7dc4deff55e", + "activity_id": "kjxavSTUrJvoAh2wvCeGEF", "id": 3, "record_type": "LD", "sport_id": 1, @@ -194,7 +194,7 @@ }, { "activity_date": "Mon, 01 Jan 2018 00:00:00 GMT", - "activity_id": "f03265f69fe0489b812fc7dc4deff55e", + "activity_id": "kjxavSTUrJvoAh2wvCeGEF", "id": 2, "record_type": "FD", "sport_id": 1, @@ -203,7 +203,7 @@ }, { "activity_date": "Mon, 01 Jan 2018 00:00:00 GMT", - "activity_id": "f03265f69fe0489b812fc7dc4deff55e", + "activity_id": "kjxavSTUrJvoAh2wvCeGEF", "id": 1, "record_type": "AS", "sport_id": 1, @@ -285,11 +285,11 @@
-
-GET /api/activities/(string: activity_uuid)
+
+GET /api/activities/(string: activity_short_id)

Get an activity

Example request:

-
GET /api/activities/f03265f69fe0489b812fc7dc4deff55e HTTP/1.1
+
GET /api/activities/kjxavSTUrJvoAh2wvCeGEF HTTP/1.1
 

Example responses:

@@ -311,7 +311,7 @@ "descent": null, "distance": 12, "duration": "0:45:00", - "id": "f03265f69fe0489b812fc7dc4deff55e", + "id": "kjxavSTUrJvoAh2wvCeGEF", "map": null, "max_alt": null, "max_speed": 16, @@ -355,7 +355,7 @@
Parameters
  • auth_user_id (integer) – authenticate user id (from JSON Web Token)

  • -
  • activity_uuid (integer) – activity uuid

  • +
  • activity_short_id (string) – activity short id

Request Headers
@@ -380,11 +380,11 @@
-
-GET /api/activities/(string: activity_uuid)/gpx
+
+GET /api/activities/(string: activity_short_id)/gpx

Get gpx file for an activity displayed on map with Leaflet

Example request:

-
GET /api/activities/f03265f69fe0489b812fc7dc4deff55e/gpx HTTP/1.1
+
GET /api/activities/kjxavSTUrJvoAh2wvCeGEF/gpx HTTP/1.1
 Content-Type: application/json
 
@@ -405,7 +405,7 @@
Parameters
  • auth_user_id (integer) – authenticate user id (from JSON Web Token)

  • -
  • activity_uuid (integer) – activity uuid

  • +
  • activity_short_id (string) – activity short id

Request Headers
@@ -434,11 +434,11 @@
-
-GET /api/activities/(string: activity_uuid)/chart_data
+
+GET /api/activities/(string: activity_short_id)/chart_data

Get chart data from an activity gpx file, to display it with Recharts

Example request:

-
GET /api/activities/f03265f69fe0489b812fc7dc4deff55e/chart HTTP/1.1
+
GET /api/activities/kjxavSTUrJvoAh2wvCeGEF/chart HTTP/1.1
 Content-Type: application/json
 
@@ -478,7 +478,7 @@
Parameters
  • auth_user_id (integer) – authenticate user id (from JSON Web Token)

  • -
  • activity_uuid (integer) – activity uuid

  • +
  • activity_short_id (string) – activity short id

Request Headers
@@ -507,12 +507,11 @@
-
-GET /api/activities/(string: activity_uuid)/chart_data/segment/(int: segment_id)
+
+GET /api/activities/(string: activity_short_id)/chart_data/segment/(int: segment_id)

Get chart data from an activity gpx file, to display it with Recharts

Example request:

-
GET /api/activities/f03265f69fe0489b812fc7dc4deff55e/chart/segment/0
-  HTTP/1.1
+
GET /api/activities/kjxavSTUrJvoAh2wvCeGEF/chart/segment/0 HTTP/1.1
 Content-Type: application/json
 
@@ -552,7 +551,7 @@
Parameters
  • auth_user_id (integer) – authenticate user id (from JSON Web Token)

  • -
  • activity_uuid (integer) – activity uuid

  • +
  • activity_short_id (string) – activity short id

  • segment_id (integer) – segment id

@@ -579,12 +578,11 @@
-
-GET /api/activities/(string: activity_uuid)/gpx/segment/(int: segment_id)
+
+GET /api/activities/(string: activity_short_id)/gpx/segment/(int: segment_id)

Get gpx file for an activity segment displayed on map with Leaflet

Example request:

-
GET /api/activities/f03265f69fe0489b812fc7dc4deff55e/gpx/segment/0
-  HTTP/1.1
+
GET /api/activities/kjxavSTUrJvoAh2wvCeGEF/gpx/segment/0 HTTP/1.1
 Content-Type: application/json
 
@@ -605,7 +603,7 @@
Parameters
  • auth_user_id (integer) – authenticate user id (from JSON Web Token)

  • -
  • activity_uuid (integer) – activity uuid

  • +
  • activity_short_id (string) – activity short id

  • segment_id (integer) – segment id

@@ -718,7 +716,7 @@ "descent": null, "distance": 10.0, "duration": "0:17:04", - "id": "f03265f69fe0489b812fc7dc4deff55e", + "id": "kjxavSTUrJvoAh2wvCeGEF", "map": null, "max_alt": null, "max_speed": 10.0, @@ -732,7 +730,7 @@ "records": [ { "activity_date": "Mon, 01 Jan 2018 00:00:00 GMT", - "activity_id": "f03265f69fe0489b812fc7dc4deff55e", + "activity_id": "kjxavSTUrJvoAh2wvCeGEF", "id": 4, "record_type": "MS", "sport_id": 1, @@ -741,7 +739,7 @@ }, { "activity_date": "Mon, 01 Jan 2018 00:00:00 GMT", - "activity_id": "f03265f69fe0489b812fc7dc4deff55e", + "activity_id": "kjxavSTUrJvoAh2wvCeGEF", "id": 3, "record_type": "LD", "sport_id": 1, @@ -750,7 +748,7 @@ }, { "activity_date": "Mon, 01 Jan 2018 00:00:00 GMT", - "activity_id": "f03265f69fe0489b812fc7dc4deff55e", + "activity_id": "kjxavSTUrJvoAh2wvCeGEF", "id": 2, "record_type": "FD", "sport_id": 1, @@ -759,7 +757,7 @@ }, { "activity_date": "Mon, 01 Jan 2018 00:00:00 GMT", - "activity_id": "f03265f69fe0489b812fc7dc4deff55e", + "activity_id": "kjxavSTUrJvoAh2wvCeGEF", "id": 1, "record_type": "AS", "sport_id": 1, @@ -859,7 +857,7 @@ "records": [ { "activity_date": "Mon, 01 Jan 2018 00:00:00 GMT", - "activity_id": "f03265f69fe0489b812fc7dc4deff55e", + "activity_id": "kjxavSTUrJvoAh2wvCeGEF", "id": 4, "record_type": "MS", "sport_id": 1, @@ -868,7 +866,7 @@ }, { "activity_date": "Mon, 01 Jan 2018 00:00:00 GMT", - "activity_id": "f03265f69fe0489b812fc7dc4deff55e", + "activity_id": "kjxavSTUrJvoAh2wvCeGEF", "id": 3, "record_type": "LD", "sport_id": 1, @@ -877,7 +875,7 @@ }, { "activity_date": "Mon, 01 Jan 2018 00:00:00 GMT", - "activity_id": "f03265f69fe0489b812fc7dc4deff55e", + "activity_id": "kjxavSTUrJvoAh2wvCeGEF", "id": 2, "record_type": "FD", "sport_id": 1, @@ -886,7 +884,7 @@ }, { "activity_date": "Mon, 01 Jan 2018 00:00:00 GMT", - "activity_id": "f03265f69fe0489b812fc7dc4deff55e", + "activity_id": "kjxavSTUrJvoAh2wvCeGEF", "id": 1, "record_type": "AS", "sport_id": 1, @@ -898,7 +896,7 @@ "sport_id": 1, "title": null, "user": "admin", - "uuid": "f03265f69fe0489b812fc7dc4deff55e" + "uuid": "kjxavSTUrJvoAh2wvCeGEF" "weather_end": null, "weather_start": null, "with_gpx": false @@ -947,8 +945,8 @@
-
-PATCH /api/activities/(string: activity_uuid)
+
+PATCH /api/activities/(string: activity_short_id)

Update an activity

Example request:

PATCH /api/activities/1 HTTP/1.1
@@ -984,7 +982,7 @@
           "records": [
             {
               "activity_date": "Mon, 01 Jan 2018 00:00:00 GMT",
-              "activity_id": "f03265f69fe0489b812fc7dc4deff55e",
+              "activity_id": "kjxavSTUrJvoAh2wvCeGEF",
               "id": 4,
               "record_type": "MS",
               "sport_id": 1,
@@ -993,7 +991,7 @@
             },
             {
               "activity_date": "Mon, 01 Jan 2018 00:00:00 GMT",
-              "activity_id": "f03265f69fe0489b812fc7dc4deff55e",
+              "activity_id": "kjxavSTUrJvoAh2wvCeGEF",
               "id": 3,
               "record_type": "LD",
               "sport_id": 1,
@@ -1002,7 +1000,7 @@
             },
             {
               "activity_date": "Mon, 01 Jan 2018 00:00:00 GMT",
-              "activity_id": "f03265f69fe0489b812fc7dc4deff55e",
+              "activity_id": "kjxavSTUrJvoAh2wvCeGEF",
               "id": 2,
               "record_type": "FD",
               "sport_id": 1,
@@ -1011,7 +1009,7 @@
             },
             {
               "activity_date": "Mon, 01 Jan 2018 00:00:00 GMT",
-              "activity_id": "f03265f69fe0489b812fc7dc4deff55e",
+              "activity_id": "kjxavSTUrJvoAh2wvCeGEF",
               "id": 1,
               "record_type": "AS",
               "sport_id": 1,
@@ -1023,7 +1021,7 @@
           "sport_id": 1,
           "title": null,
           "user": "admin",
-          "uuid": "f03265f69fe0489b812fc7dc4deff55e"
+          "uuid": "kjxavSTUrJvoAh2wvCeGEF"
           "weather_end": null,
           "weather_start": null,
           "with_gpx": false
@@ -1038,7 +1036,7 @@
 
Parameters
  • auth_user_id (integer) – authenticate user id (from JSON Web Token)

  • -
  • activity_uuid (integer) – activity uuid

  • +
  • activity_short_id (string) – activity short id

Request JSON Object
@@ -1077,11 +1075,11 @@
-
-DELETE /api/activities/(string: activity_uuid)
+
+DELETE /api/activities/(string: activity_short_id)

Delete an activity

Example request:

-
DELETE /api/activities/f03265f69fe0489b812fc7dc4deff55e HTTP/1.1
+
DELETE /api/activities/kjxavSTUrJvoAh2wvCeGEF HTTP/1.1
 Content-Type: application/json
 
@@ -1094,7 +1092,7 @@
Parameters
  • auth_user_id (integer) – authenticate user id (from JSON Web Token)

  • -
  • activity_uuid (integer) – activity uuid

  • +
  • activity_short_id (string) – activity short id

Request Headers
diff --git a/docs/api/records.html b/docs/api/records.html index ecff4bc8..c6082685 100644 --- a/docs/api/records.html +++ b/docs/api/records.html @@ -156,7 +156,7 @@ "records": [ { "activity_date": "Sun, 07 Jul 2019 08:00:00 GMT", - "activity_id": "e060bde05e3f4906a32913b102c814cb", + "activity_id": "hvYBqYBRa7wwXpaStWR4V2", "id": 9, "record_type": "AS", "sport_id": 1, @@ -165,7 +165,7 @@ }, { "activity_date": "Sun, 07 Jul 2019 08:00:00 GMT", - "activity_id": "e060bde05e3f4906a32913b102c814cb", + "activity_id": "hvYBqYBRa7wwXpaStWR4V2", "id": 10, "record_type": "FD", "sport_id": 1, @@ -174,7 +174,7 @@ }, { "activity_date": "Sun, 07 Jul 2019 08:00:00 GMT", - "activity_id": "e060bde05e3f4906a32913b102c814cb", + "activity_id": "hvYBqYBRa7wwXpaStWR4V2", "id": 11, "record_type": "LD", "sport_id": 1, @@ -183,7 +183,7 @@ }, { "activity_date": "Sun, 07 Jul 2019 08:00:00 GMT", - "activity_id": "e060bde05e3f4906a32913b102c814cb", + "activity_id": "hvYBqYBRa7wwXpaStWR4V2", "id": 12, "record_type": "MS", "sport_id": 1, diff --git a/docs/http-routingtable.html b/docs/http-routingtable.html index ef4f3cd8..05e2097d 100644 --- a/docs/http-routingtable.html +++ b/docs/http-routingtable.html @@ -133,27 +133,27 @@ - GET /api/activities/(string:activity_uuid) + GET /api/activities/(string:activity_short_id) - GET /api/activities/(string:activity_uuid)/chart_data + GET /api/activities/(string:activity_short_id)/chart_data - GET /api/activities/(string:activity_uuid)/chart_data/segment/(int:segment_id) + GET /api/activities/(string:activity_short_id)/chart_data/segment/(int:segment_id) - GET /api/activities/(string:activity_uuid)/gpx + GET /api/activities/(string:activity_short_id)/gpx - GET /api/activities/(string:activity_uuid)/gpx/segment/(int:segment_id) + GET /api/activities/(string:activity_short_id)/gpx/segment/(int:segment_id) @@ -273,7 +273,7 @@ - DELETE /api/activities/(string:activity_uuid) + DELETE /api/activities/(string:activity_short_id) @@ -288,7 +288,7 @@ - PATCH /api/activities/(string:activity_uuid) + PATCH /api/activities/(string:activity_short_id) diff --git a/docs/objects.inv b/docs/objects.inv index d84b63dbd628779bc828150053e2861c3403cab6..e1701f0802e2edc6651dea06f324322af46b5397 100644 GIT binary patch delta 1157 zcmey**~B%Wr#|w9(cLt6p*aQz8yWB1xyQS>A<1NGW78b9+J=3O*T0MY=CE~Q>gKne zHoHuaUuN$A_cF44lR8?pvmQ>l7=B74^UR!$ud;k+{G4nl^K;VXx6jxm968t~C^@#7 zvadY#OrVv&wr8WBRM_RDT2u`eunwe9HCQbzmdX-q*^UZ;QLTrACWbmtbme+~Q1e^l@P z6D0cD`0!Sn6$ezA%c4=9 zWAssO!~9KGit|MS9xnU2ca8CCHQpcBo@|%Ryzx@Aw94el`L-LOAA}|u-w3j3xHRQ$ zmeKaDUv?Z^c8O`}3xyX;);v=v{mJB8@~Zg7opb@QlPmmwwsLLN5)Gehnk%u=zux^T zSEuLcN3DMMG!yS$opEuK#93dhv@fsznL7t;JD|9DQEM36+Wl9qskGjkIcMUMN|iTr zmTp^_@O8FFYw40H>zEhDOj^x+ykA*n=b^C0d;f8S>8|Ap%c_z&YoPvKDoCC6-X!nW zl414lOg(2;_icV=wq!-%db?xkCEn+bZGXflTc2;X{PK>?A;s^WXl_3?G00+-R;inD z_XMWE@P*gboO{mvj59Lx!j-VV3a{mJ{AAY6o>i%py+W3y^ZEUm_4WTh>u*lHDXJM4 zU&w0`b>Q=@oGI61cozC89hq1xY*qN_!Jnc(R|4peT)hxc#y+wq~^S-tD_s~3B>Eo6SX zKJwy;hl-Q8-8D@qv<_7NBe}(9ft!5a(i0Icw;j~_Q1ja?@`v1$b;8veF2^P(AOAj~ zy>9JOtLZEY>mR#JT)g>F@4tgbS|ex9%J`Oia?9`P#nub_RPHXky5%94on7WFH#0T% zLmP{#qD=Bbg1r~Gy4^c=>Y7GRFht f@TVoGHuE)!@VBe!-0MFcP*Zb%-7))!I1L*Bvc5px delta 1154 zcmZqT`p-F`r#|k5QTc3H&w@iN>}&usoZn`>S-_9w^%LcbLpOg>9Jy}&MM3ba=a@q z_W9KY@0(|6>UWv*uktC@#FAHA{JmZ?)%l%eTC(E$`A3F}t(jaSBgE?u-PiuJS9jl( zpU;jI=<=uScR1jDz*#n5%C26&VE?08(ejgS@!i_6cB{6T$^1(R8HX69h2AMUT-Sk-YNY7OgWHw%n=eT_zWmC|ivjl1i!>iDR94@xw18o$X112m z_gOCro5fwYrz|RWbWb&9U)hzOu_*ca!s7Xk5h{zVo{DQ-SrroFYPKb9iIv<{?Rph8 z-B0OOmCIVTt`u_Xt}!uRIpgB$_uC|!K2=E@dCkgBz3|IB*EQ(H+>?>+v)m7zi_Chx zX~hi}tu@L^OJq5omYrGueA_{Oi=y_oQ|BjNy|gM}=`#7nk%vzD`fANluims_-o1j? zrk=B_`!+u_Te2c>{lAX$FXqkZ$v?_mwduC3fBoZgL1%YP4$bRTURn?m`l=_*Op$fb zJEyggbI+@vQQmZE!OFFZK1}hmoM&;z-1KwEw*YI74bSh-`v33q_4{dOH+fImzeh#% zLI&UKt+zG%cS<alwP%a`i6PW`5qy!@8f(ws*~(sc)-h&03o7{#|0#f`vOjFOE1|o63Hp@9~Ab zQODQ)Ul6=_qljdq{Hr5;vcIjKT|T_+`OkiflDxYbd~c_f38@vBYS&!2$98|i^L2M5 zcCViNeB-A54>@kJNTt0zfocy!pRp=lg5?=6*ZAIIDNvepUa%cH2Vcx9cM> zo_MHOc>A5yrX6!v2>)Y>k_%YOe>^B?|gkkj%(t_7dJl2K3N!_ zz4QD-g)i&pY7~`}?YU^*wZlL=Nce1>&djp<{1WynolC5@%rc8PcwF80_K9Op94x~8 z{JWoR&C235Ie+4H#7(Kx3kOUSm()L;zn4961Qe|I%># zX3OWGdy>+V8NeEC};kZ|qD^5`R', methods=['GET'] + '/activities/', methods=['GET'] ) @authenticate -def get_activity(auth_user_id, activity_uuid): +def get_activity(auth_user_id, activity_short_id): """ Get an activity @@ -281,7 +282,7 @@ def get_activity(auth_user_id, activity_uuid): .. sourcecode:: http - GET /api/activities/f03265f69fe0489b812fc7dc4deff55e HTTP/1.1 + GET /api/activities/kjxavSTUrJvoAh2wvCeGEF HTTP/1.1 **Example responses**: @@ -304,7 +305,7 @@ def get_activity(auth_user_id, activity_uuid): "descent": null, "distance": 12, "duration": "0:45:00", - "id": "f03265f69fe0489b812fc7dc4deff55e", + "id": "kjxavSTUrJvoAh2wvCeGEF", "map": null, "max_alt": null, "max_speed": 16, @@ -344,7 +345,7 @@ def get_activity(auth_user_id, activity_uuid): } :param integer auth_user_id: authenticate user id (from JSON Web Token) - :param integer activity_uuid: activity uuid + :param string activity_short_id: activity short id :reqheader Authorization: OAuth 2.0 Bearer Token @@ -357,6 +358,7 @@ def get_activity(auth_user_id, activity_uuid): :statuscode 404: activity not found """ + activity_uuid = decode_short_id(activity_short_id) activity = Activity.query.filter_by(uuid=activity_uuid).first() activities_list = [] @@ -381,8 +383,11 @@ def get_activity(auth_user_id, activity_uuid): return jsonify(response_object), code -def get_activity_data(auth_user_id, activity_uuid, data_type, segment_id=None): +def get_activity_data( + auth_user_id, activity_short_id, data_type, segment_id=None +): """Get data from an activity gpx file""" + activity_uuid = decode_short_id(activity_short_id) activity = Activity.query.filter_by(uuid=activity_uuid).first() content = '' if activity: @@ -392,7 +397,9 @@ def get_activity_data(auth_user_id, activity_uuid, data_type, segment_id=None): if response_object: return jsonify(response_object), code if not activity.gpx or activity.gpx == '': - message = f'No gpx file for this activity (id: {activity_uuid})' + message = ( + f'No gpx file for this activity (id: {activity_short_id})' + ) response_object = {'status': 'error', 'message': message} return jsonify(response_object), 404 @@ -422,7 +429,7 @@ def get_activity_data(auth_user_id, activity_uuid, data_type, segment_id=None): code = 200 else: status = 'not found' - message = f'Activity not found (id: {activity_uuid})' + message = f'Activity not found (id: {activity_short_id})' code = 404 response_object = { @@ -438,10 +445,10 @@ def get_activity_data(auth_user_id, activity_uuid, data_type, segment_id=None): @activities_blueprint.route( - '/activities//gpx', methods=['GET'] + '/activities//gpx', methods=['GET'] ) @authenticate -def get_activity_gpx(auth_user_id, activity_uuid): +def get_activity_gpx(auth_user_id, activity_short_id): """ Get gpx file for an activity displayed on map with Leaflet @@ -449,7 +456,7 @@ def get_activity_gpx(auth_user_id, activity_uuid): .. sourcecode:: http - GET /api/activities/f03265f69fe0489b812fc7dc4deff55e/gpx HTTP/1.1 + GET /api/activities/kjxavSTUrJvoAh2wvCeGEF/gpx HTTP/1.1 Content-Type: application/json **Example response**: @@ -468,7 +475,7 @@ def get_activity_gpx(auth_user_id, activity_uuid): } :param integer auth_user_id: authenticate user id (from JSON Web Token) - :param integer activity_uuid: activity uuid + :param string activity_short_id: activity short id :reqheader Authorization: OAuth 2.0 Bearer Token @@ -483,14 +490,14 @@ def get_activity_gpx(auth_user_id, activity_uuid): :statuscode 500: """ - return get_activity_data(auth_user_id, activity_uuid, 'gpx') + return get_activity_data(auth_user_id, activity_short_id, 'gpx') @activities_blueprint.route( - '/activities//chart_data', methods=['GET'] + '/activities//chart_data', methods=['GET'] ) @authenticate -def get_activity_chart_data(auth_user_id, activity_uuid): +def get_activity_chart_data(auth_user_id, activity_short_id): """ Get chart data from an activity gpx file, to display it with Recharts @@ -498,7 +505,7 @@ def get_activity_chart_data(auth_user_id, activity_uuid): .. sourcecode:: http - GET /api/activities/f03265f69fe0489b812fc7dc4deff55e/chart HTTP/1.1 + GET /api/activities/kjxavSTUrJvoAh2wvCeGEF/chart HTTP/1.1 Content-Type: application/json **Example response**: @@ -536,7 +543,7 @@ def get_activity_chart_data(auth_user_id, activity_uuid): } :param integer auth_user_id: authenticate user id (from JSON Web Token) - :param integer activity_uuid: activity uuid + :param string activity_short_id: activity short id :reqheader Authorization: OAuth 2.0 Bearer Token @@ -551,15 +558,15 @@ def get_activity_chart_data(auth_user_id, activity_uuid): :statuscode 500: """ - return get_activity_data(auth_user_id, activity_uuid, 'chart') + return get_activity_data(auth_user_id, activity_short_id, 'chart') @activities_blueprint.route( - '/activities//gpx/segment/', + '/activities//gpx/segment/', methods=['GET'], ) @authenticate -def get_segment_gpx(auth_user_id, activity_uuid, segment_id): +def get_segment_gpx(auth_user_id, activity_short_id, segment_id): """ Get gpx file for an activity segment displayed on map with Leaflet @@ -567,8 +574,7 @@ def get_segment_gpx(auth_user_id, activity_uuid, segment_id): .. sourcecode:: http - GET /api/activities/f03265f69fe0489b812fc7dc4deff55e/gpx/segment/0 - HTTP/1.1 + GET /api/activities/kjxavSTUrJvoAh2wvCeGEF/gpx/segment/0 HTTP/1.1 Content-Type: application/json **Example response**: @@ -587,7 +593,7 @@ def get_segment_gpx(auth_user_id, activity_uuid, segment_id): } :param integer auth_user_id: authenticate user id (from JSON Web Token) - :param integer activity_uuid: activity uuid + :param string activity_short_id: activity short id :param integer segment_id: segment id :reqheader Authorization: OAuth 2.0 Bearer Token @@ -602,15 +608,18 @@ def get_segment_gpx(auth_user_id, activity_uuid, segment_id): :statuscode 500: """ - return get_activity_data(auth_user_id, activity_uuid, 'gpx', segment_id) + return get_activity_data( + auth_user_id, activity_short_id, 'gpx', segment_id + ) @activities_blueprint.route( - '/activities//chart_data/segment/', + '/activities//chart_data/segment/' + '', methods=['GET'], ) @authenticate -def get_segment_chart_data(auth_user_id, activity_uuid, segment_id): +def get_segment_chart_data(auth_user_id, activity_short_id, segment_id): """ Get chart data from an activity gpx file, to display it with Recharts @@ -618,8 +627,7 @@ def get_segment_chart_data(auth_user_id, activity_uuid, segment_id): .. sourcecode:: http - GET /api/activities/f03265f69fe0489b812fc7dc4deff55e/chart/segment/0 - HTTP/1.1 + GET /api/activities/kjxavSTUrJvoAh2wvCeGEF/chart/segment/0 HTTP/1.1 Content-Type: application/json **Example response**: @@ -657,7 +665,7 @@ def get_segment_chart_data(auth_user_id, activity_uuid, segment_id): } :param integer auth_user_id: authenticate user id (from JSON Web Token) - :param integer activity_uuid: activity uuid + :param string activity_short_id: activity short id :param integer segment_id: segment id :reqheader Authorization: OAuth 2.0 Bearer Token @@ -672,7 +680,9 @@ def get_segment_chart_data(auth_user_id, activity_uuid, segment_id): :statuscode 500: """ - return get_activity_data(auth_user_id, activity_uuid, 'chart', segment_id) + return get_activity_data( + auth_user_id, activity_short_id, 'chart', segment_id + ) @activities_blueprint.route('/activities/map/', methods=['GET']) @@ -794,7 +804,7 @@ def post_activity(auth_user_id): "descent": null, "distance": 10.0, "duration": "0:17:04", - "id": "f03265f69fe0489b812fc7dc4deff55e", + "id": "kjxavSTUrJvoAh2wvCeGEF", "map": null, "max_alt": null, "max_speed": 10.0, @@ -808,7 +818,7 @@ def post_activity(auth_user_id): "records": [ { "activity_date": "Mon, 01 Jan 2018 00:00:00 GMT", - "activity_id": "f03265f69fe0489b812fc7dc4deff55e", + "activity_id": "kjxavSTUrJvoAh2wvCeGEF", "id": 4, "record_type": "MS", "sport_id": 1, @@ -817,7 +827,7 @@ def post_activity(auth_user_id): }, { "activity_date": "Mon, 01 Jan 2018 00:00:00 GMT", - "activity_id": "f03265f69fe0489b812fc7dc4deff55e", + "activity_id": "kjxavSTUrJvoAh2wvCeGEF", "id": 3, "record_type": "LD", "sport_id": 1, @@ -826,7 +836,7 @@ def post_activity(auth_user_id): }, { "activity_date": "Mon, 01 Jan 2018 00:00:00 GMT", - "activity_id": "f03265f69fe0489b812fc7dc4deff55e", + "activity_id": "kjxavSTUrJvoAh2wvCeGEF", "id": 2, "record_type": "FD", "sport_id": 1, @@ -835,7 +845,7 @@ def post_activity(auth_user_id): }, { "activity_date": "Mon, 01 Jan 2018 00:00:00 GMT", - "activity_id": "f03265f69fe0489b812fc7dc4deff55e", + "activity_id": "kjxavSTUrJvoAh2wvCeGEF", "id": 1, "record_type": "AS", "sport_id": 1, @@ -883,7 +893,7 @@ def post_activity(auth_user_id): if response_object['status'] != 'success': return jsonify(response_object), response_code - activity_data = json.loads(request.form["data"]) + activity_data = json.loads(request.form['data']) if not activity_data or activity_data.get('sport_id') is None: response_object = {'status': 'error', 'message': 'Invalid payload.'} return jsonify(response_object), 400 @@ -972,7 +982,7 @@ def post_activity_no_gpx(auth_user_id): "records": [ { "activity_date": "Mon, 01 Jan 2018 00:00:00 GMT", - "activity_id": "f03265f69fe0489b812fc7dc4deff55e", + "activity_id": "kjxavSTUrJvoAh2wvCeGEF", "id": 4, "record_type": "MS", "sport_id": 1, @@ -981,7 +991,7 @@ def post_activity_no_gpx(auth_user_id): }, { "activity_date": "Mon, 01 Jan 2018 00:00:00 GMT", - "activity_id": "f03265f69fe0489b812fc7dc4deff55e", + "activity_id": "kjxavSTUrJvoAh2wvCeGEF", "id": 3, "record_type": "LD", "sport_id": 1, @@ -990,7 +1000,7 @@ def post_activity_no_gpx(auth_user_id): }, { "activity_date": "Mon, 01 Jan 2018 00:00:00 GMT", - "activity_id": "f03265f69fe0489b812fc7dc4deff55e", + "activity_id": "kjxavSTUrJvoAh2wvCeGEF", "id": 2, "record_type": "FD", "sport_id": 1, @@ -999,7 +1009,7 @@ def post_activity_no_gpx(auth_user_id): }, { "activity_date": "Mon, 01 Jan 2018 00:00:00 GMT", - "activity_id": "f03265f69fe0489b812fc7dc4deff55e", + "activity_id": "kjxavSTUrJvoAh2wvCeGEF", "id": 1, "record_type": "AS", "sport_id": 1, @@ -1011,7 +1021,7 @@ def post_activity_no_gpx(auth_user_id): "sport_id": 1, "title": null, "user": "admin", - "uuid": "f03265f69fe0489b812fc7dc4deff55e" + "uuid": "kjxavSTUrJvoAh2wvCeGEF" "weather_end": null, "weather_start": null, "with_gpx": false @@ -1075,10 +1085,10 @@ def post_activity_no_gpx(auth_user_id): @activities_blueprint.route( - '/activities/', methods=['PATCH'] + '/activities/', methods=['PATCH'] ) @authenticate -def update_activity(auth_user_id, activity_uuid): +def update_activity(auth_user_id, activity_short_id): """ Update an activity @@ -1121,7 +1131,7 @@ def update_activity(auth_user_id, activity_uuid): "records": [ { "activity_date": "Mon, 01 Jan 2018 00:00:00 GMT", - "activity_id": "f03265f69fe0489b812fc7dc4deff55e", + "activity_id": "kjxavSTUrJvoAh2wvCeGEF", "id": 4, "record_type": "MS", "sport_id": 1, @@ -1130,7 +1140,7 @@ def update_activity(auth_user_id, activity_uuid): }, { "activity_date": "Mon, 01 Jan 2018 00:00:00 GMT", - "activity_id": "f03265f69fe0489b812fc7dc4deff55e", + "activity_id": "kjxavSTUrJvoAh2wvCeGEF", "id": 3, "record_type": "LD", "sport_id": 1, @@ -1139,7 +1149,7 @@ def update_activity(auth_user_id, activity_uuid): }, { "activity_date": "Mon, 01 Jan 2018 00:00:00 GMT", - "activity_id": "f03265f69fe0489b812fc7dc4deff55e", + "activity_id": "kjxavSTUrJvoAh2wvCeGEF", "id": 2, "record_type": "FD", "sport_id": 1, @@ -1148,7 +1158,7 @@ def update_activity(auth_user_id, activity_uuid): }, { "activity_date": "Mon, 01 Jan 2018 00:00:00 GMT", - "activity_id": "f03265f69fe0489b812fc7dc4deff55e", + "activity_id": "kjxavSTUrJvoAh2wvCeGEF", "id": 1, "record_type": "AS", "sport_id": 1, @@ -1160,7 +1170,7 @@ def update_activity(auth_user_id, activity_uuid): "sport_id": 1, "title": null, "user": "admin", - "uuid": "f03265f69fe0489b812fc7dc4deff55e" + "uuid": "kjxavSTUrJvoAh2wvCeGEF" "weather_end": null, "weather_start": null, "with_gpx": false @@ -1171,7 +1181,7 @@ def update_activity(auth_user_id, activity_uuid): } :param integer auth_user_id: authenticate user id (from JSON Web Token) - :param integer activity_uuid: activity uuid + :param string activity_short_id: activity short id :', methods=['DELETE'] + '/activities/', methods=['DELETE'] ) @authenticate -def delete_activity(auth_user_id, activity_uuid): +def delete_activity(auth_user_id, activity_short_id): """ Delete an activity @@ -1245,7 +1256,7 @@ def delete_activity(auth_user_id, activity_uuid): .. sourcecode:: http - DELETE /api/activities/f03265f69fe0489b812fc7dc4deff55e HTTP/1.1 + DELETE /api/activities/kjxavSTUrJvoAh2wvCeGEF HTTP/1.1 Content-Type: application/json **Example response**: @@ -1256,7 +1267,7 @@ def delete_activity(auth_user_id, activity_uuid): Content-Type: application/json :param integer auth_user_id: authenticate user id (from JSON Web Token) - :param integer activity_uuid: activity uuid + :param string activity_short_id: activity short id :reqheader Authorization: OAuth 2.0 Bearer Token @@ -1271,6 +1282,7 @@ def delete_activity(auth_user_id, activity_uuid): """ try: + activity_uuid = decode_short_id(activity_short_id) activity = Activity.query.filter_by(uuid=activity_uuid).first() if activity: response_object, code = can_view_activity( diff --git a/fittrackee/activities/models.py b/fittrackee/activities/models.py index 60272dbc..f66fbc44 100644 --- a/fittrackee/activities/models.py +++ b/fittrackee/activities/models.py @@ -11,6 +11,7 @@ from sqlalchemy.types import JSON, Enum from .utils_files import get_absolute_file_path from .utils_format import convert_in_duration, convert_value_to_integer +from .utils_id import encode_uuid record_types = [ 'AS', # 'Best Average Speed' @@ -147,6 +148,10 @@ class Activity(db.Model): self.distance = distance self.duration = duration + @property + def short_id(self): + return encode_uuid(self.uuid) + def serialize(self, params=None): date_from = params.get('from') if params else None date_to = params.get('to') if params else None @@ -234,7 +239,7 @@ class Activity(db.Model): .first() ) return { - "id": self.uuid.hex, # WARNING: client use uuid as id + "id": self.short_id, # WARNING: client use uuid as id "user": self.user.username, "sport_id": self.sport_id, "title": self.title, @@ -255,10 +260,10 @@ class Activity(db.Model): "bounds": [float(bound) for bound in self.bounds] if self.bounds else [], # noqa - "previous_activity": previous_activity.uuid.hex + "previous_activity": previous_activity.short_id if previous_activity else None, # noqa - "next_activity": next_activity.uuid.hex if next_activity else None, + "next_activity": next_activity.short_id if next_activity else None, "segments": [segment.serialize() for segment in self.segments], "records": [record.serialize() for record in self.records], "map": self.map_id if self.map else None, @@ -351,7 +356,7 @@ class ActivitySegment(db.Model): def __str__(self): return ( f'' + f'for activity \'{encode_uuid(self.activity_uuid)}\'>' ) def __init__(self, segment_id, activity_id, activity_uuid): @@ -361,7 +366,7 @@ class ActivitySegment(db.Model): def serialize(self): return { - "activity_id": self.activity_uuid.hex, + "activity_id": encode_uuid(self.activity_uuid), "segment_id": self.segment_id, "duration": str(self.duration) if self.duration else None, "pauses": str(self.pauses) if self.pauses else None, @@ -438,7 +443,7 @@ class Record(db.Model): "id": self.id, "user": self.user.username, "sport_id": self.sport_id, - "activity_id": self.activity_uuid.hex, + "activity_id": encode_uuid(self.activity_uuid), "record_type": self.record_type, "activity_date": self.activity_date, "value": value, diff --git a/fittrackee/activities/records.py b/fittrackee/activities/records.py index 40d85d51..48cb585b 100644 --- a/fittrackee/activities/records.py +++ b/fittrackee/activities/records.py @@ -39,7 +39,7 @@ def get_records(auth_user_id): "records": [ { "activity_date": "Sun, 07 Jul 2019 08:00:00 GMT", - "activity_id": "e060bde05e3f4906a32913b102c814cb", + "activity_id": "hvYBqYBRa7wwXpaStWR4V2", "id": 9, "record_type": "AS", "sport_id": 1, @@ -48,7 +48,7 @@ def get_records(auth_user_id): }, { "activity_date": "Sun, 07 Jul 2019 08:00:00 GMT", - "activity_id": "e060bde05e3f4906a32913b102c814cb", + "activity_id": "hvYBqYBRa7wwXpaStWR4V2", "id": 10, "record_type": "FD", "sport_id": 1, @@ -57,7 +57,7 @@ def get_records(auth_user_id): }, { "activity_date": "Sun, 07 Jul 2019 08:00:00 GMT", - "activity_id": "e060bde05e3f4906a32913b102c814cb", + "activity_id": "hvYBqYBRa7wwXpaStWR4V2", "id": 11, "record_type": "LD", "sport_id": 1, @@ -66,7 +66,7 @@ def get_records(auth_user_id): }, { "activity_date": "Sun, 07 Jul 2019 08:00:00 GMT", - "activity_id": "e060bde05e3f4906a32913b102c814cb", + "activity_id": "hvYBqYBRa7wwXpaStWR4V2", "id": 12, "record_type": "MS", "sport_id": 1, diff --git a/fittrackee/activities/utils_id.py b/fittrackee/activities/utils_id.py new file mode 100644 index 00000000..5ea88bc7 --- /dev/null +++ b/fittrackee/activities/utils_id.py @@ -0,0 +1,9 @@ +import shortuuid + + +def encode_uuid(uuid_value): + return shortuuid.encode(uuid_value) + + +def decode_short_id(short_id): + return shortuuid.decode(short_id) diff --git a/fittrackee/tests/activities/test_activities_api_0_get.py b/fittrackee/tests/activities/test_activities_api_0_get.py index 452ac941..50d83f46 100644 --- a/fittrackee/tests/activities/test_activities_api_0_get.py +++ b/fittrackee/tests/activities/test_activities_api_0_get.py @@ -1,6 +1,8 @@ import json from uuid import uuid4 +from .utils import get_random_short_id + class TestGetActivities: def test_it_gets_all_activities_for_authenticated_user( @@ -695,7 +697,7 @@ class TestGetActivity: ) response = client.get( - f'/api/activities/{activity_cycling_user_1.uuid.hex}', + f'/api/activities/{activity_cycling_user_1.short_id}', headers=dict( Authorization='Bearer ' + json.loads(resp_login.data.decode())['auth_token'] @@ -727,7 +729,7 @@ class TestGetActivity: ) response = client.get( - f'/api/activities/{activity_cycling_user_2.uuid.hex}', + f'/api/activities/{activity_cycling_user_2.short_id}', headers=dict( Authorization='Bearer ' + json.loads(resp_login.data.decode())['auth_token'] @@ -748,7 +750,7 @@ class TestGetActivity: ) response = client.get( - f'/api/activities/{uuid4().hex}', + f'/api/activities/{get_random_short_id()}', headers=dict( Authorization='Bearer ' + json.loads(resp_login.data.decode())['auth_token'] @@ -763,7 +765,7 @@ class TestGetActivity: def test_it_returns_404_on_getting_gpx_if_activity_does_not_exist( self, app, user_1 ): - random_uuid = uuid4().hex + random_short_id = get_random_short_id() client = app.test_client() resp_login = client.post( '/api/auth/login', @@ -772,7 +774,7 @@ class TestGetActivity: ) response = client.get( - f'/api/activities/{random_uuid}/gpx', + f'/api/activities/{random_short_id}/gpx', headers=dict( Authorization='Bearer ' + json.loads(resp_login.data.decode())['auth_token'] @@ -782,13 +784,13 @@ class TestGetActivity: data = json.loads(response.data.decode()) assert response.status_code == 404 assert 'not found' in data['status'] - assert f'Activity not found (id: {random_uuid})' in data['message'] + assert f'Activity not found (id: {random_short_id})' in data['message'] assert data['data']['gpx'] == '' def test_it_returns_404_on_getting_chart_data_if_activity_does_not_exist( self, app, user_1 ): - random_uuid = uuid4().hex + random_short_id = get_random_short_id() client = app.test_client() resp_login = client.post( '/api/auth/login', @@ -797,7 +799,7 @@ class TestGetActivity: ) response = client.get( - f'/api/activities/{random_uuid}/chart_data', + f'/api/activities/{random_short_id}/chart_data', headers=dict( Authorization='Bearer ' + json.loads(resp_login.data.decode())['auth_token'] @@ -807,13 +809,13 @@ class TestGetActivity: data = json.loads(response.data.decode()) assert response.status_code == 404 assert 'not found' in data['status'] - assert f'Activity not found (id: {random_uuid})' in data['message'] + assert f'Activity not found (id: {random_short_id})' in data['message'] assert data['data']['chart_data'] == '' def test_it_returns_404_on_getting_gpx_if_activity_have_no_gpx( self, app, user_1, sport_1_cycling, activity_cycling_user_1 ): - activity_uuid = activity_cycling_user_1.uuid.hex + activity_short_id = activity_cycling_user_1.short_id client = app.test_client() resp_login = client.post( '/api/auth/login', @@ -822,7 +824,7 @@ class TestGetActivity: ) response = client.get( - f'/api/activities/{activity_uuid}/gpx', + f'/api/activities/{activity_short_id}/gpx', headers=dict( Authorization='Bearer ' + json.loads(resp_login.data.decode())['auth_token'] @@ -833,14 +835,14 @@ class TestGetActivity: assert response.status_code == 404 assert 'error' in data['status'] assert ( - f'No gpx file for this activity (id: {activity_uuid})' + f'No gpx file for this activity (id: {activity_short_id})' in data['message'] ) def test_it_returns_404_if_activity_have_no_chart_data( self, app, user_1, sport_1_cycling, activity_cycling_user_1 ): - activity_uuid = activity_cycling_user_1.uuid.hex + activity_short_id = activity_cycling_user_1.short_id client = app.test_client() resp_login = client.post( '/api/auth/login', @@ -849,7 +851,7 @@ class TestGetActivity: ) response = client.get( - f'/api/activities/{activity_uuid}/chart_data', + f'/api/activities/{activity_short_id}/chart_data', headers=dict( Authorization='Bearer ' + json.loads(resp_login.data.decode())['auth_token'] @@ -860,7 +862,7 @@ class TestGetActivity: assert response.status_code == 404 assert 'error' in data['status'] assert ( - f'No gpx file for this activity (id: {activity_uuid})' + f'No gpx file for this activity (id: {activity_short_id})' in data['message'] ) @@ -876,7 +878,7 @@ class TestGetActivity: ) response = client.get( - f'/api/activities/{activity_cycling_user_1.uuid.hex}/gpx', + f'/api/activities/{activity_cycling_user_1.short_id}/gpx', headers=dict( Authorization='Bearer ' + json.loads(resp_login.data.decode())['auth_token'] @@ -901,7 +903,7 @@ class TestGetActivity: ) response = client.get( - f'/api/activities/{activity_cycling_user_1.uuid.hex}/chart_data', + f'/api/activities/{activity_cycling_user_1.short_id}/chart_data', headers=dict( Authorization='Bearer ' + json.loads(resp_login.data.decode())['auth_token'] diff --git a/fittrackee/tests/activities/test_activities_api_1_post.py b/fittrackee/tests/activities/test_activities_api_1_post.py index 0343c03c..97b4bffc 100644 --- a/fittrackee/tests/activities/test_activities_api_1_post.py +++ b/fittrackee/tests/activities/test_activities_api_1_post.py @@ -4,6 +4,7 @@ from datetime import datetime from io import BytesIO from fittrackee.activities.models import Activity +from fittrackee.activities.utils_id import decode_short_id def assert_activity_data_with_gpx(data): @@ -782,10 +783,10 @@ class TestPostAndGetActivityWithGpx: else: assert_activity_data_with_gpx(data) map_id = data['data']['activities'][0]['map'] - activity_uuid = data['data']['activities'][0]['id'] + activity_short_id = data['data']['activities'][0]['id'] response = client.get( - f'/api/activities/{activity_uuid}/gpx', + f'/api/activities/{activity_short_id}/gpx', headers=dict( Authorization='Bearer ' + json.loads(resp_login.data.decode())['auth_token'] @@ -799,7 +800,7 @@ class TestPostAndGetActivityWithGpx: assert len(data['data']['gpx']) != '' response = client.get( - f'/api/activities/{activity_uuid}/gpx/segment/1', + f'/api/activities/{activity_short_id}/gpx/segment/1', headers=dict( Authorization='Bearer ' + json.loads(resp_login.data.decode())['auth_token'] @@ -822,6 +823,7 @@ class TestPostAndGetActivityWithGpx: assert response.status_code == 200 # error case in the same test to avoid generate a new map file + activity_uuid = decode_short_id(activity_short_id) activity = Activity.query.filter_by(uuid=activity_uuid).first() activity.map = 'incorrect path' @@ -876,9 +878,9 @@ class TestPostAndGetActivityWithGpx: ), ) data = json.loads(response.data.decode()) - activity_uuid = data['data']['activities'][0]['id'] + activity_short_id = data['data']['activities'][0]['id'] response = client.get( - f'/api/activities/{activity_uuid}/chart_data', + f'/api/activities/{activity_short_id}/chart_data', headers=dict( Authorization='Bearer ' + json.loads(resp_login.data.decode())['auth_token'] @@ -914,9 +916,9 @@ class TestPostAndGetActivityWithGpx: ), ) data = json.loads(response.data.decode()) - activity_uuid = data['data']['activities'][0]['id'] + activity_short_id = data['data']['activities'][0]['id'] response = client.get( - f'/api/activities/{activity_uuid}/chart_data/segment/1', + f'/api/activities/{activity_short_id}/chart_data/segment/1', headers=dict( Authorization='Bearer ' + json.loads(resp_login.data.decode())['auth_token'] @@ -951,7 +953,7 @@ class TestPostAndGetActivityWithGpx: ), ) data = json.loads(response.data.decode()) - activity_uuid = data['data']['activities'][0]['id'] + activity_short_id = data['data']['activities'][0]['id'] resp_login = client.post( '/api/auth/login', @@ -959,7 +961,7 @@ class TestPostAndGetActivityWithGpx: content_type='application/json', ) response = client.get( - f'/api/activities/{activity_uuid}/chart_data', + f'/api/activities/{activity_short_id}/chart_data', headers=dict( Authorization='Bearer ' + json.loads(resp_login.data.decode())['auth_token'] @@ -994,9 +996,9 @@ class TestPostAndGetActivityWithGpx: ), ) data = json.loads(response.data.decode()) - activity_uuid = data['data']['activities'][0]['id'] + activity_short_id = data['data']['activities'][0]['id'] response = client.get( - f'/api/activities/{activity_uuid}/chart_data/segment/0', + f'/api/activities/{activity_short_id}/chart_data/segment/0', headers=dict( Authorization='Bearer ' + json.loads(resp_login.data.decode())['auth_token'] @@ -1032,9 +1034,9 @@ class TestPostAndGetActivityWithGpx: ), ) data = json.loads(response.data.decode()) - activity_uuid = data['data']['activities'][0]['id'] + activity_short_id = data['data']['activities'][0]['id'] response = client.get( - f'/api/activities/{activity_uuid}/chart_data/segment/999999', + f'/api/activities/{activity_short_id}/chart_data/segment/999999', headers=dict( Authorization='Bearer ' + json.loads(resp_login.data.decode())['auth_token'] @@ -1076,9 +1078,9 @@ class TestPostAndGetActivityWithoutGpx: ), ) data = json.loads(response.data.decode()) - activity_uuid = data['data']['activities'][0]['id'] + activity_short_id = data['data']['activities'][0]['id'] response = client.get( - f'/api/activities/{activity_uuid}', + f'/api/activities/{activity_short_id}', headers=dict( Authorization='Bearer ' + json.loads(resp_login.data.decode())['auth_token'] @@ -1119,9 +1121,9 @@ class TestPostAndGetActivityWithoutGpx: ), ) data = json.loads(response.data.decode()) - activity_uuid = data['data']['activities'][0]['id'] + activity_short_id = data['data']['activities'][0]['id'] response = client.get( - f'/api/activities/{activity_uuid}', + f'/api/activities/{activity_short_id}', headers=dict( Authorization='Bearer ' + json.loads(resp_login.data.decode())['auth_token'] @@ -1164,9 +1166,9 @@ class TestPostAndGetActivityUsingTimezones: ), ) data = json.loads(response.data.decode()) - activity_uuid = data['data']['activities'][0]['id'] + activity_short_id = data['data']['activities'][0]['id'] response = client.get( - f'/api/activities/{activity_uuid}', + f'/api/activities/{activity_short_id}', headers=dict( Authorization='Bearer ' + json.loads(resp_login.data.decode())['auth_token'] diff --git a/fittrackee/tests/activities/test_activities_api_2_patch.py b/fittrackee/tests/activities/test_activities_api_2_patch.py index f328128f..f1ffb81c 100644 --- a/fittrackee/tests/activities/test_activities_api_2_patch.py +++ b/fittrackee/tests/activities/test_activities_api_2_patch.py @@ -1,9 +1,9 @@ import json -from uuid import uuid4 from fittrackee.activities.models import Activity +from fittrackee.activities.utils_id import decode_short_id -from .utils import post_an_activity +from .utils import get_random_short_id, post_an_activity def assert_activity_data_with_gpx(data, sport_id): @@ -53,11 +53,11 @@ class TestEditActivityWithGpx: def test_it_updates_title_for_an_activity_with_gpx( self, app, user_1, sport_1_cycling, sport_2_running, gpx_file ): - token, activity_uuid = post_an_activity(app, gpx_file) + token, activity_short_id = post_an_activity(app, gpx_file) client = app.test_client() response = client.patch( - f'/api/activities/{activity_uuid}', + f'/api/activities/{activity_short_id}', content_type='application/json', data=json.dumps(dict(sport_id=2, title="Activity test")), headers=dict(Authorization=f'Bearer {token}'), @@ -74,11 +74,11 @@ class TestEditActivityWithGpx: def test_it_adds_notes_for_an_activity_with_gpx( self, app, user_1, sport_1_cycling, sport_2_running, gpx_file ): - token, activity_uuid = post_an_activity(app, gpx_file) + token, activity_short_id = post_an_activity(app, gpx_file) client = app.test_client() response = client.patch( - f'/api/activities/{activity_uuid}', + f'/api/activities/{activity_short_id}', content_type='application/json', data=json.dumps(dict(notes="test notes")), headers=dict(Authorization=f'Bearer {token}'), @@ -94,7 +94,7 @@ class TestEditActivityWithGpx: def test_it_raises_403_when_editing_an_activity_from_different_user( self, app, user_1, user_2, sport_1_cycling, sport_2_running, gpx_file ): - _, activity_uuid = post_an_activity(app, gpx_file) + _, activity_short_id = post_an_activity(app, gpx_file) client = app.test_client() resp_login = client.post( '/api/auth/login', @@ -103,7 +103,7 @@ class TestEditActivityWithGpx: ) response = client.patch( - f'/api/activities/{activity_uuid}', + f'/api/activities/{activity_short_id}', content_type='application/json', data=json.dumps(dict(sport_id=2, title="Activity test")), headers=dict( @@ -120,11 +120,11 @@ class TestEditActivityWithGpx: def test_it_updates_sport( self, app, user_1, sport_1_cycling, sport_2_running, gpx_file ): - token, activity_uuid = post_an_activity(app, gpx_file) + token, activity_short_id = post_an_activity(app, gpx_file) client = app.test_client() response = client.patch( - f'/api/activities/{activity_uuid}', + f'/api/activities/{activity_short_id}', content_type='application/json', data=json.dumps(dict(sport_id=2)), headers=dict(Authorization=f'Bearer {token}'), @@ -141,11 +141,11 @@ class TestEditActivityWithGpx: def test_it_returns_400_if_payload_is_empty( self, app, user_1, sport_1_cycling, gpx_file ): - token, activity_uuid = post_an_activity(app, gpx_file) + token, activity_short_id = post_an_activity(app, gpx_file) client = app.test_client() response = client.patch( - f'/api/activities/{activity_uuid}', + f'/api/activities/{activity_short_id}', content_type='application/json', data=json.dumps(dict()), headers=dict(Authorization=f'Bearer {token}'), @@ -159,11 +159,11 @@ class TestEditActivityWithGpx: def test_it_raises_500_if_sport_does_not_exists( self, app, user_1, sport_1_cycling, gpx_file ): - token, activity_uuid = post_an_activity(app, gpx_file) + token, activity_short_id = post_an_activity(app, gpx_file) client = app.test_client() response = client.patch( - f'/api/activities/{activity_uuid}', + f'/api/activities/{activity_short_id}', content_type='application/json', data=json.dumps(dict(sport_id=2)), headers=dict(Authorization=f'Bearer {token}'), @@ -187,7 +187,7 @@ class TestEditActivityWithoutGpx: sport_2_running, activity_cycling_user_1, ): - activity_uuid = activity_cycling_user_1.uuid.hex + activity_short_id = activity_cycling_user_1.short_id client = app.test_client() resp_login = client.post( '/api/auth/login', @@ -196,7 +196,7 @@ class TestEditActivityWithoutGpx: ) response = client.patch( - f'/api/activities/{activity_uuid}', + f'/api/activities/{activity_short_id}', content_type='application/json', data=json.dumps( dict( @@ -245,22 +245,22 @@ class TestEditActivityWithoutGpx: records = data['data']['activities'][0]['records'] assert len(records) == 4 assert records[0]['sport_id'] == sport_2_running.id - assert records[0]['activity_id'] == activity_uuid + assert records[0]['activity_id'] == activity_short_id assert records[0]['record_type'] == 'MS' assert records[0]['activity_date'] == 'Tue, 15 May 2018 15:05:00 GMT' assert records[0]['value'] == 8.0 assert records[1]['sport_id'] == sport_2_running.id - assert records[1]['activity_id'] == activity_uuid + assert records[1]['activity_id'] == activity_short_id assert records[1]['record_type'] == 'LD' assert records[1]['activity_date'] == 'Tue, 15 May 2018 15:05:00 GMT' assert records[1]['value'] == '1:00:00' assert records[2]['sport_id'] == sport_2_running.id - assert records[2]['activity_id'] == activity_uuid + assert records[2]['activity_id'] == activity_short_id assert records[2]['record_type'] == 'FD' assert records[2]['activity_date'] == 'Tue, 15 May 2018 15:05:00 GMT' assert records[2]['value'] == 8.0 assert records[3]['sport_id'] == sport_2_running.id - assert records[3]['activity_id'] == activity_uuid + assert records[3]['activity_id'] == activity_short_id assert records[3]['record_type'] == 'AS' assert records[3]['activity_date'] == 'Tue, 15 May 2018 15:05:00 GMT' assert records[3]['value'] == 8.0 @@ -268,7 +268,7 @@ class TestEditActivityWithoutGpx: def test_it_adds_notes_to_an_activity_wo_gpx( self, app, user_1, sport_1_cycling, activity_cycling_user_1 ): - activity_uuid = activity_cycling_user_1.uuid.hex + activity_short_id = activity_cycling_user_1.short_id client = app.test_client() resp_login = client.post( '/api/auth/login', @@ -277,7 +277,7 @@ class TestEditActivityWithoutGpx: ) response = client.patch( - f'/api/activities/{activity_uuid}', + f'/api/activities/{activity_short_id}', content_type='application/json', data=json.dumps(dict(notes='test notes')), headers=dict( @@ -317,22 +317,22 @@ class TestEditActivityWithoutGpx: records = data['data']['activities'][0]['records'] assert len(records) == 4 assert records[0]['sport_id'] == sport_1_cycling.id - assert records[0]['activity_id'] == activity_uuid + assert records[0]['activity_id'] == activity_short_id assert records[0]['record_type'] == 'MS' assert records[0]['activity_date'] == 'Mon, 01 Jan 2018 00:00:00 GMT' assert records[0]['value'] == 10.0 assert records[1]['sport_id'] == sport_1_cycling.id - assert records[1]['activity_id'] == activity_uuid + assert records[1]['activity_id'] == activity_short_id assert records[1]['record_type'] == 'LD' assert records[1]['activity_date'] == 'Mon, 01 Jan 2018 00:00:00 GMT' assert records[1]['value'] == '1:00:00' assert records[2]['sport_id'] == sport_1_cycling.id - assert records[2]['activity_id'] == activity_uuid + assert records[2]['activity_id'] == activity_short_id assert records[2]['record_type'] == 'FD' assert records[2]['activity_date'] == 'Mon, 01 Jan 2018 00:00:00 GMT' assert records[2]['value'] == 10.0 assert records[3]['sport_id'] == sport_1_cycling.id - assert records[3]['activity_id'] == activity_uuid + assert records[3]['activity_id'] == activity_short_id assert records[3]['record_type'] == 'AS' assert records[3]['activity_date'] == 'Mon, 01 Jan 2018 00:00:00 GMT' assert records[3]['value'] == 10.0 @@ -348,7 +348,7 @@ class TestEditActivityWithoutGpx: ) response = client.patch( - f'/api/activities/{activity_cycling_user_2.uuid}', + f'/api/activities/{activity_cycling_user_2.short_id}', content_type='application/json', data=json.dumps( dict( @@ -378,7 +378,7 @@ class TestEditActivityWithoutGpx: sport_2_running, activity_cycling_user_1, ): - activity_uuid = activity_cycling_user_1.uuid.hex + activity_short_id = activity_cycling_user_1.short_id client = app.test_client() resp_login = client.post( '/api/auth/login', @@ -387,7 +387,7 @@ class TestEditActivityWithoutGpx: ) response = client.patch( - f'/api/activities/{activity_uuid}', + f'/api/activities/{activity_short_id}', content_type='application/json', data=json.dumps( dict( @@ -431,22 +431,22 @@ class TestEditActivityWithoutGpx: records = data['data']['activities'][0]['records'] assert len(records) == 4 assert records[0]['sport_id'] == sport_2_running.id - assert records[0]['activity_id'] == activity_uuid + assert records[0]['activity_id'] == activity_short_id assert records[0]['record_type'] == 'MS' assert records[0]['activity_date'] == 'Tue, 15 May 2018 13:05:00 GMT' assert records[0]['value'] == 8.0 assert records[1]['sport_id'] == sport_2_running.id - assert records[1]['activity_id'] == activity_uuid + assert records[1]['activity_id'] == activity_short_id assert records[1]['record_type'] == 'LD' assert records[1]['activity_date'] == 'Tue, 15 May 2018 13:05:00 GMT' assert records[1]['value'] == '1:00:00' assert records[2]['sport_id'] == sport_2_running.id - assert records[2]['activity_id'] == activity_uuid + assert records[2]['activity_id'] == activity_short_id assert records[2]['record_type'] == 'FD' assert records[2]['activity_date'] == 'Tue, 15 May 2018 13:05:00 GMT' assert records[2]['value'] == 8.0 assert records[3]['sport_id'] == sport_2_running.id - assert records[3]['activity_id'] == activity_uuid + assert records[3]['activity_id'] == activity_short_id assert records[3]['record_type'] == 'AS' assert records[3]['activity_date'] == 'Tue, 15 May 2018 13:05:00 GMT' assert records[3]['value'] == 8.0 @@ -459,7 +459,7 @@ class TestEditActivityWithoutGpx: sport_2_running, activity_cycling_user_1, ): - activity_uuid = activity_cycling_user_1.uuid.hex + activity_short_id = activity_cycling_user_1.short_id client = app.test_client() resp_login = client.post( '/api/auth/login', @@ -468,7 +468,7 @@ class TestEditActivityWithoutGpx: ) response = client.patch( - f'/api/activities/{activity_uuid}', + f'/api/activities/{activity_short_id}', content_type='application/json', data=json.dumps(dict(sport_id=2, distance=20)), headers=dict( @@ -504,22 +504,22 @@ class TestEditActivityWithoutGpx: records = data['data']['activities'][0]['records'] assert len(records) == 4 assert records[0]['sport_id'] == sport_2_running.id - assert records[0]['activity_id'] == activity_uuid + assert records[0]['activity_id'] == activity_short_id assert records[0]['record_type'] == 'MS' assert records[0]['activity_date'] == 'Mon, 01 Jan 2018 00:00:00 GMT' assert records[0]['value'] == 20.0 assert records[1]['sport_id'] == sport_2_running.id - assert records[1]['activity_id'] == activity_uuid + assert records[1]['activity_id'] == activity_short_id assert records[1]['record_type'] == 'LD' assert records[1]['activity_date'] == 'Mon, 01 Jan 2018 00:00:00 GMT' assert records[1]['value'] == '1:00:00' assert records[2]['sport_id'] == sport_2_running.id - assert records[2]['activity_id'] == activity_uuid + assert records[2]['activity_id'] == activity_short_id assert records[2]['record_type'] == 'FD' assert records[2]['activity_date'] == 'Mon, 01 Jan 2018 00:00:00 GMT' assert records[2]['value'] == 20.0 assert records[3]['sport_id'] == sport_2_running.id - assert records[3]['activity_id'] == activity_uuid + assert records[3]['activity_id'] == activity_short_id assert records[3]['record_type'] == 'AS' assert records[3]['activity_date'] == 'Mon, 01 Jan 2018 00:00:00 GMT' assert records[3]['value'] == 20.0 @@ -535,7 +535,7 @@ class TestEditActivityWithoutGpx: ) response = client.patch( - f'/api/activities/{activity_cycling_user_1.uuid}', + f'/api/activities/{activity_cycling_user_1.short_id}', content_type='application/json', data=json.dumps(dict()), headers=dict( @@ -559,7 +559,7 @@ class TestEditActivityWithoutGpx: content_type='application/json', ) response = client.patch( - f'/api/activities/{activity_cycling_user_1.uuid}', + f'/api/activities/{activity_cycling_user_1.short_id}', content_type='application/json', data=json.dumps( dict( @@ -594,7 +594,7 @@ class TestEditActivityWithoutGpx: content_type='application/json', ) response = client.patch( - f'/api/activities/{uuid4().hex}', + f'/api/activities/{get_random_short_id()}', content_type='application/json', data=json.dumps( dict( @@ -620,7 +620,8 @@ class TestRefreshActivityWithGpx: def test_refresh_an_activity_with_gpx( self, app, user_1, sport_1_cycling, sport_2_running, gpx_file ): - token, activity_uuid = post_an_activity(app, gpx_file) + token, activity_short_id = post_an_activity(app, gpx_file) + activity_uuid = decode_short_id(activity_short_id) client = app.test_client() # Edit some activity data @@ -629,7 +630,7 @@ class TestRefreshActivityWithGpx: activity.min_alt = -100 response = client.patch( - f'/api/activities/{activity_uuid}', + f'/api/activities/{activity_short_id}', content_type='application/json', data=json.dumps(dict(refresh=True)), headers=dict(Authorization=f'Bearer {token}'), diff --git a/fittrackee/tests/activities/test_activities_api_3_delete.py b/fittrackee/tests/activities/test_activities_api_3_delete.py index fd1a245a..644def9c 100644 --- a/fittrackee/tests/activities/test_activities_api_3_delete.py +++ b/fittrackee/tests/activities/test_activities_api_3_delete.py @@ -1,11 +1,10 @@ import json import os -from uuid import uuid4 from fittrackee.activities.models import Activity from fittrackee.activities.utils import get_absolute_file_path -from .utils import post_an_activity +from .utils import get_random_short_id, post_an_activity def get_gpx_filepath(activity_id): @@ -17,11 +16,11 @@ class TestDeleteActivityWithGpx: def test_it_deletes_an_activity_with_gpx( self, app, user_1, sport_1_cycling, gpx_file ): - token, activity_uuid = post_an_activity(app, gpx_file) + token, activity_short_id = post_an_activity(app, gpx_file) client = app.test_client() response = client.delete( - f'/api/activities/{activity_uuid}', + f'/api/activities/{activity_short_id}', headers=dict(Authorization=f'Bearer {token}'), ) @@ -30,7 +29,7 @@ class TestDeleteActivityWithGpx: def test_it_returns_403_when_deleting_an_activity_from_different_user( self, app, user_1, user_2, sport_1_cycling, gpx_file ): - _, activity_uuid = post_an_activity(app, gpx_file) + _, activity_short_id = post_an_activity(app, gpx_file) client = app.test_client() resp_login = client.post( '/api/auth/login', @@ -39,7 +38,7 @@ class TestDeleteActivityWithGpx: ) response = client.delete( - f'/api/activities/{activity_uuid}', + f'/api/activities/{activity_short_id}', headers=dict( Authorization='Bearer ' + json.loads(resp_login.data.decode())['auth_token'] @@ -60,7 +59,7 @@ class TestDeleteActivityWithGpx: content_type='application/json', ) response = client.delete( - f'/api/activities/{uuid4().hex}', + f'/api/activities/{get_random_short_id()}', headers=dict( Authorization='Bearer ' + json.loads(resp_login.data.decode())['auth_token'] @@ -73,14 +72,14 @@ class TestDeleteActivityWithGpx: def test_it_returns_500_when_deleting_an_activity_with_gpx_invalid_file( self, app, user_1, sport_1_cycling, gpx_file ): - token, activity_uuid = post_an_activity(app, gpx_file) + token, activity_short_id = post_an_activity(app, gpx_file) client = app.test_client() gpx_filepath = get_gpx_filepath(1) gpx_filepath = get_absolute_file_path(gpx_filepath) os.remove(gpx_filepath) response = client.delete( - f'/api/activities/{activity_uuid}', + f'/api/activities/{activity_short_id}', headers=dict(Authorization=f'Bearer {token}'), ) @@ -105,7 +104,7 @@ class TestDeleteActivityWithoutGpx: content_type='application/json', ) response = client.delete( - f'/api/activities/{activity_cycling_user_1.uuid}', + f'/api/activities/{activity_cycling_user_1.short_id}', headers=dict( Authorization='Bearer ' + json.loads(resp_login.data.decode())['auth_token'] @@ -123,7 +122,7 @@ class TestDeleteActivityWithoutGpx: content_type='application/json', ) response = client.delete( - f'/api/activities/{activity_cycling_user_1.uuid}', + f'/api/activities/{activity_cycling_user_1.short_id}', headers=dict( Authorization='Bearer ' + json.loads(resp_login.data.decode())['auth_token'] diff --git a/fittrackee/tests/activities/test_activities_model.py b/fittrackee/tests/activities/test_activities_model.py index 2f35c753..8a85429f 100644 --- a/fittrackee/tests/activities/test_activities_model.py +++ b/fittrackee/tests/activities/test_activities_model.py @@ -1,4 +1,6 @@ -from .utils import is_valid_uuid +from uuid import UUID + +from fittrackee.activities.utils_id import decode_short_id class TestActivityModel: @@ -22,7 +24,7 @@ class TestActivityModel: ) serialized_activity = activity_cycling_user_1.serialize() - assert is_valid_uuid(serialized_activity['id']) + assert isinstance(decode_short_id(serialized_activity['id']), UUID) assert 'test' == serialized_activity['user'] assert 1 == serialized_activity['sport_id'] assert serialized_activity['title'] == 'Test' @@ -61,6 +63,6 @@ class TestActivityModel: ): assert ( f'' + f'for activity \'{activity_cycling_user_1.short_id}\'>' == str(activity_cycling_user_1_segment) ) diff --git a/fittrackee/tests/activities/test_records_api.py b/fittrackee/tests/activities/test_records_api.py index dee01469..9b55859d 100644 --- a/fittrackee/tests/activities/test_records_api.py +++ b/fittrackee/tests/activities/test_records_api.py @@ -38,7 +38,7 @@ class TestGetRecords: assert 'test' == data['data']['records'][0]['user'] assert sport_1_cycling.id == data['data']['records'][0]['sport_id'] assert ( - activity_cycling_user_1.uuid.hex + activity_cycling_user_1.short_id == data['data']['records'][0]['activity_id'] ) assert 'AS' == data['data']['records'][0]['record_type'] @@ -51,7 +51,7 @@ class TestGetRecords: assert 'test' == data['data']['records'][1]['user'] assert sport_1_cycling.id == data['data']['records'][1]['sport_id'] assert ( - activity_cycling_user_1.uuid.hex + activity_cycling_user_1.short_id == data['data']['records'][1]['activity_id'] ) assert 'FD' == data['data']['records'][1]['record_type'] @@ -64,7 +64,7 @@ class TestGetRecords: assert 'test' == data['data']['records'][2]['user'] assert sport_1_cycling.id == data['data']['records'][2]['sport_id'] assert ( - activity_cycling_user_1.uuid.hex + activity_cycling_user_1.short_id == data['data']['records'][2]['activity_id'] ) assert 'LD' == data['data']['records'][2]['record_type'] @@ -77,7 +77,7 @@ class TestGetRecords: assert 'test' == data['data']['records'][3]['user'] assert sport_1_cycling.id == data['data']['records'][3]['sport_id'] assert ( - activity_cycling_user_1.uuid.hex + activity_cycling_user_1.short_id == data['data']['records'][3]['activity_id'] ) assert 'MS' == data['data']['records'][3]['record_type'] @@ -177,7 +177,7 @@ class TestGetRecords: ), ) data = json.loads(response.data.decode()) - activity_1_uuid = data['data']['activities'][0]['id'] + activity_1_short_id = data['data']['activities'][0]['id'] response = client.get( '/api/records', headers=dict( @@ -197,7 +197,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][0]['user'] assert sport_1_cycling.id == data['data']['records'][0]['sport_id'] - assert activity_1_uuid == data['data']['records'][0]['activity_id'] + assert activity_1_short_id == data['data']['records'][0]['activity_id'] assert 'AS' == data['data']['records'][0]['record_type'] assert 7.0 == data['data']['records'][0]['value'] @@ -207,7 +207,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][1]['user'] assert sport_1_cycling.id == data['data']['records'][1]['sport_id'] - assert activity_1_uuid == data['data']['records'][1]['activity_id'] + assert activity_1_short_id == data['data']['records'][1]['activity_id'] assert 'FD' == data['data']['records'][1]['record_type'] assert 7.0 == data['data']['records'][1]['value'] @@ -217,7 +217,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][2]['user'] assert sport_1_cycling.id == data['data']['records'][2]['sport_id'] - assert activity_1_uuid == data['data']['records'][2]['activity_id'] + assert activity_1_short_id == data['data']['records'][2]['activity_id'] assert 'LD' == data['data']['records'][2]['record_type'] assert '1:00:00' == data['data']['records'][2]['value'] @@ -227,7 +227,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][3]['user'] assert sport_1_cycling.id == data['data']['records'][3]['sport_id'] - assert activity_1_uuid == data['data']['records'][3]['activity_id'] + assert activity_1_short_id == data['data']['records'][3]['activity_id'] assert 'MS' == data['data']['records'][3]['record_type'] assert 7.0 == data['data']['records'][3]['value'] @@ -251,7 +251,7 @@ class TestGetRecords: ), ) data = json.loads(response.data.decode()) - activity_2_uuid = data['data']['activities'][0]['id'] + activity_2_short_id = data['data']['activities'][0]['id'] response = client.get( '/api/records', headers=dict( @@ -271,7 +271,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][0]['user'] assert sport_1_cycling.id == data['data']['records'][0]['sport_id'] - assert activity_2_uuid == data['data']['records'][0]['activity_id'] + assert activity_2_short_id == data['data']['records'][0]['activity_id'] assert 'AS' == data['data']['records'][0]['record_type'] assert 8.4 == data['data']['records'][0]['value'] @@ -281,7 +281,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][1]['user'] assert sport_1_cycling.id == data['data']['records'][1]['sport_id'] - assert activity_1_uuid == data['data']['records'][1]['activity_id'] + assert activity_1_short_id == data['data']['records'][1]['activity_id'] assert 'FD' == data['data']['records'][1]['record_type'] assert 7.0 == data['data']['records'][1]['value'] @@ -291,7 +291,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][2]['user'] assert sport_1_cycling.id == data['data']['records'][2]['sport_id'] - assert activity_1_uuid == data['data']['records'][2]['activity_id'] + assert activity_1_short_id == data['data']['records'][2]['activity_id'] assert 'LD' == data['data']['records'][2]['record_type'] assert '1:00:00' == data['data']['records'][2]['value'] @@ -301,7 +301,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][0]['user'] assert sport_1_cycling.id == data['data']['records'][0]['sport_id'] - assert activity_2_uuid == data['data']['records'][0]['activity_id'] + assert activity_2_short_id == data['data']['records'][0]['activity_id'] assert 'MS' == data['data']['records'][3]['record_type'] assert 8.4 == data['data']['records'][3]['value'] @@ -324,7 +324,7 @@ class TestGetRecords: ), ) data = json.loads(response.data.decode()) - activity_3_uuid = data['data']['activities'][0]['id'] + activity_3_short_id = data['data']['activities'][0]['id'] response = client.get( '/api/records', headers=dict( @@ -344,7 +344,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][0]['user'] assert sport_1_cycling.id == data['data']['records'][0]['sport_id'] - assert activity_2_uuid == data['data']['records'][0]['activity_id'] + assert activity_2_short_id == data['data']['records'][0]['activity_id'] assert 'AS' == data['data']['records'][0]['record_type'] assert 8.4 == data['data']['records'][0]['value'] @@ -354,7 +354,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][1]['user'] assert sport_1_cycling.id == data['data']['records'][1]['sport_id'] - assert activity_1_uuid == data['data']['records'][1]['activity_id'] + assert activity_1_short_id == data['data']['records'][1]['activity_id'] assert 'FD' == data['data']['records'][1]['record_type'] assert 7.0 == data['data']['records'][1]['value'] @@ -364,7 +364,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][2]['user'] assert sport_1_cycling.id == data['data']['records'][2]['sport_id'] - assert activity_1_uuid == data['data']['records'][2]['activity_id'] + assert activity_1_short_id == data['data']['records'][2]['activity_id'] assert 'LD' == data['data']['records'][2]['record_type'] assert '1:00:00' == data['data']['records'][2]['value'] @@ -374,14 +374,14 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][0]['user'] assert sport_1_cycling.id == data['data']['records'][0]['sport_id'] - assert activity_2_uuid == data['data']['records'][0]['activity_id'] + assert activity_2_short_id == data['data']['records'][0]['activity_id'] assert 'MS' == data['data']['records'][3]['record_type'] assert 8.4 == data['data']['records'][3]['value'] # Edit last activity # 1 new record: Longest duration client.patch( - f'/api/activities/{activity_3_uuid}', + f'/api/activities/{activity_3_short_id}', content_type='application/json', data=json.dumps(dict(duration=4000)), headers=dict( @@ -408,7 +408,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][0]['user'] assert sport_1_cycling.id == data['data']['records'][0]['sport_id'] - assert activity_2_uuid == data['data']['records'][0]['activity_id'] + assert activity_2_short_id == data['data']['records'][0]['activity_id'] assert 'AS' == data['data']['records'][0]['record_type'] assert 8.4 == data['data']['records'][0]['value'] @@ -418,7 +418,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][1]['user'] assert sport_1_cycling.id == data['data']['records'][1]['sport_id'] - assert activity_1_uuid == data['data']['records'][1]['activity_id'] + assert activity_1_short_id == data['data']['records'][1]['activity_id'] assert 'FD' == data['data']['records'][1]['record_type'] assert 7.0 == data['data']['records'][1]['value'] @@ -428,7 +428,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][2]['user'] assert sport_1_cycling.id == data['data']['records'][2]['sport_id'] - assert activity_3_uuid == data['data']['records'][2]['activity_id'] + assert activity_3_short_id == data['data']['records'][2]['activity_id'] assert 'LD' == data['data']['records'][2]['record_type'] assert '1:06:40' == data['data']['records'][2]['value'] @@ -438,13 +438,13 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][0]['user'] assert sport_1_cycling.id == data['data']['records'][0]['sport_id'] - assert activity_2_uuid == data['data']['records'][0]['activity_id'] + assert activity_2_short_id == data['data']['records'][0]['activity_id'] assert 'MS' == data['data']['records'][3]['record_type'] assert 8.4 == data['data']['records'][3]['value'] # delete activity 2 => AS and MS record update client.delete( - f'/api/activities/{activity_2_uuid}', + f'/api/activities/{activity_2_short_id}', headers=dict( Authorization='Bearer ' + json.loads(resp_login.data.decode())['auth_token'] @@ -469,7 +469,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][0]['user'] assert sport_1_cycling.id == data['data']['records'][0]['sport_id'] - assert activity_1_uuid == data['data']['records'][0]['activity_id'] + assert activity_1_short_id == data['data']['records'][0]['activity_id'] assert 'AS' == data['data']['records'][0]['record_type'] assert 7.0 == data['data']['records'][0]['value'] @@ -479,7 +479,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][1]['user'] assert sport_1_cycling.id == data['data']['records'][1]['sport_id'] - assert activity_1_uuid == data['data']['records'][1]['activity_id'] + assert activity_1_short_id == data['data']['records'][1]['activity_id'] assert 'FD' == data['data']['records'][1]['record_type'] assert 7.0 == data['data']['records'][1]['value'] @@ -489,7 +489,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][2]['user'] assert sport_1_cycling.id == data['data']['records'][2]['sport_id'] - assert activity_3_uuid == data['data']['records'][2]['activity_id'] + assert activity_3_short_id == data['data']['records'][2]['activity_id'] assert 'LD' == data['data']['records'][2]['record_type'] assert '1:06:40' == data['data']['records'][2]['value'] @@ -499,7 +499,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][3]['user'] assert sport_1_cycling.id == data['data']['records'][3]['sport_id'] - assert activity_1_uuid == data['data']['records'][3]['activity_id'] + assert activity_1_short_id == data['data']['records'][3]['activity_id'] assert 'MS' == data['data']['records'][3]['record_type'] assert 7.0 == data['data']['records'][3]['value'] @@ -523,7 +523,7 @@ class TestGetRecords: ), ) data = json.loads(response.data.decode()) - activity_4_uuid = data['data']['activities'][0]['id'] + activity_4_short_id = data['data']['activities'][0]['id'] response = client.get( '/api/records', headers=dict( @@ -543,7 +543,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][0]['user'] assert sport_1_cycling.id == data['data']['records'][0]['sport_id'] - assert activity_1_uuid == data['data']['records'][0]['activity_id'] + assert activity_1_short_id == data['data']['records'][0]['activity_id'] assert 'AS' == data['data']['records'][0]['record_type'] assert 7.0 == data['data']['records'][0]['value'] @@ -553,7 +553,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][1]['user'] assert sport_1_cycling.id == data['data']['records'][1]['sport_id'] - assert activity_1_uuid == data['data']['records'][1]['activity_id'] + assert activity_1_short_id == data['data']['records'][1]['activity_id'] assert 'FD' == data['data']['records'][1]['record_type'] assert 7.0 == data['data']['records'][1]['value'] @@ -563,7 +563,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][2]['user'] assert sport_1_cycling.id == data['data']['records'][2]['sport_id'] - assert activity_3_uuid == data['data']['records'][2]['activity_id'] + assert activity_3_short_id == data['data']['records'][2]['activity_id'] assert 'LD' == data['data']['records'][2]['record_type'] assert '1:06:40' == data['data']['records'][2]['value'] @@ -573,7 +573,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][3]['user'] assert sport_1_cycling.id == data['data']['records'][3]['sport_id'] - assert activity_1_uuid == data['data']['records'][3]['activity_id'] + assert activity_1_short_id == data['data']['records'][3]['activity_id'] assert 'MS' == data['data']['records'][3]['record_type'] assert 7.0 == data['data']['records'][3]['value'] @@ -599,7 +599,7 @@ class TestGetRecords: ), ) data = json.loads(response.data.decode()) - activity_5_uuid = data['data']['activities'][0]['id'] + activity_5_short_id = data['data']['activities'][0]['id'] response = client.get( '/api/records', headers=dict( @@ -619,7 +619,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][0]['user'] assert sport_1_cycling.id == data['data']['records'][0]['sport_id'] - assert activity_5_uuid == data['data']['records'][0]['activity_id'] + assert activity_5_short_id == data['data']['records'][0]['activity_id'] assert 'AS' == data['data']['records'][0]['record_type'] assert 7.0 == data['data']['records'][0]['value'] @@ -629,7 +629,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][1]['user'] assert sport_1_cycling.id == data['data']['records'][1]['sport_id'] - assert activity_5_uuid == data['data']['records'][1]['activity_id'] + assert activity_5_short_id == data['data']['records'][1]['activity_id'] assert 'FD' == data['data']['records'][1]['record_type'] assert 7.0 == data['data']['records'][1]['value'] @@ -639,7 +639,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][2]['user'] assert sport_1_cycling.id == data['data']['records'][2]['sport_id'] - assert activity_3_uuid == data['data']['records'][2]['activity_id'] + assert activity_3_short_id == data['data']['records'][2]['activity_id'] assert 'LD' == data['data']['records'][2]['record_type'] assert '1:06:40' == data['data']['records'][2]['value'] @@ -649,34 +649,34 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][3]['user'] assert sport_1_cycling.id == data['data']['records'][3]['sport_id'] - assert activity_5_uuid == data['data']['records'][3]['activity_id'] + assert activity_5_short_id == data['data']['records'][3]['activity_id'] assert 'MS' == data['data']['records'][3]['record_type'] assert 7.0 == data['data']['records'][3]['value'] # delete all activities - no more records client.delete( - f'/api/activities/{activity_1_uuid}', + f'/api/activities/{activity_1_short_id}', headers=dict( Authorization='Bearer ' + json.loads(resp_login.data.decode())['auth_token'] ), ) client.delete( - f'/api/activities/{activity_3_uuid}', + f'/api/activities/{activity_3_short_id}', headers=dict( Authorization='Bearer ' + json.loads(resp_login.data.decode())['auth_token'] ), ) client.delete( - f'/api/activities/{activity_4_uuid}', + f'/api/activities/{activity_4_short_id}', headers=dict( Authorization='Bearer ' + json.loads(resp_login.data.decode())['auth_token'] ), ) client.delete( - f'/api/activities/{activity_5_uuid}', + f'/api/activities/{activity_5_short_id}', headers=dict( Authorization='Bearer ' + json.loads(resp_login.data.decode())['auth_token'] @@ -722,7 +722,7 @@ class TestGetRecords: ), ) data = json.loads(response.data.decode()) - activity_1_uuid = data['data']['activities'][0]['id'] + activity_1_short_id = data['data']['activities'][0]['id'] response = client.post( '/api/activities/no_gpx', content_type='application/json', @@ -741,7 +741,7 @@ class TestGetRecords: ), ) data = json.loads(response.data.decode()) - activity_2_uuid = data['data']['activities'][0]['id'] + activity_2_short_id = data['data']['activities'][0]['id'] client.post( '/api/activities/no_gpx', content_type='application/json', @@ -777,7 +777,7 @@ class TestGetRecords: ), ) data = json.loads(response.data.decode()) - activity_4_uuid = data['data']['activities'][0]['id'] + activity_4_short_id = data['data']['activities'][0]['id'] response = client.get( '/api/records', headers=dict( @@ -797,7 +797,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][0]['user'] assert sport_1_cycling.id == data['data']['records'][0]['sport_id'] - assert activity_1_uuid == data['data']['records'][0]['activity_id'] + assert activity_1_short_id == data['data']['records'][0]['activity_id'] assert 'AS' == data['data']['records'][0]['record_type'] assert 7.0 == data['data']['records'][0]['value'] @@ -807,7 +807,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][1]['user'] assert sport_1_cycling.id == data['data']['records'][1]['sport_id'] - assert activity_1_uuid == data['data']['records'][1]['activity_id'] + assert activity_1_short_id == data['data']['records'][1]['activity_id'] assert 'FD' == data['data']['records'][1]['record_type'] assert 7.0 == data['data']['records'][1]['value'] @@ -817,7 +817,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][2]['user'] assert sport_1_cycling.id == data['data']['records'][2]['sport_id'] - assert activity_1_uuid == data['data']['records'][2]['activity_id'] + assert activity_1_short_id == data['data']['records'][2]['activity_id'] assert 'LD' == data['data']['records'][2]['record_type'] assert '1:00:00' == data['data']['records'][2]['value'] @@ -827,7 +827,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][3]['user'] assert sport_1_cycling.id == data['data']['records'][3]['sport_id'] - assert activity_1_uuid == data['data']['records'][3]['activity_id'] + assert activity_1_short_id == data['data']['records'][3]['activity_id'] assert 'MS' == data['data']['records'][3]['record_type'] assert 7.0 == data['data']['records'][3]['value'] @@ -837,7 +837,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][4]['user'] assert sport_2_running.id == data['data']['records'][4]['sport_id'] - assert activity_2_uuid == data['data']['records'][4]['activity_id'] + assert activity_2_short_id == data['data']['records'][4]['activity_id'] assert 'AS' == data['data']['records'][4]['record_type'] assert 20.0 == data['data']['records'][4]['value'] @@ -847,7 +847,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][5]['user'] assert sport_2_running.id == data['data']['records'][5]['sport_id'] - assert activity_2_uuid == data['data']['records'][5]['activity_id'] + assert activity_2_short_id == data['data']['records'][5]['activity_id'] assert 'FD' == data['data']['records'][5]['record_type'] assert 20.0 == data['data']['records'][5]['value'] @@ -857,7 +857,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][6]['user'] assert sport_2_running.id == data['data']['records'][6]['sport_id'] - assert activity_2_uuid == data['data']['records'][6]['activity_id'] + assert activity_2_short_id == data['data']['records'][6]['activity_id'] assert 'LD' == data['data']['records'][6]['record_type'] assert '1:00:00' == data['data']['records'][6]['value'] @@ -867,12 +867,12 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][7]['user'] assert sport_2_running.id == data['data']['records'][7]['sport_id'] - assert activity_2_uuid == data['data']['records'][7]['activity_id'] + assert activity_2_short_id == data['data']['records'][7]['activity_id'] assert 'MS' == data['data']['records'][7]['record_type'] assert 20.0 == data['data']['records'][7]['value'] client.patch( - f'/api/activities/{activity_2_uuid}', + f'/api/activities/{activity_2_short_id}', content_type='application/json', data=json.dumps(dict(sport_id=1)), headers=dict( @@ -899,7 +899,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][0]['user'] assert sport_1_cycling.id == data['data']['records'][0]['sport_id'] - assert activity_2_uuid == data['data']['records'][0]['activity_id'] + assert activity_2_short_id == data['data']['records'][0]['activity_id'] assert 'AS' == data['data']['records'][0]['record_type'] assert 20.0 == data['data']['records'][0]['value'] @@ -909,7 +909,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][1]['user'] assert sport_1_cycling.id == data['data']['records'][1]['sport_id'] - assert activity_2_uuid == data['data']['records'][1]['activity_id'] + assert activity_2_short_id == data['data']['records'][1]['activity_id'] assert 'FD' == data['data']['records'][1]['record_type'] assert 20.0 == data['data']['records'][1]['value'] @@ -919,7 +919,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][2]['user'] assert sport_1_cycling.id == data['data']['records'][2]['sport_id'] - assert activity_1_uuid == data['data']['records'][2]['activity_id'] + assert activity_1_short_id == data['data']['records'][2]['activity_id'] assert 'LD' == data['data']['records'][2]['record_type'] assert '1:00:00' == data['data']['records'][2]['value'] @@ -929,7 +929,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][3]['user'] assert sport_1_cycling.id == data['data']['records'][3]['sport_id'] - assert activity_2_uuid == data['data']['records'][3]['activity_id'] + assert activity_2_short_id == data['data']['records'][3]['activity_id'] assert 'MS' == data['data']['records'][3]['record_type'] assert 20.0 == data['data']['records'][3]['value'] @@ -939,7 +939,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][4]['user'] assert sport_2_running.id == data['data']['records'][4]['sport_id'] - assert activity_4_uuid == data['data']['records'][4]['activity_id'] + assert activity_4_short_id == data['data']['records'][4]['activity_id'] assert 'AS' == data['data']['records'][4]['record_type'] assert 12.0 == data['data']['records'][4]['value'] @@ -949,7 +949,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][5]['user'] assert sport_2_running.id == data['data']['records'][5]['sport_id'] - assert activity_4_uuid == data['data']['records'][5]['activity_id'] + assert activity_4_short_id == data['data']['records'][5]['activity_id'] assert 'FD' == data['data']['records'][5]['record_type'] assert 10.0 == data['data']['records'][5]['value'] @@ -959,7 +959,7 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][6]['user'] assert sport_2_running.id == data['data']['records'][6]['sport_id'] - assert activity_4_uuid == data['data']['records'][6]['activity_id'] + assert activity_4_short_id == data['data']['records'][6]['activity_id'] assert 'LD' == data['data']['records'][6]['record_type'] assert '0:50:00' == data['data']['records'][6]['value'] @@ -969,6 +969,6 @@ class TestGetRecords: ) # noqa assert 'test' == data['data']['records'][7]['user'] assert sport_2_running.id == data['data']['records'][7]['sport_id'] - assert activity_4_uuid == data['data']['records'][7]['activity_id'] + assert activity_4_short_id == data['data']['records'][7]['activity_id'] assert 'MS' == data['data']['records'][7]['record_type'] assert 12.0 == data['data']['records'][7]['value'] diff --git a/fittrackee/tests/activities/utils.py b/fittrackee/tests/activities/utils.py index d4b262df..906d2b46 100644 --- a/fittrackee/tests/activities/utils.py +++ b/fittrackee/tests/activities/utils.py @@ -1,14 +1,12 @@ import json from io import BytesIO -from uuid import UUID +from uuid import uuid4 + +from fittrackee.activities.utils_id import encode_uuid -def is_valid_uuid(string): - try: - UUID(string, version=4) - except ValueError: - return False - return True +def get_random_short_id(): + return encode_uuid(uuid4()) def post_an_activity(app, gpx_file): diff --git a/poetry.lock b/poetry.lock index a9e956f5..6d839168 100644 --- a/poetry.lock +++ b/poetry.lock @@ -889,6 +889,14 @@ python-versions = "*" [package.dependencies] urllib3 = "*" +[[package]] +name = "shortuuid" +version = "1.0.1" +description = "A generator library for concise, unambiguous and URL-safe UUIDs." +category = "main" +optional = false +python-versions = ">=3.5" + [[package]] name = "six" version = "1.15.0" @@ -1154,7 +1162,7 @@ testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2.3)", "pyt [metadata] lock-version = "1.0" python-versions = "^3.7" -content-hash = "94d589f7d4810e10acf98513037953027e13374bf13a62207570d9caca3f9ab0" +content-hash = "b5c7cbb6e449c8c6cc94a7413ae2fc0b8889d738e3fc802566efc45cc5096287" [metadata.files] alabaster = [ @@ -1674,6 +1682,10 @@ selenium = [ {file = "selenium-3.141.0-py2.py3-none-any.whl", hash = "sha256:2d7131d7bc5a5b99a2d9b04aaf2612c411b03b8ca1b1ee8d3de5845a9be2cb3c"}, {file = "selenium-3.141.0.tar.gz", hash = "sha256:deaf32b60ad91a4611b98d8002757f29e6f2c2d5fcaf202e1c9ad06d6772300d"}, ] +shortuuid = [ + {file = "shortuuid-1.0.1-py3-none-any.whl", hash = "sha256:492c7402ff91beb1342a5898bd61ea953985bf24a41cd9f247409aa2e03c8f77"}, + {file = "shortuuid-1.0.1.tar.gz", hash = "sha256:3c11d2007b915c43bee3e10625f068d8a349e04f0d81f08f5fa08507427ebf1f"}, +] six = [ {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, diff --git a/pyproject.toml b/pyproject.toml index d0340d52..ca2f143b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,6 +35,7 @@ psycopg2-binary = "^2.8" pyjwt = "^2.0" python-forecastio = "^1.4" pytz = "^2020.5" +shortuuid = "^1.0.1" staticmap = "^0.5.4" tqdm = "^4.55"