o
    }si9                     @   s  U d Z ddlZddlZddlmZmZ ddlmZmZm	Z	m
Z
mZ ejejejeddZejedZddd	d
dddddd	dddddddd	ddddddddd	dddddddd	ddd dd!d"gd#d$ddd%ddd	d&dddddd	d'ddddddd	d(ddddddd	d)ddddd*dd+d,ddd*d-d.gddd	d&dddddd	d'ddddddd	d(dddd/dddd	d)ddddd0d0d1d2d3d4gddd	d
d/d5d6d7d8d9dd:d;ddd9dd<dd	dd=dd>d?dd@dd	dAdddBddCdd	dDdddCddEddFdAdGddHdgddd	d
dId5d6dJd9dd:d;ddd9dddd	ddKddddLdd	dMdNddOdddd	dPdKddddQdd	dRdGddQdgdSZeeef edT< dUdVdWdXdYdUdVdWdZd[dUdVdWd\d]d]d^d_d`dadbdcdddedfdgdhdidbdjdSZeeef edk< ddldmddndmddodmddpdmgddldmddndmddodmd*dqdmgddldmddndmddodmgd7drdmd>dsdmdBdtdmdCdudmdHdvdmd9dwdmgddldmddxdmdQdydmdzd{dmd6d|dmd9dwdmgdSZeeee f ed}< h d~ZdZdejdededee fddZddedededejfddZdededejfddZdededejfddZdejdededededdfddZ dededefddZ!dedededdfddZ"dS )uJ  Render warehouse labels from a JSON template definition.

Template format — a list of element dicts:
  {"type": "text",    "x": 10, "y": 57, "size": 14, "bold": false,
   "field": "sku"}                          ← dynamic field
  {"type": "text",    "x": 10, "y": 57, "size": 14, "bold": false,
   "value": "Static text"}                  ← static value
  {"type": "barcode",          "x": 10,  "y": 5,   "w": 340, "h": 48, "field": "order_number"}
  {"type": "barcode_vertical", "x": 390, "y": 13,  "bar_length": 228, "bar_thickness": 44,
   "field": "barcode", "symbology": "upc"}         ← 'code128' or 'upc'
  {"type": "logo",             "x": 360, "y": 5,   "w": 75, "h": 35}
  {"type": "line",             "x": 10,  "y": 100, "w": 420, "thickness": 2}
  {"type": "background",       "x": 0,   "y": 0,   "file": "sealed_bg.png"}
    N)Image	ImageDraw)LABEL_WLABEL_Hdraw_barcodedraw_barcode_vertical	load_fontstaticimgzsoldered_logo.pnglogo
      n   $   )idtypexywhskutext.      T)r   r   r   r   sizeboldfieldname?      Fi  )r   r   r   r   r   r   r   max_wlocv      locationbarcode   2   ean)r   r   r   r   r   r   r   	symbologybg
background)r   r   r   r      0   B      sealed_amounti     right)r   r   r   r   r   r   r   aligniT  data_matrixiZ     Z   )r   r   r   r   r   ,   barcode_dataorder_number)r   r   r   r   r   r   r   	hrt_fieldletteri~     buyer   
buyer_nameih  itemsz   	num_itemsdelivery   totali     	total_euric  )r   r   r   r   r   r   r      urlP      product_url^   qty_namep   )productproduct_sealeddigikeyorder_summary
order_itemDEFAULT_TEMPLATES333023z2-channel relay boardzP4-11732388674107)r   r   r$   r%   u   10×)r   r   r$   r0   )r   r   r$   S1042zIvan Horvatz3 itemsDHLz	49.99 USDA)r9   r8   r?   rB   rC   rG   r;   zSOLR-WV2023zsolde.red/SOLR-WV2023zB-07u   2× Inkplate 10z	29.99 USDzS1042SOLR-WV2023)r   rL   r$   rN   
item_pricer8   r;   SAMPLE_FIELDSSKU)r   labelzProduct NameLocationBarcodezSealed AmountzOrder Numberz
Buyer Namez
Item CountzDelivery MethodTotalzBatch LetterzWarehouse Locationu   Qty × Namer[   z
Item PricezBarcode DataTEMPLATE_FIELDS>   r;   r%   r[      draw	max_widthreturnc           
      C   s   | d}g }d}|D ](}|d |  }| jd||d}	|	d |	d  |ks)|s,|}q|| |}q|r;|| |p?|gS )z@Split *text* into lines that each fit within *max_width* pixels.  r   r   fontr<   r   )splitstriptextbboxappend)
rd   r   rk   re   wordslinescurrentwordtestbbox rv   ?/var/www/warehouse.soldered.com/app/labels/template_renderer.py
_wrap_text   s   



rx      elementsfieldsscalec           (      C   s  t | }t| }td||fd}t|}| D ]=}|dd}t|dd| }	t|dd| }
|d}|rEt||pCdnt|d	pLd}|t	v rU|sUq|d
kr|s\qt|dd| }t
|dd}t||d}|dd}|d}|rt|| n||	 d|  }t||||}|jdd|d}|d |d  td|  }t|D ]7\}}|	}|dv r|jd||d}|d |d  }|dkr|	| n|	|d  }|j||
||  f|d|d qq|dkr1|sqt|dt d | }t|d d!| }|d"d#}|d$}|rt||pdnd%}t|||	|
||||p-d%d& q|d'kr`|s:qt|d(d)| } t|d*d+| }!|d"d#}t|||	|
| |!|d, q|d-krt|dd.| }|j|	|
f|	| |
| fgdtd|d/ ttd|d0 dd}"|j|	d1|  |
|d  d|  fd2d|"d |j|	d1|  |
|d  d|  fd3d|"d q|d4kr|d5d6}#tjt|#}$tj|$rt|dt | }t|d t| }t|$d}%|%||ftj}%||%|	|
f q|d7kr#t||	|
t|dd8| t|d d9|  q|d:krVt|dt d | }&t|t|d;d| }'|j|	|
f|	|& d |
|' d fgdd< q|S )=uH   Core renderer — always works in L (greyscale) mode, scaled by *scale*.L   r   rh   r   r   r   r   valuer   r   rH   r   F)r   r3   leftr       ri   rZ   rj   rc   ry   )r2   centerr<   r2   )fillrk   r%   r      r   r-   r)   code128r:   N)r   r   widthheightr)   hrt_textbarcode_vertical
bar_length   bar_thicknessr7   )r   r   r   r   r)   r4   r6   )outliner   rK      DATAMATRIXr+   filezsealed_bg.pngr   rJ   (   line	thickness)r   )r   r   r   newr   Drawgetintstr_OPTIONAL_FIELDSboolr   rx   rn   	enumerater   r   r   	rectanglemaxospathjoin_STATIC_IMGexistsopenconvertresizeLANCZOSpaste
_draw_logo)(rz   r{   r|   r   r   r
   rd   elemetyper   r   r   valr   r   rk   r3   
elem_max_wr    rq   cap_bbline_hir   lxlbboxtwbwbhsymr:   hrt_valblbtph_fontfnamebg_pathr*   lwtrv   rv   rw   _render   s   


(
  



*.0

2
*r   c                 C   s   t | |ddS )uB   Render a label for printing. Returns 440×256 greyscale PIL Image.ry   r|   )r   )rz   r{   rv   rv   rw   render_template	  s   r   c                 C   s   t | |td}|dS )uL   Render a label for screen preview at PREVIEW_SCALE×. Returns RGB PIL Image.r   RGB)r   PREVIEW_SCALEr   )rz   r{   r
   rv   rv   rw   render_template_preview  s   
r   canvasr   r   r   r   c                 C   s   t jtsdS ttd}td|jd}|j	||
 d d |d||ftj}|dd }| 	|||f dS )	z=Paste the Soldered logo onto the canvas, composited on white.NRGBA)r~   r~   r~   r~   rc   )maskr}   c                 S   s   | dk rdS dS )N   r   r~   rv   )vrv   rv   rw   <lambda>  s    z_draw_logo.<locals>.<lambda>)r   r   r   
