+
    À¨ëiÛ  ã                  óv   € R t ^ RIHt ^ RIt^ RIHt ^ RIt^ RIHt R t	R R lt
R t]R	8X  d
   ]! 4        R# R# )
aR  
Inspect and repair parts_inventory.part_images using on-disk file existence.

Use this when parts show broken image entries that point to missing files.

Features:
- Inspect one location (e.g. BA001-A2) or all parts
- Detect broken image rows (file_path missing on disk, with no URL)
- Optionally delete broken rows
- Recompute is_primary so each part has one valid primary image

Examples:
  # Inspect one part by location only
  python scripts/repair_part_images_from_disk.py --host 127.0.0.1 --user bill --password 5074367 --location BA001-A2

  # Apply repair for one location
  python scripts/repair_part_images_from_disk.py --host 127.0.0.1 --user bill --password 5074367 --location BA001-A2 --apply

  # Apply repair for all parts
  python scripts/repair_part_images_from_disk.py --host 127.0.0.1 --user bill --password 5074367 --all --apply
)ÚannotationsN)ÚPath)Ú
DictCursorc                 ó´  € \         P                  ! R R7      p V P                  RRR7       V P                  R\        RR7       V P                  RR	R
7       V P                  RR	R
7       V P                  RRR7       V P                  RRR7       V P                  RRR7       V P                  RRRR7       V P                  RRRR7       V P	                  4       # )z:Repair part_images rows by validating image files on disk.)Údescriptionz--hostz	127.0.0.1)Údefaultz--portiê  )Útyper   z--userT)Úrequiredz
--passwordz
--databaseÚparts_inventoryz--upload-rootz+/var/www/html/Server/partsinventory_uploadsz
--locationz.Specific storage location name (e.g. BA001-A2))Úhelpz--allÚ
store_truez/Process all parts instead of a single location.)Úactionr   z--applyz/Apply fixes. Without this, script only reports.)ÚargparseÚArgumentParserÚadd_argumentÚintÚ
parse_args)Úps    ÚEc:\Users\Bill\Software\Server\scripts\repair_part_images_from_disk.pyr   r      sº   € Ü×ÒÐ,hÔi€AØ‡N�N�8 [€NÔ1Ø‡N�N�8¤#¨t€NÔ4Ø‡N�N�8 d€NÔ+Ø‡N�N�<¨$€NÔ/Ø‡N�N�<Ð):€NÔ;Ø‡N�N�?Ð,Y€NÔZØ‡N�N�<Ð&V€NÔWØ‡N�N�7 <Ð6g€NÔhØ‡N�N�9 \Ð8i€NÔjØ�<‰<‹>Ðó    c               ó$   € V ^8„  d   QhRRRRRR/# )é   Úupload_rootr   Ú	file_pathz
str | NoneÚreturnÚbool© )Úformats   "r   Ú__annotate__r   -   s!   € ÷ .ñ .˜Tð .¨jð .¸Tñ .r   c                óB   € V'       g   R # W,          P                  4       # )F)Úexists)r   r   s   &&r   Úfile_existsr!   -   s   € ßÙØÕ#×+Ñ+Ó-Ð-r   c                 ór  € \        4       p V P                  '       g   V P                  '       g   \        R 4      h\        P
                  ! V P                  V P                  V P                  V P                  V P                  \        RR7      p\        V P                  4      p^ p^ p VP                  4       ;_uu_ 4       pV P                  '       d   VP                  R4       MVP                  RV P                  34       VP!                  4       pV'       g'   \#        R4        RRR4       VP%                  4        R# V EF<  pVR,          pVP                  RV34       VP!                  4       p	V	'       g   K:  . p
. p\#        R	V R
VR,           R24       V	 Få  p\'        VP)                  R4      ;'       g    RP+                  4       4      pT;'       g    \-        W,P)                  R4      4      pV'       d   RMRp\#        RVR,           RVR,           RV RVP)                  R4       RVP)                  R4       2
4       V'       d   VP/                  VR,          4       KÍ  V
P/                  VR,          4       Kç  	  V P0                  '       dZ   V
'       dR   VP                  RRP3                  R.\5        V
4      ,          4       R2\7        V
4      4       W5P8                  ,          pV P0                  '       g   EKÂ  VP                  RV34       VP!                  4        Uu. uF  pVR,          NK  	  ppV'       g   EK  VP                  RV34       VP                  RV^ ,          34       V^,          pEK?  	  RRR4       V P0                  '       d#   VP;                  4        \#        RV R V 24       MVP=                  4        \#        R!4        VP%                  4        R# u upi   + '       g   i     Lw; i  \>         d    TP=                  4        h i ; i  TP%                  4        i ; i)"z"Provide --location <name> or --allF)ÚhostÚportÚuserÚpasswordÚdatabaseÚcursorclassÚ
autocommitz%SELECT id,name FROM parts ORDER BY idzó
                    SELECT p.id, p.name
                    FROM parts p
                    JOIN storage_locations s ON s.id = p.storage_location_id
                    WHERE s.name = %s
                    ORDER BY p.id
                    zNo matching parts found.NÚidzó
                    SELECT id, file_path, url, is_primary, original_filename, source, created_at
                    FROM part_images
                    WHERE part_id = %s
                    ORDER BY is_primary DESC, id
                    z
