
    9h4                         d dl Z d dlZd dlZd dlZd dlZd dlmZmZmZm	Z	 dZ
dZ e             ddZddZddZddZdd	Zdd
Zd ZddZd Zd ZdS )    N)get_access_tokenload_tokens_rate_limiters_tokenszemde-b2b.myshopify.comz2025-01c                 @  K   t          d           t          |           \  }}t          |                                          d {V  dt           dt
           d}d|d}g }t                      }t          j                    4 d {V }|rb||v rt          d|           nL|	                    |           t          |                                          d {V  	 |
                    ||          4 d {V }|                                 |                                 d {V }	|                    |	
                    d	g                      |j        
                    d
          }
|
r/t          j        d|
          }|r|                    d          nd }nd }	 d d d           d {V  n# 1 d {V swxY w Y   n'# t$          $ r}t          d|           Y d }~nd }~ww xY w|b	 d d d           d {V  n# 1 d {V swxY w Y   	 t'          ddd          5 }t          j        ||dd           d d d            n# 1 swxY w Y   t          t+          |           d           n'# t$          $ r}t          d|           Y d }~nd }~ww xY w|S )Nzgetting all productshttps:///admin/api/z/products.json?limit=250application/jsonContent-TypeX-Shopify-Access-Token.   Pagination arrêtée car URL déjà visitée :headersproductsLink<([^>]+)>;\s*rel="next"   z"Exception during get_all_products:z../main/products.jsonwzutf-8)encodingF   )ensure_asciiindentu$    produits écrits dans products.jsonu,   Erreur lors de l'écriture du fichier JSON :)printr   r   acquireSHOPIFY_DOMAINAPI_VERSIONsetaiohttpClientSessionaddgetraise_for_statusjsonextendr   researchgroup	Exceptionopendumplen)token_indexaccess_token	token_keyurlr   r   visited_urlssessionresponsedatalink_headermatchefs                 #/var/www/sites/EMDE/api/products.pyget_all_productsr:      s`     	
 !!!.{;;L)

#
+
+
-
--------
U^
U
U
U
U
UC*". G H55L$&&       ' 	l""FLLLS!!! +33555555555";;sG;<< 	# 	# 	# 	# 	# 	# 	#--///!)000000DOODHHZ$<$<==="*"2"6"6v">">K" # "	*Dk R R05?ekk!nnn4"
	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#    :A>>>#  	 	                          .A)3AAA 	AQIha@@@@	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	AXDDDEEEE A A A<a@@@@@@@@A Os   
AHG<B%F4"G4
F>	>GF>	GH
G*G% H%G**H
HHI7 'I I7 II7 I"I7 7
JJJc                 Z  K   t          |          \  }}dt           dt           d}|dd}	 |                     |||d          4 d {V }|j        }t          d|            |d	k    r,|                                 d {V cd d d           d {V  S |                                 d {V }	t          d
|            t          d|	            	 d d d           d {V  d S # 1 d {V swxY w Y   d S # t          j	        $ r}
t          d|
            Y d }
~
d S d }
~
ww xY w)Nr   r	   z/products.jsonr
   r   r   Fr   r$   sslHTTP Status Code:    z%Erreur API Shopify pour le produit : u   Erreur renvoyée par Shopify : u   Erreur de requête : )
r   r   r   poststatusr   r$   textr   ClientError)r2   product_jsonr-   r.   r/   r0   r   r3   http_status
error_textr7   s              r9   create_shopify_productrH   ?   sC     .{;;L)
K^
K
K
K
K
KC".* G<<W<U<SS 
	 
	 
	 
	 
	 
	 
	W_"/K4{44555c!!%]]__,,,,,,
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 $,==??222222
LlLLMMMD
DDEEE
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	    )a))***tttttsG   C> 9C+C> ?C+C> +
C55C> 8C59C> >D*D%%D*c                 H  K   t          |          \  }}dt           dt           d| d}|dd}	 |                     |||d          4 d {V }|j        }	t          d	|	            |	d
v r.|                                 d {V }
|
cd d d           d {V  S |                                 d {V }t          d| d|            	 d d d           d {V  d S # 1 d {V swxY w Y   d S # t          j	        $ r }t          d| d|            Y d }~d S d }~ww xY w)Nr   r	   
/products/.jsonr
   r<   Fr=   r?   )   r@   u9   Erreur API Shopify lors de la mise à jour du produit ID  : u9   Erreur de requête lors de la mise à jour du produit ID )