_LOGO_PATHr   r   r   r   r   r   rl   r   r   point)r   r   r   r   r   r   r*   rv   rv   rw   r     s   r   db_pathc                 C   s   ddl m} |d|  |}|rCz)t|}| dkr7|D ]}|ddkr6|ddkr6d	|d< |d
d q|W S  tyB   Y nw dd t| g D S )z9Load template from DB, falling back to DEFAULT_TEMPLATES.r   )get_settingLABEL_TEMPLATE_rS   r   r%   r   r9   r8   r:   c                 S   s   g | ]}t |qS rv   )dict).0erv   rv   rw   
<listcomp>3  s    z get_template.<locals>.<listcomp>)app.dbr   jsonloadsr   
setdefault	ExceptionrU   )r   r   r   rawtmplr   rv   rv   rw   get_template"  s    
r   c                 C   s(   ddl m} |d|  t|| d S )Nr   )set_settingr   )r   r   r   dumps)r   rz   r   r   rv   rv   rw   save_template6  s   r   )ry   )#__doc__r   r   PILr   r   app.labels.renderr   r   r   r   r   r   r   dirname__file__r   r   rU   r   r   list__annotations__r\   rb   r   r   r   rx   r   r   r   r   r   r   rv   rv   rv   rw   <module>   s     			0
)	% Y$