From dafd83427f5d6ebaeaf83b372479109a90d43028 Mon Sep 17 00:00:00 2001 From: Facundo Batista Date: Fri, 23 Aug 2024 19:05:33 -0300 Subject: [PATCH 1/2] Used external URLs and better format for datetime. --- kilink/backend.py | 2 +- kilink/templates/_tools.html | 32 ++++++++++++++++---------------- kilink/views_v2.py | 18 +++++++++++++----- tests/test_views_v2.py | 36 +++++++++++++++++++++++++----------- 4 files changed, 55 insertions(+), 33 deletions(-) diff --git a/kilink/backend.py b/kilink/backend.py index a98362c..bd10a8a 100644 --- a/kilink/backend.py +++ b/kilink/backend.py @@ -263,7 +263,7 @@ def build_tree_from_root_id(self, linkode_id): for treenode in self._get_kilink_tree(linkode_id): node_dict = { - 'timestamp': str(treenode.timestamp), + 'timestamp': treenode.timestamp.isoformat(), 'linkode_id': treenode.linkode_id, 'parent': treenode.parent, } diff --git a/kilink/templates/_tools.html b/kilink/templates/_tools.html index a60bf9b..7c0b748 100644 --- a/kilink/templates/_tools.html +++ b/kilink/templates/_tools.html @@ -65,9 +65,9 @@

To create a new linkode

> "https://linkode.org/api/2/linkode" { "linkode_id": "SrDotVY03btcJBxSAtINC6", - "linkode_url": "/api/2/linkode/SrDotVY03btcJBxSAtINC6", + "linkode_url": "https://linkode.org/api/2/linkode/SrDotVY03btcJBxSAtINC6", "root_id": "SrDotVY03btcJBxSAtINC6", - "root_url": "/api/2/linkode/SrDotVY03btcJBxSAtINC6" + "root_url": "https://linkode.org/api/2/linkode/SrDotVY03btcJBxSAtINC6" } @@ -134,9 +134,9 @@

To create a child of an existing linkode node

> "https://linkode.org/api/2/linkode/SrDotVY03btcJBxSAtINC6/" { "linkode_id": "x1F110pkRqWclAhXVcqtD1", - "linkode_url": "/api/2/linkode/x1F110pkRqWclAhXVcqtD1", + "linkode_url": "https://linkode.org/api/2/linkode/x1F110pkRqWclAhXVcqtD1", "root_id": "SrDotVY03btcJBxSAtINC6", - "root_url": "/api/2/linkode/SrDotVY03btcJBxSAtINC6" + "root_url": "https://linkode.org/api/2/linkode/SrDotVY03btcJBxSAtINC6" } $ $ # a children of the just created node @@ -145,9 +145,9 @@

To create a child of an existing linkode node

> "https://linkode.org/api/2/linkode/x1F110pkRqWclAhXVcqtD1/" { "linkode_id": "ww9RtsVzx6srGGjYmlpiY5", - "linkode_url": "/api/2/linkode/ww9RtsVzx6srGGjYmlpiY5", + "linkode_url": "https://linkode.org/api/2/linkode/ww9RtsVzx6srGGjYmlpiY5", "root_id": "SrDotVY03btcJBxSAtINC6", - "root_url": "/api/2/linkode/SrDotVY03btcJBxSAtINC6" + "root_url": "https://linkode.org/api/2/linkode/SrDotVY03btcJBxSAtINC6"
@@ -192,7 +192,7 @@

To get a specific linkode node

'root_id': '7bxvJqtvFIggJnyNXba1K4', 'root_url': '/api/2/linkode/7bxvJqtvFIggJnyNXba1K4', 'text_type': 'python', - 'timestamp': 'Thu, 22 Aug 2024 19:57:22 GMT'} + 'timestamp': '2024-08-22T19:57:22.244297'}
@@ -200,11 +200,11 @@

To get a specific linkode node

