From 0b197cff7236f83f637a5b30f2e6b9f4185e8598 Mon Sep 17 00:00:00 2001 From: Stefan Pratter Date: Tue, 22 Aug 2023 20:58:52 +0300 Subject: [PATCH] Fix pending campus sync (#1428) * allow syncing of pending campuses through incremental sync * linting --- .../management/commands/pdb_api_test.py | 16 +++++++++++++++ peeringdb_server/rest.py | 20 +++++++++++++++++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/peeringdb_server/management/commands/pdb_api_test.py b/peeringdb_server/management/commands/pdb_api_test.py index 31a10928..f22116d4 100644 --- a/peeringdb_server/management/commands/pdb_api_test.py +++ b/peeringdb_server/management/commands/pdb_api_test.py @@ -3100,6 +3100,22 @@ class TestJSON(unittest.TestCase): ########################################################################## + def test_guest_005_list_campus_since(self): + # test that pending campuses are included in incremental update + # query (?since parameter) + + data = self.db_guest.all( + "campus", since=int(START_TIMESTAMP) - 10, status="pending" + ) + self.assertEqual(len(data), 7) + self.assert_handleref_integrity(data[0]) + self.assert_data_integrity(data[0], "campus") + + for row in data: + assert row["status"] == "pending" + + ########################################################################## + def test_guest_005_list_carrier_no_website(self): carrier = SHARED["carrier_rw_ok"] carrier.website = "" diff --git a/peeringdb_server/rest.py b/peeringdb_server/rest.py index f6a59a03..0385cede 100644 --- a/peeringdb_server/rest.py +++ b/peeringdb_server/rest.py @@ -612,7 +612,23 @@ class ModelViewSet(viewsets.ModelViewSet): if not self.kwargs: if since > 0: - # .filter(status__in=["ok","deleted"]) + # incremental update query (used by peeringdb-py client + # to handle incremental updates, will include `deleted` objects) + + allowed_status = ["ok", "deleted"] + + if self.model.HandleRef.tag == "campus": + # Special treatment for campus objects, since their status + # is fluid, depending on the number of facilities. #1472 + # + # If the campus has less than 2 facilities in it is considered pending + # If the campus has 2 or more facilities in it is considered ok + # + # Pending campuses need to be included in the incremental update , since + # a pending campus may be referenced by a facility + + allowed_status.append("pending") + qset = ( qset.since( timestamp=datetime.datetime.fromtimestamp(since).replace( @@ -621,7 +637,7 @@ class ModelViewSet(viewsets.ModelViewSet): deleted=True, ) .order_by("updated") - .filter(status__in=["ok", "deleted"]) + .filter(status__in=allowed_status) ) else: qset = qset.filter(status="ok")