Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save Antebios/f53807040247b536e1674758a400dc45 to your computer and use it in GitHub Desktop.
Save Antebios/f53807040247b536e1674758a400dc45 to your computer and use it in GitHub Desktop.
from woocommerce import API
import json
import time
import array
# Production
wcapi = API(
url="https://mysite.com",
consumer_key="ck_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
consumer_secret="cs_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
wp_api=True,
version="wc/v3",
timeout=15
)
#ProductID = 426
#ProductIDs = [298, 304, 307, 348, 350, 353, 355, 359, 361, 363, 365, 367, 369, 371, 373, 375, 377]
#ProductIDs = [288, 286, 284, 281, 279, 273, 271, 269, 267, 265, 261, 259, 254, 247, 243, 222, 220, 217]
ProductIDs = [215, 213, 211, 208, 206, 195, 125]
WhatIf = False # value is either True or False only.
option1 = "Original Painting"
option2 = "Print Size"
variationsDict = {
1: {'Painting':'X-Large'},
2: {'Print':'Small'},
3: {'Print':'Medium'},
4: {'Print':'Large'},
5: {'Print':'X-Large'}
}
def GetProductInfo(product_id: int):
global product_type
global product_price
global product_regular_price
global product_weight
global product_dimensions
global product_dimensions_length
global product_dimensions_width
global product_dimensions_height
global product_shipping_class
global product_shipping_class_id
global product_categories
# Get Parent Product Information
product = wcapi.get("products/" + str(product_id)).json()
#product_id = product["id"]
product_type = product["type"]
product_price = product["price"]
product_regular_price = product["regular_price"]
product_weight = product["weight"]
if not product_weight:
print("Missing product weight, so setting default to 4 lbs.")
product_weight = 4
product_dimensions = product["dimensions"]
product_dimensions_length = product_dimensions["length"]
product_dimensions_width = product_dimensions["width"]
product_dimensions_height = product_dimensions["height"]
product_shipping_class = product["shipping_class"]
product_shipping_class_id = product["shipping_class_id"]
product_categories = product["categories"]
def checkVariations(product_id: int, \
option1: str, \
option1Value: str, \
option2: str, \
option2Value: str) -> bool:
IsFound = False
IsOption1Found = False
IsOption2Found = False
variations_all = wcapi.get("products/" + str(product_id) + "/variations/").json()
attribCount = len(variations_all)
#option1 = "Original Painting"
#option1Value = "Painting"
#option2 = "Print Size"
#option2Value = "X-Large"
if attribCount > 0:
for variation in variations_all:
attribCollection = variation['attributes']
coll1 = attribCollection[0]
coll2 = attribCollection[1]
coll1Name = coll1['name']
coll1Option = coll1['option']
coll2Name = coll2['name']
coll2Option = coll2['option']
if (coll1Name == option1
and coll1Option == option1Value
and coll2Name == option2
and coll2Option == option2Value
):
IsFound = True
else:
IsFound = False
return IsFound
else:
#print("No Variations were found!")
IsFound = False
return IsFound
def CreateProductVariation(product_id: int, \
option1: str, \
option1Value: str, \
option2: str, \
option2Value: str):
if (option1Value == "Painting"
and option2Value == "X-Large"):
shipping_class = "large-painting"
prodvarManageStock = True
prodvarPrice = product_regular_price
prodvarStockQuantity = 1
prodvarWeight = product_weight
prodvarDimensions = {
"length": product_dimensions_length,
"width": product_dimensions_width,
"height": product_dimensions_height
}
prodvarMetaData = ""
prodvarShippingClass = product_shipping_class
# end of "Painting" : "X-Large"
if (option1Value == "Print"
and option2Value == "Small"):
prodvarManageStock = False
prodvarPrice = "5.00"
prodvarStockQuantity = 0
prodvarWeight = "0.1"
prodvarDimensions = {
"length": "8.5",
"width": "0.1",
"height": "11"
}
prodvarMetaData = {
"key": "_shipping-usps-envelope",
"value": "yes"
}
prodvarShippingClass = "large-envelope"
# end of "Print" : "Small"
if (option1Value == "Print"
and option2Value == "Medium"):
prodvarManageStock = False
prodvarPrice = "7.00"
prodvarStockQuantity = 0
prodvarWeight = "0.1"
prodvarDimensions = {
"length": "11",
"width": "0.1",
"height": "14"
}
prodvarMetaData = {
"key": "_shipping-usps-envelope",
"value": "yes"
}
prodvarShippingClass = "large-envelope"
# end of "Print" : "Medium"
if (option1Value == "Print"
and option2Value == "Large"):
prodvarManageStock = False
prodvarPrice = "25.00"
prodvarStockQuantity = 0
prodvarWeight = "0.2"
prodvarDimensions = {
"length": "16",
"width": "0.1",
"height": "20"
}
prodvarMetaData = ""
prodvarShippingClass = "tubes"
# end of "Print" : "Large"
if (option1Value == "Print"
and option2Value == "X-Large"):
prodvarManageStock = False
prodvarPrice = "30.00"
prodvarStockQuantity = 0
prodvarWeight = "0.2"
prodvarDimensions = {
"length": "18",
"width": "0.1",
"height": "24"
}
prodvarMetaData = ""
prodvarShippingClass = "tubes"
# end of "Print" : "X-Large"
# Now create structure
painting_variation_data = {
"manage_stock": prodvarManageStock,
"regular_price": prodvarPrice,
"stock_quantity": prodvarStockQuantity,
"weight": prodvarWeight,
"dimensions": prodvarDimensions,
"shipping_class": prodvarShippingClass,
"attributes": [
{
"id": 2,
"name": option1,
"option": option1Value
},
{
"id": 1,
"name": option2,
"option": option2Value
}
]
}
# ,
# "meta_data": [
# prodvarMetaData
# ]
print(prodvarMetaData)
if not prodvarMetaData:
#print("Missing meta_data")
print("Skipped adding variation for Product: " + str(product_id))
else:
#print("Found meta_data")
#print("Printing: prodvarMetaData")
#print(prodvarMetaData)
print("Adding variation for Product: " + str(product_id))
# metaVar = [prodvarMetaData]
painting_variation_data["meta_data"] = [prodvarMetaData]
print("Printing: painting_variation_data")
print(painting_variation_data)
if not WhatIf:
print("Updating record for " + str(product_id) + " for " + option1Value + ":" + option2Value)
wcapi.post("products/" + str(product_id) + "/variations", painting_variation_data).json()
time.sleep(3)
else:
print("Skipping creation of Variation for " + option1Value + ":" + option2Value)
print("================================================================")
## end of CreateProductVariation func ##
def ConvertProductToVariable (product_id: int):
attributes_data = {
"type": "variable",
"manage_stock": False,
"attributes": [
{
"id": 0,
"name": "Item Dimensions",
"position": 0,
"visible": True,
"variation": False,
"options": [
"16 x 20 in."
]
},
{
"id": 2,
"name": "Original Painting",
"position": 1,
"visible": True,
"variation": True,
"options": [
"Painting",
"Print"
]
},
{
"id": 1,
"name": "Print Size",
"position": 2,
"visible": True,
"variation": True,
"options": [
"Small",
"Medium",
"Large",
"X-Large"
]
}
],
"categories" : [
{
"id": 17
},
{
"id": 28
}
]
}
if not WhatIf:
print("Converting product to Variation for: " + str(product_id))
wcapi.put("products/" + str(product_id), attributes_data).json()
time.sleep(5)
else:
print("Skipped converting Product: " + str(product_id))
print("================================================================")
## end of ConvertProductToVariable func ##
def ProcessProducts(product_id: int):
# Convert Product from Simple to Variable
ConvertProductToVariable(product_id)
# Iterate through the list of variations
for p_id, p_info in variationsDict.items():
for key in p_info:
option1Value = key
option2Value = p_info[key]
results = checkVariations(product_id, option1, option1Value, option2, option2Value)
print("Results from checking variation: " + option1Value + ":" + option2Value + "==" + str(results))
if results == True:
print("Variation already exists, so skipping: " + option1Value + ":" + option2Value)
else:
print("About to create variation for: " + option1Value + ":" + option2Value)
CreateProductVariation(product_id, option1, option1Value, option2, option2Value)
for product_id in ProductIDs:
#print(product_id)
GetProductInfo(product_id)
ProcessProducts(product_id)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment