""" This file holds the functions necesary to: - Connect to seller's shop API - Load information on seller [??] - Load product information """ import logging from woocommerce import API from companies.models import Company from products.models import Product from products.serializers import ProductSerializer def get_wcapi_instance(url, key, secret, version="wc/v3"): wcapi = API( url=url, consumer_key=key, consumer_secret=secret, wp_api=True, version=version ) return wcapi def migrate_shop_products(url, key, secret, version="wc/v3"): """Tries to connect to WooCommerce site @ url with given credentials If succesful, returns list of Product instances created """ # get wcapi wcapi = get_wcapi_instance(url, key, secret, version) consumer_key = 'ck_565539bb25b472b1ff7a209eb157ca11c0a26397' consumer_secret = 'cs_9c1690ba5da0dd70f51d61c395628fa14d1a104c' # get company fom url company = Company.objects.filter(web_link=url).first() if not company: # logging.error(f"Could not find Company with URL: {url}") # print(f"Could not find Company with URL: {url}") # return None # TODO: ELIMINATE THIS AFTER DEBUGGING company = Company.objects.create(web_link=url) logging.error(f"Created Company for testing: {url}") # list products response = wcapi.get('/products/') if response.status_code == 200: products = response.json() elif response.status_code == 401: logging.error(f"{response.status_code} [{response.url}]: {response.json()}") return None else: logging.error(f"Could not load products from {url}: [{response.status_code}]") print(f"Could not load products fom {url}: [{response.status_code}]") return None product_fields = [f.name for f in Product._meta.get_fields()] counter = 0 products_created = [] for product in products: instance_data = {'company':company.id} # parse the product info for key in product: if key in product_fields: instance_data[key] = product[key] # remove unwanted fields instance_data.pop('id') # extract m2m field data tags = instance_data.pop('tags') attributes = instance_data.pop('attributes') # create instance with serializer ''' serializer = ProductSerializer(data=instance_data) if serializer.is_valid(): new = serializer.save() if tags: new.tags.set(tags) if attributes: new.attributes.set(attributes) new.save() else: logging.error(f"{serializer.errors}") continue ''' # alternative method serializer = ProductSerializer(data=instance_data) if serializer.is_valid(): try: new = Product.objects.create(**serializer.validated_data) if tags: new.tags.set(tags) if attributes: new.attributes.set(attributes) new.save() except Exception as e: logging.error(f"Could not create product instance: {str(e)}") else: logging.error(f"{serializer.errors}") continue products_created.append(new) counter += 1 logging.info(f"Product {instance_data.get('name')} created") print(f"Product {instance_data.get('name')} created") print(f"Products created: {counter}") return products_created