
    >TfcI                         d dl Z d dlmZmZ d dlmZmZmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ dZd	Zd
ZdZdZdZdez  ez   ez   Z G d de          Z G d de          Z G d d          ZdS )    N)Group	Hyperlink)LinePolylineRect)Text)settings)CABLE_TRACE_SVG_DEFAULT_WIDTH)foreground_color)CableTraceSVGg      ?
      #         c                   n     e Zd ZdZdZdef fd	Zed             Zed             Zed             Z	 xZ
S )NodeaZ  
    Create a node to be represented in the SVG document as a rectangular box with a hyperlink.

    Arguments:
        position: (x, y) coordinates of the box's top left corner
        width: Box width
        url: Hyperlink URL
        color: Box fill color (RRGGBB format)
        labels: An iterable of text strings. Each label will render on a new line within the box.
        radius: Box corner radius, for rounded corners (default: 10)
        object: A copy of the object to allow reference when drawing cables to determine which cables are connected to
                which terminations.
    Nr   c                 &    t          t          |           j        d|dd| || _        |\  }	}
|dz
  t          t
          t          |          z  z   t          z   f}t          |	t          z   |
f||dd|           }| 	                    |           |
t          z   }t          |          D ]d\  }}|t
          z  }|	|dz  z   |t
          dz  z
  f}dt          |d	           }t          ||||sd
ng           }| 	                    |           ed S )N_parenthreftarget   zparent-objectzfill: #)rxclass_style#303030)darkbold)insertfillr    )superr   __init__objectPADDINGLINE_HEIGHTlenr   OFFSETadd	enumerater   r   )selfpositionwidthurlcolorlabelsradiusr&   extraxy
dimensionsboxcursorilabeltext_coords
text_colortext	__class__s                      4/var/www/html/netbox-4.1.3/netbox/dcim/svg/cables.pyr%   zNode.__init__(   s?   "dD"GIGGGGG 1 ai;V+D!Dw!NO
AJ?J6/YjchYjYjkkkW "&)) 	 	HAuk!Fuqy=&;?*BCKE-e(CCCEEJk
YZKb66`bcccDHHTNNNN	 	    c                 .    | j         r| j         d         nd S )Nr   )elementsr-   s    r@   r8   zNode.box?   s    #'=:t}Qd:rA   c                 X    | j         d         | j         d         dz  z   | j         d         fS )Nr5   r/   r   r6   r8   rD   s    r@   
top_centerzNode.top_centerC   s*    x}tx0144dhsmCCrA   c                 t    | j         d         | j         d         dz  z   | j         d         | j         d         z   fS )Nr5   r/   r   r6   heightrF   rD   s    r@   bottom_centerzNode.bottom_centerG   s6    x}tx0144dhsmdhxFX6XXXrA   )__name__
__module____qualname____doc__r&   r%   propertyr8   rG   rJ   __classcell__r?   s   @r@   r   r      s          FCEf      . ; ; X; D D XD Y Y XY Y Y Y YrA   r   c                   ,     e Zd ZdZg g ddf fd	Z xZS )	Connectorz
    Return an SVG group containing a line element and text labels representing a Cable.

    Arguments:
        color: Cable (line) color
        url: Hyperlink URL
        labels: Iterable of text labels
    Nr   c	                 2    t                      j        dddi|	 || _        t          dz  t          t          |          z  z   t          dz  z   | _        |r|n|d         |d         | j        z   f| _        |pd| _        |r2t          | j        | j        d          }
| 
                    |
           njt          | j        | j        d	          }| 
                    |           t          | j        | j        d
| j                   }
| 
                    |
           t          |d          }|d         |z   }|t          dz  t          dz  z   z  }|d         |d         z   dz  t          z   }t          |          D ]I\  }}|t          z  }||t          dz  z
  f}t          |||sdng           }|
                    |           Jt          |          dk    r(|                    d                    |                     | 
                    |           d S )Nr   	connectorr   r      000000zwireless-linkstartendr   cable-shadow	stroke: #)rY   rZ   r   r   r   r    )r!   r   
r#   )r$   r%   rY   r'   r(   r)   rI   rZ   r1   r   r+   r   r,   r   set_descjoin)r-   rY   r0   r1   wirelessr2   descriptionrZ   text_offsetr4   cablecable_shadowlinkr9   x_coordr:   r;   r<   r>   r?   s                      r@   r%   zConnector.__init__V   s   555u555
kK#f++$==!KE33E!HeAh.D#E&h
 	tztxPPPEHHUOOOO  djdh~VVVLHH\""" tztx?W4:?W?WXXXEHHUOOO c)444 qK''A+a//8c!f$)G3!&)) 	 	HAuk!F"F[1_$<=Kk:Q&&rRRRDHHTNNNN{aMM$))K00111rA   )rK   rL   rM   rN   r%   rP   rQ   s   @r@   rS   rS   L   sT          <>2SWef % % % % % % % % % %rA   rS   c                       e Zd ZdZedfdZed             Zed             Z	ed             Z
d Zd Zd	 Zd
 Zd Zd Zd Zd ZdS )r   a  
    Generate a graphical representation of a CablePath in SVG format.

    :param origin: The originating termination
    :param width: Width of the generated image (in pixels)
    :param base_url: Base URL for links within the SVG document. If none, links will be relative.
    Nc                     || _         || _        ||                    d          nd| _        t          | _        g | _        g | _        g | _        d S )N/ )	originr/   rstripbase_urlr*   r9   parent_objectsterminations
connectors)r-   rk   r/   rm   s       r@   r%   zCableTraceSVG.__init__   sS    
080D,,,"  !rA   c                     | j         dz  S )Nr   )r/   rD   s    r@   centerzCableTraceSVG.center   s    zA~rA   c                    t          |          g}|j        j        dk    ro|                    |j        j         d|j                    |j         }|j        r|d|j         z  }|j        r|d|j         z  }|                    |           n|j        j        dk    r^d| |d<   |                    |j	                   |                    |j
                   |j        r|                    |j                   n]|j        j        dk    r#|j        r|                    |j                    n*|j        j        dk    r|                    |j
                   |S )	zZ
        Return a list of text labels for the given instance based on model type.
        device z / circuitzCircuit r   circuitterminationprovidernetwork)str_meta
model_nameappenddevice_typemanufacturersitelocationracktypeproviderra   xconnect_id)clsinstancer2   location_labels       r@   _get_labelszCableTraceSVG._get_labels   st   
 h-->$00MMX1>WWAUWWXXX (/N  <";(9";";;} 8"7"7"77MM.))))^&)33-8--F1IMM(-(((MM(+,,,# 4h2333^&*>>># 9!57888^&*;;;MM(+,,,rA   c                     t          |d          rt          |dd          pdS t          |d          r|j        j        S |j        j        dk    r|j        j        r|j        j        S dS )zV
        Return the appropriate fill color for an object within a cable path.
        parent_objectr1   f0f0f0rolerv   e0e0e0)hasattrgetattrr   r1   rz   r{   r   )r   r   s     r@   
_get_colorzCableTraceSVG._get_color   sw    
 8_-- 	D8Wh77C8C8V$$ 	=&&^&)338K3=&& 8rA   c           
         g }| j         t          |          z  }t          |          D ]\  }}t          ||z  | j        f|| j         |                                 |                     |          |                     |          |          }|	                    |           | j
        	                    |           |dz   t          |          k    r| xj        |j        d         z  c_        |S )zm
        Draw a set of parent objects (eg hosts, switched, patchpanels) and return all created nodes
        )r.   r/   r0   r1   r2   r&   rV   rI   )r/   r)   r,   r   r9   rm   get_absolute_urlr   r   r|   rn   r8   )r-   obj_listobjectsr/   r:   objnodes          r@   draw_parent_objectsz!CableTraceSVG.draw_parent_objects   s     
S]]*)) 	2 	2FAse)T[1}>c&:&:&<&<>>ooc**'',,  D NN4   &&t,,,1uH%%tx11rA   c           
         d}g }t          t          |d                     D ]\  }}t          |||z  z   | j        f|| j         |                                 |                     |          |                     |          d|          }t          ||j	        d                   }|
                    |           ||fS )z
        Draw all terminations belonging to an object with specified offset and width
        Return all created nodes and their maximum height
        r   c                      t          |           S Nry   r5   s    r@   <lambda>z8CableTraceSVG.draw_object_terminations.<locals>.<lambda>   s    CFF rA   keyr   )r.   r/   r0   r1   r2   r3   r&   rI   )r,   sortedr   r9   rm   r   r   r   maxr8   r|   )	r-   ro   offset_xr/   nodes_heightnodesr:   termr   s	            r@   draw_object_terminationsz&CableTraceSVG.draw_object_terminations   s    
  :J:J!K!K!KLL 	 	GAt"QY.<}?d&;&;&=&=??ood++''--  D |TXh-?@@LLLl""rA   c                 <  	 g }d}|D ]i		fd|D             }	j         d         t          |          z  }	j         d         }|                     |||          \  }}|                    |           j| xj        |z  c_        | j                            |           |S )z
        Draw a row of terminating objects (e.g. interfaces) and return all created nodes
        Attach them to previously created parent objects
        r   c                 4    g | ]}|j         j        k    |S r#   )r   r&   ).0r   parents     r@   
<listcomp>z3CableTraceSVG.draw_terminations.<locals>.<listcomp>   s*    aaaTT=OSYS`=`=`D=`=`=`rA   r/   r5   )r8   r)   r   extendr9   ro   )
r-   ro   parent_object_nodesr   r   parent_termsr/   r   resultr   s
            @r@   draw_terminationszCableTraceSVG.draw_terminations   s    
  * 	! 	!Faaaa\aaaL Jw'#l*;*;;Ez#H#'#@#@xY^#_#_ FLLL    |#  '''rA   c           	         t          |d           }| j        t          |          z  }d}g }t          |          D ]g\  }fd|D             }||z  }	|                     ||	|t          |          z            \  }
}t          ||          }|                    |
           h| xj        |z  c_        | j                            |           | 	                    |          }||fS )z\
        Draw the far-end objects and its terminations and return all created nodes
        c                      t          |           S r   r   r   s    r@   r   z0CableTraceSVG.draw_far_objects.<locals>.<lambda>  s    Q rA   r   r   c                 *    g | ]}|j         k    |S r#   r   )r   r   r   s     r@   r   z2CableTraceSVG.draw_far_objects.<locals>.<listcomp>  s'    TTT$$:LPS:S:S:S:S:SrA   )
r   r/   r)   r,   r   r   r   r9   ro   r   )r-   r   ro   r   r/   terms_height
term_nodesr:   	obj_termsobj_posr   result_nodes_heightobject_nodesr   s                @r@   draw_far_objectszCableTraceSVG.draw_far_objects  s   
 '7'7888
S\\) 
  (( 	& 	&FAsTTTT,TTTI%iG*.*G*G	SZ\adghqdrdr\r*s*s'F'|-@AALf%%%% 	|#  ,,,//88Z''rA   c           	          |D ]i}|j         |j         d         |j         d         t          z   f|f}| j                            t	          |d          t	          |d|           f           jdS )zX
        Draw the fan-in-lines from each of the terminations to the targetpoint
        r   rV   r[   pointsr   r\   r   r   N)rJ   FANOUT_LEG_HEIGHTrp   r   r   )r-   r   ro   r1   r   r   s         r@   
draw_faninzCableTraceSVG.draw_fanin$  s     ! 		 		D"#A&(:1(=@Q(QRF
 O""~>>>.A%.A.ABBB$    		 		rA   c           	          |D ]i}|j         |j         d         |j         d         t          z
  f|f}| j                            t	          |d          t	          |d|           f           jdS )zX
        Draw the fan-out-lines from the startpoint to each of the terminations
        r   rV   r[   r   r\   r   N)rG   r   rp   r   r   )r-   rY   ro   r1   r   r   s         r@   draw_fanoutzCableTraceSVG.draw_fanout3  s     ! 		 		D#T_Q%7:K%KLF
 O""~>>>.A%.A.ABBB$    		 		rA   c                 @   t          d          }t          | j        z   t          | j        z   f}t          dz  t
          z   t          dz  z   }|d         |d         |z   f}t          ||d          }|                    |           | xj        t          dz  z  c_        |S )	zW
        Return an SVG group containing a line element and "Attachment" label.
        rU   )r   r   r   rV   
attachmentrX      )r   r*   rr   r9   r'   r(   r   r+   )r-   grouprY   rI   rZ   lines         r@   draw_attachmentzCableTraceSVG.draw_attachmentB  s     [))) $+%v';<1{*Wq[8QxqF*+%S>>>		$w{"rA   c                 N   ddl m} ddlm} | j                                        }g }t          |          D ]\  }}|\  }}}	|dk    r,|                     t          d |D                                 }| 	                    ||          }
| xj
        t          z  c_
        |r[d |	D             }|                     ||	          \  }}|D ]0d                                 g}g }g }d}j        r|                    j                    t!          |          rt#          |          dk    r gnd	                                 g}j        r'|                                                               j        r8j        r1|                    j         d
                                            j        pd}fd|
D             }fd|D             }|r|sfd|
D             }fd|D             }nt!          |          rt#          |          dk    r gnd                                 g}j        r|                    j                    j        r8j        r1|                    j         d
                                            fd|
D             }fd|D             }|r|sfd|
D             }fd|D             }|d         j        }|d         j        }d}t#          |          dk    rt#          |          dk    rt=          d |D                       t#          |          z  }t=          d |D                       t#          |          z  }||z   dz  }||d         t>          z   t@          z   f}||d         t>          z
  t@          z
  f}|t>          t@          z   z  }| !                    |||           | "                    |||           nt#          |          dk    rJ|d         |d         t>          z   t@          z   f}| !                    |||           |t>          t@          z   z  }nTt#          |          dk    rA|d         |d         t>          z
  t@          z
  f}| "                    |||           |t>          z  }tG          |||t!          |          | j$         %                                 |||          }| j&                            |           2|	rC| '                                }| j&                            |           |                     |	          }tQ          j)        | j*        | j
        dz   f          | _+        tY          tZ          j.         d          5 }| j+        j/        0                    | j+        1                    |2                                                     ddd           n# 1 swxY w Y   | j&        | j3        z   | j4        z   D ]}| j+        0                    |           | j+        S )zD
        Return an SVG document representing a cable trace.
        r   )Cable)WirelessLinkc              3   $   K   | ]}|j         V  d S r   r   r   rZ   s     r@   	<genexpr>z'CableTraceSVG.render.<locals>.<genexpr>c  s&      BjBjY\3CTBjBjBjBjBjBjrA   c                     h | ]	}|j         
S r#   r   r   s     r@   	<setcomp>z'CableTraceSVG.render.<locals>.<setcomp>l  s    BBB#C-BBBrA   zLink rW   r   zCable ru   c                 0    g | ]}|j         j        v |S r#   r&   a_terminationsr   r   rc   s     r@   r   z(CableTraceSVG.render.<locals>.<listcomp>  s)    jjjdkUZUiFiFiFiFiFirA   c                 0    g | ]}|j         j        v |S r#   r&   b_terminationsr   s     r@   r   z(CableTraceSVG.render.<locals>.<listcomp>  s)    hhhDKSXSgDgDgtDgDgDgrA   c                 0    g | ]}|j         j        v |S r#   r   r   s     r@   r   z(CableTraceSVG.render.<locals>.<listcomp>  s)    #n#n#nT$+Y^YmJmJmDJmJmJmrA   c                 0    g | ]}|j         j        v |S r#   r   r   s     r@   r   z(CableTraceSVG.render.<locals>.<listcomp>  s)    "l"l"lDW\WkHkHk4HkHkHkrA   z	Wireless c                 4    g | ]}|j         j        k    |S r#   r&   interface_ar   s     r@   r   z(CableTraceSVG.render.<locals>.<listcomp>  s)    gggdkUZUfFfFfFfFfFfrA   c                 4    g | ]}|j         j        k    |S r#   r&   interface_br   s     r@   r   z(CableTraceSVG.render.<locals>.<listcomp>  s)    eeeDKSXSdDdDdtDdDdDdrA   c                 4    g | ]}|j         j        k    |S r#   r   r   s     r@   r   z(CableTraceSVG.render.<locals>.<listcomp>  s)    #k#k#kT$+Y^YjJjJjDJjJjJjrA   c                 4    g | ]}|j         j        k    |S r#   r   r   s     r@   r   z(CableTraceSVG.render.<locals>.<listcomp>  s)    "i"i"iDW\WhHhHh4HhHhHhrA   rV   c                 (    g | ]}|j         d          S r   rJ   r   poss     r@   r   z(CableTraceSVG.render.<locals>.<listcomp>  s     +Q+Q+QSC,=a,@+Q+Q+QrA   c                 (    g | ]}|j         d          S r   r   r   s     r@   r   z(CableTraceSVG.render.<locals>.<listcomp>  s     )N)N)N3#*;A*>)N)N)NrA   )rY   rZ   r1   r`   r0   rb   r2   ra   )sizez/cable_trace.cssN)5dcim.modelsr   wireless.modelsr   rk   tracer,   r   setr   r9   CABLE_HEIGHTr   get_status_displayra   r|   
isinstancer)   r   get_type_displaylengthlength_unitget_length_unit_displayr1   ssiddistancedistance_unitget_distance_unit_displayrJ   rG   sumFANOUT_HEIGHTr   r   r   rS   rm   r   rp   r   svgwriteDrawingr/   drawingopenr	   STATIC_ROOTdefsr+   r   readrn   ro   )r-   r   r   traced_pathr   r:   segment	near_endslinksfar_endsnear_terminationsr   far_terminationsra   nearfarr1   r2   rY   rZ   rb   start_center
end_centercenter_xrU   r   css_fileelementrc   s                               @r@   renderzCableTraceSVG.renderR  sr    	&%%%%%000000k'')) #K00 g	I g	IJAw)0&Iuh Avv&*&>&>sBjBj`iBjBjBj?j?j&k&k# !% 6 6yBU V VKK<'KK  ZIBBBBB8<8M8MhX`8a8a5#%5" L6 L6E (0022#K DC$E( C#**e.?+ABBB!%// j14UaU*FVuFVFVX]XpXpXrXrEs : I'..u/E/E/G/GHHH < dE,= d'..%,/b/bA^A^A`A`/b/bccc % 7x  kjjj1Bjjjhhhh0@hhh $ m m#n#n#n#n5F#n#n#nD"l"l"l"l4D"l"l"lC#E<88 j14UaU*FYRWFYFY[`[s[s[u[uEv : @'..%*??? > he.A h'..%./f/f5CbCbCdCd/f/fggggggg1Bgggeeee0@eee $ j j#k#k#k#k5F#k#k#kD"i"i"i"i4D"i"i"iC !G1Ea&+C"#K4yy1}}SA'*+Q+QD+Q+Q+Q'R'RUXY]U^U^'^%()N)N#)N)N)N%O%ORUVYRZRZ%Z
$0:$=#B!)58m+CFW+W X'Q-)?BS)ST#8I(IJtU;;;((c59999TQ!$QqM)ADU)U VtU;;;#}7H'HHSA$QxQ-)?BS)ST((c5999#}4 !*##!+E<!@!@#}He.D.D.F.FHH$/%$/	! 	! 	!I O**95555YL6`  I!1133
&&z222 '+&>&>x&H&H#  '*dkAo.
 
 

 X);;;<< 	GL!!$,"4"4X]]__"E"EFFF	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G )<<t?PP 	& 	&GLW%%%%|s   A
W!!W%(W%)rK   rL   rM   rN   r
   r%   rO   rr   classmethodr   r   r   r   r   r   r   r   r   r  r#   rA   r@   r   r   ~   s         &CT       X   [6   [   *# # #,  0( ( (8       A A A A ArA   r   )r   svgwrite.containerr   r   svgwrite.shapesr   r   r   svgwrite.textr   django.confr	   dcim.constantsr
   utilities.htmlr   __all__r*   r'   r(   r   r   r   r   rS   r   r#   rA   r@   <module>r     s]    / / / / / / / / 0 0 0 0 0 0 0 0 0 0                   8 8 8 8 8 8 + + + + + + 

 ;.1BB2Y 2Y 2Y 2Y 2Y9 2Y 2Y 2Yj/ / / / / / / /dU U U U U U U U U UrA   