diff --git a/swh/web/common/service.py b/swh/web/common/service.py --- a/swh/web/common/service.py +++ b/swh/web/common/service.py @@ -12,6 +12,7 @@ from swh.model import hashutil from swh.model.identifiers import CONTENT, DIRECTORY, RELEASE, REVISION, SNAPSHOT +from swh.model.model import OriginVisit from swh.storage.algos import diff, revisions_walker from swh.storage.algos.origin import origin_get_latest_visit_status from swh.storage.algos.snapshot import snapshot_get_latest @@ -859,7 +860,7 @@ def _lookup_origin_visits( origin_url: str, last_visit: Optional[int] = None, limit: int = 10 -) -> Iterator[Dict[str, Any]]: +) -> Iterator[OriginVisit]: """Yields the origin origins' visits. Args: @@ -868,15 +869,19 @@ limit (int): Number of elements max to display Yields: - Dictionaries of origin_visit for that origin + OriginVisit for that origin """ limit = min(limit, MAX_LIMIT) - for visit in storage.origin_visit_get( - origin_url, last_visit=last_visit, limit=limit - ): - visit["origin"] = origin_url - yield visit + page_token: Optional[str] + if last_visit is not None: + page_token = str(last_visit) + else: + page_token = None + visit_page = storage.origin_visit_get( + origin_url, page_token=page_token, limit=limit + ) + yield from visit_page.results def lookup_origin_visits( @@ -891,10 +896,11 @@ Dictionaries of origin_visit for that origin """ - visits = _lookup_origin_visits(origin, last_visit=last_visit, limit=per_page) - for visit in visits: - visit_status = storage.origin_visit_status_get_latest(origin, visit["visit"]) - yield converters.from_origin_visit({**visit, **visit_status.to_dict()}) + for visit in _lookup_origin_visits(origin, last_visit=last_visit, limit=per_page): + visit_status = storage.origin_visit_status_get_latest(origin, visit.visit) + yield converters.from_origin_visit( + {**visit_status.to_dict(), "type": visit.type} + ) def lookup_origin_visit_latest( diff --git a/swh/web/tests/conftest.py b/swh/web/tests/conftest.py --- a/swh/web/tests/conftest.py +++ b/swh/web/tests/conftest.py @@ -228,14 +228,25 @@ return [converters.from_origin(o.to_dict()) for o in origins] def origin_visit_get(self, origin_url): - visits = list(self.storage.origin_visit_get(origin_url)) - for i in range(len(visits)): - visit_status = self.storage.origin_visit_status_get_latest( - origin_url, visits[i]["visit"] - ) - visits[i] = converters.from_origin_visit( - {**visits[i], **visit_status.to_dict()} + next_page_token = None + visits = [] + while True: + visit_page = self.storage.origin_visit_get( + origin_url, page_token=next_page_token ) + next_page_token = visit_page.next_page_token + + for visit in visit_page.results: + visit_status = self.storage.origin_visit_status_get_latest( + origin_url, visit.visit + ) + visits.append( + converters.from_origin_visit( + {**visit_status.to_dict(), "type": visit.type} + ) + ) + if not next_page_token: + break return visits def origin_visit_get_by(self, origin_url: str, visit_id: int) -> OriginVisitInfo: diff --git a/swh/web/tests/strategies.py b/swh/web/tests/strategies.py --- a/swh/web/tests/strategies.py +++ b/swh/web/tests/strategies.py @@ -264,9 +264,10 @@ """ ret = [] tests_data = get_tests_data() + storage = tests_data["storage"] for origin in tests_data["origins"]: - visits = list(tests_data["storage"].origin_visit_get(origin["url"])) - if len(visits) > 1: + visit_page = storage.origin_visit_get(origin["url"]) + if len(visit_page.results) > 1: ret.append(origin) return sampled_from(ret)