376 lines
14 KiB
Python
376 lines
14 KiB
Python
from woocommerce import API
|
||
import pandas as pd
|
||
import ezodf
|
||
import requests
|
||
import pprint
|
||
import base64
|
||
import time
|
||
import json
|
||
|
||
wcapi = API(
|
||
url="https://lescreationsdemissbleue.local",
|
||
consumer_key="ck_604e9b7b5d290cce72346efade6b31cb9a1ff28e",
|
||
consumer_secret="cs_563974c7e59532c1ae1d0f8bbf61f0500d6bc768",
|
||
wp_api=True,
|
||
version="wc/v3",
|
||
verify_ssl=False # Désactive la vérification SSL pour le développement
|
||
)
|
||
|
||
# ✅ Identifiants WordPress (et non WooCommerce)
|
||
wordpress_username = "admin_lcdm" # Remplace par ton username WordPress
|
||
wordpress_application_password = "yTW8 Mc6J FUCN tPSq bnuJ 0Sdw" #"#8io_mb!55@Bis" # Généré dans WordPress > Utilisateurs
|
||
|
||
# ✅ Générer l'authentification Basic en base64
|
||
auth_str = f"{wordpress_username}:{wordpress_application_password}"
|
||
auth_bytes = auth_str.encode("utf-8")
|
||
auth_base64 = base64.b64encode(auth_bytes).decode("utf-8")
|
||
|
||
images_to_upload = [
|
||
{'categories': [
|
||
("C:\\Users\\beren\\OneDrive\\Documents\\nextcloud\\beren\\site_missbleue\\photos\\Photos_Claudine\\Photos_bougies_Claudine\\Bougies\\Chope\\chope-sapin-face.jpg", "chope-sapin-face.jpg", "Chope sapin", "Chope sapin de face", "Gamme prestige"),
|
||
("C:\\Users\\beren\\OneDrive\\Documents\\nextcloud\\beren\\site_missbleue\\photos\\Photos_Claudine\\Photos_bougies_Claudine\\Bougies\\Chope\\chope-adoucissant-face.jpg", "chope-adoucissant-face.jpg", "Chope adoucissant", "Chope adoucissant de face", "Chopes"),
|
||
]
|
||
},
|
||
{'images':[
|
||
("C:\\Users\\beren\\OneDrive\\Documents\\nextcloud\\beren\\site_missbleue\\photos\\Photos_Claudine\\Photos_bougies_Claudine\\Bougies\\Chope\\chope-citron-meringue-face.jpg", "chope-citron-meringue-face.jpg", "Chope citron meringuée (1)", "Chope citron meringuée de face", "Chopes"),
|
||
("C:\\Users\\beren\\OneDrive\\Documents\\nextcloud\\beren\\site_missbleue\\photos\\Photos_Claudine\\Photos_bougies_Claudine\\Bougies\\Chope\\chope-citron-meringue-haut.jpg", "chope-citron-meringue-haut.jpg", "Chope citron meringuée (2)", "Chope citron meringuée de haut", "Chopes"),
|
||
("C:\\Users\\beren\\OneDrive\\Documents\\nextcloud\\beren\\site_missbleue\\photos\\Photos_Claudine\\Photos_bougies_Claudine\\Bougies\\Chope\\chope-citron-meringue-dos.jpg", "chope-citron-meringue-dos.jpg", "Chope citron meringuée (3)", "Chope citron meringuée de dos", "Chopes")
|
||
]
|
||
}
|
||
]
|
||
"""updata_data = {
|
||
"title" : "Pyramide olfactive test",
|
||
"alt_text": "Pyramide olfactive test"
|
||
}
|
||
|
||
response = requests.post(
|
||
media_api_url,
|
||
headers=headers,
|
||
json=updata_data,
|
||
verify=False # ⚠️ Désactiver la vérification SSL si problème de certificat
|
||
)"""
|
||
|
||
|
||
def update_data(title, alt, image_id):
|
||
updata_data = {
|
||
"title" : title,
|
||
"alt_text": alt
|
||
}
|
||
headers = {
|
||
"Authorization": f"Basic {auth_base64}",
|
||
"Content-Type": "application/json"
|
||
}
|
||
|
||
response = requests.post(
|
||
f"{media_api_url}/{image_id}",
|
||
headers=headers,
|
||
json=updata_data,
|
||
verify=False # ⚠️ Désactiver la vérification SSL si problème de certificat
|
||
)
|
||
# ✅ Vérifier la réponse
|
||
if response.status_code == 200:
|
||
print(f"✅ Métadonnées mises à jour pour l’image {image_id} : {title} | ALT : {alt}")
|
||
return response.json() # Retourne les nouvelles données de l'image
|
||
else:
|
||
print(f"❌ Erreur mise à jour image : {response.status_code} {response.text}")
|
||
return None
|
||
|
||
media_api_url = f"https://lescreationsdemissbleue.local/wp-json/wp/v2/media"
|
||
|
||
def upload_image(image_path, image_name, title, alt, category_name):
|
||
with open(image_path, "rb") as image_file:
|
||
response = requests.post(
|
||
media_api_url,
|
||
headers={
|
||
"Authorization": f"Basic {auth_base64}",
|
||
"Content-Disposition": f"attachment; filename={image_name}"
|
||
},
|
||
files={"file": image_file},
|
||
verify=False
|
||
)
|
||
|
||
if response.status_code == 201:
|
||
media_data = response.json()
|
||
update_data(title, alt, media_data["id"])
|
||
return {'category_name':category_name, 'id':media_data["id"], 'image_name':image_name} # Retourne l'ID de l'image
|
||
else:
|
||
print(f"❌ Erreur image : {response.status_code} {response.text}")
|
||
return None
|
||
|
||
categories_api_url = "https://lescreationsdemissbleue.local/wp-json/wp/v2/product_cat"
|
||
category_parent_id = 0
|
||
image_id= None
|
||
categories_to_create = [
|
||
("Gamme prestige", "Catégorie principale pour organiser la gamme prestige", None),
|
||
("Chopes", "Catégorie enfant de la gamme prestige", category_parent_id),
|
||
]
|
||
|
||
def create_category(name, description, parent_id=None):
|
||
"""Crée une catégorie WooCommerce (principale ou sous-catégorie)"""
|
||
category_data = {
|
||
"name": name,
|
||
"description": description,
|
||
"parent": parent_id if parent_id else 0,
|
||
#'images':image_id
|
||
}
|
||
response = wcapi.post("products/categories/", category_data)
|
||
|
||
print(f"response.status_code = {response.status_code}")
|
||
print(f"Réponse API = {response.text}")
|
||
if response.status_code == 201:
|
||
category = response.json()
|
||
#pprint.pprint(category)
|
||
#return category["id"]
|
||
return category
|
||
else:
|
||
return None
|
||
|
||
uploaded_images_cat = []
|
||
for image_path, image_name, title, alt, category_name in images_to_upload[0]['categories']:
|
||
category_dict = upload_image(image_path, image_name, title, alt, category_name)
|
||
uploaded_images_cat.append(category_dict)
|
||
|
||
for image_path, image_name, title, alt, category_name in images_to_upload[1]['images']:
|
||
upload_image(image_path, image_name, title, alt, category_name)
|
||
|
||
|
||
def get_id_img_for_category(category):
|
||
headers = {
|
||
"Authorization": f"Basic {auth_base64}",
|
||
"Content-Type": "application/json"
|
||
}
|
||
|
||
response = requests.get(
|
||
media_api_url,
|
||
headers=headers,
|
||
verify=False # ⚠️ Désactiver la vérification SSL si problème de certificat
|
||
)
|
||
response_images = response.json()
|
||
image_id = {}
|
||
for img in response_images:
|
||
for cat_img in uploaded_images_cat:
|
||
print(f"cat_img['id'] = {cat_img['id']}")
|
||
if category['name'] == cat_img['category_name']:
|
||
image_id = {'id':cat_img['id']}
|
||
break
|
||
print(f"image_id = {image_id}")
|
||
return image_id
|
||
|
||
|
||
def update_data_img_id_for_category(img_id, cat_id):
|
||
update_category_data = {
|
||
"image" : img_id,
|
||
}
|
||
print(f"cat_id = {cat_id}")
|
||
print(f"img_id = {img_id}")
|
||
response = wcapi.put(f"products/categories/{cat_id}", update_category_data)
|
||
"""def get_id_img_for_category(category):
|
||
category_list_by_doc = [cat.strip().replace('"', '') for cat in product['Categorie'].split("/")]
|
||
#list_images_by_doc = [img.strip().replace('"', '') for img in product['Photo'].split(",")]
|
||
#print(f'category_list_by_doc = {category_list_by_doc}')
|
||
|
||
headers = {
|
||
"Authorization": f"Basic {auth_base64}",
|
||
"Content-Type": "application/json"
|
||
}
|
||
|
||
response = requests.get(
|
||
media_api_url,
|
||
headers=headers,
|
||
verify=False # ⚠️ Désactiver la vérification SSL si problème de certificat
|
||
)
|
||
|
||
response_images = response.json()
|
||
#print(f"response_images = {type(response_images)}")
|
||
for img in response_images:
|
||
#print(f"type_img = {type(img)}")
|
||
for key, value in img.items():
|
||
if key == 'source_url':
|
||
#print(f"key= {key}, value = {value}")
|
||
for image in list_images_by_doc:
|
||
if category['image_name'] in value:
|
||
img_id = category['id']
|
||
#pprint.pprint(f'list_image_for_product = {list_image_for_product}')
|
||
return img_id"""
|
||
|
||
for category in categories_to_create:
|
||
name, description, parent_id = category
|
||
if parent_id != None:
|
||
parent_id = cat['id']
|
||
#img_id = get_id_img_for_category(category)
|
||
cat = create_category(name, description, parent_id)
|
||
img_id = get_id_img_for_category(cat)
|
||
update_data_img_id_for_category(img_id,cat["id"])
|
||
|
||
def get_list_id_img_for_product(product):
|
||
list_images_by_doc = [img.strip().replace('"', '') for img in product['Photo'].split(",")]
|
||
|
||
headers = {
|
||
"Authorization": f"Basic {auth_base64}",
|
||
"Content-Type": "application/json"
|
||
}
|
||
|
||
response = requests.get(
|
||
media_api_url,
|
||
headers=headers,
|
||
verify=False # ⚠️ Désactiver la vérification SSL si problème de certificat
|
||
)
|
||
|
||
list_image_for_product = []
|
||
response_images = response.json()
|
||
for img in response_images:
|
||
for key, value in img.items():
|
||
if key == 'source_url':
|
||
for image in list_images_by_doc:
|
||
if image in value:
|
||
img_id_for_product = {'id':img['id'], 'value':value}
|
||
list_image_for_product.append(img_id_for_product)
|
||
break
|
||
return list_image_for_product[::-1]
|
||
|
||
|
||
def get_list_category_for_product(product):
|
||
response = wcapi.get("products/categories")
|
||
category_list_by_doc = [cat.strip().replace('"', '') for cat in product['Categorie'].split("/")]
|
||
list_category_for_product = []
|
||
for category in response.json():
|
||
for cat in category_list_by_doc:
|
||
if category['name'] == cat:
|
||
id_category = {'id':category['id']}
|
||
list_category_for_product.append(id_category)
|
||
return list_category_for_product
|
||
|
||
def update_data_list_cat_product(list_category_id, list_img_id, product_id):
|
||
product_data = {
|
||
'categories':list_category_id,
|
||
'images':list_img_id,
|
||
}
|
||
wcapi.put(f"products/{product_id}", product_data)
|
||
response_product = wcapi.get(f"products/{product_id}")
|
||
|
||
def create_product(product):
|
||
|
||
product_data = {
|
||
'name' : product['Nom'],
|
||
'price': product['Prix'],
|
||
'stock_quantity': product['Stock'],
|
||
'description': product['Description'],
|
||
#'images':list_id_image,
|
||
'short_description':product['Courte_description'],
|
||
#'categories':list_id_category
|
||
}
|
||
response = wcapi.post("products/", product_data)
|
||
|
||
print(f"response.status_code = {response.status_code}")
|
||
print("Réponse API :", response.text)
|
||
if response.status_code == 201:
|
||
product = response.json()
|
||
return product["id"]
|
||
else:
|
||
return None
|
||
|
||
ezodf.config.set_table_expand_strategy('all')
|
||
doc = ezodf.opendoc("C:\\Users\\beren\\OneDrive\\Documents\\nextcloud\\beren\\site_missbleue\\infos_site.ods")
|
||
|
||
# Sélectionner la première feuille
|
||
sheet = doc.sheets[0]
|
||
|
||
# Convertir la feuille en DataFrame
|
||
data = []
|
||
for row in sheet.rows():
|
||
data.append([cell.value for cell in row])
|
||
|
||
# Convertir en DataFrame Pandas
|
||
df = pd.DataFrame(data)
|
||
df.columns = df.iloc[0]
|
||
df = df[1:].reset_index(drop=True)
|
||
df = df.dropna(how='all')
|
||
json_data = df.to_dict(orient="records")
|
||
#get_data = json.dumps(json_data, indent=4, ensure_ascii=False)
|
||
for product in json_data:
|
||
#list_img_id = get_list_id_img_for_product(product)
|
||
product_id = create_product(product)
|
||
list_category_id = get_list_category_for_product(product)
|
||
list_img_id = get_list_id_img_for_product(product)
|
||
update_data_list_cat_product(list_category_id, list_img_id, product_id)
|
||
"""
|
||
categories_to_create = [
|
||
("Gamme prestige", "Catégorie principale pour organiser la gamme prestige", image_id, None),
|
||
("Chope", "Catégorie enfant de la gamme prestige", image_id, category_parent_id),
|
||
]
|
||
|
||
uploaded_images_cat = []
|
||
for image_path, image_name, title, alt, category_name in images_to_upload[0]['categories']:
|
||
image_name_id = upload_image(image_path, image_name, title, alt, category_name)
|
||
if image_name_id:
|
||
uploaded_images_cat.append(image_name_id)
|
||
|
||
uploaded_images = []
|
||
for image_path, image_name, title, alt, category_name in images_to_upload[1]['images']:
|
||
|
||
print(f'image_name = {image_name}')
|
||
image_name_id = upload_image(image_path, image_name, title, alt, category_name)
|
||
if image_name_id:
|
||
uploaded_images.append(image_name_id)
|
||
print(f"uploaded_images = {uploaded_images}")
|
||
|
||
def create_category(name, description, image_id=None, parent_id=None):
|
||
category_data = {
|
||
"name": name,
|
||
"description": description,
|
||
"parent": parent_id if parent_id else 0,
|
||
}
|
||
if image_id:
|
||
category_data['image'] = {'id':image_id}
|
||
|
||
|
||
#response = requests.post(categories_api_url, headers=headers, json=category_data, verify=False)
|
||
response = wcapi.post("products/categories/", category_data)
|
||
|
||
print(f"response.status_code = {response.status_code}")
|
||
print(f"Réponse API = {response.text}")
|
||
if response.status_code == 201:
|
||
category = response.json()
|
||
#pprint.pprint(category)
|
||
#return category["id"]
|
||
return {'category_name':category_name, 'id':category["id"]}
|
||
else:
|
||
return None
|
||
|
||
categories_list = []
|
||
for category in categories_to_create:
|
||
name, description, image_id, parent_id = category
|
||
for image in uploaded_images_cat:
|
||
if image['category_name'] == name:
|
||
image_id = image['id']
|
||
if parent_id != None:
|
||
parent_id = cat['id']
|
||
cat = create_category(name, description, image_id, parent_id)
|
||
print(f"category = {category}")
|
||
print(type(category))
|
||
categories_list.append(cat)
|
||
"""
|
||
"""list_id_image = []
|
||
pprint.pprint(uploaded_images)
|
||
for image in uploaded_images:
|
||
if image['image_name'] in image_list:
|
||
image = {'id':image['id']}
|
||
list_id_image.append(image)
|
||
|
||
list_id_category = []
|
||
pprint.pprint(categories_list)
|
||
pprint.pprint(category_list)
|
||
print('______')
|
||
for category in categories_list:
|
||
print(f'categoryyyy = {category}')
|
||
if category['category_name'] in category_list:
|
||
print(f"category['id'] = {category['id']}")
|
||
cat = {'id':category['id']}
|
||
list_id_category.append(cat)
|
||
print(f"list_id_category = {list_id_category}")
|
||
|
||
list_test = []
|
||
test = {'id':3}
|
||
list_test.append(test)
|
||
print(f"list_test = {list_test}") """
|
||
|