Skip to content
Snippets Groups Projects
Commit 6c337a3a authored by Pelle Koster's avatar Pelle Koster
Browse files

better get/list visitor handling

parent 66cdcbba
Branches
Tags
No related merge requests found
...@@ -131,7 +131,7 @@ class ReportField: ...@@ -131,7 +131,7 @@ class ReportField:
path: str path: str
transform: Optional[Callable] = None transform: Optional[Callable] = None
def get_value(self, reader: InvoiceWrapper): def get_value(self, reader: StripeWrapper):
value = getattr_or_none(reader, self.path.split(".")) value = getattr_or_none(reader, self.path.split("."))
if value is not None and self.transform: if value is not None and self.transform:
value = self.transform(value) value = self.transform(value)
......
from __future__ import annotations from __future__ import annotations
from typing import Optional, Union from typing import Callable, Optional, Union
from django.http import Http404 from django.http import Http404
import requests import requests
from requests.auth import HTTPBasicAuth from requests.auth import HTTPBasicAuth
...@@ -24,18 +24,45 @@ class VisitorAPI: ...@@ -24,18 +24,45 @@ class VisitorAPI:
response.raise_for_status() response.raise_for_status()
return response.json() return response.json()
def list_visitors(self): def _request_visitors(self, from_revision=None):
all_visitors = self._request( params = {"showDeleted": "false"}
if from_revision is not None:
params["fromRevision"] = from_revision
return self._request(
"get", "get",
f"{BASE_URL}/visitors/{self.expo_id}", f"{BASE_URL}/visitors/{self.expo_id}",
params={"showDeleted": "false"}, params=params,
) )
def list_visitors(self):
all_visitors = self._request_visitors()
return [ return [
Visitor.from_api(data) Visitor.from_api(data)
for data in filter(lambda v: not v["deleted"], all_visitors) for data in filter(lambda v: not v["deleted"], all_visitors)
] ]
def get_visitor(self, visitor_id: str): def list_all_visitors(self, log_progress: Callable[[str]]):
last_revision = 0
next_revision = None
visitors_by_id = {}
while True:
response = self._request_visitors(from_revision=next_revision)
if log_progress is not None:
log_progress(f"Retrieved {len(response)} visitors")
next_revision = response[-1]["revision"]
for visitor in response:
visitors_by_id[visitor["id"]] = visitor
if next_revision == last_revision:
break
last_revision = next_revision
return [
Visitor.from_api(data)
for data in filter(lambda v: not v["deleted"], visitors_by_id.values())
]
def get_visitor(self, visitor_id: str, allow_deleted=False):
result = self._request( result = self._request(
"get", f"{BASE_URL}/visitors/{self.expo_id}/{visitor_id}" "get", f"{BASE_URL}/visitors/{self.expo_id}/{visitor_id}"
) )
...@@ -45,7 +72,8 @@ class VisitorAPI: ...@@ -45,7 +72,8 @@ class VisitorAPI:
# properly raise # properly raise
if not isinstance(result, dict): if not isinstance(result, dict):
raise Http404() raise Http404()
if result['deleted'] and not allow_deleted:
raise Http404()
return Visitor.from_api(result) return Visitor.from_api(result)
def update_visitor( def update_visitor(
......
...@@ -29,3 +29,21 @@ def test_special_fake_visitor_id_that_return_list(api): ...@@ -29,3 +29,21 @@ def test_special_fake_visitor_id_that_return_list(api):
) )
with pytest.raises(Http404): with pytest.raises(Http404):
api.get_visitor("fakevisitor") api.get_visitor("fakevisitor")
@responses.activate
def test_raises_on_deleted_visitor(api):
responses.reset()
responses.add(
responses.GET,
re.compile(r"https://api.visitcloud.com/create/v2/visitors/[^/]+/[^/]+$"),
json={
"deleted": True,
"expo": {"id": "18lm2fafttito", "name": "TNC25", "reference": ""},
"id": "0keoqgpagjw9e",
"reference": "",
"revision": 11539734023,
},
)
with pytest.raises(Http404):
api.get_visitor("0keoqgpagjw9e")
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment