Correction and create command terminal api woocommerce

This commit is contained in:
Bene
2025-04-24 17:27:31 +02:00
parent 8760966e4c
commit 832205450f
19 changed files with 9854 additions and 93 deletions

1150
api_woocommerce_070425.py Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1 @@
,LAPTOP-8GN3F14J/beren,LAPTOP-8GN3F14J,24.04.2025 17:17,file:///C:/Users/beren/AppData/Roaming/LibreOffice/4;

View File

@ -12,22 +12,50 @@ import unicodedata
import logging import logging
import os import os
import time import time
import argparse
from logging.handlers import TimedRotatingFileHandler
from watermark import create_watermark_image
logger = logging.getLogger(__name__) # Créer un dossier 'logs' s'il n'existe pas
log_directory = "logs"
os.makedirs(log_directory, exist_ok=True)
# 1 Configurer le logger # 🔧 Configuration du handler avec rotation quotidienne
logging.basicConfig( log_file = os.path.join(log_directory, "woocommerce.log")
filename="woocommerce.log", # 📌 Fichier où les logs seront sauvegardés handler = TimedRotatingFileHandler(
level=logging.DEBUG, # 📌 Niveau de log (DEBUG, INFO, WARNING, ERROR, CRITICAL) filename=log_file,
format="%(asctime)s - %(levelname)s - %(message)s", # 📌 Format du log when="midnight", # ⏰ Rotation tous les jours à minuit
datefmt="%Y-%m-%d %H:%M:%S" # 📌 Format de la date interval=1, # 📅 Chaque 1 jour
backupCount=7, # ♻️ Garde les 7 derniers fichiers de log
encoding='utf-8' # 🧾 Pour supporter tous les caractères
) )
# 📋 Format du log
formatter = logging.Formatter(
fmt="%(asctime)s - %(levelname)s - %(message)s",
datefmt="%Y-%m-%d %H:%M:%S"
)
handler.setFormatter(formatter)
# 🔌 Récupère le logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG) # 👁 Niveau minimum à capturer
logger.addHandler(handler)
# 🧪 Test
"""logger.debug("Démarrage du programme (DEBUG)")
logger.info("Traitement en cours (INFO)")
logger.warning("Avertissement (WARNING)")
logger.error("Erreur (ERROR)")
logger.critical("Erreur critique (CRITICAL)")"""
# via consumer key and consumer secret : # via consumer key and consumer secret :
# https://lescreationsdemissbleue.local/wp-json/wc/v3/products?consumer_key=ck_604e9b7b5d290cce72346efade6b31cb9a1ff28e&consumer_secret=cs_563974c7e59532c1ae1d0f8bbf61f0500d6bc768 # https://lescreationsdemissbleue.local/wp-json/wc/v3/products?consumer_key=ck_604e9b7b5d290cce72346efade6b31cb9a1ff28e&consumer_secret=cs_563974c7e59532c1ae1d0f8bbf61f0500d6bc768
wcapi = WoocommerceApi( wcapi = WoocommerceApi(
url="https://lescreationsdemissbleue.local", #url="https://lescreationsdemissbleue.local",
url="https://les-creations-de-missbleue.local",
consumer_key="ck_604e9b7b5d290cce72346efade6b31cb9a1ff28e", consumer_key="ck_604e9b7b5d290cce72346efade6b31cb9a1ff28e",
consumer_secret="cs_563974c7e59532c1ae1d0f8bbf61f0500d6bc768", consumer_secret="cs_563974c7e59532c1ae1d0f8bbf61f0500d6bc768",
wp_api=True, wp_api=True,
@ -48,10 +76,14 @@ class AuthentificationWpApi:
ath = AuthentificationWpApi() ath = AuthentificationWpApi()
WEBSITE_URL = "https://lescreationsdemissbleue.local" #WEBSITE_URL = "https://lescreationsdemissbleue.local"
FILENAME_ODS = "C:\\Users\\beren\\OneDrive\\Documents\\nextcloud\\beren\\site_missbleue\\donnees_site_internet_missbleue_corrige.ods" WEBSITE_URL = "https://les-creations-de-missbleue.local"
#FILENAME_ODS = "C:\\Users\\beren\\OneDrive\\Documents\\nextcloud\\beren\\site_missbleue\\donnees_site_internet_missbleue_corrige.ods"
BASE_PATH = "C:\\Users\\beren\\OneDrive\\Documents\\nextcloud\\beren\\site_missbleue\\photos\\photos_site\\Photos_site\\" BASE_PATH = "C:\\Users\\beren\\OneDrive\\Documents\\nextcloud\\beren\\site_missbleue\\photos\\photos_site\\Photos_site\\"
#FILENAME_ODS = "C:\\Users\\beren\\OneDrive\\Documents\\nextcloud\\beren\\site_missbleue\\infos_site.ods" #FILENAME_ODS = "C:\\Users\\beren\\OneDrive\\Documents\\nextcloud\\beren\\site_missbleue\\infos_site.ods"
FILENAME_ODS = "C:\\Users\\beren\\OneDrive\\Documents\\nextcloud\\beren\\site_missbleue\\api_woocommerce\\final_api_woocommerce\\donnees_site_internet_missbleue_corrige.ods"
class OdsReader: class OdsReader:
def __init__(self, filename_ods=FILENAME_ODS): def __init__(self, filename_ods=FILENAME_ODS):
@ -60,6 +92,12 @@ class OdsReader:
def get_all_product_lines(self): def get_all_product_lines(self):
return self.get_doc_ods(2) return self.get_doc_ods(2)
def fetch_all_product_rows(self, start, end=None):
return self.extract_ods_row(2, start, end)
def get_product_line_by_value(self, search_value):
return self.get_doc_ods_by_value(2, search_value)
def get_product_by_slug_from_ods(self, slug): def get_product_by_slug_from_ods(self, slug):
for product in self.get_all_product_lines(): for product in self.get_all_product_lines():
if product['Slug'] == slug: return product if product['Slug'] == slug: return product
@ -68,12 +106,27 @@ class OdsReader:
def get_all_media_lines(self): def get_all_media_lines(self):
return self.get_doc_ods(0) return self.get_doc_ods(0)
def fetch_all_media_rows(self, start, end=None):
return self.extract_ods_row(0, start, end)
def get_media_line_by_value(self, search_value):
return self.get_doc_ods_by_value(0, search_value)
def get_all_attribute_and_tab_lines(self): def get_all_attribute_and_tab_lines(self):
return self.get_doc_ods(3) return self.get_doc_ods(3)
def get_attribute_and_tab_lines(self, search_value):
return self.get_doc_ods_by_value(3, search_value)
def get_all_category_lines(self): def get_all_category_lines(self):
return self.get_doc_ods(1) return self.get_doc_ods(1)
def get_category_line_by_value(self, search_value):
return self.get_doc_ods_by_value(1, search_value)
def get_all_seo_lines(self):
return self.get_doc_ods(6)
def get_doc_ods(self, number_sheet): def get_doc_ods(self, number_sheet):
doc = ezodf.opendoc(self.filename_ods) doc = ezodf.opendoc(self.filename_ods)
sheet = doc.sheets[number_sheet] sheet = doc.sheets[number_sheet]
@ -88,21 +141,151 @@ class OdsReader:
json_data = df.to_dict(orient="records") json_data = df.to_dict(orient="records")
return json_data return json_data
def get_doc_ods_by_value(self, number_sheet, search_value=None):
doc = ezodf.opendoc(self.filename_ods)
sheet = doc.sheets[number_sheet]
data = []
for row in sheet.rows():
data.append([cell.value for cell in row])
df = pd.DataFrame(data)
df.columns = df.iloc[0]
df = df[1:].reset_index(drop=True)
df = df.dropna(how='all')
if search_value:
try:
print(f"Recherche de la valeur : {search_value}")
# Vérifier que le DataFrame n'est pas vide
if df.empty:
raise ValueError("Le DataFrame est vide")
# Nettoyer le search_value pour enlever les espaces superflus
search_value = str(search_value).strip()
# Dynamique sur la colonne à rechercher
column_name = 'Nom' # à modifier selon la situation
if column_name not in df.columns:
raise ValueError(f"La colonne '{column_name}' n'existe pas dans le DataFrame")
# Supprimer les espaces avant et après dans la colonne cible
df[column_name] = df[column_name].str.strip()
# Remplir les NaN par des chaînes vides
df[column_name] = df[column_name].fillna('')
# Recherche avec contains sur la colonne
mask = df[column_name].str.contains(str(search_value), case=False, na=False)
#print(f"Masque généré :\n{mask}")
if mask.sum() == 0: # Si aucune ligne ne correspond
raise ValueError(f"Aucune correspondance trouvée pour '{search_value}' dans la colonne '{column_name}'")
# Filtrage du DataFrame
df = df[mask]
#print(f"df après filtrage :\n{df}")
except ValueError as ve:
print(f"Erreur : {ve}")
logger.exception(f"🚫 Aucune correspondance trouvée pour '{search_value}' dans la colonne '{column_name}'")
except Exception as e:
print(f"Erreur lors de la recherche : {e}")
logger.exception(f"🚫 Erreur lors de la recherche de '{search_value}' dans la colonne '{column_name}'. Exception : {e}")
else:
print("Aucun search_value fourni")
# Convertir en json_data pour le retour
json_data = df.to_dict(orient="records")
return json_data
def extract_ods_row(self, number_sheet, start_row=None, end_row=None):
doc = ezodf.opendoc(self.filename_ods)
sheet = doc.sheets[number_sheet]
data = []
for row in sheet.rows():
data.append([cell.value for cell in row])
df = pd.DataFrame(data)
df.columns = df.iloc[0]
df = df[1:].reset_index(drop=True)
if start_row is not None and end_row is not None:
df = df.iloc[start_row:end_row]
elif start_row is not None:
df = df.iloc[start_row:]
elif end_row is not None:
df = df.iloc[:end_row]
df = df.dropna(how='all')
return df.to_dict(orient="records")
class MediaManager(OdsReader): class MediaManager(OdsReader):
def __init__(self, ath): def __init__(self, ath, filename_ods):# filename_ods
super().__init__() super().__init__(filename_ods) # filename_ods
self.ath = ath self.ath = ath
self.media_api_url = f"{WEBSITE_URL}/wp-json/wp/v2/media" self.media_api_url = f"{WEBSITE_URL}/wp-json/wp/v2/media"
self.media_api_settings = f"{WEBSITE_URL}/wp-json/wp/v2/settings" self.media_api_settings = f"{WEBSITE_URL}/wp-json/wp/v2/settings"
def upload_media(self): def upload_media(self, search_value=None):
json_data = self.get_all_media_lines() if search_value:
json_data = self.get_media_line_by_value(search_value)
else:
json_data = self.get_all_media_lines()
for media in json_data: for media in json_data:
path = Path(BASE_PATH + media['Chemin']) path = Path(BASE_PATH + media['Chemin'])
image_name = path.name image_name = path.name
try:
if not self.is_exists(media, image_name):
image_path = BASE_PATH + media['Chemin']
# 👇 Tentative d'ouverture et d'envoi
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_media(media, media_data['id'])
logger.info(f"✅ Image uploadée : {image_name}")
else:
logger.error(f"❌ Échec de l'upload ({response.status_code}) pour : {image_name} - URL: {self.media_api_url}")
else:
logger.info(f"↪️ Image déjà existante (non uploadée) : {image_name}")
except FileNotFoundError:
logger.exception(f"🚫 Fichier introuvable : {image_name} ({path})")
except requests.RequestException as e:
logger.exception(f"🔌 Problème réseau/API lors de l'upload de {image_name} : {e}")
except Exception as e:
logger.exception(f"🔥 Erreur inattendue lors de l'upload de {image_name} : {e}")
def create_and_update_media(self, media, image_name, path, watermark=False):
try:
if not self.is_exists(media, image_name): if not self.is_exists(media, image_name):
with open(BASE_PATH + media['Chemin'], "rb") as image_file: if watermark:
image_path = path
else:
image_path = BASE_PATH + media['Chemin']
print(f"image_path = {image_path}")
# 👇 Tentative d'ouverture et d'envoi
with open(image_path, "rb") as image_file:
response = requests.post( response = requests.post(
self.media_api_url, self.media_api_url,
headers={ headers={
@ -115,10 +298,34 @@ class MediaManager(OdsReader):
if response.status_code == 201: if response.status_code == 201:
media_data = response.json() media_data = response.json()
self.update_data_media(media, media_data['id']) self.update_data_media(media, media_data['id'])
logger.info(f"✅ Image uploadée : {image_name}")
else: else:
return None logger.error(f"❌ Échec de l'upload ({response.status_code}) pour : {image_name} - URL: {self.media_api_url}")
except FileNotFoundError:
logger.exception(f"🚫 Fichier introuvable : {image_name} ({path})")
except requests.RequestException as e:
logger.exception(f"🔌 Problème réseau/API lors de l'upload de {image_name} : {e}")
except Exception as e:
logger.exception(f"🔥 Erreur inattendue lors de l'upload de {image_name} : {e}")
def upload_media_from_to(self, range_start, range_end=None):
json_data = self.fetch_all_media_rows(range_start, range_end)
for media in json_data:
path = Path(BASE_PATH + media['Chemin'])
image_name = path.name
first_folder = media['Chemin'].split("\\")[0]
print(f"first_folder = {first_folder}")
watermarked_path = Path(create_watermark_image(str(path)))
watermarked_name = watermarked_path.name
if first_folder == 'Logo':
self.create_and_update_media(media,image_name,path)
else: else:
pass self.create_and_update_media(media, watermarked_name, watermarked_path, True)
def is_exists(self, media, image_name): def is_exists(self, media, image_name):
all_images = self.get_all_images() all_images = self.get_all_images()
@ -139,10 +346,13 @@ class MediaManager(OdsReader):
} }
path = Path(BASE_PATH + media['Chemin']) path = Path(BASE_PATH + media['Chemin'])
image_name = path.name image_name = path.name
response = requests.post( response = requests.post(
f"{self.media_api_url}/{id_img}", f"{self.media_api_url}/{id_img}",
headers={ headers={
"Authorization": f"Basic {self.ath.auth_base64}", "Authorization": f"Basic {self.ath.auth_base64}",
#"Authorization": f"Basic {self.ath['auth_base64']}",
"Content-Disposition": f"attachment; filename={image_name}" "Content-Disposition": f"attachment; filename={image_name}"
}, },
json=update_data, json=update_data,
@ -173,6 +383,7 @@ class MediaManager(OdsReader):
if img['slug'] == slug: if img['slug'] == slug:
delete_url = f"{self.media_api_url}/{img['id']}?force=true" delete_url = f"{self.media_api_url}/{img['id']}?force=true"
response = requests.delete(delete_url, response = requests.delete(delete_url,
#headers={"Authorization": f"Basic {self.ath['auth_base64']}"},
headers={"Authorization": f"Basic {self.ath.auth_base64}"}, headers={"Authorization": f"Basic {self.ath.auth_base64}"},
verify=False) verify=False)
@ -183,6 +394,7 @@ class MediaManager(OdsReader):
while True: while True:
response = requests.get(f"{self.media_api_url}?per_page=100&page={page}", response = requests.get(f"{self.media_api_url}?per_page=100&page={page}",
headers={"Authorization": f"Basic {self.ath.auth_base64}"}, headers={"Authorization": f"Basic {self.ath.auth_base64}"},
#headers={"Authorization": f"Basic {self.ath['auth_base64']}"},
verify=False verify=False
) )
if response.status_code != 200: if response.status_code != 200:
@ -205,6 +417,7 @@ class MediaManager(OdsReader):
response = requests.delete(delete_url, response = requests.delete(delete_url,
headers={"Authorization": f"Basic {self.ath.auth_base64}"}, headers={"Authorization": f"Basic {self.ath.auth_base64}"},
#{"Authorization": f"Basic {self.ath['auth_base64']}"},
verify=False) verify=False)
if response.status_code in [200, 410]: # 410 = déjà supprimé if response.status_code in [200, 410]: # 410 = déjà supprimé
print(f"Image {img_id} supprimée.") print(f"Image {img_id} supprimée.")
@ -219,6 +432,7 @@ class MediaManager(OdsReader):
response = requests.delete(delete_url, response = requests.delete(delete_url,
headers={"Authorization": f"Basic {self.ath.auth_base64}"}, headers={"Authorization": f"Basic {self.ath.auth_base64}"},
#"Authorization": f"Basic {self.ath['auth_base64']}"},
verify=False) verify=False)
if response.status_code in [200, 410]: # 410 = déjà supprimé if response.status_code in [200, 410]: # 410 = déjà supprimé
print(f"Image {img_id} supprimée.") print(f"Image {img_id} supprimée.")
@ -248,8 +462,8 @@ class MediaManager(OdsReader):
class CategoryManager(OdsReader): class CategoryManager(OdsReader):
def __init__(self, wcapi, ath, medias=None): def __init__(self, wcapi, ath, filename_ods, medias=None):
super().__init__() super().__init__(filename_ods)
self.wcapi = wcapi self.wcapi = wcapi
self.ath = ath self.ath = ath
self.medias = medias self.medias = medias
@ -275,9 +489,17 @@ class CategoryManager(OdsReader):
"slug":slug "slug":slug
} }
if self.find_id_by_slug(slug): if self.find_id_by_slug(slug):
self.error_log.append(f"Catégorie contenant comme slug '{slug}' existe déjà") #self.error_log.append(f"Catégorie contenant comme slug '{slug}' existe déjà")
logger.debug(f"Catégorie contenant comme slug '{slug}' existe déjà")
else: else:
self.wcapi.post("products/categories/", category_data) try:
response = self.wcapi.post("products/categories/", category_data)
if response.status_code == 201:
logger.info(f"Catégorie créé avec succès. ID: {response.json()['id']}")
else:
logger.error(f"Erreur lors de la création de la catégorie. Code: {response.status_code}, Message: {response.text}")
except Exception as e:
logger.error(f"Erreur inattendue lors de l'envoi de la catégorie à WooCommerce: {e}")
def assign_parent_category(self, parent_slug, slug): def assign_parent_category(self, parent_slug, slug):
response = self.wcapi.get("products/categories/",params={"per_page": 100}) response = self.wcapi.get("products/categories/",params={"per_page": 100})
@ -298,6 +520,8 @@ class CategoryManager(OdsReader):
return cat['id'] return cat['id']
def find_media_id_by_slug(self, media_slug): def find_media_id_by_slug(self, media_slug):
#print(f"media_slug = {media_slug}")
#pprint.pprint(self.medias.items())
for id, slug in self.medias.items(): for id, slug in self.medias.items():
if media_slug == slug: if media_slug == slug:
return id return id
@ -312,8 +536,13 @@ class CategoryManager(OdsReader):
} }
self.wcapi.put(f"products/categories/{cat_id}", update_category_data) self.wcapi.put(f"products/categories/{cat_id}", update_category_data)
def update_data_categories(self): def update_data_categories(self, search_value=None):
json_data = self.get_all_category_lines() if search_value:
print("la")
json_data = self.get_category_line_by_value(search_value)
else:
print("oula")
json_data = self.get_all_category_lines()
for category in json_data: for category in json_data:
self.create_category(category['Nom'], category['Description'], category['Slug']) self.create_category(category['Nom'], category['Description'], category['Slug'])
cat_id = self.find_id_by_slug(category['Slug']) cat_id = self.find_id_by_slug(category['Slug'])
@ -346,8 +575,8 @@ class CategoryManager(OdsReader):
return print(f"self.error_log = {self.error_log}") return print(f"self.error_log = {self.error_log}")
class ProductManager(OdsReader): class ProductManager(OdsReader):
def __init__(self, wcapi, ath, medias=None): def __init__(self, wcapi, ath, filename_ods, medias=None):
super().__init__() super().__init__(filename_ods)
self.wcapi = wcapi self.wcapi = wcapi
self.ath = ath self.ath = ath
self.medias = medias self.medias = medias
@ -431,12 +660,22 @@ class ProductManager(OdsReader):
else: else:
print(f"error") print(f"error")
def create_product(self, product_data): def create_product(self, product_data):
if self.find_id_by_slug(product_data['slug']): if self.find_id_by_slug(product_data['slug']):
self.error_log.append(f"Produit contenant comme slug '{product_data['slug']}' existe déjà") #self.error_log.append(f"Produit contenant comme slug '{product_data['slug']}' existe déjà")
logger.debug(f"Produit contenant comme slug '{product_data['slug']}' existe déjà")
else: else:
response = self.wcapi.post("products/", product_data) try:
response = self.wcapi.post("products/", product_data)
if response.status_code == 201:
# Le produit a été créé avec succès
logger.info(f"Produit créé avec succès. ID: {response.json()['id']}")
else:
# Le produit n'a pas été créé, mais il y a une réponse avec un code d'erreur
logger.error(f"Erreur lors de la création du produit. Code: {response.status_code}, Message: {response.text}")
except Exception as e:
logger.error(f"Erreur inattendue lors de l'envoi du produit à WooCommerce: {e}")
def update_data_product(self, product_data, categories, medias): def update_data_product(self, product_data, categories, medias):
json_data = self.get_all_product_lines() json_data = self.get_all_product_lines()
for product in json_data: for product in json_data:
@ -526,8 +765,8 @@ class ProductManager(OdsReader):
class AttributeManager(OdsReader): class AttributeManager(OdsReader):
def __init__(self, wcapi): def __init__(self, wcapi, filename_ods):
super().__init__() super().__init__(filename_ods)
self.wcapi = wcapi self.wcapi = wcapi
def get_attributes(self): def get_attributes(self):
@ -550,8 +789,11 @@ class AttributeManager(OdsReader):
list_name_data.append(item['Nom']) list_name_data.append(item['Nom'])
return list_name_data return list_name_data
def create(self): def create(self, search_value=None):
features_json_data = self.get_all_attribute_and_tab_lines() if search_value:
features_json_data = self.get_attribute_and_tab_lines(search_value)
else:
features_json_data = self.get_all_attribute_and_tab_lines()
for item in features_json_data: for item in features_json_data:
if item['Onglet'].strip() == "Informations Complémentaires": if item['Onglet'].strip() == "Informations Complémentaires":
attribute_data = { attribute_data = {
@ -559,11 +801,14 @@ class AttributeManager(OdsReader):
} }
self.wcapi.post(f"products/attributes", attribute_data) self.wcapi.post(f"products/attributes", attribute_data)
def get_term(self): def get_term(self, search_value=None):
term_dict = {} term_dict = {}
list_item = [] if search_value:
term_json_data = self.get_all_attribute_and_tab_lines() term_json_data = self.get_attribute_and_tab_lines(search_value)
else:
term_json_data = self.get_all_attribute_and_tab_lines()
for item in term_json_data: for item in term_json_data:
list_item = []
if item['Onglet'].strip() == "Informations Complémentaires": if item['Onglet'].strip() == "Informations Complémentaires":
if "," in item["Valeurs"]: if "," in item["Valeurs"]:
list_item = [value_term.strip() for value_term in item['Valeurs'].split(",")] list_item = [value_term.strip() for value_term in item['Valeurs'].split(",")]
@ -573,6 +818,7 @@ class AttributeManager(OdsReader):
term_dict[item['Nom']] = list_item term_dict[item['Nom']] = list_item
else: else:
term_dict[item['Nom']] = item['Valeurs'] term_dict[item['Nom']] = item['Valeurs']
return term_dict return term_dict
def configure_term(self): def configure_term(self):
@ -677,12 +923,15 @@ class AttributeManager(OdsReader):
class TabManager(OdsReader): class TabManager(OdsReader):
def __init__(self, wcapi): def __init__(self, wcapi,filename_ods):
super().__init__() super().__init__(filename_ods)
self.wcapi = wcapi self.wcapi = wcapi
def get_list_name_data(self): def get_list_name_data(self, search_value=None):
list_name_data = [] list_name_data = []
"""if search_value:
json_data = self.get_attribute_and_tab_lines(search_value)
else:"""
json_data = self.get_all_attribute_and_tab_lines() json_data = self.get_all_attribute_and_tab_lines()
for item in json_data: for item in json_data:
if item['Onglet'].strip() != "Informations Complémentaires": if item['Onglet'].strip() != "Informations Complémentaires":
@ -731,7 +980,7 @@ class TabManager(OdsReader):
} }
res = self.wcapi.put(f"products/{product_id}", meta_data_data) res = self.wcapi.put(f"products/{product_id}", meta_data_data)
else: else:
print('else') #print('else')
data_tab = { data_tab = {
'content':content, 'content':content,
} }
@ -771,8 +1020,8 @@ class TabManager(OdsReader):
class VariationsManager(OdsReader): class VariationsManager(OdsReader):
def __init__(self, wcapi): def __init__(self, wcapi, filename_ods):
super().__init__() super().__init__(filename_ods)
self.wcapi = wcapi self.wcapi = wcapi
def get_attribute_id(self, product_data): def get_attribute_id(self, product_data):
@ -880,8 +1129,8 @@ class VariationsManager(OdsReader):
return False return False
class WooCommerceManager(OdsReader): class WooCommerceManager(OdsReader):
def __init__(self, wcapi, media_manager, category_manager, product_manager, tab_manager, attribute_manager, variation_manager): def __init__(self, wcapi, media_manager, category_manager, product_manager, tab_manager, attribute_manager, variation_manager, filename_ods):
super().__init__() super().__init__(filename_ods)
self.wcapi = wcapi self.wcapi = wcapi
self.media_manager = media_manager self.media_manager = media_manager
self.category_manager = category_manager self.category_manager = category_manager
@ -889,6 +1138,7 @@ class WooCommerceManager(OdsReader):
self.tab_manager = tab_manager self.tab_manager = tab_manager
self.attribute_manager = attribute_manager self.attribute_manager = attribute_manager
self.variation_manager = variation_manager self.variation_manager = variation_manager
self.filename_ods = filename_ods
def tab_exists(self, product_id, name_tab): def tab_exists(self, product_id, name_tab):
return self.product_manager.tab_exists(product_id, name_tab) return self.product_manager.tab_exists(product_id, name_tab)
@ -923,7 +1173,7 @@ class WooCommerceManager(OdsReader):
for title, content in value: for title, content in value:
if key: if key:
if key in product['short_description']: if key in product['short_description']:
tab_manager.create_for_product(product_id=product_id, title=title, content=content, nickname="", position=x, tab_type="local") self.tab_manager.create_for_product(product_id=product_id, title=title, content=content, nickname="", position=x, tab_type="local")
x=x+1 x=x+1
else: else:
pass pass
@ -999,20 +1249,83 @@ class WooCommerceManager(OdsReader):
def create_or_update_product(self, product_data, attributes, tabs, categories, medias): def create_or_update_product(self, product_data, attributes, tabs, categories, medias):
self.product_manager.update_data_product(product_data=product_data, categories=categories, medias=medias) try:
self.update_product_attribute(attributes=attributes, product_data=product_data) self.product_manager.update_data_product(product_data=product_data, categories=categories, medias=medias)
product_id = self.product_manager.find_id_by_slug(product_data['slug']) self.update_product_attribute(attributes=attributes, product_data=product_data)
self.update_product_variations(product_data) product_id = self.product_manager.find_id_by_slug(product_data['slug'])
self.tab_manager.create_or_update_for_product(product_id=product_id, tabs=tabs) self.update_product_variations(product_data)
self.tab_manager.create_or_update_for_product(product_id=product_id, tabs=tabs)
except Exception as e:
print(f"Erreur lors de la mise à jour du produit: {e}")
logger.exception(f"Erreur lors de la mise à jour du produit: {e}")
def get_product_lines(self, search_value=None):
if search_value:
print('')
return self.get_product_line_by_value(search_value)
else:
return self.get_all_product_lines()
def process_file(self, filename): def process_file(self, search_value=None):
# refresh media cache # refresh media cache
medias = media_manager.get_all_as_slug_dict() medias = self.media_manager.get_all_as_slug_dict()
self.product_manager.medias = medias
# read provided file
products_lines = self.get_product_lines(search_value)
print('yoooo')
#pprint.pprint(products_lines)
for product_line in products_lines:
# standard product data
product_data = {
'name' : product_line['Nom'],
'price': product_line['Prix'],
'regular_price': product_line['Prix'],
'stock_quantity': product_line['Stock'],
'manage_stock':True,
'weight':str(product_line['Poids']),
'sku':str(product_line['Numéro de référence']),
'description': product_line['Description'],
'short_description': product_line['Courte Description'],
'slug':product_line['Slug']
}
if product_line['Type'] == "parfums":
product_data['type'] = "variable"
else:
product_data['type'] = "simple"
attributes = {
"Temps de combustion" : product_line['Temps de combustion'],
"Type de cire" : product_line['Type de cire'],
"Mèche" : product_line['Mèche'],
"Fabrication" : product_line['Fabrication'],
"Composition" : product_line['Composition'],
"Ingrédients et engagements" : product_line['Ingrédients et engagements'],
"Parfums" : product_line['Parfums']
}
tabs ={
#"Description" : product_line["Description"],
"Conseils d'utilisation" : product_line["Conseils dutilisation"],
"Précautions articles" : product_line["Précautions articles"],
#"Allergènes" : product_line["Allergènes"]
}
# ... associated categories
categories = self.get_list_category_for_product(product_line['Catégories'])
# ... associated medias
medias = self.get_list_media_id_for_product(product_line['Media Slugs'])
# create or update product
self.create_or_update_product(product_data=product_data, attributes=attributes, tabs=tabs, categories=categories, medias=medias)
def process_file_from_to(self, range_start, range_end=None):
# refresh media cache
medias = self.media_manager.get_all_as_slug_dict()
self.product_manager.medias = medias self.product_manager.medias = medias
# read provided file # read provided file
reader = OdsReader(filename) #reader = OdsReader(filename)
for product_line in reader.get_all_product_lines(): for product_line in self.fetch_all_product_rows(range_start, range_end):
# standard product data # standard product data
product_data = { product_data = {
'name' : product_line['Nom'], 'name' : product_line['Nom'],
@ -1074,48 +1387,174 @@ class WooCommerceManager(OdsReader):
self.category_manager.delete_all_category() self.category_manager.delete_all_category()
def delete_information_by_slug(self): def delete_information_by_slug(self):
product_manager.delete_product_by_slug("chope-adoucissant") self.product_manager.delete_product_by_slug("chope-adoucissant")
#category_manager.delete_all_category() #category_manager.delete_all_category()
class OrderManager:
def __init__(self, wcapi, ath):
super().__init__()
self.wcapi = wcapi
self.ath = ath
self.error_log = []
self.headers = {
"Authorization": f"Basic {self.ath.auth_base64}",
"Content-Type": "application/json"
}
def delete_all_orders(self):
response = self.wcapi.get("orders/",params={"per_page": 100})
print(f"response = {response.status_code}")
if response.status_code == 200:
orders = response.json()
for index, order in enumerate(orders):
#print(f"index = {index}")
#print(f"order = {order}")
self.wcapi.delete(f"orders/{order['id']}", params={"force": True}).json()
"""def find_order_id_by_slug(self, slug):
response = self.wcapi.get("orders/",params={"per_page": 100})
if response.status_code == 200:
orders = response.json()
for cat in categories:
if cat['slug'] == slug:
return cat['id']"""
class SeoManager(OdsReader):
def __init__(self, ath, filename_ods):# filename_ods
super().__init__(filename_ods) # filename_ods
self.ath = ath
self.page_api_url = f"{WEBSITE_URL}/wp-json/wp/v2/pages"
def get_all_pages(self):
print("coucou")
"""Récupère toutes les images en gérant la pagination"""
all_pages = []
dict_id_slug = {}
#while True:
response = requests.get(f"{self.page_api_url}?per_page=100",
headers={"Authorization": f"Basic {self.ath.auth_base64}"},
#headers={"Authorization": f"Basic {self.ath['auth_base64']}"},
verify=False
)
if response.status_code != 200:
pass
list_pages = response.json()
#pprint.pprint(page)
#print(page[0]['_links'])
#print(page[0]['slug'])
print(f"count = {len(list_pages)}")
if not list_pages:
pass
#print('_______')
#pprint.pprint(page)
for index, page in enumerate(list_pages):
dict_id_slug[list_pages[index]['id']] = list_pages[index]['slug']
all_pages.append(dict_id_slug)
dict_id_slug = {}
return all_pages
def update_seo_page(self):
all_pages = self.get_all_pages()
pprint.pprint(all_pages)
seo_lines = self.get_all_seo_lines()
#pprint.pprint(seo_lines)
for page_id_slug in all_pages:
for key_page, slug_page in page_id_slug.items():
print(f"key_page = {key_page}")
for line in seo_lines:
#dict_seo = {}
if line['Slug'] == slug_page:
data = {
"meta": {
"og_title": line["Titre"],
"og_description": line["Description"],
#"_yoast_wpseo_opengraph-title": line["Titre"],
#"_yoast_wpseo_opengraph-description": line["Description"]
}
}
response = requests.post(
f"{self.page_api_url}/{key_page}",
headers={
"Authorization": f"Basic {self.ath.auth_base64}",
"Content-Type": "application/json"
},
json=data,
verify=False
)
""""meta": {
"_yoast_wpseo_title": line["Titre"],
"_yoast_wpseo_metadesc": line["Description"],
"_yoast_wpseo_opengraph-title": line["Titre"],
"_yoast_wpseo_opengraph-description": line["Description"]
}"""
"""dict_seo['yoast_head_json']['description'] = line['Description']
dict_seo['yoast_head_json']['og_description'] = line['Description']
dict_seo['yoast_head_json']['og_title'] = line['Titre']
response = requests.post(
f"{self.page_api_url}/{page['id']}",
headers={
"Authorization": f"Basic {self.ath.auth_base64}",
#"Authorization": f"Basic {self.ath['auth_base64']}",
#"Content-Disposition": f"attachment; filename={image_name}"
},
json=dict_seo,
verify=False
)"""
#page['yoast_head_json']['description']
#page['yoast_head_json']['og_description']
#page['yoast_head_json']['og_title']
#ALL_TABS = ["Allergènes", "Conseils dutilisation", "Description", "Précautions articles"] #ALL_TABS = ["Allergènes", "Conseils dutilisation", "Description", "Précautions articles"]
#ALL_ATTRIBUTES = ["Temps de combustion", "Type de cire", "Mèche", "Fabrication", "Composition", "Ingrédients et engagement"] #ALL_ATTRIBUTES = ["Temps de combustion", "Type de cire", "Mèche", "Fabrication", "Composition", "Ingrédients et engagement"]
if __name__ == "__main__":
media_manager = MediaManager(ath=ath) #seo_manager = SeoManager(ath=ath, filename_ods=FILENAME_ODS)
#media_manager.upload_media() #pages = seo_manager.get_all_pages()
#media_manager.delete_all_images() #seo_manager.update_seo_page()
#media_manager.assign_image_logo() #media_manager = MediaManager(ath=ath)
category_manager = CategoryManager(wcapi=wcapi,ath=ath) #media_manager.upload_media()
#category_manager.delete_all_category() #media_manager.delete_all_images()
product_manager = ProductManager(wcapi=wcapi,ath=ath) #media_manager.assign_image_logo()
#product_manager.delete_all_product() #category_manager = CategoryManager(wcapi=wcapi,ath=ath)
#medias=media_manager.get_all_as_slug_dict() #category_manager.delete_all_category()
#media_manager.delete_media_by_slug('pyramide-olfactive-frangipanier') order_manager = OrderManager(wcapi=wcapi,ath=ath)
#product_manager.delete_product_by_slug("citron-meringue") order_manager.delete_all_orders()
#product_manager.update_data_product() #product_manager = ProductManager(wcapi=wcapi,ath=ath)
tab_manager = TabManager(wcapi=wcapi) #product_manager.delete_all_product()
attribute_manager = AttributeManager(wcapi=wcapi) #medias=media_manager.get_all_as_slug_dict()
variation_manager = VariationsManager(wcapi=wcapi) #media_manager.delete_media_by_slug('pyramide-olfactive-frangipanier')
#attribute_manager.create(ALL_ATTRIBUTES) #product_manager.delete_product_by_slug("citron-meringue")
#attribute_manager.create() #product_manager.update_data_product()
#attribute_manager.configure_term() #tab_manager = TabManager(wcapi=wcapi)
#attribute_manager.delete_all_term() #attribute_manager = AttributeManager(wcapi=wcapi)
#product_id = product_manager.find_id_by_slug("citron-meringue")""" #variation_manager = VariationsManager(wcapi=wcapi)
woocommerce_manager = WooCommerceManager(wcapi=wcapi, media_manager=media_manager,category_manager=category_manager,product_manager=product_manager, tab_manager=tab_manager, attribute_manager=attribute_manager, variation_manager=variation_manager) #attribute_manager.create(ALL_ATTRIBUTES)
##woocommerce_manager.delete_all_informations() # #attribute_manager.create()
woocommerce_manager.create_all_informations() #attribute_manager.configure_term()
##woocommerce_manager.process_file(FILENAME_ODS) #attribute_manager.delete_all_term()
#category_manager.update_data_categories() #product_id = product_manager.find_id_by_slug("citron-meringue")"""
#woocommerce_manager.delete_all_informations() #woocommerce_manager = WooCommerceManager(wcapi=wcapi, media_manager=media_manager,category_manager=category_manager,product_manager=product_manager, tab_manager=tab_manager, attribute_manager=attribute_manager, variation_manager=variation_manager)
#woocommerce_manager.delete_information_by_slug() ##woocommerce_manager.delete_all_informations() #
#woocommerce_manager.create_all_informations() #woocommerce_manager.create_all_informations()
#woocommerce_manager.create_all_categories_and_products() ##woocommerce_manager.process_file(FILENAME_ODS)
#woocommerce_manager.update_product_tab() #category_manager.update_data_categories()
#woocommerce_manager.tab_manager.delete_by_product_id(1890) #woocommerce_manager.delete_all_informations()
#woocommerce_manager.tab_manager.delete_all() #woocommerce_manager.delete_information_by_slug()
#woocommerce_manager.update_product() #woocommerce_manager.create_all_informations()
#woocommerce_manager.attribute_manager.delete_all_for_product() #woocommerce_manager.create_all_categories_and_products()
#woocommerce_manager.update_product_attribute_by_slug('citron-meringue') #woocommerce_manager.update_product_tab()
#woocommerce_manager.attribute_manager.delete_all_for_product() #woocommerce_manager.tab_manager.delete_by_product_id(1890)
#woocommerce_manager.tab_manager.delete_all()
#woocommerce_manager.update_product()
#woocommerce_manager.attribute_manager.delete_all_for_product()
#woocommerce_manager.update_product_attribute_by_slug('citron-meringue')
#woocommerce_manager.attribute_manager.delete_all_for_product()
"""tabs_in_product = [] """tabs_in_product = []
for tab in ALL_TABS: for tab in ALL_TABS:
@ -1147,4 +1586,10 @@ ex: traiter uniquement les articles dont le nom contient le terme "bougie"
... --categories [--products-regex=.*bougie.*] ... --categories [--products-regex=.*bougie.*]
""" """
#parser = argparse.ArgumentParser(description="Script de traitement WooCommerce")
#wcctl --wc-url=https://lescreationsdemissbleue.local --wc-key=<consumer_key> --wc-secret=<consumer_secret> import-ods --ods-path=fichier.ods

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 KiB

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,46 @@
2025-04-09 10:18:28 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:18:31 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:18:34 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:18:37 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:18:42 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:18:45 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:18:48 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:18:51 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:18:54 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:18:57 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:19:01 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:19:04 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:19:07 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:19:10 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:19:13 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:19:16 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:19:19 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:19:22 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:19:25 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:19:28 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:19:31 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:19:34 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:19:39 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:19:42 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:19:46 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:19:49 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:19:52 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:19:57 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:20:03 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:20:06 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:20:09 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:20:12 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:20:16 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:20:19 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:20:22 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:20:26 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:20:29 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:20:32 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:20:36 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:20:39 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:20:43 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:20:46 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:20:49 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:20:52 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:20:55 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-09 10:20:58 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà

View File

@ -0,0 +1,929 @@
2025-04-23 11:59:38 - INFO - ↪️ Image déjà existante (non uploadée) : chope-sapin-noel-profil.jpg
2025-04-23 11:59:40 - INFO - ↪️ Image déjà existante (non uploadée) : chope-adoucissant-face.jpg
2025-04-23 11:59:42 - INFO - ↪️ Image déjà existante (non uploadée) : chope-adoucissant-haut.jpg
2025-04-23 11:59:44 - INFO - ↪️ Image déjà existante (non uploadée) : chope-adoucissant-profil.jpg
2025-04-23 11:59:46 - INFO - ↪️ Image déjà existante (non uploadée) : chope-citron-meringue-face.jpg
2025-04-23 11:59:47 - INFO - ↪️ Image déjà existante (non uploadée) : chope-citron-meringue-haut.jpg
2025-04-23 12:02:55 - INFO - ↪️ Image déjà existante (non uploadée) : chope-sapin-noel-profil.jpg
2025-04-23 12:02:57 - INFO - ↪️ Image déjà existante (non uploadée) : chope-adoucissant-face.jpg
2025-04-23 12:02:59 - INFO - ↪️ Image déjà existante (non uploadée) : chope-adoucissant-haut.jpg
2025-04-23 12:03:00 - INFO - ↪️ Image déjà existante (non uploadée) : chope-adoucissant-profil.jpg
2025-04-23 12:03:03 - INFO - ↪️ Image déjà existante (non uploadée) : chope-citron-meringue-face.jpg
2025-04-23 12:03:05 - INFO - ↪️ Image déjà existante (non uploadée) : chope-citron-meringue-haut.jpg
2025-04-23 12:04:44 - INFO - ✅ Image uploadée : chope-sapin-noel-profil.jpg
2025-04-23 12:04:46 - INFO - ↪️ Image déjà existante (non uploadée) : chope-adoucissant-face.jpg
2025-04-23 12:04:48 - INFO - ↪️ Image déjà existante (non uploadée) : chope-adoucissant-haut.jpg
2025-04-23 12:04:50 - INFO - ↪️ Image déjà existante (non uploadée) : chope-adoucissant-profil.jpg
2025-04-23 12:04:52 - INFO - ↪️ Image déjà existante (non uploadée) : chope-citron-meringue-face.jpg
2025-04-23 12:04:54 - INFO - ↪️ Image déjà existante (non uploadée) : chope-citron-meringue-haut.jpg
2025-04-23 12:07:03 - INFO - ↪️ Image déjà existante (non uploadée) : chope-sapin-noel-profil.jpg
2025-04-23 12:07:05 - INFO - ↪️ Image déjà existante (non uploadée) : chope-adoucissant-face.jpg
2025-04-23 12:07:07 - INFO - ↪️ Image déjà existante (non uploadée) : chope-adoucissant-haut.jpg
2025-04-23 12:07:09 - INFO - ↪️ Image déjà existante (non uploadée) : chope-adoucissant-profil.jpg
2025-04-23 12:07:11 - INFO - ↪️ Image déjà existante (non uploadée) : chope-citron-meringue-face.jpg
2025-04-23 12:07:13 - INFO - ↪️ Image déjà existante (non uploadée) : chope-citron-meringue-haut.jpg
2025-04-23 12:09:56 - INFO - ↪️ Image déjà existante (non uploadée) : chope-sapin-noel-profil.jpg
2025-04-23 12:09:58 - INFO - ↪️ Image déjà existante (non uploadée) : chope-adoucissant-face.jpg
2025-04-23 12:10:00 - INFO - ↪️ Image déjà existante (non uploadée) : chope-adoucissant-haut.jpg
2025-04-23 12:10:02 - INFO - ↪️ Image déjà existante (non uploadée) : chope-adoucissant-profil.jpg
2025-04-23 12:10:04 - INFO - ↪️ Image déjà existante (non uploadée) : chope-citron-meringue-face.jpg
2025-04-23 12:10:06 - INFO - ↪️ Image déjà existante (non uploadée) : chope-citron-meringue-haut.jpg
2025-04-23 12:15:11 - INFO - ↪️ Image déjà existante (non uploadée) : logo-lescreationsdemissbleue-fond-transparent.png
2025-04-23 12:15:18 - INFO - ✅ Image uploadée : chope-sapin-noel-face.jpg
2025-04-23 12:15:25 - INFO - ✅ Image uploadée : chope-sapin-noel-haut.jpg
2025-04-23 12:15:32 - INFO - ✅ Image uploadée : chope-sapin-noel-profil.jpg
2025-04-23 12:21:10 - INFO - ↪️ Image déjà existante (non uploadée) : logo-lescreationsdemissbleue-fond-transparent.png
2025-04-23 12:21:17 - INFO - ✅ Image uploadée : chope-sapin-noel-face.jpg
2025-04-23 12:21:24 - INFO - ✅ Image uploadée : chope-sapin-noel-haut.jpg
2025-04-23 12:21:30 - INFO - ✅ Image uploadée : chope-sapin-noel-profil.jpg
2025-04-23 12:23:45 - INFO - ↪️ Image déjà existante (non uploadée) : logo-lescreationsdemissbleue-fond-transparent.png
2025-04-23 12:23:47 - INFO - ↪️ Image déjà existante (non uploadée) : chope-sapin-noel-face.jpg
2025-04-23 12:23:49 - INFO - ↪️ Image déjà existante (non uploadée) : chope-sapin-noel-haut.jpg
2025-04-23 12:23:51 - INFO - ↪️ Image déjà existante (non uploadée) : chope-sapin-noel-profil.jpg
2025-04-23 12:24:23 - INFO - ↪️ Image déjà existante (non uploadée) : logo-lescreationsdemissbleue-fond-transparent.png
2025-04-23 12:24:25 - INFO - ↪️ Image déjà existante (non uploadée) : chope-sapin-noel-face.jpg
2025-04-23 12:24:27 - INFO - ↪️ Image déjà existante (non uploadée) : chope-sapin-noel-haut.jpg
2025-04-23 12:24:29 - INFO - ↪️ Image déjà existante (non uploadée) : chope-sapin-noel-profil.jpg
2025-04-23 14:11:25 - INFO - ✅ Image uploadée : logo-lescreationsdemissbleue.jpg
2025-04-23 14:11:28 - INFO - ✅ Image uploadée : logo-lescreationsdemissbleue-fond-transparent.png
2025-04-23 14:13:18 - INFO - ↪️ Image déjà existante (non uploadée) : logo-lescreationsdemissbleue.jpg
2025-04-23 14:13:19 - INFO - ↪️ Image déjà existante (non uploadée) : logo-lescreationsdemissbleue-fond-transparent.png
2025-04-23 14:13:21 - INFO - ✅ Image uploadée : logo-lescreationsdemissbleue-resize.png
2025-04-23 14:14:21 - INFO - ↪️ Image déjà existante (non uploadée) : logo-lescreationsdemissbleue.jpg
2025-04-23 14:14:21 - INFO - ↪️ Image déjà existante (non uploadée) : logo-lescreationsdemissbleue-fond-transparent.png
2025-04-23 14:14:22 - INFO - ↪️ Image déjà existante (non uploadée) : logo-lescreationsdemissbleue-resize.png
2025-04-23 14:15:56 - INFO - ✅ Image uploadée : logo-lescreationsdemissbleue.jpg
2025-04-23 14:15:59 - INFO - ✅ Image uploadée : logo-lescreationsdemissbleue-fond-transparent.png
2025-04-23 14:15:59 - INFO - ↪️ Image déjà existante (non uploadée) : logo-lescreationsdemissbleue-resize.png
2025-04-23 14:15:59 - ERROR - 🚫 Fichier introuvable : logo-lescreationsdemissbleue-fond-transparent-resize.png (C:\Users\beren\OneDrive\Documents\nextcloud\beren\site_missbleue\photos\photos_site\Photos_site\Logo\logo-lescreationsdemissbleue-fond-transparent-resize.png)
Traceback (most recent call last):
File "C:\Users\beren\OneDrive\Documents\nextcloud\beren\site_missbleue\api_woocommerce\final_api_woocommerce\api_woocommerce.py", line 311, in upload_media_from_to
watermarked_path = Path(create_watermark_image(str(path)))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\beren\OneDrive\Documents\nextcloud\beren\site_missbleue\api_woocommerce\final_api_woocommerce\watermark.py", line 11, in create_watermark_image
image = ImageOps.exif_transpose(Image.open(image_path)).convert("RGBA")
^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\beren\OneDrive\Documents\nextcloud\beren\site_missbleue\api_woocommerce\.venv\Lib\site-packages\PIL\Image.py", line 3465, in open
fp = builtins.open(filename, "rb")
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\beren\\OneDrive\\Documents\\nextcloud\\beren\\site_missbleue\\photos\\photos_site\\Photos_site\\Logo\\logo-lescreationsdemissbleue-fond-transparent-resize.png'
2025-04-23 14:16:51 - INFO - ↪️ Image déjà existante (non uploadée) : logo-lescreationsdemissbleue.jpg
2025-04-23 14:16:52 - INFO - ↪️ Image déjà existante (non uploadée) : logo-lescreationsdemissbleue-fond-transparent.png
2025-04-23 14:16:53 - INFO - ↪️ Image déjà existante (non uploadée) : logo-lescreationsdemissbleue-resize.png
2025-04-23 14:16:53 - ERROR - 🚫 Fichier introuvable : logo-lescreationsdemissbleue-fond-transparent-resize.png (C:\Users\beren\OneDrive\Documents\nextcloud\beren\site_missbleue\photos\photos_site\Photos_site\Logo\logo-lescreationsdemissbleue-fond-transparent-resize.png)
Traceback (most recent call last):
File "C:\Users\beren\OneDrive\Documents\nextcloud\beren\site_missbleue\api_woocommerce\final_api_woocommerce\api_woocommerce.py", line 311, in upload_media_from_to
watermarked_path = Path(create_watermark_image(str(path)))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\beren\OneDrive\Documents\nextcloud\beren\site_missbleue\api_woocommerce\final_api_woocommerce\watermark.py", line 11, in create_watermark_image
image = ImageOps.exif_transpose(Image.open(image_path)).convert("RGBA")
^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\beren\OneDrive\Documents\nextcloud\beren\site_missbleue\api_woocommerce\.venv\Lib\site-packages\PIL\Image.py", line 3465, in open
fp = builtins.open(filename, "rb")
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\beren\\OneDrive\\Documents\\nextcloud\\beren\\site_missbleue\\photos\\photos_site\\Photos_site\\Logo\\logo-lescreationsdemissbleue-fond-transparent-resize.png'
2025-04-23 14:18:45 - ERROR - 🚫 Fichier introuvable : logo-lescreationsdemissbleue-fond-transparent-resize.png (C:\Users\beren\OneDrive\Documents\nextcloud\beren\site_missbleue\photos\photos_site\Photos_site\Logo\logo-lescreationsdemissbleue-fond-transparent-resize.png)
Traceback (most recent call last):
File "C:\Users\beren\OneDrive\Documents\nextcloud\beren\site_missbleue\api_woocommerce\final_api_woocommerce\api_woocommerce.py", line 290, in upload_media_from_to
with open(image_path, "rb") as image_file:
^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\beren\\OneDrive\\Documents\\nextcloud\\beren\\site_missbleue\\photos\\photos_site\\Photos_site\\Logo\\logo-lescreationsdemissbleue-fond-transparent-resize.png'
2025-04-23 14:19:16 - ERROR - 🚫 Fichier introuvable : logo-lescreationsdemissbleue-fond-transparent-resize.png (C:\Users\beren\OneDrive\Documents\nextcloud\beren\site_missbleue\photos\photos_site\Photos_site\Logo\logo-lescreationsdemissbleue-fond-transparent-resize.png)
Traceback (most recent call last):
File "C:\Users\beren\OneDrive\Documents\nextcloud\beren\site_missbleue\api_woocommerce\final_api_woocommerce\api_woocommerce.py", line 290, in upload_media_from_to
with open(image_path, "rb") as image_file:
^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\beren\\OneDrive\\Documents\\nextcloud\\beren\\site_missbleue\\photos\\photos_site\\Photos_site\\Logo\\logo-lescreationsdemissbleue-fond-transparent-resize.png'
2025-04-23 14:20:24 - INFO - ✅ Image uploadée : logo-lescreationsdemissbleue.jpg
2025-04-23 14:20:28 - INFO - ✅ Image uploadée : logo-lescreationsdemissbleue-fond-transparent.png
2025-04-23 14:20:29 - INFO - ✅ Image uploadée : logo-lescreationsdemissbleue-resize.png
2025-04-23 14:20:30 - ERROR - 🚫 Fichier introuvable : logo-lescreationsdemissbleue-fond-transparent-resize.png (C:\Users\beren\OneDrive\Documents\nextcloud\beren\site_missbleue\photos\photos_site\Photos_site\Logo\logo-lescreationsdemissbleue-fond-transparent-resize.png)
Traceback (most recent call last):
File "C:\Users\beren\OneDrive\Documents\nextcloud\beren\site_missbleue\api_woocommerce\final_api_woocommerce\api_woocommerce.py", line 290, in upload_media_from_to
with open(image_path, "rb") as image_file:
^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\beren\\OneDrive\\Documents\\nextcloud\\beren\\site_missbleue\\photos\\photos_site\\Photos_site\\Logo\\logo-lescreationsdemissbleue-fond-transparent-resize.png'
2025-04-23 14:20:37 - INFO - ✅ Image uploadée : chope-sapin-noel-face.jpg
2025-04-23 14:20:43 - INFO - ✅ Image uploadée : chope-sapin-noel-haut.jpg
2025-04-23 14:20:49 - INFO - ✅ Image uploadée : chope-sapin-noel-profil.jpg
2025-04-23 14:20:56 - INFO - ✅ Image uploadée : chope-adoucissant-face.jpg
2025-04-23 14:21:03 - INFO - ✅ Image uploadée : chope-adoucissant-haut.jpg
2025-04-23 14:21:10 - INFO - ✅ Image uploadée : chope-adoucissant-profil.jpg
2025-04-23 14:21:16 - INFO - ✅ Image uploadée : chope-citron-meringue-face.jpg
2025-04-23 14:21:23 - INFO - ✅ Image uploadée : chope-citron-meringue-haut.jpg
2025-04-23 14:21:30 - INFO - ✅ Image uploadée : chope-citron-meringue-profil.jpg
2025-04-23 14:21:37 - INFO - ✅ Image uploadée : chope-lavande-face.jpg
2025-04-23 14:21:44 - INFO - ✅ Image uploadée : chope-lavande-haut.jpg
2025-04-23 14:22:01 - INFO - ✅ Image uploadée : chope-lavande-profil.jpg
2025-04-23 14:22:09 - INFO - ✅ Image uploadée : chope-framboise-face.jpg
2025-04-23 14:22:16 - INFO - ✅ Image uploadée : chope-framboise-haut.jpg
2025-04-23 14:22:23 - INFO - ✅ Image uploadée : chope-framboise-profil.jpg
2025-04-23 14:22:30 - INFO - ✅ Image uploadée : chope-baie-givree-face.jpg
2025-04-23 14:22:39 - INFO - ✅ Image uploadée : chope-baie-givree-haut.jpg
2025-04-23 14:22:46 - INFO - ✅ Image uploadée : chope-baie-givree-profil.jpg
2025-04-23 14:22:56 - INFO - ✅ Image uploadée : chope-chocolat-noisette-face.jpg
2025-04-23 14:23:06 - INFO - ✅ Image uploadée : chope-chocolat-noisette-haut.jpg
2025-04-23 14:23:14 - INFO - ✅ Image uploadée : chope-chocolat-noisette-profil.jpg
2025-04-23 14:23:22 - INFO - ✅ Image uploadée : chope-fraise-menthe-face.jpg
2025-04-23 14:23:29 - INFO - ✅ Image uploadée : chope-fraise-menthe-haut.jpg
2025-04-23 14:23:36 - INFO - ✅ Image uploadée : chope-fraise-menthe-profil.jpg
2025-04-23 14:23:43 - INFO - ✅ Image uploadée : chope-hiver-scandinave-face.jpg
2025-04-23 14:23:51 - INFO - ✅ Image uploadée : chope-hiver-scandinave-haut.jpg
2025-04-23 14:23:58 - INFO - ✅ Image uploadée : chope-hiver-scandinave-profil.jpg
2025-04-23 14:24:05 - INFO - ✅ Image uploadée : chope-melon-face.jpg
2025-04-23 14:24:12 - INFO - ✅ Image uploadée : chope-melon-haut.jpg
2025-04-23 14:24:20 - INFO - ✅ Image uploadée : chope-melon-profil.jpg
2025-04-23 14:24:27 - INFO - ✅ Image uploadée : verre-ambre-bois-santal-face.jpg
2025-04-23 14:24:34 - INFO - ✅ Image uploadée : verre-ambre-bois-santal-haut.jpg
2025-04-23 14:24:42 - INFO - ✅ Image uploadée : verre-ambre-cafe-bresilien-face.jpg
2025-04-23 14:24:49 - INFO - ✅ Image uploadée : verre-ambre-cafe-bresilien-haut.jpg
2025-04-23 14:24:56 - INFO - ✅ Image uploadée : verre-ambre-caramel-beurre-sale-face.jpg
2025-04-23 14:25:04 - INFO - ✅ Image uploadée : verre-ambre-caramel-beurre-sale-haut.jpg
2025-04-23 14:25:11 - INFO - ✅ Image uploadée : verre-ambre-citron-meringue-face.jpg
2025-04-23 14:25:18 - INFO - ✅ Image uploadée : verre-ambre-citron-meringue-haut.jpg
2025-04-23 14:25:25 - INFO - ✅ Image uploadée : verre-ambre-dark-flowers-face.jpg
2025-04-23 14:25:32 - INFO - ✅ Image uploadée : verre-ambre-dark-flowers-haut.jpg
2025-04-23 14:25:39 - INFO - ✅ Image uploadée : verre-ambre-figue-pain-epices-face.jpg
2025-04-23 14:25:46 - INFO - ✅ Image uploadée : verre-ambre-figue-pain-epices-haut.jpg
2025-04-23 14:25:54 - INFO - ✅ Image uploadée : verre-ambre-frangipanier-face.jpg
2025-04-23 14:26:00 - INFO - ✅ Image uploadée : verre-ambre-frangipanier-haut.jpg
2025-04-23 14:26:07 - INFO - ✅ Image uploadée : verre-ambre-melon-face.jpg
2025-04-23 14:26:15 - INFO - ✅ Image uploadée : verre-ambre-melon-haut.jpg
2025-04-23 14:27:01 - INFO - ✅ Image uploadée : bougie-chauffe-plat-citron-meringue-lot-2.jpg
2025-04-23 14:27:16 - INFO - ✅ Image uploadée : bougie-chauffe-plat-lavande-lot-2.jpg
2025-04-23 14:27:26 - INFO - ✅ Image uploadée : bougie-chauffe-plat-sapin-lot-2.jpg
2025-04-23 14:27:34 - INFO - ✅ Image uploadée : verre-irise-cerise-noire-explosive-face.jpg
2025-04-23 14:27:44 - INFO - ✅ Image uploadée : verre-irise-cerise-noire-explosive-face-couvercle.jpg
2025-04-23 14:27:52 - INFO - ✅ Image uploadée : verre-irise-cerise-noire-explosive-haut.jpg
2025-04-23 14:28:00 - INFO - ✅ Image uploadée : verre-irise-escale-cassis-face.jpg
2025-04-23 14:28:08 - INFO - ✅ Image uploadée : verre-irise-escale-cassis-face-couvercle.jpg
2025-04-23 14:28:16 - INFO - ✅ Image uploadée : verre-irise-escale-cassis-haut.jpg
2025-04-23 14:28:22 - INFO - ✅ Image uploadée : verre-bois-santal-face.jpg
2025-04-23 14:28:29 - INFO - ✅ Image uploadée : verre-bois-santal-haut.jpg
2025-04-23 14:28:37 - INFO - ✅ Image uploadée : verre-cocodream-face.jpg
2025-04-23 14:28:45 - INFO - ✅ Image uploadée : verre-cocodream-haut.jpg
2025-04-23 14:28:52 - INFO - ✅ Image uploadée : verre-cocodream-sans-couvercle.jpg
2025-04-23 14:28:59 - INFO - ✅ Image uploadée : verre-dark-flowers-face.jpg
2025-04-23 14:29:08 - INFO - ✅ Image uploadée : verre-dark-flowers-haut.jpg
2025-04-23 14:29:16 - INFO - ✅ Image uploadée : verre-framboise-face.jpg
2025-04-23 14:29:24 - INFO - ✅ Image uploadée : verre-framboise-haut.jpg
2025-04-23 14:29:31 - INFO - ✅ Image uploadée : verre-frangipanier-face.jpg
2025-04-23 14:29:39 - INFO - ✅ Image uploadée : verre-frangipanier-haut.jpg
2025-04-23 14:29:47 - INFO - ✅ Image uploadée : verre-petale-oranger-face.jpg
2025-04-23 14:29:54 - INFO - ✅ Image uploadée : verre-petale-oranger-haut.jpg
2025-04-23 14:30:01 - INFO - ✅ Image uploadée : verre-pink-lover-face.jpg
2025-04-23 14:30:09 - INFO - ✅ Image uploadée : verre-pink-lover-haut.jpg
2025-04-23 14:30:17 - INFO - ✅ Image uploadée : diffuseur-voiture-argent-accroche.jpg
2025-04-23 14:30:24 - INFO - ✅ Image uploadée : diffuseur-voiture-argent-pose.jpg
2025-04-23 14:30:31 - INFO - ✅ Image uploadée : diffuseur-voiture-or-accroche.jpg
2025-04-23 14:30:40 - INFO - ✅ Image uploadée : diffuseur-voiture-or-pose.jpg
2025-04-23 14:30:48 - INFO - ✅ Image uploadée : diffuseur-voiture-noir-accroche.jpg
2025-04-23 14:30:55 - INFO - ✅ Image uploadée : diffuseur-voiture-noir-pose.jpg
2025-04-23 14:31:04 - INFO - ✅ Image uploadée : nettoyant-multi-usage-1l.jpg
2025-04-23 14:31:12 - INFO - ✅ Image uploadée : fondtzel-perlimpinpin.jpg
2025-04-23 14:31:20 - INFO - ✅ Image uploadée : fondtzel-perlimpinpin-paquet.jpg
2025-04-23 14:31:27 - INFO - ✅ Image uploadée : fondtzel-adoucissant.jpg
2025-04-23 14:31:35 - INFO - ✅ Image uploadée : fondtzel-adoucissant-paquet.jpg
2025-04-23 14:31:43 - INFO - ✅ Image uploadée : fondtzel-fruits-rouges.jpg
2025-04-23 14:31:51 - INFO - ✅ Image uploadée : fondtzel-fruits-rouges-paquet.jpg
2025-04-23 14:31:58 - INFO - ✅ Image uploadée : fondtzel-peche.jpg
2025-04-23 14:32:06 - INFO - ✅ Image uploadée : fondtzel-peche-paquet.jpg
2025-04-23 14:32:14 - INFO - ✅ Image uploadée : fondtzel-fleur-tiare.jpg
2025-04-23 14:32:21 - INFO - ✅ Image uploadée : fondtzel-fleur-tiare-paquet.jpg
2025-04-23 14:32:29 - INFO - ✅ Image uploadée : fondtzel-hiver-scandinave.jpg
2025-04-23 14:32:38 - INFO - ✅ Image uploadée : fondtzel-hiver-scandinave-paquet.jpg
2025-04-23 14:32:46 - INFO - ✅ Image uploadée : fondtzel-mocaccino-noel.jpg
2025-04-23 14:33:00 - INFO - ✅ Image uploadée : fondtzel-mocaccino-noel-paquet.jpg
2025-04-23 14:33:08 - INFO - ✅ Image uploadée : fondtzel-monoi-passion.jpg
2025-04-23 14:33:17 - INFO - ✅ Image uploadée : fondtzel-monoi-passion-paquet.jpg
2025-04-23 14:33:24 - INFO - ✅ Image uploadée : fondtzel-mojito.jpg
2025-04-23 14:33:31 - INFO - ✅ Image uploadée : fondtzel-mojito-paquet.jpg
2025-04-23 14:33:39 - INFO - ✅ Image uploadée : fondtzel-sapin.jpg
2025-04-23 14:37:15 - INFO - ✅ Image uploadée : fondtzel-sapin-paquet-filigrane.jpg
2025-04-23 14:37:22 - INFO - ✅ Image uploadée : fondant-parfume-tablette-femme-bleue-face-filigrane.jpg
2025-04-23 14:37:30 - INFO - ✅ Image uploadée : fondant-parfume-tablette-femme-bleue-profil-filigrane.jpg
2025-04-23 14:37:38 - INFO - ✅ Image uploadée : fondant-parfume-tablette-violet-ambre-face-filigrane.jpg
2025-04-23 14:37:46 - INFO - ✅ Image uploadée : fondant-parfume-tablette-violet-ambre-profil-filigrane.jpg
2025-04-23 14:37:54 - INFO - ✅ Image uploadée : fondant-parfume-tablette-little-dark-face-filigrane.jpg
2025-04-23 14:38:02 - INFO - ✅ Image uploadée : fondant-parfume-tablette-little-dark-profil-filigrane.jpg
2025-04-23 14:38:12 - INFO - ✅ Image uploadée : fondant-parfume-tablette-fruit-defendu-face-filigrane.jpg
2025-04-23 14:38:21 - INFO - ✅ Image uploadée : fondant-parfume-tablette-fruit-defendu-profil-filigrane.jpg
2025-04-23 14:38:31 - INFO - ✅ Image uploadée : fondant-parfume-tablette-glorieuse-face-filigrane.jpg
2025-04-23 14:38:40 - INFO - ✅ Image uploadée : fondant-parfume-tablette-glorieuse-profil-filigrane.jpg
2025-04-23 14:38:48 - INFO - ✅ Image uploadée : fondant-parfume-tablette-millionnaire-face-filigrane.jpg
2025-04-23 14:38:56 - INFO - ✅ Image uploadée : fondant-parfume-tablette-millionnaire-profil-filigrane.jpg
2025-04-23 14:38:59 - INFO - ✅ Image uploadée : allergenes-chope-citron-meringue-filigrane.jpg
2025-04-23 14:39:02 - INFO - ✅ Image uploadée : allergenes-chope-lavande-filigrane.jpg
2025-04-23 14:39:05 - INFO - ✅ Image uploadée : allergenes-chope-framboise-filigrane.jpg
2025-04-23 14:39:11 - INFO - ✅ Image uploadée : allergenes-chope-baie-givree-filigrane.jpg
2025-04-23 14:39:14 - INFO - ✅ Image uploadée : allergenes-chope-chocolat-noisettes-filigrane.jpg
2025-04-23 14:39:18 - INFO - ✅ Image uploadée : allergenes-chope-fraise-menthe-filigrane.jpg
2025-04-23 14:39:21 - INFO - ✅ Image uploadée : allergenes-chope-hiver-scandinave-filigrane.jpg
2025-04-23 14:39:24 - INFO - ✅ Image uploadée : allergenes-chope-melon-filigrane.jpg
2025-04-23 14:39:27 - INFO - ✅ Image uploadée : allergenes-verre-ambre-bois-santal-filigrane.jpg
2025-04-23 14:39:30 - INFO - ✅ Image uploadée : allergenes-verre-ambre-cafe-bresilien-filigrane.jpg
2025-04-23 14:39:33 - INFO - ✅ Image uploadée : allergenes-verre-ambre-caramel-beurre-sale-filigrane.jpg
2025-04-23 14:39:36 - INFO - ✅ Image uploadée : allergenes-verre-ambre-citron-meringue-filigrane.jpg
2025-04-23 14:39:39 - INFO - ✅ Image uploadée : allergenes-verre-ambre-dark-flowers-filigrane.jpg
2025-04-23 14:39:43 - INFO - ✅ Image uploadée : allergenes-verre-ambre-figue-pain-epices-filigrane.jpg
2025-04-23 14:39:46 - INFO - ✅ Image uploadée : allergenes-verre-ambre-frangipanier-filigrane.jpg
2025-04-23 14:39:49 - INFO - ✅ Image uploadée : allergenes-verre-ambre-melon-filigrane.jpg
2025-04-23 14:39:51 - INFO - ✅ Image uploadée : allergenes-bougie-chauffe-plat-citron-meringue-filigrane.jpg
2025-04-23 14:39:54 - INFO - ✅ Image uploadée : allergenes-bougie-chauffe-plat-lavande-filigrane.jpg
2025-04-23 14:39:57 - INFO - ✅ Image uploadée : allergenes-bougie-chauffe-plat-sapin-filigrane.jpg
2025-04-23 14:40:01 - INFO - ✅ Image uploadée : allergenes-verre-irise-cerise-noire-explosive-filigrane.jpg
2025-04-23 14:40:04 - INFO - ✅ Image uploadée : allergenes-verre-irise-escale-cassis-filigrane.jpg
2025-04-23 14:40:07 - INFO - ✅ Image uploadée : allergenes-verre-bois-santal-filigrane.jpg
2025-04-23 14:40:10 - INFO - ✅ Image uploadée : allergenes-verre-cocodream-filigrane.jpg
2025-04-23 14:40:14 - INFO - ✅ Image uploadée : allergenes-verre-dark-flowers-filigrane.jpg
2025-04-23 14:40:17 - INFO - ✅ Image uploadée : allergenes-verre-frangipanier-filigrane.jpg
2025-04-23 14:40:20 - INFO - ✅ Image uploadée : allergenes-verre-petales-oranger-filigrane.jpg
2025-04-23 14:40:24 - INFO - ✅ Image uploadée : allergenes-verre-pink-lover-filigrane.jpg
2025-04-23 14:40:27 - INFO - ✅ Image uploadée : allergenes-fondant-adoucissant-filigrane.jpg
2025-04-23 14:40:31 - INFO - ✅ Image uploadée : allergenes-fondant-fruits-rouges-filigrane.jpg
2025-04-23 14:40:39 - INFO - ✅ Image uploadée : allergenes-fondant-hiver-scandinave-filigrane.jpg
2025-04-23 14:40:43 - INFO - ✅ Image uploadée : allergenes-fondant-mocaccino-noel-filigrane.jpg
2025-04-23 14:40:49 - INFO - ✅ Image uploadée : allergenes-fondant-mojito-filigrane.jpg
2025-04-23 14:40:54 - INFO - ✅ Image uploadée : allergenes-fondant-peche-filigrane.jpg
2025-04-23 14:40:57 - INFO - ✅ Image uploadée : allergenes-fondant-perlimpinpin-filigrane.jpg
2025-04-23 14:41:01 - INFO - ✅ Image uploadée : allergenes-fondant-sapin-filigrane.jpg
2025-04-23 14:47:12 - INFO - ✅ Image uploadée : allergenes-fondant-tablette-femme-bleue-filigrane.jpg
2025-04-23 14:47:15 - INFO - ✅ Image uploadée : allergenes-fondant-tablette-fruit-defendu-filigrane.jpg
2025-04-23 14:47:18 - INFO - ✅ Image uploadée : allergenes-fondant-tablette-glorieuse-filigrane.jpg
2025-04-23 14:47:22 - INFO - ✅ Image uploadée : allergenes-fondant-tablette-little-dark-filigrane.jpg
2025-04-23 14:47:25 - INFO - ✅ Image uploadée : allergenes-fondant-tablette-millionnaire-filigrane.jpg
2025-04-23 14:47:29 - INFO - ✅ Image uploadée : allergenes-fondant-tablette-violet-ambre-filigrane.jpg
2025-04-23 14:47:34 - INFO - ✅ Image uploadée : pyramide-olfactive-poudre-perlimpinpin-filigrane.jpg
2025-04-23 14:47:39 - INFO - ✅ Image uploadée : pyramide-olfactive-relaxation-tahiti-filigrane.jpg
2025-04-23 14:47:43 - INFO - ✅ Image uploadée : pyramide-olfactive-rose-jardins-filigrane.jpg
2025-04-23 14:47:49 - INFO - ✅ Image uploadée : pyramide-olfactive-vanille-iles-filigrane.jpg
2025-04-23 14:47:54 - INFO - ✅ Image uploadée : pyramide-olfactive-frangipanier-filigrane.jpg
2025-04-23 14:47:59 - INFO - ✅ Image uploadée : pyramide-olfactive-sapin-noel-filigrane.jpg
2025-04-23 14:48:04 - INFO - ✅ Image uploadée : pyramide-olfactive-lavande-filigrane.jpg
2025-04-23 14:48:09 - INFO - ✅ Image uploadée : pyramide-olfactive-framboise-filigrane.jpg
2025-04-23 14:48:14 - INFO - ✅ Image uploadée : pyramide-olfactive-baie-givree-filigrane.jpg
2025-04-23 14:48:21 - INFO - ✅ Image uploadée : pyramide-olfactive-chocolat-noisettes-filigrane.jpg
2025-04-23 14:48:25 - INFO - ✅ Image uploadée : pyramide-olfactive-fraise-menthe-filigrane.jpg
2025-04-23 14:48:30 - INFO - ✅ Image uploadée : pyramide-olfactive-hiver-scandinave-filigrane.jpg
2025-04-23 14:48:34 - INFO - ✅ Image uploadée : pyramide-olfactive-melon-filigrane.jpg
2025-04-23 14:48:38 - INFO - ✅ Image uploadée : pyramide-olfactive-bois-santal-filigrane.jpg
2025-04-23 14:48:43 - INFO - ✅ Image uploadée : pyramide-olfactive-cafe-bresilien-filigrane.jpg
2025-04-23 14:48:48 - INFO - ✅ Image uploadée : pyramide-olfactive-caramel-beurre-sale-filigrane.jpg
2025-04-23 14:48:52 - INFO - ✅ Image uploadée : pyramide-olfactive-figue-pain-epices-filigrane.jpg
2025-04-23 14:48:57 - INFO - ✅ Image uploadée : pyramide-olfactive-cerise-noire-explosive-filigrane.jpg
2025-04-23 14:49:04 - INFO - ✅ Image uploadée : pyramide-olfactive-calanque-cassis-filigrane.jpg
2025-04-23 14:49:09 - INFO - ✅ Image uploadée : pyramide-olfactive-petales-oranger-filigrane.jpg
2025-04-23 14:49:14 - INFO - ✅ Image uploadée : pyramide-olfactive-little-dark-filigrane.jpg
2025-04-23 14:49:19 - INFO - ✅ Image uploadée : pyramide-olfactive-femme-bleue-filigrane.jpg
2025-04-23 14:49:23 - INFO - ✅ Image uploadée : pyramide-olfactive-violet-ambre-filigrane.jpg
2025-04-23 14:51:15 - INFO - ✅ Image uploadée : fond-neutre-logo-filigrane.jpg
2025-04-23 14:51:54 - INFO - ✅ Image uploadée : fond-neutre-filigrane.jpg
2025-04-23 14:54:21 - INFO - ✅ Image uploadée : fond-neutre-logo-filigrane.jpg
2025-04-23 14:54:28 - INFO - ✅ Image uploadée : fond-neutre-filigrane.jpg
2025-04-23 14:58:15 - INFO - ✅ Image uploadée : fond-neutre-logo-filigrane.jpg
2025-04-23 14:58:22 - INFO - ✅ Image uploadée : fond-neutre-filigrane.jpg
2025-04-23 15:00:29 - INFO - ✅ Image uploadée : fondtzel-sapin-paquet-filigrane.jpg
2025-04-23 15:00:35 - INFO - ✅ Image uploadée : fondant-parfume-tablette-femme-bleue-face-filigrane.jpg
2025-04-23 15:00:44 - INFO - ✅ Image uploadée : fondant-parfume-tablette-femme-bleue-profil-filigrane.jpg
2025-04-23 15:00:51 - INFO - ✅ Image uploadée : fondant-parfume-tablette-violet-ambre-face-filigrane.jpg
2025-04-23 15:00:57 - INFO - ✅ Image uploadée : fondant-parfume-tablette-violet-ambre-profil-filigrane.jpg
2025-04-23 15:01:04 - INFO - ✅ Image uploadée : fondant-parfume-tablette-little-dark-face-filigrane.jpg
2025-04-23 15:01:11 - INFO - ✅ Image uploadée : fondant-parfume-tablette-little-dark-profil-filigrane.jpg
2025-04-23 15:01:18 - INFO - ✅ Image uploadée : fondant-parfume-tablette-fruit-defendu-face-filigrane.jpg
2025-04-23 15:01:25 - INFO - ✅ Image uploadée : fondant-parfume-tablette-fruit-defendu-profil-filigrane.jpg
2025-04-23 15:01:31 - INFO - ✅ Image uploadée : fondant-parfume-tablette-glorieuse-face-filigrane.jpg
2025-04-23 15:01:38 - INFO - ✅ Image uploadée : fondant-parfume-tablette-glorieuse-profil-filigrane.jpg
2025-04-23 15:01:45 - INFO - ✅ Image uploadée : fondant-parfume-tablette-millionnaire-face-filigrane.jpg
2025-04-23 15:01:52 - INFO - ✅ Image uploadée : fondant-parfume-tablette-millionnaire-profil-filigrane.jpg
2025-04-23 15:01:55 - INFO - ✅ Image uploadée : allergenes-chope-citron-meringue-filigrane.jpg
2025-04-23 15:01:57 - INFO - ✅ Image uploadée : allergenes-chope-lavande-filigrane.jpg
2025-04-23 15:02:00 - INFO - ✅ Image uploadée : allergenes-chope-framboise-filigrane.jpg
2025-04-23 15:02:02 - INFO - ✅ Image uploadée : allergenes-chope-baie-givree-filigrane.jpg
2025-04-23 15:02:05 - INFO - ✅ Image uploadée : allergenes-chope-chocolat-noisettes-filigrane.jpg
2025-04-23 15:02:07 - INFO - ✅ Image uploadée : allergenes-chope-fraise-menthe-filigrane.jpg
2025-04-23 15:02:10 - INFO - ✅ Image uploadée : allergenes-chope-hiver-scandinave-filigrane.jpg
2025-04-23 15:02:13 - INFO - ✅ Image uploadée : allergenes-chope-melon-filigrane.jpg
2025-04-23 15:02:15 - INFO - ✅ Image uploadée : allergenes-verre-ambre-bois-santal-filigrane.jpg
2025-04-23 15:02:18 - INFO - ✅ Image uploadée : allergenes-verre-ambre-cafe-bresilien-filigrane.jpg
2025-04-23 15:02:21 - INFO - ✅ Image uploadée : allergenes-verre-ambre-caramel-beurre-sale-filigrane.jpg
2025-04-23 15:02:23 - INFO - ✅ Image uploadée : allergenes-verre-ambre-citron-meringue-filigrane.jpg
2025-04-23 15:02:26 - INFO - ✅ Image uploadée : allergenes-verre-ambre-dark-flowers-filigrane.jpg
2025-04-23 15:02:28 - INFO - ✅ Image uploadée : allergenes-verre-ambre-figue-pain-epices-filigrane.jpg
2025-04-23 15:02:31 - INFO - ✅ Image uploadée : allergenes-verre-ambre-frangipanier-filigrane.jpg
2025-04-23 15:02:34 - INFO - ✅ Image uploadée : allergenes-verre-ambre-melon-filigrane.jpg
2025-04-23 15:02:36 - INFO - ✅ Image uploadée : allergenes-bougie-chauffe-plat-citron-meringue-filigrane.jpg
2025-04-23 15:02:39 - INFO - ✅ Image uploadée : allergenes-bougie-chauffe-plat-lavande-filigrane.jpg
2025-04-23 15:02:41 - INFO - ✅ Image uploadée : allergenes-bougie-chauffe-plat-sapin-filigrane.jpg
2025-04-23 15:02:44 - INFO - ✅ Image uploadée : allergenes-verre-irise-cerise-noire-explosive-filigrane.jpg
2025-04-23 15:02:46 - INFO - ✅ Image uploadée : allergenes-verre-irise-escale-cassis-filigrane.jpg
2025-04-23 15:02:49 - INFO - ✅ Image uploadée : allergenes-verre-bois-santal-filigrane.jpg
2025-04-23 15:02:52 - INFO - ✅ Image uploadée : allergenes-verre-cocodream-filigrane.jpg
2025-04-23 15:02:54 - INFO - ✅ Image uploadée : allergenes-verre-dark-flowers-filigrane.jpg
2025-04-23 15:02:57 - INFO - ✅ Image uploadée : allergenes-verre-frangipanier-filigrane.jpg
2025-04-23 15:02:59 - INFO - ✅ Image uploadée : allergenes-verre-petales-oranger-filigrane.jpg
2025-04-23 15:03:02 - INFO - ✅ Image uploadée : allergenes-verre-pink-lover-filigrane.jpg
2025-04-23 15:03:05 - INFO - ✅ Image uploadée : allergenes-fondant-adoucissant-filigrane.jpg
2025-04-23 15:03:08 - INFO - ✅ Image uploadée : allergenes-fondant-fruits-rouges-filigrane.jpg
2025-04-23 15:03:11 - INFO - ✅ Image uploadée : allergenes-fondant-hiver-scandinave-filigrane.jpg
2025-04-23 15:03:13 - INFO - ✅ Image uploadée : allergenes-fondant-mocaccino-noel-filigrane.jpg
2025-04-23 15:03:16 - INFO - ✅ Image uploadée : allergenes-fondant-mojito-filigrane.jpg
2025-04-23 15:03:19 - INFO - ✅ Image uploadée : allergenes-fondant-peche-filigrane.jpg
2025-04-23 15:03:24 - INFO - ✅ Image uploadée : allergenes-fondant-perlimpinpin-filigrane.jpg
2025-04-23 15:03:26 - INFO - ✅ Image uploadée : allergenes-fondant-sapin-filigrane.jpg
2025-04-23 15:03:30 - INFO - ✅ Image uploadée : allergenes-fondant-tablette-femme-bleue-filigrane.jpg
2025-04-23 15:03:32 - INFO - ✅ Image uploadée : allergenes-fondant-tablette-fruit-defendu-filigrane.jpg
2025-04-23 15:03:35 - INFO - ✅ Image uploadée : allergenes-fondant-tablette-glorieuse-filigrane.jpg
2025-04-23 15:03:38 - INFO - ✅ Image uploadée : allergenes-fondant-tablette-little-dark-filigrane.jpg
2025-04-23 15:03:41 - INFO - ✅ Image uploadée : allergenes-fondant-tablette-millionnaire-filigrane.jpg
2025-04-23 15:03:44 - INFO - ✅ Image uploadée : allergenes-fondant-tablette-violet-ambre-filigrane.jpg
2025-04-23 15:03:47 - INFO - ✅ Image uploadée : pyramide-olfactive-poudre-perlimpinpin-filigrane.jpg
2025-04-23 15:03:50 - INFO - ✅ Image uploadée : pyramide-olfactive-relaxation-tahiti-filigrane.jpg
2025-04-23 15:03:53 - INFO - ✅ Image uploadée : pyramide-olfactive-rose-jardins-filigrane.jpg
2025-04-23 15:03:57 - INFO - ✅ Image uploadée : pyramide-olfactive-vanille-iles-filigrane.jpg
2025-04-23 15:04:01 - INFO - ✅ Image uploadée : pyramide-olfactive-frangipanier-filigrane.jpg
2025-04-23 15:04:05 - INFO - ✅ Image uploadée : pyramide-olfactive-sapin-noel-filigrane.jpg
2025-04-23 15:04:08 - INFO - ✅ Image uploadée : pyramide-olfactive-lavande-filigrane.jpg
2025-04-23 15:04:12 - INFO - ✅ Image uploadée : pyramide-olfactive-framboise-filigrane.jpg
2025-04-23 15:04:16 - INFO - ✅ Image uploadée : pyramide-olfactive-baie-givree-filigrane.jpg
2025-04-23 15:04:19 - INFO - ✅ Image uploadée : pyramide-olfactive-chocolat-noisettes-filigrane.jpg
2025-04-23 15:04:23 - INFO - ✅ Image uploadée : pyramide-olfactive-fraise-menthe-filigrane.jpg
2025-04-23 15:04:26 - INFO - ✅ Image uploadée : pyramide-olfactive-hiver-scandinave-filigrane.jpg
2025-04-23 15:04:30 - INFO - ✅ Image uploadée : pyramide-olfactive-melon-filigrane.jpg
2025-04-23 15:04:33 - INFO - ✅ Image uploadée : pyramide-olfactive-bois-santal-filigrane.jpg
2025-04-23 15:04:36 - INFO - ✅ Image uploadée : pyramide-olfactive-cafe-bresilien-filigrane.jpg
2025-04-23 15:04:40 - INFO - ✅ Image uploadée : pyramide-olfactive-caramel-beurre-sale-filigrane.jpg
2025-04-23 15:04:44 - INFO - ✅ Image uploadée : pyramide-olfactive-figue-pain-epices-filigrane.jpg
2025-04-23 15:04:47 - INFO - ✅ Image uploadée : pyramide-olfactive-cerise-noire-explosive-filigrane.jpg
2025-04-23 15:04:51 - INFO - ✅ Image uploadée : pyramide-olfactive-calanque-cassis-filigrane.jpg
2025-04-23 15:04:55 - INFO - ✅ Image uploadée : pyramide-olfactive-petales-oranger-filigrane.jpg
2025-04-23 15:05:00 - INFO - ✅ Image uploadée : pyramide-olfactive-little-dark-filigrane.jpg
2025-04-23 15:05:05 - INFO - ✅ Image uploadée : pyramide-olfactive-femme-bleue-filigrane.jpg
2025-04-23 15:05:09 - INFO - ✅ Image uploadée : pyramide-olfactive-violet-ambre-filigrane.jpg
2025-04-23 15:05:12 - INFO - ✅ Image uploadée : fond-neutre-logo-filigrane.jpg
2025-04-23 15:05:20 - INFO - ✅ Image uploadée : fond-neutre-filigrane.jpg
2025-04-23 15:13:06 - INFO - ✅ Image uploadée : fond-neutre-logo.png
2025-04-23 15:13:13 - INFO - ✅ Image uploadée : fond-neutre.jpg
2025-04-23 15:14:04 - DEBUG - Catégorie contenant comme slug 'bougies' existe déjà
2025-04-23 15:14:06 - INFO - Catégorie créé avec succès. ID: 650
2025-04-23 15:14:09 - INFO - Catégorie créé avec succès. ID: 651
2025-04-23 15:14:12 - INFO - Catégorie créé avec succès. ID: 652
2025-04-23 15:14:16 - INFO - Catégorie créé avec succès. ID: 653
2025-04-23 15:14:20 - INFO - Catégorie créé avec succès. ID: 654
2025-04-23 15:14:24 - INFO - Catégorie créé avec succès. ID: 655
2025-04-23 15:14:29 - INFO - Catégorie créé avec succès. ID: 656
2025-04-23 15:14:33 - INFO - Catégorie créé avec succès. ID: 657
2025-04-23 15:14:39 - INFO - Catégorie créé avec succès. ID: 658
2025-04-23 15:14:45 - INFO - Catégorie créé avec succès. ID: 659
2025-04-23 15:14:54 - INFO - Catégorie créé avec succès. ID: 660
2025-04-23 15:15:00 - INFO - Catégorie créé avec succès. ID: 661
2025-04-23 15:15:07 - INFO - Catégorie créé avec succès. ID: 662
2025-04-23 15:15:15 - INFO - Catégorie créé avec succès. ID: 663
2025-04-23 15:15:22 - INFO - Catégorie créé avec succès. ID: 664
2025-04-23 15:15:31 - INFO - Catégorie créé avec succès. ID: 665
2025-04-23 15:15:40 - INFO - Catégorie créé avec succès. ID: 666
2025-04-23 15:15:49 - INFO - Catégorie créé avec succès. ID: 667
2025-04-23 15:15:59 - INFO - Catégorie créé avec succès. ID: 668
2025-04-23 15:16:10 - INFO - Catégorie créé avec succès. ID: 669
2025-04-23 15:24:46 - INFO - ✅ Image uploadée : logo-lescreationsdemissbleue-fond-transparent-resize.png
2025-04-23 15:26:23 - INFO - Produit créé avec succès. ID: 7114
2025-04-23 15:26:25 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:26:26 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:26:29 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:26:35 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:26:37 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:26:38 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:26:40 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:26:41 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:26:43 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:26:45 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:26:46 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:26:48 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:26:50 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:26:51 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:26:53 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:26:54 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:26:56 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:26:57 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:26:59 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:27:00 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:27:02 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:27:04 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:27:05 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:27:07 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:27:08 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:27:10 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:27:11 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:27:13 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:27:14 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:27:16 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:27:17 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:27:19 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:27:21 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:27:22 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:27:24 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:27:25 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:27:27 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:27:29 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:27:30 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:27:32 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:27:34 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:27:36 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:27:38 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:27:40 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:27:43 - DEBUG - Produit contenant comme slug 'chope-citron-meringue' existe déjà
2025-04-23 15:27:56 - INFO - Produit créé avec succès. ID: 7118
2025-04-23 15:27:58 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:27:59 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:01 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:04 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:06 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:07 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:09 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:10 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:12 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:13 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:15 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:16 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:18 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:20 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:21 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:23 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:24 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:26 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:28 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:29 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:31 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:32 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:34 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:35 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:37 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:39 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:40 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:42 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:43 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:45 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:46 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:48 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:50 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:51 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:53 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:55 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:56 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:58 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:28:59 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:29:01 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:29:03 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:29:04 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:29:06 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:29:07 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:29:09 - DEBUG - Produit contenant comme slug 'chope-lavande' existe déjà
2025-04-23 15:29:19 - INFO - Produit créé avec succès. ID: 7120
2025-04-23 15:29:21 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:29:22 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:29:24 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:29:26 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:29:27 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:29:29 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:29:31 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:29:32 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:29:34 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:29:35 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:29:37 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:29:39 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:29:41 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:29:42 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:29:44 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:29:46 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:29:47 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:29:49 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:29:53 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:29:58 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:30:00 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:30:02 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:30:04 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:30:06 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:30:07 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:30:09 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:30:11 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:30:13 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:30:14 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:30:16 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:30:17 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:30:19 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:30:21 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:30:23 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:30:26 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:30:28 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:30:30 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:30:31 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:30:33 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:30:35 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:30:36 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:30:38 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:30:39 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:30:41 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:30:42 - DEBUG - Produit contenant comme slug 'chope-framboise' existe déjà
2025-04-23 15:30:52 - INFO - Produit créé avec succès. ID: 7121
2025-04-23 15:31:00 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:02 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:03 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:05 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:07 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:08 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:10 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:11 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:13 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:15 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:17 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:19 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:20 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:22 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:24 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:26 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:27 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:29 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:30 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:32 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:34 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:35 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:37 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:38 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:40 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:42 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:43 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:45 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:47 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:48 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:50 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:51 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:53 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:55 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:56 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:31:58 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:32:00 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:32:02 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:32:03 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:32:05 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:32:07 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:32:08 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:32:10 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:32:12 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:32:14 - DEBUG - Produit contenant comme slug 'chope-melon' existe déjà
2025-04-23 15:32:31 - INFO - Produit créé avec succès. ID: 7124
2025-04-23 15:32:34 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:32:36 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:32:38 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:32:39 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:32:41 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:32:43 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:32:45 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:32:47 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:32:48 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:32:50 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:32:53 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:32:56 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:32:57 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:32:59 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:33:01 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:33:03 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:33:05 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:33:06 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:33:08 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:33:10 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:33:11 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:33:13 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:33:15 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:33:17 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:33:19 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:33:20 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:33:22 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:33:24 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:33:25 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:33:27 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:33:29 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:33:30 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:33:32 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:33:34 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:33:36 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:33:38 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:33:39 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:33:41 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:33:43 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:33:46 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:33:48 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:33:49 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:33:51 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:33:53 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:33:54 - DEBUG - Produit contenant comme slug 'chope-fraise-menthe' existe déjà
2025-04-23 15:34:30 - INFO - Produit créé avec succès. ID: 7125
2025-04-23 15:34:32 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:34:34 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:34:35 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:34:37 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:34:38 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:34:40 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:34:42 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:34:43 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:34:45 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:34:46 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:34:48 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:34:49 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:34:51 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:34:53 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:34:54 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:34:56 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:34:57 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:34:59 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:35:00 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:35:03 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:35:04 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:35:06 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:35:07 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:35:09 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:35:10 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:35:12 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:35:14 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:35:15 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:35:17 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:35:19 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:35:20 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:35:22 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:35:23 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:35:25 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:35:27 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:35:28 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:35:30 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:35:31 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:35:33 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:35:35 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:35:36 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:35:38 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:35:39 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:35:41 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:35:42 - DEBUG - Produit contenant comme slug 'chope-baie-givree' existe déjà
2025-04-23 15:35:53 - INFO - Produit créé avec succès. ID: 7126
2025-04-23 15:35:55 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:35:56 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:35:58 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:36:00 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:36:01 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:36:03 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:36:05 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:36:06 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:36:08 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:36:10 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:36:12 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:36:13 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:36:15 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:36:17 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:36:19 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:36:20 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:36:22 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:36:24 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:36:26 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:36:27 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:36:29 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:36:31 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:36:36 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:36:38 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:36:40 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:36:41 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:36:43 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:36:45 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:36:47 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:36:48 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:36:50 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:36:52 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:36:53 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:36:55 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:36:57 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:36:59 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:37:01 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:37:03 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:37:05 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:37:07 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:37:09 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:37:11 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:37:12 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:37:14 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:37:16 - DEBUG - Produit contenant comme slug 'chope-adoucissant' existe déjà
2025-04-23 15:37:26 - INFO - Produit créé avec succès. ID: 7127
2025-04-23 15:37:28 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:37:29 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:37:31 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:37:33 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:37:34 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:37:36 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:37:38 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:37:40 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:37:41 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:37:43 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:37:45 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:37:47 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:37:48 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:37:50 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:37:52 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:37:53 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:37:55 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:37:57 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:37:58 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:38:00 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:38:02 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:38:04 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:38:06 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:38:07 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:38:09 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:38:11 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:38:12 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:38:14 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:38:16 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:38:18 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:38:19 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:38:21 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:38:23 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:38:24 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:38:26 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:38:28 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:38:30 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:38:31 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:38:33 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:38:35 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:38:37 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:38:38 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:38:40 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:38:42 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:38:44 - DEBUG - Produit contenant comme slug 'chope-chocolat-noisette' existe déjà
2025-04-23 15:38:54 - INFO - Produit créé avec succès. ID: 7128
2025-04-23 15:38:55 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:38:57 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:38:59 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:39:01 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:39:04 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:39:05 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:39:07 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:39:09 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:39:11 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:39:13 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:39:14 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:39:16 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:39:18 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:39:20 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:39:21 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:39:23 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:39:25 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:39:27 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:39:28 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:39:30 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:39:32 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:39:33 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:39:35 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:39:37 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:39:40 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:39:41 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:39:43 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:39:45 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:39:47 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:39:49 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:39:50 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:39:52 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:39:54 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:39:55 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:39:57 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:39:59 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:40:00 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:40:02 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:40:04 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:40:06 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:40:08 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:40:09 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:40:11 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:40:13 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:40:15 - DEBUG - Produit contenant comme slug 'chope-hiver-scandinave' existe déjà
2025-04-23 15:40:25 - INFO - Produit créé avec succès. ID: 7129
2025-04-23 15:40:27 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:40:28 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:40:30 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:40:37 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:40:39 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:40:41 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:40:43 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:40:45 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:40:47 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:40:48 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:40:50 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:40:52 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:40:54 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:40:56 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:40:59 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:41:02 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:41:04 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:41:06 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:41:08 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:41:10 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:41:12 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:41:14 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:41:16 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:41:18 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:41:20 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:41:22 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:41:23 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:41:25 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:41:27 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:41:29 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:41:31 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:41:32 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:41:34 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:41:36 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:41:38 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:41:40 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:41:41 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:41:43 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:41:45 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:41:47 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:41:49 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:41:51 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:41:53 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:41:54 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:41:56 - DEBUG - Produit contenant comme slug 'verre-petale-oranger' existe déjà
2025-04-23 15:42:07 - INFO - Produit créé avec succès. ID: 7131
2025-04-23 15:42:09 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:42:11 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:42:13 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:42:15 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:42:16 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:42:18 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:42:20 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:42:22 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:42:24 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:42:26 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:42:28 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:42:29 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:42:31 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:42:33 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:42:35 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:42:36 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:42:38 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:42:40 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:42:42 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:42:43 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:42:45 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:42:47 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:42:49 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:42:50 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:42:58 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:43:00 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:43:02 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:43:04 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:43:06 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:43:08 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:43:09 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:43:11 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:43:13 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:43:15 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:43:17 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:43:18 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:43:20 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:43:22 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:43:24 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:43:26 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:43:28 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:43:30 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:43:31 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:43:33 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:43:35 - DEBUG - Produit contenant comme slug 'verre-pink-lover' existe déjà
2025-04-23 15:43:47 - INFO - Produit créé avec succès. ID: 7133
2025-04-23 15:43:49 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:43:51 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:43:58 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:44:00 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:44:03 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:44:06 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:44:09 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:44:11 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:44:13 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:44:14 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:44:16 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:44:18 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:44:22 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:44:23 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:44:25 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:44:27 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:44:28 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:44:30 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:44:32 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:44:34 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:44:39 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:44:49 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:44:51 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:44:53 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:44:55 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:45:05 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:45:09 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:45:12 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:45:14 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:45:25 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:45:32 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:45:45 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:45:57 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:46:05 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà
2025-04-23 15:46:16 - DEBUG - Produit contenant comme slug 'verre-bois-santal' existe déjà

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,45 @@
from PIL import Image, ImageOps
import os
from pathlib import Path# main.py
import logging
logger = logging.getLogger(__name__)
logger.info("Logger from watermark")
def create_watermark_image(image_path, filigrane_path="logo-lescreationsdemissbleue-fond-transparent.png"):
#image = Image.open(image_path).convert("RGBA")
image = ImageOps.exif_transpose(Image.open(image_path)).convert("RGBA")
filigrane = Image.open(filigrane_path).convert("RGBA")
# Resize the watermak (ex: 25% of widht from principal image)
"""ratio = 0.25
"""
ratio = 0.15 # instead of 0.25
new_width = int(image.width * ratio)
new_height = int(filigrane.height * (new_width / filigrane.width))
filigrane = filigrane.resize((new_width, new_height), Image.Resampling.LANCZOS)
# Change the color in grey and handle the transparency
"""filigrane = filigrane.convert("L").convert("RGBA") # Gris
alpha = filigrane.getchannel("A").point(lambda p: int(p * 0.3)) # ~30% opacité
filigrane.putalpha(alpha)"""
x = image.width - filigrane.width - 30 # 10px from right edge
y = image.height - filigrane.height - 30 # 10px from bottom edge
# Paste watermark (with alpha mask)
image.paste(filigrane, (x, y), filigrane)
# Save the result
output_path = image_path.rsplit('.', 1)
output_path = f"{output_path[0]}-filigrane.jpg"
try:
if not os.path.exists(output_path):
image.convert("RGB").save(output_path, "JPEG")
except Exception as e:
logger.exception(f"🔥 Image avec filigrane existe déjà : {e} - {Path(output_path).name}")
print(f"outpath = {output_path}")
return output_path
#print(f"✅ Image enregistrée : {output_path}")

View File

@ -0,0 +1,167 @@
print(f"📦 Script lancé : __name__ = {__name__}")
import argparse
from woocommerce import API as WoocommerceApi
#from api_woocommerce import AuthentificationWpApi, MediaManager, CategoryManager, ProductManager, AttributeManager, VariationsManager, TabManager, WooCommerceManager
from new_api_woocommerce import AuthentificationWpApi, MediaManager, CategoryManager, ProductManager, AttributeManager, VariationsManager, TabManager, WooCommerceManager
import pprint
import base64
def import_medias_ods(args, media_manager):
if args.media:
if args.media_regex:
try:
media_manager.upload_media(args.media_regex)
except ValueError:
print("error name product_regex")
elif args.media_range:
try:
parts = args.media_range.split(':')
start = int(parts[0]) -1 if parts[0] else 0
end = int(parts[1]) if len(parts) > 1 and parts[1] else None
print(f"start = {start}, end = {end or 'fin'}")
media_manager.upload_media_from_to(start, end)
except ValueError:
print("❌ Mauvais format pour --media-range. Utilisez par exemple --media-range=1:40")
else:
start, end = 0, None
print(" --media activé, mais aucune plage spécifiée.")
def import_products_ods(args, woocommerce_manager):
if args.product:
if args.product_regex:
try:
woocommerce_manager.process_file(args.product_regex)
except ValueError:
print("error name product_regex")
elif args.product_range:
try:
parts = args.product_range.split(':')
start = int(parts[0]) -1 if parts[0] else 0
end = int(parts[1]) if len(parts) > 1 and parts[1] else None
print(f"start = {start}, end = {end or 'fin'}")
woocommerce_manager.process_file_from_to(start, end)
except ValueError:
print("❌ Mauvais format pour --product-range. Utilisez par exemple --product-range=1:40")
else:
start, end = 0, None
print(" --product activé, mais aucune plage spécifiée.")
def main():
#ath = AuthentificationWpApi()
parser = argparse.ArgumentParser(prog='wcctl', description='WooCommerce CLI controller')
# 🌐 Options globales
parser.add_argument('--wc-url', required=True, help='WooCommerce site URL')
parser.add_argument('--wc-key', required=True, help='WooCommerce API consumer key')
parser.add_argument('--wc-secret', required=True, help='WooCommerce API consumer secret')
#parser.add_argument('--media', action='store_true', help='Process media items')
#parser.add_argument('--media-range', type=str, help='Range of media rows to process (e.g., 10:30)')
# 🧱 Sous-commandes
subparsers = parser.add_subparsers(dest='command', required=True)
# 📥 Commande : import-ods
import_parser = subparsers.add_parser('import-ods', help='Import ODS file data')
import_parser.add_argument('--ods-path', required=True, help='Path to the ODS file')
# media
import_parser.add_argument('--media', action='store_true', help='Process media items')
import_parser.add_argument('--media-range', type=str, help='Range of media rows to process (e.g., 10:30)')
import_parser.add_argument('--media-regex', type=str, help='Regex to filter and import media by name')
import_parser.add_argument('--logo', action='store_true', help='Process logo')
# category
import_parser.add_argument('--category', action='store_true', help='import all categories')
import_parser.add_argument('--category-regex', type=str, help='Regex to filter and import categories by name')
# attribute
import_parser.add_argument('--attribute', action='store_true', help='import all attributes and terms')
import_parser.add_argument('--attribute-regex', type=str, help='Regex to filter and import attribute by name')
# tab
#import_parser.add_argument('--tab', action='store_true', help='import all tabs')
#import_parser.add_argument('--tab-regex', type=str, help='Regex to filter and import tab by name')
# product
import_parser.add_argument('--product', action='store_true', help='import all products')
import_parser.add_argument('--product-regex', type=str, help='Regex to filter and import product by name')
import_parser.add_argument('--product-range', type=str, help='Range of product rows to process (e.g., 10:30)')
# delete all informations
import_parser.add_argument('--delete-all', action='store_true', help='Delete media, categories, products, attributes, tabs')
# Analyse des arguments
args = parser.parse_args()
wcapi = WoocommerceApi(
url=args.wc_url,
consumer_key=args.wc_key,
consumer_secret=args.wc_secret,
wp_api=True,
version="wc/v3",
verify_ssl=False, # Désactive la vérification SSL pour le développement
timeout=30
)
ath = AuthentificationWpApi()
media_manager = MediaManager(ath, filename_ods=args.ods_path)
category_manager = CategoryManager(wcapi, ath, filename_ods=args.ods_path)
product_manager = ProductManager(wcapi, ath, filename_ods=args.ods_path)
attribute_manager = AttributeManager(wcapi, filename_ods=args.ods_path)
tab_manager = TabManager(wcapi, filename_ods=args.ods_path)
variation_manager = VariationsManager(wcapi, filename_ods=args.ods_path)
woocommerce_manager = WooCommerceManager(wcapi=wcapi,
media_manager=media_manager,
category_manager=category_manager,
product_manager=product_manager,
tab_manager=tab_manager,
attribute_manager=attribute_manager,
variation_manager=variation_manager,
filename_ods=args.ods_path)
# Dispatch en fonction de la commande
#if args.command == 'import-ods':
# import_medias_ods(args)
#print(f"🔍 args.media = {args.media}")
#print(f"🔍 args.media_range = {args.media_range}")
print(f"args = {args}")
if args.media:
import_medias_ods(args, media_manager)
if args.delete_all:
#woocommerce_manager.delete_all_informations()
media_manager.delete_all_images()
if args.category:
medias = media_manager.get_all_as_slug_dict()
category_manager.medias = medias
regex = args.category_regex if args.category_regex else None
category_manager.update_data_categories(regex)
if args.attribute:
regex = args.attribute_regex if args.attribute_regex else None
attribute_manager.create(regex)
attribute_manager.configure_term()
if args.product:
import_products_ods(args, woocommerce_manager)
if args.logo:
media_manager.assign_image_logo()
if __name__ == "__main__":
main()
# wcctl --wc-url=https://lescreationsdemissbleue.local --wc-key=<consumer_key> --wc-secret=<consumer_secret> import-ods --ods-path=fichier.ods
# ods_file = donnees_site_internet_missbleue_corrige.ods
#python wcctl.py --wc-url="https://lescreationsdemissbleue.local" --wc-key="ck_604e9b7b5d290cce72346efade6b31cb9a1ff28e" --wc-secret="cs_563974c7e59532c1ae1d0f8bbf61f0500d6bc768" import-ods --ods-path="donnees_site_internet_missbleue_corrige.ods"
#python wcctl.py --wc-url="https://les-creations-de-missbleue.local" --wc-key="ck_604e9b7b5d290cce72346efade6b31cb9a1ff28e" --wc-secret="cs_563974c7e59532c1ae1d0f8bbf61f0500d6bc768" import-ods --ods-path="donnees_site_internet_missbleue_corrige.ods"

0
logs/woocommerce.log Normal file
View File

File diff suppressed because it is too large Load Diff