← back to Elitis Price 2026

exec/__pycache__/ws5_activate.cpython-314.pyc

61 lines

+
�Sj��
���Rt^RIt^RIt^RIt^RIt^RIt^RIt]PP^R4^RI	H
t
Rt]PP]R4t
]PPRR4t]PPRR4tR	tR
tRtRtR-tR.tR
tRtRtRtRtR/RltR0RltRt]R8XEd]!4wtt R]PB9d�]PB]PBPER4^,,t#]$!R] 44t%]&!R]%R,]%R,R4]&!R]!]%]RR74]PN!^4](!4t)]PPU]4'dv]PV!],!]44FYt-]-R,P]R 4'g!]-R,P]R!4'gKA])P_]-R",4K[	^;t0;t1t2] Uu.uFqR",])9gKVNK	upt3]&!R#]4!]34R$]4!])4R%24]5!]34F�wt6t-]!]-]4t7]7R 8Xd]0^,
t0M*]7P]R&4'd]2^,
t2M	]1^,
t1]6^,^,^8XgKa]&!R']6^,R(]4!]34R)]0R*]1R+]22
4K�	]&!R,]0R*]1R+]224R#R#uupi)1aWS5 - attach Elitis feed images to the Needs-Image drafts and flip them ACTIVE.
Images are PATTERN-level (Elitis publishes no per-colorway imagery) - Steve-approved
2026-07-11 (canary-then-batch). $0: Shopify fetches the CDN URL itself; Admin API free.

Per draft (from ws3_drafts ledger, status OK) matched to elitis_feed.json by
accent-normalized pattern:
  1. rank images (drop swatch-grid/nuancier; prefer ambiance/mural/detail), take top 3.
  2. productCreateMedia(originalSource=CDN url) -> wait until READY.
  3. strip 'Needs-Image' tag + set status ACTIVE.
Idempotent: skips drafts that already have an image or are already ACTIVE.N�lib)�gqlz..zelitis_feed.json�ledgerzws3_drafts.csvzws5_activate.csvz�mutation($pid:ID!,$media:[CreateMediaInput!]!){
  productCreateMedia(productId:$pid, media:$media){
    media{ ... on MediaImage { id status } } mediaUserErrors{ field message } } }z]mutation($id:ID!,$tags:[String!]!){ tagsRemove(id:$id, tags:$tags){ userErrors{ message } } }zsmutation($input:ProductInput!){ productUpdate(input:$input){
  product{ id status } userErrors{ field message } } }zqquery($id:ID!){ product(id:$id){ status
  media(first:10){ edges{ node{ ... on MediaImage { id status } } } } } }c���\P!RT;'gR4pRPRV44pRPVP4P	44#)�NFKD�c3�b"�TF%p\P!V4'dK!Vx�K'	R#5i�N)�unicodedata�	combining)�.0�cs& �A/Users/macstudio3/Projects/elitis-price-2026/exec/ws5_activate.py�	<genexpr>�norm.<locals>.<genexpr>)s���=�1�a�K�$9�$9�!�$<���1�s�/�
/� )r
�	normalize�join�casefold�split)�ss&r�normr'sL�����f�a�g�g�2�.�A�
���=�1�=�=�A��8�8�A�J�J�L�&�&�(�)�)�c�"�Rp\WRR7#)c�pa�VP4o^p\;QJd#V3Rl\4F'gKRM	RM!V3Rl\44'd
V^
,p\;QJd#V3Rl\4F'gKRM	RM!V3Rl\44'd
V^,
pV#)�c3�,<"�TF	qS9x�K	R#5ir	�)r�d�lus& �rr�-rank_images.<locals>.score.<locals>.<genexpr>1s����%��1�B�w����TFc3�,<"�TF	qS9x�K	R#5ir	r)r�brs& �rrr 3s����&��1�B�w��r!)�lower�any�DROP�BOOST)�urrs& @r�score�rank_images.<locals>.score.sl���
�W�W�Y��
���3�%��%�3�3�3�%��%�%�%�
��G�A��3�&��&�3�3�3�&��&�&�&�
��F�A��rT)�key�reverse)�sorted)�urlsr)s& r�rank_imagesr/-s����$�4�0�0rc��RV2#)zgid://shopify/Product/r��pids&r�gidr39s��
#�C�5�)�)rc	���\PP\4;'d'\PP	\4^8�'*p\\RRR7;_uu_4p\P!V4pV'dVP.RO4VP\P!R4WW#.4RRR4R# +'giR#;i)r�ar)�newlinez%Y-%m-%dT%H:%M:%SN)�ts�
product_id�pattern�dw_sku�status)�os�path�exists�LEDGER�getsize�open�csv�writer�writerow�time�strftime)r2�pat�dwr;�new�f�ws&&&&   r�logrL=s����w�w�~�~�f�%�E�E�"�'�'�/�/�&�*A�A�*E�
F�C�	
�f�c�2�	&�	&�!��J�J�q�M���
�J�J�J�K�	�
�
�D�M�M�"5�6��"�M�N�	
'�	&�	&�	&�s
�1AC�C&	c��\\R\V4/4R,p\VR,R,4^8�pVR,V3#)�id�product�media�edgesr;)r�Q_MEDIAr3�len)r2r�has_imgs&  r�already_donerUFsC���G�d�C��H�%�&�y�1�A��!�G�*�W�%�&��*�G��X�;���rc��\P!4p\P!4V,
V8Ed\\R\V4/4R,pVR,R,Uu.uF+qDR,'gKVR,P	R4NK-	ppV'd=\
;QJdRV4F'dKRM	RM
!RV44'dR#\;QJdR	V4F'gKRM	RM
!R	V44'dR#\P!^4EK"\X4#uupi)
rNrOrPrQ�noder;c3�*"�TF	qR8Hx�K	R#5i)�READYNr�rrs& rr�wait_ready.<locals>.<genexpr>Qs���/�B�q�7�l�B���FTc3�*"�TF	qR8Hx�K	R#5i)�FAILEDNrrZs& rrr[Ss���)�b��H�}�b�r\)	rErrRr3�get�allr%�sleep�bool)r2�timeout�t0r�e�sts&&    r�
wait_readyrgLs���	
����B�
�)�)�+��
�W�
$���$��C��)�*�9�5��/0��z�'�/B�
P�/B�!��i�i�%�a��i�m�m�H�%�/B��
P�
�#�#�/�B�/�#�#�#�/�B�/�/�/���3�)�b�)�3�3�3�)�b�)�)�)���
�
�1�
���8�O��
Qs�,E�Ec�X�VR,pVR,pVR,pVP\V44pV'g\W4VR4R#\V4wrxV'dVR8Xd\W4VR4R#V'g\	VR,4R,M.p	V	'd�V	U
u.uF$p
RT
R	R
RVPR4;'gT/NK&	pp
\\R
\V4RV/4pVR,R,p
V
'd2\W4VR\P!V
4R,,4R#\V4\\R\V4RR./4\\RR\V4RR//4pVR,R,p
V
'd2\W4VR\P!V
4R,,4R#\W4VR4V'dG\\P!R
VRVRVPR4RVR\V	4RV	/^R R!74R#uup
i)"r8r9r:zSKIP:no-feed-match�ACTIVEzSKIP:already-active-with-image�images:N�N�originalSource�mediaContentType�IMAGE�alt�colorwayr2rP�productCreateMedia�mediaUserErrorszFAIL:media::N�xNz
FAIL:mediarN�tagszNeeds-Image�inputr;�
productUpdate�
userErrorszFAIL:activate:z
FAIL:activate�OK�images_attached�img_urlsF)�indent�ensure_ascii)r_rrLrUr/r�M_MEDIAr3�json�dumpsrg�M_TAGSRM�M_UPD�printrS)�row�feed�verboser2rGrHrJr;rT�imgsr(rP�r�ues&&&           r�activate_oner�Ys���

�l�
�C�

�i�.�C�	�X��B�����c���A���C�b�.�/�#�"�3�'�O�F��6�X�%��C�b�:�;�/�/6�;�q��{�#�B�'�B�D��>B�D�>B��#�A�'9�7������,�3�3��5�>B�	�D���%��S��7�E�:�;��
�#�
$�%6�
7��
���"�m�d�j�j��n�T�.B�B�C���3����4��S��6�M�?�;�<��E�G�d�C��H�h��A�B�C�A�	
�?�	�L�	)�B�	��C�b�*�T�Z�Z��^�D�-A�A�B����"�d���
�d�j�j�%��i��j�#�'�'�*�BU�"�B�(9�3�t�9�$�d�,�45�E�K�	L���)Ds�'!H'�	H'c���\P!\\44p\P
!\\44Uu.uFqR,R8XgKVNK	ppW3#uupi)r;rx)r~�loadrA�FEEDrB�
DictReader�DRAFTS)r�r��rowss   rr�r�~sP���9�9�T�$�Z� �D��~�~�d�6�l�3�K�3�!��{�d�7J�A�A�3�D�K��:���Ls�	A(�A(�__main__z--canaryc#�L"�TFqR,\8XgKVx�K	R#5i)r8Nr1)rr�s& rrr�s���=�d���o��&<�1�1�d�s�$�
$z=== WS5 CANARY:r9rpz===zRESULT:T)r�r;rxzSKIP:alreadyr8zWS5 batch: z drafts to activate (z already done)�FAILz  ...�/z ok=z skip=z fail=z
WS5 DONE: ok=)�grille�nuancier�pastille�swatchz-color�colour)�ambiance�detail�mural�room�deco)�()F)8�__doc__�sysr<rBr~rEr
r=�insert�shopifyr�ROOTrr�r�r?r}r�r�rRr&r'rr/r3rLrUrgr�r��__name__r�r��argv�indexr2�nextr�r��exit�set�doner>r�rAr��
startswith�add�n_ok�n_skip�n_fail�todorS�	enumerate�irf)r�s0r�<module>r�s���	N��	�
����������5�����	�w�w�|�|�D�,�-��	�����h� 0�	1��	�����h� 2�	3��U��o��	:��M��H��7��*�	1�*�O� �
�"�J��z����J�D�$��S�X�X���h�h�s�x�x�~�~�j�1�A�5�6���=�d�=�=��
���Y���Z��%�H�
�i��c�4��>�?�������5�D�	�w�w�~�~�f�������V��-�A���{�%�%�d�+�+�q��{�/E�/E�n�/U�/U�����<��)�.���D��6�F��;�t�!���d�:�A�A�t�;�D�	�K��D�	�{�"7��D�	�{�.�
Q�R��$����1�
�!�T�
"��
��:��A�I�D�
�]�]�6�
"�
"��a�K�F��a�K�F�
��E�R�<�1���E�!�A�#��a��D�	�{�$�t�f�F�6�(�&���Q�R� �
�M�$��v�f�X�V�F�8�
<�=�5��<s�K"�K"