Part z (Únamez):ÚurlÚ r   ÚOKÚMISSINGz  id=z	 primary=Ú
is_primaryz status=z file_path=z url=z%DELETE FROM part_images WHERE id IN (Ú,z%sÚ)z9SELECT id FROM part_images WHERE part_id = %s ORDER BY idz8UPDATE part_images SET is_primary = 0 WHERE part_id = %sz3UPDATE part_images SET is_primary = 1 WHERE id = %sz
Repair complete: deleted_rows=z fixed_primary_parts=zL
Dry run complete (no changes applied). Re-run with --apply to commit fixes.) r   ÚallÚlocationÚ
SystemExitÚpymysqlÚconnectr#   r$   r%   r&   r'   r   r   r   ÚcursorÚexecuteÚfetchallÚprintÚcloser   ÚgetÚstripr!   ÚappendÚapplyÚjoinÚlenÚtupleÚrowcountÚcommitÚrollbackÚ	Exception)ÚargsÚconnr   Údeleted_rowsÚfixed_primary_partsÚcurÚpartsÚpartÚpart_idÚimagesÚ
broken_idsÚ	valid_idsÚimgÚhas_urlr    ÚstatusÚrÚ	remainings                     r   ÚmainrX   3   sz  € Ü‹<€DØ�8�8ˆ8˜DŸMŸM˜MÜÐ=Ó>Ð>ä�?Š?Ø�Y‰YØ�Y‰YØ�Y‰YØ—‘Ø—‘ÜØô€Dô �t×'Ñ'Ó(€Kà€LØÐðQØ�[‰[�]Œ]˜cØ�x�xˆxØ—‘ÐCÕDà—‘ðð —]‘]Ð$ô	ð —L‘L“NˆEçÜÐ0Ô1Ø÷% ð` 	�
‰
Žôy �Ø˜t�*�Ø—‘ðð �Jôð Ÿ™›�ßÙà�
Ø�	Ü˜ ˜y¨¨4°­<¨.¸Ð;Ô<Û!�CÜ" C§G¡G¨E£N×$8Ð$8°b×#?Ñ#?Ó#AÓB�GØ$×VÐV¬°KÇÁÈÓAUÓ(V�Fß%+™T°�FÜØ  D¥	˜{¨)°C¸Õ4EÐ3FÀhÈvÈhð W%Ø%(§W¡W¨[Ó%9Ð$:¸%ÀÇÁÈÃÐ?OðQô÷ Ø!×(Ñ(¨¨T­Ö3à"×)Ñ)¨#¨d­)Ö4ñ "ð —:—:�:§*Ø—K‘KØ?ÀÇÁÈ$ÈÔRUÐV`ÓRaÕIaÓ@bÐ?cÐcdÐeÜ˜jÓ)ôð !§L¡LÕ0�Là—:—:“:à—K‘KÐ [Ð^eÐ]gÔhØ25·,±,´.Ó A±.¨Q  4§ ±.�IÐ Aß ’yØŸ™Ð$^ÐahÐ`jÔkØŸ™Ð$YÐ\eÐfgÕ\hÐ[jÔkØ+¨qÕ0Ó+ñ[ ÷) ðF �:�:ˆ:Ø�K‰KŒMÜØ2°<°.ð A'Ø':Ð&;ð=õð
 �M‰MŒOÜÐaÕbð
 	�
‰
Žùò' !B÷{ �]ûôX ô Ø�‰ŒØðûð 	�
‰
�úsš   Â'P Â?AO1ÄO1Ä%P Ä?A:O1Æ:O1Ç"O1Ç;BO1ÊO1ÊA O1Ì%O1Ì(O,
Ì:O1Í;O1ÎP Î!P Î=P$ Î>P ÏP$ Ï,O1Ï1P	Ï<P ÐP!Ð!P$ Ð$P6Ú__main__)Ú__doc__Ú
__future__r   r   Úpathlibr   r6   Úpymysql.cursorsr   r   r!   rX   Ú__name__r   r   r   Ú<module>r_      s@   ðñõ* #ã Ý ã Ý &òõ.òdðN ˆzÔÙ†Fñ r   