r   r   r   putrB   r   r$   rC   r   rD   )r2   
product_idrE   r-   r.   r/   r0   r   r3   rF   updated_productrG   r7   s                r9   update_shopify_productrQ   W   sL     .{;;L)
X^
X
X
X
Xz
X
X
XC".* G;;sG,E;RR 
	 
	 
	 
	 
	 
	 
	V^"/K4{44555j(((0"7"7"7"7"7"7&
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 $,==??222222
mR\mmakmmnnn
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	    \*\\YZ\\]]]tttttsG   C2 9C	C2 0CC2 
C))C2 ,C)-C2 2D!DD!c           
        K   t          |          \  }}|dd}|D ]׊t          d dt          |          dz
   d           t          j        d           d{V  fd|D             }t          |           t          d	|            t          j        |          }t          d
|            dt           dt           d d}dddd|di}		 | 	                    |||	d          4 d{V }
|
j
        }t          d d|            |dk    rY|
                                 d{V }|                    di           }t          d d|                    d                      n/|
                                 d{V }t          d d|            ddd          d{V  n# 1 d{V swxY w Y   # t          j        $ r }t          d d|            Y d}~d}~ww xY wdS )u   
    Pour chaque product_id de product_ids, crée un metafield 'custom.linked_products'
    en type list.product_reference, dont la valeur est la liste des autres products en GID.
    r
   r<   zPour le produit ID rM   r   u    produits liésNc                 &    g | ]}|k    d | S )zgid://shopify/Product/ ).0other_idpids     r9   
<listcomp>z2add_linked_products_metafields.<locals>.<listcomp>   s2     
 
 
3 0X//    zSiblings : zSiblings json: r   r	   rJ   /metafields.json	metafieldcustomlinked_productszlist.product_reference)	namespacekeytypevalueFr=   [z] HTTP Status Code: r@   u   ] Metafield créé: id=idu   ] Erreur création metafield : u   ] Erreur de requête : )r   r   r,   asynciosleepr$   dumpsr   r   rA   rB   r"   rC   r   rD   )r2   product_idsr-   r.   r/   r   siblingssiblings_jsonr0   payloadr3   rB   r4   mferrr7   rW   s                   @r9   add_linked_products_metafieldsrm   n   s[     
 /{;;L)".* G
  )7 )7QCQQC,<,<q,@QQQRRRmA
 
 
 