$ curl -s "https://linkode.org/api/2/linkode/x1F110pkRqWclAhXVcqtD1/"{ "content": "new content", "linkode_id": "x1F110pkRqWclAhXVcqtD1", - "linkode_url": "/api/2/linkode/x1F110pkRqWclAhXVcqtD1", + "linkode_url": "https://linkode.org/api/2/linkode/x1F110pkRqWclAhXVcqtD1", "root_id": "SrDotVY03btcJBxSAtINC6", - "root_url": "/api/2/linkode/SrDotVY03btcJBxSAtINC6", + "root_url": "https://linkode.org/api/2/linkode/SrDotVY03btcJBxSAtINC6", "text_type": "python", - "timestamp": "Thu, 22 Aug 2024 20:12:38 GMT" + "timestamp": "2024-08-22T20:12:38.023853" }
@@ -243,12 +243,12 @@

To get all the tree of a linkode

200 >>> response.json() {'linkode_id': '7bxvJqtvFIggJnyNXba1K4', - 'timestamp': '2024-08-22 12:31:53.237094', + 'timestamp': '2024-08-22T12:31:53.237094', 'children': [{'children': [{'children': [], 'linkode_id': 'dkaj4P3pJrdpMZomSKuQb7', - 'timestamp': '2024-08-22 19:57:54.454925'}], + 'timestamp': '2024-08-22T19:57:54.454925'}], 'linkode_id': 'TRgCnj5fXrcEC66dALDxt7', - 'timestamp': '2024-08-22 19:57:22.270264'}]} + 'timestamp': '2024-08-22T19:57:22.270264'}]}
@@ -261,15 +261,15 @@

To get all the tree of a linkode

