Source code for oneworldsync.models

"""
Models for the 1WorldSync API

This module defines data models for the 1WorldSync API responses.
"""


[docs] class Product: """ Model representing a product from the 1WorldSync API """
[docs] def __init__(self, data): """ Initialize a product from API data Args: data (dict): Product data from the API """ self.data = data self.item = data.get('item', {})
@property def item_id(self): """Get the primary item ID""" identifiers = self.item.get('itemIdentificationInformation', {}).get('itemIdentifier', []) for identifier in identifiers: if identifier.get('isPrimary') == 'true': return identifier.get('itemId') return None @property def brand_name(self): """Get the brand name""" try: info = self.item.get('tradeItemInformation', [])[0] desc_module = info.get('tradeItemDescriptionModule', {}) desc_info = desc_module.get('tradeItemDescriptionInformation', [])[0] return desc_info.get('brandNameInformation', {}).get('brandName') except (IndexError, KeyError, TypeError): return None @property def product_name(self): """Get the product name""" try: info = self.item.get('tradeItemInformation', [])[0] desc_module = info.get('tradeItemDescriptionModule', {}) desc_info = desc_module.get('tradeItemDescriptionInformation', [])[0] reg_names = desc_info.get('regulatedProductName', []) if reg_names: return reg_names[0].get('statement', {}).get('values', [])[0].get('value') except (IndexError, KeyError, TypeError): return None @property def description(self): """Get the product description""" try: info = self.item.get('tradeItemInformation', [])[0] desc_module = info.get('tradeItemDescriptionModule', {}) desc_info = desc_module.get('tradeItemDescriptionInformation', [])[0] desc = desc_info.get('additionalTradeItemDescription', {}) return desc.get('values', [])[0].get('value') except (IndexError, KeyError, TypeError): return None @property def images(self): """Get product images""" try: info = self.item.get('tradeItemInformation', [])[0] file_module = info.get('referencedFileDetailInformationModule', {}) file_headers = file_module.get('referencedFileHeader', []) images = [] for file_header in file_headers: if file_header.get('referencedFileTypeCode', {}).get('value') == 'PRODUCT_IMAGE': images.append({ 'url': file_header.get('uniformResourceIdentifier'), 'is_primary': file_header.get('isPrimaryFile', {}).get('value') == 'true' }) return images except (IndexError, KeyError, TypeError): return [] @property def dimensions(self): """Get product dimensions""" try: info = self.item.get('tradeItemInformation', [])[0] measurements_group = info.get('tradeItemMeasurementsModuleGroup', [])[0] measurements_module = measurements_group.get('tradeItemMeasurementsModule', {}) measurements = measurements_module.get('tradeItemMeasurements', {}) return { 'height': { 'value': measurements.get('height', {}).get('value'), 'unit': measurements.get('height', {}).get('qual') }, 'width': { 'value': measurements.get('width', {}).get('value'), 'unit': measurements.get('width', {}).get('qual') }, 'depth': { 'value': measurements.get('depth', {}).get('value'), 'unit': measurements.get('depth', {}).get('qual') } } except (IndexError, KeyError, TypeError): return {}
[docs] def __str__(self): """String representation of the product""" return f"{self.brand_name} - {self.product_name} ({self.item_id})"
[docs] class SearchResults: """ Model representing search results from the 1WorldSync API """
[docs] def __init__(self, data): """ Initialize search results from API data Args: data (dict): Search results data from the API """ self.data = data self.response_code = data.get('responseCode') self.response_message = data.get('responseMessage') self.total_results = int(data.get('totalNumOfResults', '0')) self.next_cursor = data.get('nextCursorMark') # Parse products self.products = [] for result in data.get('results', []): self.products.append(Product(result))
[docs] def __len__(self): """Get the number of products in the results""" return len(self.products)
[docs] def __iter__(self): """Iterate through products""" return iter(self.products)
[docs] def __getitem__(self, index): """Get a product by index""" return self.products[index]