'
 
 

 	k&H&&'''
8,,///000```K``3```%.5*	 
	7||CwE|RR 
I 
I 
I 
I 
I 
I 
IV^!;#;;6;;<<<S==!)000000D+r22BHcHH"&&,,HHIIII (//////CGcGG#GGHHH
I 
I 
I 
I 
I 
I 
I 
I 
I 
I 
I 
I 
I 
I 
I 
I 
I 
I 
I 
I 
I 
I 
I 
I 
I 
I 
I " 	7 	7 	75c55!5566666666	7Q)7 )7s=   G4B+F1G1
F;	;G>F;	?GG3G..G3c                   K   t          |          \  }}|                     d|           }t          |          }t          |          \  }}dt           dt           d}d|d}d}t          j        |d|id	          }	t          j                    4 d {V }
t          |         
                                 d {V  	 |
                    |||	
          4 d {V }|                                 d {V }|j        dk    r>t          d|j        |           d|icd d d           d {V  cd d d           d {V  S |                                 d {V }d|v rDt          d|d                    d|d         icd d d           d {V  cd d d           d {V  S |                    di                               di           cd d d           d {V  cd d d           d {V  S # 1 d {V swxY w Y   n9# t          $ r,}t          d|           Y d }~d d d           d {V  d S d }~ww xY w	 d d d           d {V  d S # 1 d {V swxY w Y   d S )Nproductr   r	   z/graphql.jsonr
   r   z
    mutation productCreate($input: ProductInput!) {
      productCreate(input: $input) {
        product {
          id
          title
        }
        userErrors {
          field
          message
        }
      }
    }
    input)query	variables)r   r4   i  z)HTTP Error during create_product_graphql:errorerrorsz-GraphQL errors during create_product_graphql:r4   productCreatez(Exception during create_product_graphql:)r   r"   transform_product_inputr   r   r$   rf   r   r    r   r   rA   rC   rB   r   r)   )product_datar-   r.   r/   	raw_input
input_datar0   r   mutationrj   r2   r3   response_textresultr7   s                  r9   create_product_graphqlr}      s=     .{;;L)  L99I(33J.{;;L)
J^
J
J
J
J
JC*". GH jz*   G $&&       'Y'//111111111	||Cw|GG 	G 	G 	G 	G 	G 	G 	G8&.mmoo 5 5 5 5 5 5?c))ExXefff#]3		G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G               (}}......v%%I6RZK[\\\#VH%56	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G              zz&"--11/2FF	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G             	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G  	 	 	<a@@@444             		G                             sx   &I?H?G1H=G1>H#)G1H1
G;	;H>G;	?HI
H9H4I4H99I
IIc                   K   t          |           \  }}t          |                                          d {V  dt           dt           d}d|d}g }t                      }t          j                    4 d {V }|rb||v rt          d|           nL|	                    |           t          |                                          d {V  	 |
                    ||          4 d {V }|                                 |                                 d {V }	|                    |	
                    dg                      |j        
                    d	          }
|
r/t          j        d
|
          }|r|                    d          nd }nd }	 d d d           d {V  n# 1 d {V swxY w Y   n'# t$          $ r}t          d|           Y d }~nd }~ww xY w|b	 d d d           d {V  n# 1 d {V swxY w Y   |S )Nr   r	   z/variants.json?limit=250r
   r   r   r   variantsr   r   r   z"Exception during get_all_variants:)r   r   r   r   r   r   r   r    r   r!   r"   r#   r$   r%   r   r&   r'   r(   r)   )r-   r.   r/   r0   r   r   r1   r2   r3   r4   r5   r6   r7   s                r9   get_all_variantsr      sW     .{;;L)

#
+
+
-
--------
U^
U
U
U
U
UC*". G H55L$&&       ' 	l""FLLLS!!! +33555555555";;sG;<< 	# 	# 	# 	# 	# 	# 	#--///!)000000DOODHHZ$<$<==="*"2"6"6v">">K" # "	*Dk R R05?ekk!nnn4"
	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#    :A>>>#  	 	                          * Osb   ;AG4F7-B%F%F7%
F/	/F72F/	3F76G47
GGG4GG44
G>G>c                 &   i }|                      d          |d<   |                      d          |d<   |                      d          |d<   |                      d          |d<   |                      d          |d<   |                      dd	                                          }|d
k    rdnd|d<   |                      d          }t          |t                    r#d |                    d          D             |d<   n||d<   d| v r| d         |d<   |S )uv  
    Transforme le dictionnaire d'entrée pour qu'il corresponde à ProductInput attendu par Shopify GraphQL.

    Transformations effectuées :
      - 'body_html' → 'descriptionHtml'
      - 'product_type' → 'productType'
      - 'status' est remplacé par 'published' (true si 'active')
      - Suppression du champ 'variants' (non supporté dans cette mutation)
    title	body_htmldescriptionHtmlvendorproduct_typeproductTyper   rB    activeTF	publishedtagsc                 ^    g | ]*}|                                 |                                 +S rT   )strip)rU   tags     r9   rX   z+transform_product_input.<locals>.<listcomp>  s-    UUUsUsyy{{UUUrY   ,
metafields)r"   lower
isinstancestrsplit)r4   transformedrB   r   s       r9   rv   rv      s)    K88G,,K%)XXk%:%:K!" HHX..K!%.!9!9K"hhz22K
 XXh##))++F'-'9'9ttuK 88FD$ #UUdjjooUUUF"F t$($6L! rY   c                   K   t          |          \  }}dt           dt           d|  d}d|d}t          |                                          d {V  t          j                    4 d {V }	 |                    ||          4 d {V }|                                 |	                                 d {V }|                    dg           cd d d           d {V  cd d d           d {V  S # 1 d {V swxY w Y   n;# t          $ r.}	t          d	|	           g cY d }	~	cd d d           d {V  S d }	~	ww xY w	 d d d           d {V  d S # 1 d {V swxY w Y   d S )
Nr   r	   z
/variants/rZ   r
   r   r   r   z(Exception during get_variant_metafields:)r   r   r   r   r   r   r    r"   r#   r$   r)   r   )

variant_idr-   r.   r/   r0   r   r2   r3   r4   r7   s
             r9   get_variant_metafieldsr      s     .{;;L)
c^
c
c
c
cz
c
c
cC*". G
 
#
+
+
-
--------$&&       '	{{3{88 2 2 2 2 2 2 2H))+++%]]__,,,,,,xxb112 2 2 2 2 2 2 2 2 2 2 2 2             2 2 2 2 2 2 2 2 2 2 2 2 2 2 2  	 	 	<a@@@IIIII             		2                             sg   .E0DAC6D6
D 	 DD 	DE
E D;#E $E;E  E
E!$E!c                 X  K   t          |          \  }}t          d           t          |           d| d}|dd}	 |                     ||d          4 d {V }|j        }t          d|            |d	k    r't          d
| d           	 d d d           d {V  dS |                                 d {V }	t          d| d|	            	 d d d           d {V  dS # 1 d {V swxY w Y   d S # t
          j        $ r }
t          d| d|
            Y d }
~
dS d }
~
ww xY w)NzAppel de delete_shopify_productz:https://emde-b2b.myshopify.com/admin/api/2024-10/products/rK   r
   r<   F)r   r>   r?   rL   zProduit avec l'ID u    supprimé avec succès.Tz8Erreur API Shopify lors de la suppression du produit ID rM   u8   Erreur de requête lors de la suppression du produit ID )r   r   deleterB   rC   r   rD   )r2   rO   r-   r.   r/   r0   r   r3   rF   rG   r7   s              r9   delete_shopify_productr   4  sQ     .{;;L)	
+,,,	*
Xz
X
X
XC".* G>>#wE>BB 	 	 	 	 	 	 	h"/K4{44555c!!O:OOOPPP	 	 	 	 	 	 	 	 	 	 	 	 	 	 $,==??222222
lQ[ll`jllmmm	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	    [[[XY[[\\\uuuuusG   C: 4C'C: $0C'C: '
C11C: 4C15C: :D)	D$$D)c                   K   d}t          |          \  }}|| |d}dt           dt           d}|dd}	 t          j        |||          }	|	                                S # t          $ r}
t          |
           Y d }
~
d S d }
~
ww xY w)	Nl   z] )location_idinventory_item_id	availabler   r	   z/inventory_levels/set.jsonr
   r<   )r$   r   )r   r   r   requestsrA   r$   r)   r   )r   stockr-   r   r.   r/   
stock_datar0   r   r3   r7   s              r9   update_stockr   N  s      K.{;;L) #. J
 X^
W
W
W
W
WC".* G
=:wGGG}}   attttts   *A! !
B+B  B)r   )r$   rd   r   r   r&   api.customersr   r   r   r   r   r   r:   rH   rQ   rm   r}   r   rv   r   r   r   rT   rY   r9   <module>r      s5       				 P P P P P P P P P P P P) + + + +^   0   .47 47 47 47p. . . .b       F# # #L   (  4    rY   