Files
consumocuidado-server/utils/woocommerce.py
2021-02-24 11:54:11 +00:00

142 lines
4.5 KiB
Python

"""
This file holds the functions necesary to:
- Connect to seller's shop API
- Load information on seller [??]
- Load product information
"""
import logging
from io import BytesIO
import datetime
from woocommerce import API
import requests
from PIL import Image
from django.core.files import File
from companies.models import Company
from products.models import Product
from products.serializers import ProductSerializer
from history.models import HistorySync
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, user=None, 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
# 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:
import ipdb; ipdb.set_trace()
logging.error(f"Could not load products from {response.url}: [{response.status_code}]")
print(f"Could not load products fom {response.url}: [{response.status_code}]")
return None
# create HistorySync instance and link to every product created
history = HistorySync.objects.create(
company=company,
sync_date=datetime.datetime.now(),
)
product_fields = [f.name for f in Product._meta.get_fields()]
counter = 0
products_created = []
for product in products:
# extract m2m field data
tags = [t.get('name') for t in product.pop('tags')]
attributes = [t.get('name') for t in product.pop('attributes')]
# prepare instance data
instance_data = {
'company':company.id,
'creator': user.id if user is not None else None,
'history': history.id,
'url': product['permalink'],
}
# 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')
# alternative method
serializer = ProductSerializer(data=instance_data)
if serializer.is_valid():
try:
new = Product.objects.create(**serializer.validated_data)
new.tags = tags
new.attributes = attributes
new.save()
except Exception as e:
import ipdb; ipdb.set_trace()
logging.error(f"Could not create product instance: {str(e)}")
continue
try:
# get image
headers={"User-Agent" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}
image_url = product['images'][0]['src']
response = requests.get(image_url, stream=True, headers=headers)
response.raw.decode_content = True
image = Image.open(response.raw)
# save using File object
img_io = BytesIO()
image.save(img_io, format='JPEG')
new.image.save(f"{new.name}-{new.sku}.jpg", File(img_io), save=False)
new.save()
except Exception as e:
logging.error(f"Could not add image to product: {str(e)}")
else:
import ipdb; ipdb.set_trace()
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")
# update history.quantity
history.quantity = counter
history.save()
print(f"Products created: {counter}")
return products_created