← back to Kravet Sheet Sync 2026 04 20

__pycache__/price_update_pass.cpython-314.pyc

84 lines

+
x
Yju��B�Rt^RIt^RIt^RIt^RIt^RIt^RIt^RIt^RI	H
t
Ht^RIt^RI
t
^RIt]PP!RR4tRtRR.tRt]P*!^4t]P.!4tR	tR
tRRltRtR
tRtRt] R8Xd
]!4R#R#)u
Price-update pass for Kravet products whose sheet MAP has changed.

Source: kravet_diff_update_2026_04_20 where change_flag='retail_changed'
Updates: retail price (= sheet MAP) and cost (= MAP/2 + WHLS × Tariff%)
         on the main DWKK-XXX variant (the "Sold Per..." variant, NOT Sample).

Pipeline per product:
  1) query product variants, find main variant (sku = DWKK-XXX exactly)
  2) productVariantsBulkUpdate with new price + new cost
  3) write kravet_catalog.price_retail/cost_price

Concurrency: 8 threads.
Resume-safe: tracks updated products in JSONL; re-run skips already-done.

Usage:
  python3 price_update_pass.py --limit 100      # pilot
  python3 price_update_pass.py                  # all 4,570
  python3 price_update_pass.py --dry-run        # no Shopify writes
N)�ThreadPoolExecutor�as_completed�SHOPIFY_ADMIN_TOKEN�zPhttps://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json�sshzroot@45.61.58.125zprice_update_results.jsonlc���\P!\RVR2.,RRRR7p\P!\
P!VP44Uu.uFq"'gKVNK	up#uupi)zLPGPASSWORD=DW2024! psql -h 127.0.0.1 -U dw_admin -d dw_unified --csv -t -c "�"T��capture_output�text�check)�
subprocess�run�SSH�csv�reader�io�StringIO�stdout)�sql�r�rows&  �1kravet-sheet-sync-2026-04-20/price_update_pass.py�pg_rowsr#sj�����s�
V�WZ�V[�[\�]�_�_��$�d�	4�A��:�:�b�k�k�!�(�(�&;�<�D�<�C��C�C�<�D�D��Ds�!	A8�/A8c�Z�\P!\RVR2.,RRRR7R#)zCPGPASSWORD=DW2024! psql -h 127.0.0.1 -U dw_admin -d dw_unified -c "rTr	N)r
rr)rs&r�pg_execr*s0���N�N�3�
M�c�U�RS�T�V�V��$�d�4�c	��\P!RTRT;'g//4P4p\PP\VRRRR\/R7p\P!\PPV^R7P44pRV9d\VR,4hVR	,#)
�query�	variables�POSTzContent-Typezapplication/jsonzX-Shopify-Access-Token)�data�method�headers)�timeout�errorsr!)�json�dumps�encode�urllib�request�Request�URL�TOKEN�loads�urlopen�read�RuntimeError)�q�v�body�req�ds&&   r�gqlr70s���	
���W�Q�{�1�7�7��3�	4�	;�	;�	=�D������s��F�� 2�3K�E�R�	�	T�C�
�j�j����'�'��B�'�7�<�<�>�?�A��1�}�L��8��5�5��V�9�rzvquery($id:ID!){ product(id:$id){ variants(first:5){ nodes{ id sku price inventoryItem{ id unitCost{ amount } } } } } }z�mutation($pid:ID!,$vs:[ProductVariantsBulkInput!]!){ productVariantsBulkUpdate(productId:$pid,variants:$vs){ userErrors{field message} } }c	� �Vwr#rErg\V4pV'd\V4MRp	V'd\V4MRp
T
e\Y�,
4R8dTRRT
/3#RTRTR
/pT	e
RT	R
/TR&T'dTR	R
T
RTRT	/3#\;_uu_4\\RTR
T./4pRRR4XR,R,p
T
'dTR\T
4R,2R3#TPRR4p\RTRT	eT	MRRTR24TRR
T
RTRT	/3# \\3d	TRR3u#i;i +'giL�;i \d9pTR\T4PR\T4R,2R3uRp?#Rp?ii;i)N�bad_numbersg{�G�zt?�nochange�price�idz.2f�cost�
inventoryItem�dry�from�to�pid�vs�productVariantsBulkUpdate�
userErrorszshopify_err::N�xN�'z''z'UPDATE kravet_catalog SET price_retail=z
, cost_price=�NULLz!, updated_at=now() WHERE dw_sku='�okzexc:�::N�dN)
�float�
ValueError�	TypeError�abs�_semr7�UPD�str�replacer�	Exception�type�__name__)rr?�dw_sku�variant_gid�product_gid�
current_price�	sheet_map�
sheet_cost�	new_price�new_cost�	cur_price�
variant_inputr�errs�esc�es&&              r�process_onerd=s���NQ�J�F��Y�H�	1��i�(�I�-7��j�)�T�H�0=��m�,�4�I�� �S��)>�%?�%�%G��J��)�(<�=�=��{�G�	�#��H�
���.4��#��-H�M�/�*���E�F�I�t�Y��PX�#Y�Z�Z�
�T��C�%��d�]�O�D�E�A���,�-�l�;����l�3�t�9�T�?�*;�<�d�C�C��n�n�S�$�'���9�)��E�*2�*>�h�F�K�L2�25��a�9�	:���v�y�$�	�6�8�T�U�U��+�I�&�	1��M�4�0�0�	1���T���H��$�t�A�w�/�/�0��#�a�&��,��@�$�G�G��H�su�'D�
D� E
�E
�<
E
�E
�D7�+E
�E
�#7E
�D4�1E
�3D4�4E
�7E	�E
�
F
�-F�F
�F
c��\P!4pVPR\^R7VPRRR7VPR\^R7VP	4p\4p\PP\4'dW\\4;_uu_4pVF0p\P!V4qRPVR,4K2	RRR4RpVP'dVR	VP2,
p\!V4pVUu.uFq�^,V9gKVNK	pp\#R
\%V4R\%V4R24\\R
^R7p	^;p
;p;r�\&P&!4p\)VP*R7;_uu_4pVUu.uF"q�P-\.W�P04NK$	pp\3\5V4^4EF3wppVP74wpppV	P9\P:!RVRVRV/4R,4VR8XdV
^,
p
M+VR8XdV^,
pMVR8XdV
^,
p
M	V^,
pV^d,^8XgV\%V48XgK�V\=^\&P&!4V,
4,p\%V4V,
\=^V4,p\#RVR
R\%V4R
RV
RVRVRV
RVR
RV^<,R 
R!2R"R#7EK6	RRR4V	P?4\#R$V
R%VRVRV
R\&P&!4V,
R 
R&24R# \dEK�i;i +'giEL�;iuupiuupi +'giL�;i)'z--limit)rU�defaultz	--dry-run�
store_true)�actionz	--threadsrWNa#SELECT u.dw_sku, m.variant_gid, m.product_gid, m.price::text,
                    u.sheet_map::text, u.sheet_cost::text
               FROM kravet_diff_update_2026_04_20 u
               JOIN kravet_dwkk_variant_map m ON m.dw_sku = u.dw_sku
              WHERE u.change_flag='retail_changed'z LIMIT z[scope] z rows to update (resumed: �)�a)�	buffering)�max_workers�statusr!�
rIr:r?z  [�,�/z] ok=z nc=z err=z dry=z  z.1fz/s  eta z.0f�mT)�flushz
[done] ok=z
 nochange=�s) �argparse�ArgumentParser�add_argument�int�
parse_args�set�os�path�exists�	OUT_JSONL�openr&r.�addrT�limitr�print�len�timer�threads�submitrd�dry_run�	enumerater�result�writer'�max�close)�ap�args�done�f�liner6r�rowsr�outrI�errr:r?�t0�ex�futs�irWrmr!�rate�etas                       r�mainr�`s��	�	 �	 �	"�B��O�O�I�C��O�3��O�O�K��O�5��O�O�K�c�1�O�5�
�=�=�?�D��5�D�	�w�w�~�~�i� � �
�)�_�_�������D�)�Q�8�8�A�h�K�+@���6�C�
�z�z�z�3�G�D�J�J�<�0�0�3��3�<�D��0�t�!��t�4�/�A�A�t�D�0�	�H�S��Y�K�9�#�d�)��A�
F�G�
�y�#��
+�C� !�!�B�!��!�x�	
����B�	����	5�	5��AE�F��A�	�	�+�q�,�,�7���F��l�4�0�!�4�D�A�q�#$�8�8�:� �F�F�D��I�I�d�j�j�(�F�H�f�f�d�!S�T�W[�[�\���~�r�Q�w�r��:�%�x�1�}�x��5��s�a�x�s�'*�a�x�s��3�w�!�|�q�C��I�~��3�q�$�)�)�+��"2�3�3���4�y�1�}��A�t��4����A�a�5��#�d�)�A��e�B�4�t�H�:�U�3�%�u�UX�TY�Y[��c�
�(�3�r�6�#�,�a�9�@D�F�F�5�
6��I�I�K�	�L���J�x�j��c�U�%��u�B�t�y�y�{�SU�~�VY�FZ�Z[�
\�]��C!�&�$�&���_�_��1��G�
6�	5�sb�3N�9-N�&N�+N*�?N*�7N4�<(N/�$B;N4�$BN4�N	�N�N	�N�N'	�/N4�4O	�__main__)N)!�__doc__rtr&rzr
�sysr��urllib.requestr)�concurrent.futuresrrrr�	threading�environ�getr-r,rr}�	SemaphorerP�Lock�_lockrrr7�GET_VARSrQrdr�rV�rr�<module>r�s����(A�@�@�@�?����j�j�n�n�*�2�.��V��
����
&�	����1��������E�4��
F��U�� H�F.^�b�z���F�r