Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions examples/did_trunk_assignment.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@

def print_did_assignment(did_id):
result = client.dids().find(did_id, include_params).data
trunk_id = result._relationship_id("voice_in_trunk")
group_id = result._relationship_id("voice_in_trunk_group")
print(f" trunk = {trunk_id or 'null'}")
print(f" group = {group_id or 'null'}")
trunk = result.voice_in_trunk
group = result.voice_in_trunk_group
print(f" trunk = {trunk.id if trunk else 'null'}")
print(f" group = {group.id if group else 'null'}")


# Get a DID
Expand Down
3 changes: 0 additions & 3 deletions src/didww/resources/available_did.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,6 @@ class AvailableDid(DidwwApiModel):
class Meta:
type = "available_dids"

def nanpa_prefix_id(self):
return self._relationship_id("nanpa_prefix")


class AvailableDidRepository(ReadOnlyRepository):
_resource_class = AvailableDid
Expand Down
17 changes: 0 additions & 17 deletions src/didww/resources/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -328,23 +328,6 @@ def _null_relationship(self, key):
self.raw_object.relationships[key] = {"data": None}
self._mark_relationship_dirty(key)

def _relationship_id(self, key):
"""Get the ID from a to-one relationship without resolving it."""
try:
rel = self.relationships[key]
if rel.data and rel.data.id is not None:
return rel.data.id
except (KeyError, AttributeError):
pass
return None

def _relationship_ids(self, key):
"""Get IDs from a to-many relationship without resolving them."""
try:
rel = self.relationships[key]
return [item.id for item in rel.data if item.id is not None]
except (KeyError, AttributeError, TypeError):
return []


class ApiResponse:
Expand Down
3 changes: 0 additions & 3 deletions src/didww/resources/city.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,6 @@ class City(DidwwApiModel):
class Meta:
type = "cities"

def area_id(self):
return self._relationship_id("area")


class CityRepository(ReadOnlyRepository):
_resource_class = City
Expand Down
27 changes: 0 additions & 27 deletions src/didww/resources/requirement.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,33 +28,6 @@ class Requirement(DidwwApiModel):
class Meta:
type = "requirements"

def country_id(self):
return self._relationship_id("country")

def did_group_type_id(self):
return self._relationship_id("did_group_type")

def personal_permanent_document_id(self):
return self._relationship_id("personal_permanent_document")

def business_permanent_document_id(self):
return self._relationship_id("business_permanent_document")

def personal_onetime_document_id(self):
return self._relationship_id("personal_onetime_document")

def business_onetime_document_id(self):
return self._relationship_id("business_onetime_document")

def personal_proof_type_ids(self):
return self._relationship_ids("personal_proof_types")

def business_proof_type_ids(self):
return self._relationship_ids("business_proof_types")

def address_proof_type_ids(self):
return self._relationship_ids("address_proof_types")


class RequirementRepository(ReadOnlyRepository):
_resource_class = Requirement
Expand Down
19 changes: 9 additions & 10 deletions tests/fixtures/did_groups/show_with_requirement.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -36,20 +36,19 @@ interactions:
\ \"links\": {\n \"self\": \"https://sandbox-api.didww.com/v3/did_groups/2187c36d-28fb-436f-8861-5a0f5b5a3ee1/relationships/requirement\"\
,\n \"related\": \"https://sandbox-api.didww.com/v3/did_groups/2187c36d-28fb-436f-8861-5a0f5b5a3ee1/requirement\"\
\n },\n \"data\": {\n \"type\": \"requirements\",\n\
\ \"id\": \"c3d4e5f6-a1b2-7890-abcd-ef1234567890\"\n }\n \
\ \"id\": \"8da1e0b2-047c-4baf-9c57-57143f09b9ce\"\n }\n \
\ }\n }\n },\n \"included\": [\n {\n \"id\": \"dfd1a0a0-bd53-4f7a-9c8e-d2fc5dd1bf7e\"\
,\n \"type\": \"countries\",\n \"attributes\": {\n \"name\"\
: \"Germany\",\n \"prefix\": \"49\",\n \"iso\": \"DE\"\n \
\ }\n },\n {\n \"id\": \"c3d4e5f6-a1b2-7890-abcd-ef1234567890\"\
\ }\n },\n {\n \"id\": \"8da1e0b2-047c-4baf-9c57-57143f09b9ce\"\
,\n \"type\": \"requirements\",\n \"attributes\": {\n \"\
identity_type\": \"personal_or_business\",\n \"personal_area_level\"\
: \"city\",\n \"business_area_level\": \"city\",\n \"address_area_level\"\
: \"city\",\n \"personal_proof_qty\": 1,\n \"business_proof_qty\"\
: 1,\n \"address_proof_qty\": 1,\n \"personal_mandatory_fields\"\
: [\"first_name\", \"last_name\"],\n \"business_mandatory_fields\"\
: [\"company_name\"],\n \"service_description_required\": false,\n\
\ \"restriction_message\": null\n }\n }\n ],\n \"meta\":\
\ {\n \"api_version\": \"2022-05-09\"\n }\n}"
identity_type\": \"Any\",\n \"personal_area_level\": \"WorldWide\"\
,\n \"business_area_level\": \"WorldWide\",\n \"address_area_level\"\
: \"WorldWide\",\n \"personal_proof_qty\": 0,\n \"business_proof_qty\"\
: 0,\n \"address_proof_qty\": 0,\n \"personal_mandatory_fields\"\
: [],\n \"business_mandatory_fields\": [],\n \"service_description_required\"\
: false,\n \"restriction_message\": null\n }\n }\n ],\n \"\
meta\": {\n \"api_version\": \"2022-05-09\"\n }\n}"
headers:
Content-Type:
- application/vnd.api+json
Expand Down
14 changes: 6 additions & 8 deletions tests/resources/test_did_group.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from didww.enums import Feature
from didww.enums import Feature, IdentityType, AreaLevel
from tests.conftest import my_vcr
from didww.query_params import QueryParams

