diff --git a/pypretix_device/client.py b/pypretix_device/client.py index 85b4280..19a5345 100644 --- a/pypretix_device/client.py +++ b/pypretix_device/client.py @@ -8,7 +8,7 @@ from typing import Any, Dict, List, Optional import requests -from pypretix_device.models import CheckinList, CheckinResult, DeviceInfo, Event, SearchResult +from pypretix_device.models import CheckinList, CheckinResult, DeviceInfo, Event, Item, SearchResult # API endpoint bases _CHECKINRPC_REDEEM = "checkinrpc/redeem/" @@ -134,7 +134,7 @@ class PretixDeviceClient: "source_type": "barcode", "lists": checkin_list_id, "type": "entry", - "force": True, + "force": False, "ignore_unpaid": False, "questions_supported": False, } @@ -189,7 +189,7 @@ class PretixDeviceClient: "source_type": "barcode", "lists": checkin_list_id, "type": "exit", - "force": True, + "force": False, "ignore_unpaid": False, "questions_supported": False, } @@ -357,6 +357,46 @@ class PretixDeviceClient: logger.error(f"Failed to list check-in lists: {e}") return [] + def list_items(self, event_slug: Optional[str] = None) -> List[Item]: + """List products/items for the current (or specified) event. + + Check-in responses (``checkinrpc/redeem``, ``checkinrpc/search``) only + include the numeric item ID on the position, not its name — use this + to resolve IDs to display names. + + Args: + event_slug: Event slug to fetch items for. Uses client default if not provided. + + Returns: + List of Item objects. + """ + event = event_slug or self.event_slug + endpoint = f"events/{event}/items/" + try: + resp = self._request("GET", self._api_url(endpoint)) + if resp is None: + logger.error("Failed to list items") + return [] + + data = resp.json() + result = [] + for item in data.get("results", []): + name_raw = item.get("name", "") + if isinstance(name_raw, dict): + name = name_raw.get("de") or name_raw.get("en") or "Unnamed" + else: + name = str(name_raw) + result.append(Item( + id=item["id"], + name=name, + internal_name=item.get("internal_name"), + )) + return result + + except (requests.exceptions.RequestException, ValueError, KeyError) as e: + logger.error(f"Failed to list items: {e}") + return [] + def select_event(self, event_slug: str) -> bool: """Switch the client to use a different event. diff --git a/pypretix_device/models.py b/pypretix_device/models.py index 6b91842..39f9919 100644 --- a/pypretix_device/models.py +++ b/pypretix_device/models.py @@ -43,6 +43,15 @@ class Event: date_to: Optional[str] = None +@dataclass +class Item: + """A product/item within an event.""" + + id: int + name: str + internal_name: Optional[str] = None + + @dataclass class CheckinList: """A check-in list within an event."""