add initial script api woocommerce
This commit is contained in:
436
api_old_code.py
Normal file
436
api_old_code.py
Normal file
@ -0,0 +1,436 @@
|
||||
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
|
||||
)
|
||||
|
||||
class Authentification:
|
||||
# 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")
|
||||
|
||||
ath = Authentification()
|
||||
|
||||
path_name = "C:\\Users\\beren\\OneDrive\\Documents\\nextcloud\\beren\\site_missbleue\\photos\\Photos_Claudine\\Photos_bougies_Claudine"
|
||||
|
||||
images_to_upload = [
|
||||
{'categories': [
|
||||
(f"{path_name}\\Bougies\\Chope\\chope-sapin-face.jpg", "chope-sapin-face.jpg", "Chope sapin", "Chope sapin de face", "Gamme prestige"),
|
||||
(f"{path_name}\\Bougies\\Chope\\chope-adoucissant-face.jpg", "chope-adoucissant-face.jpg", "Chope adoucissant", "Chope adoucissant de face", "Chopes"),
|
||||
]
|
||||
},
|
||||
{'products':[
|
||||
(f"{path_name}\\Bougies\\Chope\\chope-citron-meringue-face.jpg", "chope-citron-meringue-face-1.jpg", "Chope citron meringuée (1)", "Chope citron meringuée de face", "Chopes"),
|
||||
(f"{path_name}\\Bougies\\Chope\\chope-citron-meringue-haut.jpg", "chope-citron-meringue-haut-1.jpg", "Chope citron meringuée (2)", "Chope citron meringuée de haut", "Chopes"),
|
||||
(f"{path_name}\\Bougies\\Chope\\chope-citron-meringue-dos.jpg", "chope-citron-meringue-dos-1.jpg", "Chope citron meringuée (3)", "Chope citron meringuée de dos", "Chopes")
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
category_parent_id = 0
|
||||
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),
|
||||
]
|
||||
|
||||
#media_api_url = f"https://lescreationsdemissbleue.local/wp-json/wp/v2/media"
|
||||
|
||||
class ImageManager:
|
||||
|
||||
def __init__(self, images_to_upload, ath, url_website):
|
||||
self.images_to_upload = images_to_upload
|
||||
self.ath = ath
|
||||
self.media_api_url = f"{url_website}/wp-json/wp/v2/media"
|
||||
self.dict_image = {}
|
||||
self.headers = {
|
||||
"Authorization": f"Basic {self.ath.auth_base64}",
|
||||
"Content-Type": "application/json"
|
||||
}
|
||||
|
||||
def update_data(self, title, alt, image_id):
|
||||
updata_data = {
|
||||
"title" : title,
|
||||
"alt_text": alt
|
||||
}
|
||||
|
||||
response = requests.post(
|
||||
f"{self.media_api_url}/{image_id}",
|
||||
headers=self.headers,
|
||||
json=updata_data,
|
||||
verify=False
|
||||
)
|
||||
|
||||
if response.status_code == 200:
|
||||
return response.json()
|
||||
else:
|
||||
return None
|
||||
|
||||
|
||||
|
||||
def upload_image(self, image_path, image_name, title, alt, category_name):
|
||||
with open(image_path, "rb") as image_file:
|
||||
response = requests.post(
|
||||
self.media_api_url,
|
||||
headers={
|
||||
"Authorization": f"Basic {self.ath.auth_base64}",
|
||||
"Content-Disposition": f"attachment; filename={image_name}"
|
||||
},
|
||||
files={"file": image_file},
|
||||
verify=False
|
||||
)
|
||||
|
||||
if response.status_code == 201:
|
||||
media_data = response.json()
|
||||
self.update_data(title, alt, media_data["id"])
|
||||
return {'category_name':category_name, 'id':media_data["id"], 'image_name':image_name, 'title':title} # Retourne l'ID de l'image
|
||||
else:
|
||||
return None
|
||||
|
||||
def update(self):
|
||||
uploaded_images_cat = []
|
||||
for image_path, image_name, title, alt, category_name in images_to_upload[0]['categories']:
|
||||
category_dict = self.upload_image(image_path, image_name, title, alt, category_name)
|
||||
uploaded_images_cat.append(category_dict)
|
||||
|
||||
uploaded_images_pro = []
|
||||
for image_path, image_name, title, alt, category_name in images_to_upload[1]['products']:
|
||||
image_dict = self.upload_image(image_path, image_name, title, alt, category_name)
|
||||
uploaded_images_pro.append(image_dict)
|
||||
|
||||
self.dict_image['category'] = uploaded_images_cat
|
||||
self.dict_image['product'] = uploaded_images_pro
|
||||
|
||||
return self.dict_image
|
||||
|
||||
def delete(self):
|
||||
pass
|
||||
|
||||
class CategoryManager:
|
||||
|
||||
def __init__(self, wcapi, ath, categories_to_create, url_website, uploaded_images):
|
||||
self.wcapi = wcapi
|
||||
self.ath = ath
|
||||
self.categories_to_create = categories_to_create
|
||||
self.categories_api_url = f"{url_website}/wp-json/wp/v2/product_cat"
|
||||
self.uploaded_images_cat = uploaded_images
|
||||
|
||||
self.media_api_url = f"{url_website}/wp-json/wp/v2/media"
|
||||
self.headers = {
|
||||
"Authorization": f"Basic {self.ath.auth_base64}",
|
||||
"Content-Type": "application/json"
|
||||
}
|
||||
|
||||
def create_category(self, name, description, parent_id=None):
|
||||
category_data = {
|
||||
"name": name,
|
||||
"description": description,
|
||||
"parent": parent_id if parent_id else 0,
|
||||
}
|
||||
response = self.wcapi.post("products/categories/", category_data)
|
||||
if response.status_code == 201:
|
||||
category = response.json()
|
||||
return category
|
||||
else:
|
||||
return None
|
||||
|
||||
def get_id_img_for_category(self, category):
|
||||
for cat_img in self.uploaded_images_cat:
|
||||
if category['name'] == cat_img['category_name']:
|
||||
image_id = {'id':cat_img['id']}
|
||||
#break
|
||||
return image_id
|
||||
|
||||
def update_data_img_id_for_category(self, img_id, cat_id):
|
||||
update_category_data = {
|
||||
"image" : img_id,
|
||||
}
|
||||
self.wcapi.put(f"products/categories/{cat_id}", update_category_data)
|
||||
|
||||
def update(self):
|
||||
for category in self.categories_to_create:
|
||||
name, description, parent_id = category
|
||||
if parent_id != None:
|
||||
parent_id = cat['id']
|
||||
cat = self.create_category(name, description, parent_id)
|
||||
img_id = self.get_id_img_for_category(cat)
|
||||
self.update_data_img_id_for_category(img_id,cat["id"])
|
||||
|
||||
def delete_category(self):
|
||||
response = self.wcapi.get(f"products/categories")
|
||||
for cat in response.json():
|
||||
print(f"cat_image = {cat['image']}")
|
||||
for category in self.categories_to_create:
|
||||
name, description, parent_id = category
|
||||
if cat['name'] == name:
|
||||
response = self.wcapi.delete(f"products/categories/{cat['id']}", params={"force": True})
|
||||
|
||||
def delete_img_category(self):
|
||||
for img_cat in self.uploaded_images_cat:
|
||||
print(f"img_cat['id'] = {img_cat['id']}")
|
||||
response = requests.delete(
|
||||
f"{self.media_api_url}/{img_cat['id']}",
|
||||
headers=self.headers,
|
||||
verify=False
|
||||
)
|
||||
|
||||
def delete_all_img_cat_by_name(self):
|
||||
response = requests.get(
|
||||
f"{self.media_api_url}?per_page=100",
|
||||
headers=self.headers,
|
||||
verify=False
|
||||
)
|
||||
images = response.json()
|
||||
for img in images:
|
||||
for path_image, name_image, title_image, text_alt, category_name in self.uploaded_images_cat:
|
||||
if img['title']['rendered'] == title_image:
|
||||
print(f"img_id = {img['id']}")
|
||||
print('iiii')
|
||||
response = requests.delete(
|
||||
f"{self.media_api_url}/{img['id']}?force=true",
|
||||
headers=self.headers,
|
||||
verify=False
|
||||
)
|
||||
|
||||
print(f"Status Code: {response.status_code}")
|
||||
pprint.pprint(response.json())
|
||||
|
||||
def delete(self):
|
||||
self.delete_category()
|
||||
#self.delete_img_category()
|
||||
self.delete_all_img_cat_by_name()
|
||||
|
||||
class ProductManager:
|
||||
def __init__(self, wcapi, ath, filename_ods, uploaded_images):
|
||||
self.wcapi = wcapi
|
||||
self.ath = ath
|
||||
self.uploaded_images_pro = uploaded_images
|
||||
self.filename_ods = filename_ods
|
||||
|
||||
self.media_api_url = f"{url_website}/wp-json/wp/v2/media"
|
||||
self.headers = {
|
||||
"Authorization": f"Basic {self.ath.auth_base64}",
|
||||
"Content-Type": "application/json"
|
||||
}
|
||||
|
||||
def get_list_id_img_for_product(self, product):
|
||||
image_id = {}
|
||||
list_image_id_for_product = []
|
||||
list_images_by_doc = [img.strip().replace('"', '') for img in product['Photo'].split(",")]
|
||||
#pprint.pprint(self.uploaded_images_pro)
|
||||
for pro_img in self.uploaded_images_pro:
|
||||
for image in list_images_by_doc:
|
||||
#print(f"list_images_by_doc = {list_images_by_doc}")
|
||||
if image == pro_img['image_name']:
|
||||
image_id = {'id':pro_img['id']}
|
||||
list_image_id_for_product.append(image_id)
|
||||
#print(f"list_image_id_for_product = {list_image_id_for_product}")
|
||||
return list_image_id_for_product
|
||||
|
||||
def get_list_category_for_product(self, product):
|
||||
response = self.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:
|
||||
#print(f"category['name'] = {category['name']}")
|
||||
#print(f"cat = {cat}")
|
||||
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(self, list_category_id, list_img_id, product_id):
|
||||
product_data = {
|
||||
'categories':list_category_id,
|
||||
'images':list_img_id,
|
||||
}
|
||||
print(f"product_id = {product_id}")
|
||||
self.wcapi.put(f"products/{product_id}", product_data)
|
||||
#self.wcapi.get(f"products/{product_id}")
|
||||
|
||||
def create_product(self, product):
|
||||
|
||||
product_data = {
|
||||
'name' : product['Nom'],
|
||||
'price': product['Prix'],
|
||||
'stock_quantity': product['Stock'],
|
||||
'description': product['Description'],
|
||||
'short_description': product['Courte_description'],
|
||||
}
|
||||
response = self.wcapi.post("products/", product_data)
|
||||
if response.status_code == 201:
|
||||
product = response.json()
|
||||
return product["id"]
|
||||
else:
|
||||
return None
|
||||
|
||||
def get_doc_ods(self):
|
||||
ezodf.config.set_table_expand_strategy('all')
|
||||
doc = ezodf.opendoc(self.filename_ods)
|
||||
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")
|
||||
return json_data
|
||||
|
||||
def update(self):
|
||||
json_data = self.get_doc_ods()
|
||||
for product in json_data:
|
||||
product_id = self.create_product(product)
|
||||
list_category_id = self.get_list_category_for_product(product)
|
||||
list_img_id = self.get_list_id_img_for_product(product)
|
||||
self.update_data_list_cat_product(list_category_id, list_img_id, product_id)
|
||||
|
||||
def delete_product(self):
|
||||
json_data = self.get_doc_ods()
|
||||
for product in json_data:
|
||||
list_products = self.wcapi.get(f"products/")
|
||||
for pro in list_products.json():
|
||||
print(f"product['Nom'] = {product['Nom']}")
|
||||
print(f"pro['name'] = {pro['name']}")
|
||||
if product['Nom'] == pro['name']:
|
||||
self.wcapi.delete(f"products/{pro['id']}")
|
||||
|
||||
|
||||
def delete_img_product(self):
|
||||
list_products = self.wcapi.get(f"products/")
|
||||
for pro in list_products.json():
|
||||
#print(f"pro['name'] = {pro['name']}")
|
||||
for img_pro in self.uploaded_images_pro:
|
||||
#print(f"img_pro['title'] = {img_pro['title']}")
|
||||
if pro['name'] == img_pro['title']:
|
||||
#print(f"img_pro['id'] = {img_pro['id']}")
|
||||
#print(f"pro['id'] = {pro['id']}")
|
||||
response = requests.post(
|
||||
f"{self.media_api_url}/{img_pro['id']}",
|
||||
headers=self.headers,
|
||||
json={"force": True}, # 🔥 Forcer la suppressio
|
||||
verify=False
|
||||
)
|
||||
|
||||
|
||||
def delete_all_img_product_by_name(self):
|
||||
response = requests.get(
|
||||
f"{self.media_api_url}?per_page=100",
|
||||
headers=self.headers,
|
||||
verify=False
|
||||
)
|
||||
images = response.json()
|
||||
for img in images:
|
||||
for path_image, name_image, title_image, text_alt, category_name in self.uploaded_images_pro:
|
||||
if img['title']['rendered'] == title_image:
|
||||
print(f"img_id = {img['id']}")
|
||||
print('iiii')
|
||||
response = requests.delete(
|
||||
f"{self.media_api_url}/{img['id']}?force=true",
|
||||
headers=self.headers,
|
||||
verify=False
|
||||
)
|
||||
|
||||
print(f"Status Code: {response.status_code}")
|
||||
pprint.pprint(response.json())
|
||||
|
||||
def delete_all_img_product(self):
|
||||
response = requests.get(
|
||||
f"{self.media_api_url}?per_page=100",
|
||||
headers=self.headers,
|
||||
verify=False
|
||||
)
|
||||
images = response.json()
|
||||
for img in images:
|
||||
for img_pro in self.uploaded_images_pro:
|
||||
if img['title']['rendered'] == img_pro['title']:
|
||||
print('coucou')
|
||||
print(f"img_pro['id'] = {img_pro['id']}")
|
||||
print(f"img['id'] = {img['id']}")
|
||||
response = requests.delete(
|
||||
#f"{self.media_api_url}/{img['id']}?force=true"
|
||||
f"{self.media_api_url}/{img_pro['id']}?force=true",
|
||||
headers=self.headers,
|
||||
verify=False
|
||||
)
|
||||
print(f"Status Code: {response.status_code}")
|
||||
pprint.pprint(response.json())
|
||||
|
||||
|
||||
|
||||
def delete(self):
|
||||
#self.delete_product()
|
||||
#self.delete_img_product()
|
||||
#self.delete_all_img_product()
|
||||
self.delete_all_img_product_by_name()
|
||||
|
||||
url_website = "https://lescreationsdemissbleue.local"
|
||||
filename_ods = "C:\\Users\\beren\\OneDrive\\Documents\\nextcloud\\beren\\site_missbleue\\infos_site.ods"
|
||||
|
||||
image_manager = ImageManager(images_to_upload,ath,url_website)
|
||||
dict_image = image_manager.update()
|
||||
|
||||
#category_manager = CategoryManager(wcapi,ath,categories_to_create,url_website,dict_image['category'])
|
||||
#category_manager.update()
|
||||
#category_manager = CategoryManager(wcapi,ath,categories_to_create,url_website,images_to_upload[0]["categories"])
|
||||
#category_manager.delete()
|
||||
|
||||
product_manager = ProductManager(wcapi,ath,filename_ods,dict_image['product'])
|
||||
#product_manager.update()
|
||||
#product_manager = ProductManager(wcapi,ath,filename_ods, images_to_upload[1]["products"])
|
||||
product_manager.delete()
|
||||
|
||||
"""ALL_MEDIAS=[
|
||||
{ 'slug': None, 'title': None, 'alt_text': None }
|
||||
]
|
||||
|
||||
ALL_CATEGORIES=[
|
||||
{ 'name': None, 'parent_name': 'None', 'description': None, 'media_slug': None }
|
||||
]
|
||||
|
||||
ALL_PRODUCTS=[
|
||||
{ 'name': None, 'parent_name': 'None', 'description': None, 'media_slug_list': [] }
|
||||
]
|
||||
|
||||
api = WoocommerceApi(...)
|
||||
|
||||
media_manager = MediaManager(api=api)
|
||||
media_manager.upload(media_list=...)
|
||||
media_manager.find_id_by_slug(slug=...)
|
||||
media_manager.delete(slug=...)
|
||||
|
||||
category_manager = CategoryManager(api=api, medias=media_manager.get_all_as_slug_dict())
|
||||
category_manager.create(name, short_description, description, )
|
||||
|
||||
|
||||
product_manager = ProductManager(api=api, medias=media_manager.get_all())
|
||||
product_manager.create(product_list=...)
|
||||
|
||||
manager = WooCommerceManager(media_manager, category_manager, product_manager)
|
||||
|
||||
manager.delete_product(slug=...)
|
||||
|
||||
|
||||
"""
|
||||
Reference in New Issue
Block a user