Expand Down Expand Up @@ -34,17 +34,15 @@ def test_find_did_group(self, client):

@my_vcr.use_cassette("did_groups/show_with_requirement.yaml")
def test_find_did_group_with_requirement(self, client):
params = QueryParams().include("country", "requirement")
params = QueryParams().include("requirement")
response = client.did_groups().find("2187c36d-28fb-436f-8861-5a0f5b5a3ee1", params)
dg = response.data
assert dg.id == "2187c36d-28fb-436f-8861-5a0f5b5a3ee1"
assert dg.prefix == "241"
country = dg.country
assert country is not None
assert country.name == "Germany"
assert dg.area_name == "Aachen"
requirement = dg.requirement
assert requirement is not None
assert requirement.id == "c3d4e5f6-a1b2-7890-abcd-ef1234567890"
assert requirement.personal_proof_qty == 1
assert requirement.business_proof_qty == 1
assert requirement.id == "8da1e0b2-047c-4baf-9c57-57143f09b9ce"
assert requirement.identity_type == IdentityType.ANY
assert requirement.personal_area_level == AreaLevel.WORLDWIDE
Comment on lines 43 to +47
Copy link

Copilot AI Mar 11, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test validates the resolved dg.requirement object, but it doesn’t assert the new DidGroup.requirement_id() accessor added in this PR. Add an assertion like assert dg.requirement_id() == <expected id> to ensure the relationship ID can be accessed without resolving the relationship.

Copilot uses AI. Check for mistakes.
assert requirement.service_description_required is False
24 changes: 7 additions & 17 deletions tests/resources/test_requirement.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,23 +33,13 @@ def test_find_requirement(self, client):
assert "Birth Date" in req.personal_mandatory_fields
assert isinstance(req.business_mandatory_fields, list)
assert "Company ID" in req.business_mandatory_fields
# relationship ID accessors
assert req.country_id() == "5b156dc2-327e-4665-bdc5-35cd8729b885"
assert req.did_group_type_id() == "994ea201-4a4d-4b27-ac4b-b5916ac969a3"
assert req.personal_permanent_document_id() == "fd38c86d-b69b-4ca8-b73c-286a3b93d107"
assert req.business_permanent_document_id() == "fd38c86d-b69b-4ca8-b73c-286a3b93d107"
assert req.personal_onetime_document_id() == "206ccec2-1166-461f-9f58-3a56823db548"
assert req.business_onetime_document_id() == "206ccec2-1166-461f-9f58-3a56823db548"
assert len(req.personal_proof_type_ids()) == 1
assert len(req.business_proof_type_ids()) == 7
assert len(req.address_proof_type_ids()) == 1
# included resource assertions
assert req.country is not None
assert req.did_group_type is not None
assert req.personal_permanent_document is not None
assert req.business_permanent_document is not None
assert req.personal_onetime_document is not None
assert req.business_onetime_document is not None
# included relationships
assert req.country.id == "5b156dc2-327e-4665-bdc5-35cd8729b885"
assert req.did_group_type.id == "994ea201-4a4d-4b27-ac4b-b5916ac969a3"
assert req.personal_permanent_document.id == "fd38c86d-b69b-4ca8-b73c-286a3b93d107"
assert req.business_permanent_document.id == "fd38c86d-b69b-4ca8-b73c-286a3b93d107"
assert req.personal_onetime_document.id == "206ccec2-1166-461f-9f58-3a56823db548"
assert req.business_onetime_document.id == "206ccec2-1166-461f-9f58-3a56823db548"
assert len(req.personal_proof_types) == 1
assert len(req.business_proof_types) == 7
assert len(req.address_proof_types) == 1
Loading