{ "children": [], "linkode_id": "ww9RtsVzx6srGGjYmlpiY5", - "timestamp": "2024-08-22 20:13:24.673839" + "timestamp": "2024-08-22T20:13:24.673839" } ], "linkode_id": "x1F110pkRqWclAhXVcqtD1", - "timestamp": "2024-08-22 20:12:38.499254" + "timestamp": "2024-08-22T20:12:38.499254" } ], "linkode_id": "SrDotVY03btcJBxSAtINC6", - "timestamp": "2024-08-22 12:49:29.845979" + "timestamp": "2024-08-22T12:49:29.845979" }
diff --git a/kilink/views_v2.py b/kilink/views_v2.py index a141207..b06d3af 100644 --- a/kilink/views_v2.py +++ b/kilink/views_v2.py @@ -19,6 +19,14 @@ linkode_v2 = Blueprint("linkode_v2", __name__) +def external_url_for(*args, **kwargs): + """Provide the url for some params, always external. + + Always use this one, not 'url_for' directly. + """ + return url_for(*args, **kwargs, _external=True) + + @linkode_v2.route('/linkode/', methods=['POST']) @linkode_v2.route('/linkode//', methods=['POST']) def create_linkode(linkode_id=None): @@ -66,9 +74,9 @@ def create_linkode(linkode_id=None): ret_json = jsonify( linkode_id=linkode.linkode_id, - linkode_url=url_for("linkode_v2.get_linkode", linkode_id=linkode.linkode_id), + linkode_url=external_url_for("linkode_v2.get_linkode", linkode_id=linkode.linkode_id), root_id=linkode.root, - root_url=url_for("linkode_v2.get_linkode", linkode_id=linkode.root), + root_url=external_url_for("linkode_v2.get_linkode", linkode_id=linkode.root), ) logger.debug("API create done; linkode_id=%s", linkode.linkode_id) return ret_json, HTTPStatus.CREATED @@ -101,11 +109,11 @@ def get_linkode(linkode_id): ret_json = jsonify( content=linkode.content, text_type=linkode.text_type, - timestamp=linkode.timestamp, + timestamp=linkode.timestamp.isoformat(), linkode_id=linkode.linkode_id, - linkode_url=url_for("linkode_v2.get_linkode", linkode_id=linkode.linkode_id), + linkode_url=external_url_for("linkode_v2.get_linkode", linkode_id=linkode.linkode_id), root_id=linkode.root, - root_url=url_for("linkode_v2.get_linkode", linkode_id=linkode.root), + root_url=external_url_for("linkode_v2.get_linkode", linkode_id=linkode.root), ) return ret_json, HTTPStatus.OK diff --git a/tests/test_views_v2.py b/tests/test_views_v2.py index 9fb0418..a385bf1 100644 --- a/tests/test_views_v2.py +++ b/tests/test_views_v2.py @@ -29,7 +29,13 @@ def test_creates_new_root_with_all_params(self): assert response.status_code == 201 # created linkode is the root of its tree - assert response.json["linkode_id"] == response.json["root_id"] + linkode_id = response.json["linkode_id"] + root_id = response.json["root_id"] + assert linkode_id == root_id + + # proper urls + assert response.json["linkode_url"] == f"http://localhost/api/2/linkode/{linkode_id}" + assert response.json["root_url"] == f"http://localhost/api/2/linkode/{root_id}" def test_creates_new_root_without_text_type(self): payload = { @@ -56,9 +62,15 @@ def test_creates_new_revision(self): assert response.status_code == 201 - # new linkoded created with id different than its parent - assert response.json["linkode_id"] != parent_id - assert response.json["root_id"] == parent_id + # new linkode created with id different than its parent + linkode_id = response.json["linkode_id"] + root_id = response.json["root_id"] + assert linkode_id != parent_id + assert root_id == parent_id + + # proper urls + assert response.json["linkode_url"] == f"http://localhost/api/2/linkode/{linkode_id}" + assert response.json["root_url"] == f"http://localhost/api/2/linkode/{root_id}" def test_creates_new_revision_when_parent_not_found(self): response = test_client.post( @@ -94,9 +106,11 @@ def test_get_linkode_happy_path(self): assert response.json["text_type"] == "python" assert response.json["linkode_id"] == linkode.linkode_id assert response.json["root_id"] == linkode.root - assert "timestamp" in response.json - assert "linkode_url" in response.json - assert "root_id" in response.json + assert response.json["timestamp"] == linkode.timestamp.isoformat() + assert ( + response.json["linkode_url"] == f"http://localhost/api/2/linkode/{linkode.linkode_id}" + ) + assert response.json["root_url"] == f"http://localhost/api/2/linkode/{linkode.root}" def test_get_linkode_when_not_found(self): response = test_client.get("/api/2/linkode/SomeUnexistingId/") @@ -117,22 +131,22 @@ def test_get_tree_happy_path(self): assert response.json == { "linkode_id": parent.linkode_id, - "timestamp": str(parent.timestamp), + "timestamp": parent.timestamp.isoformat(), "children": [ { "linkode_id": child_1.linkode_id, - "timestamp": str(child_1.timestamp), + "timestamp": child_1.timestamp.isoformat(), "children": [ { "linkode_id": grandchild.linkode_id, - "timestamp": str(grandchild.timestamp), + "timestamp": grandchild.timestamp.isoformat(), "children": [] } ], }, { "linkode_id": child_2.linkode_id, - "timestamp": str(child_2.timestamp), + "timestamp": child_2.timestamp.isoformat(), "children": [] } ] From 166f68c41fcb49b10fc77950cbdf14c1ae01b091 Mon Sep 17 00:00:00 2001 From: Facundo Batista Date: Sat, 24 Aug 2024 18:16:08 -0300 Subject: [PATCH 2/2] Better docstring. --- kilink/views_v2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kilink/views_v2.py b/kilink/views_v2.py index b06d3af..c97c138 100644 --- a/kilink/views_v2.py +++ b/kilink/views_v2.py @@ -20,7 +20,7 @@ def external_url_for(*args, **kwargs): - """Provide the url for some params, always external. + """Provide the full url (including host) for some params. Always use this one, not 'url_for' directly. """