adobe / adobe/target-python-sdk

get_attributes crashes with TypeError: 'NoneType' object is not iterable

Ouverte
#43 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub
Langage dominant
Python
Étoiles
4
Forks
7
Métriques de merge des PR
Aucune PR mergée en 30 j

Description

Hello,

I'm using version 1.1.0 of the `target-python-sdk` and some calls to `get_attributes` raises the following error:

```
Traceback (most recent call last):
File "/app/.venv/lib/python3.11/site-packages/target_python_sdk/__init__.py", line 268, in get_attributes
return AttributesProvider(response)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/app/.venv/lib/python3.11/site-packages/target_tools/attributes_provider.py", line 46, in __init__
self.indexed = create_indexed(offers_response.get("response"))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/app/.venv/lib/python3.11/site-packages/target_tools/attributes_provider.py", line 28, in create_indexed
for option in mbox.options:
TypeError: 'NoneType' object is not iterable
```

The error happens when an mbox name is wrong or even when the request doesn't match the audience rule for the given mbox.

The following code snippet would help to reproduce the problem:

```
target_client = TargetClient.create({
"client": "Client",
"organization_id": "Org-ID",
"events": {
"client_ready": client_ready_callback,
},
})

def get_attrs():
delivery_request = DeliveryRequest(
id=VisitorId(third_party_id="some-user-id"),
context=Context(
channel=ChannelType.WEB,
),
execute=ExecuteRequest(mboxes=[MboxRequest(name="invalid-mbox-name", index=1)]),
)

# target_client was correctly created and initialized
attrs = target_client.get_attributes(flag_names, {"request": delivery_request}) # Code crashes at this point

return attrs
```

Notice that you can pass a valid mbox name for an activity with a custom audience filter that doesn't match with the request context and the code will crash. For example, you could limite the activity with geolocation as this:

Image

The problem is with this part of the target-python-sdk's code:

```
def create_indexed(response):
"""
:param response: (delivery_api_client.Model.delivery_response.DeliveryResponse)
Target View Delivery API response
:return (dict) returns a map of mbox names to content
"""
result = {}
for request_type in REQUEST_TYPES:
if getattr(response, request_type) and getattr(response, request_type).mboxes:
for mbox in getattr(response, request_type).mboxes:
name = mbox.name
for option in mbox.options: # <---- mbox.options is None as returned by Adobe Target
if option.type == OptionType.JSON and option.content:
result[name] = {} if not result or not result.get(
name) else result[name]
result[name].update(option.content)
return result
```

Is there something I can do to prevent sdk from crashing?

Guide de contribution

Ouvrir le guide de contribution

Piste de recherche

Commencez dans target_tools/attributes_provider.py, au niveau de create_indexed, en utilisant la reproduction signalée de get_attributes avec un mbox invalide ou une audience qui ne correspond pas. Vérifiez comment est traitée une réponse dont mbox.options est défini sur None, et confirmez que le comportement final ne lève plus de TypeError et renvoie les attributs vides ou disponibles attendus.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
python
Domaine
api
Type d'issue
Bug
Difficulté
2/5
Temps estimé
1-3 heures
Activité
À l'abandon
Clarté
Clairement spécifiée
Accessibilité débutants
45/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.