
    >Tfۮ              	       &   d dl mZ d dlmZmZ d dlmZ d dlmZm	Z	 d dl
mZ d dlmZmZ d dlmZ d dlmZ d d	lmZmZ d d
lT d d
lT d dlmZmZ d dlmZ d dlmZm Z  d dl!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 d
l,T d dl-m.Z. dZ/ G d de           Z0 G d de0          Z1 G d dej2                  Z3 G d dej2                  Z4 G d de1e3e4e+          Z5 G d d e1e3e4e+          Z6 G d! d"e1e3e4e+          Z7 G d# d$e1e3e4e+          Z8 G d% d&ej2                  Z9 G d' d(e1e9e3e4e+          Z: G d) d*e1e3e+          Z; G d+ d,e1e3e+          Z< G d- d.e1e+e          Z= G d/ d0e0e+          Z> G d1 d2e          Z? G d3 d4ee0e+          Z@d5S )6    )cached_property)GenericForeignKeyGenericRelation)ValidationError)MaxValueValidatorMinValueValidator)models)FSum)reverse)gettext_lazy)	MPTTModelTreeForeignKey)*)MACAddressFieldWWNField)ColorChoices)OrganizationalModelNetBoxModel)
ColorFieldNaturalOrderingField)TreeManager)naturalize_interface)CollateAsChar)TrackingModelMixin)get_channel_attr)BaseInterfaceCabledObjectModelConsolePortConsoleServerPort	DeviceBay	FrontPort	InterfaceInventoryItemInventoryItemRole	ModuleBayPathEndpointPowerOutlet	PowerPortRearPortc                   r    e Zd ZdZ ej        dej        d          Z ej         e	d          d          Z
 eddd	
          Z ej         e	d          dd	 e	d                    Z ej         e	d          dd	          Z G d d          Z fdZd Z fdZ fdZed             Z xZS )ComponentModelzM
    An abstract model inherited by any model which has a parent Device.
    dcim.Device
%(class)ssto	on_deleterelated_namename@   )verbose_name
max_lengthd   T)target_fieldr6   blanklabelzPhysical labelr5   r6   r9   	help_textdescription   )r5   r6   r9   c                   <    e Zd ZdZdZ ej        dd          fZdS )ComponentModel.MetaT)device_namerA   r3   *%(app_label)s_%(class)s_unique_device_namefieldsr3   N)__name__
__module____qualname__abstractorderingr	   UniqueConstraintconstraints     B/var/www/html/netbox-4.1.3/netbox/dcim/models/device_components.pyMetar@   J   s<        &#F#)A  
rO   rQ   c                 x     t                      j        |i | | j                            d          | _        d S )N	device_id)super__init____dict__get_original_deviceselfargskwargs	__class__s      rP   rU   zComponentModel.__init__T   s?    $)&))) !% 1 1+ > >rO   c                 B    | j         r| j         d| j          dS | j        S )Nz ())r:   r3   rZ   s    rP   __str__zComponentModel.__str__Z   s/    : 	1i004:0000yrO   c                 b    t                                          |          }| j        |_        |S N)rT   to_objectchangerA   related_object)rZ   actionobjectchanger]   s      rP   rd   zComponentModel.to_objectchange_   s*    ww..v66&*k#rO   c                     t                                                       t          |           t          fvr5| j        0| j        | j        k    r"t          dt          d          i          d S d S d S )NrA   z1Components cannot be moved to a different device.)	rT   cleantyper$   pkrX   rS   r   _rZ   r]   s    rP   ri   zComponentModel.cleand   sz     JJ}o--DG4GdNcgkguNuNu!!OPP#    .-4G4GNuNurO   c                     | j         S rc   rA   r`   s    rP   parent_objectzComponentModel.parent_objectm   s
    {rO   )rG   rH   rI   __doc__r	   
ForeignKeyCASCADErA   	CharFieldrl   r3   r   rB   r:   r=   rQ   rU   ra   rd   ri   propertyrp   __classcell__r]   s   @rP   r,   r,   ,   s         V.!  F
 6QvYY  D !   E
 FQwZZ!$%%	  E #&"Q}%%  K
 
 
 
 
 
 
 
? ? ? ? ?  
    
       X    rO   r,   c                       e Zd Z ej        dej        ddd          Z eddd          Z G d	 d
e	j
                  Z
dS )ModularComponentModelzdcim.Moduler.   Tr0   r1   r2   r9   nullzdcim.InventoryItemcomponent_typecomponent_id)r0   content_type_fieldobject_id_fieldc                       e Zd ZdZdS )ModularComponentModel.MetaTNrG   rH   rI   rJ   rN   rO   rP   rQ   r              rO   rQ   N)rG   rH   rI   r	   rr   rs   moduler   inventory_itemsr,   rQ   rN   rO   rP   ry   ry   r   s        V.!  F &o+&  O    ~"     rO   ry   c                       e Zd ZdZ ej        dej        ddd          Z ej         e	d          dde
          Z ej         e	d	          d
 e	d                    Z edddd          Z G d d          Z fdZed             Zed             Zed             Zed             Zed             Z xZS )r   z
    An abstract model inherited by all models to which a Cable can terminate. Provides the `cable` and `cable_end`
    fields for caching cable associations, as well as `mark_connected` to designate "fake" connections.
    z
dcim.Cable+Trz   z	cable end   )r5   r6   r9   choiceszmark connectedFz Treat as if a cable is connectedr5   defaultr<   zdcim.CableTerminationtermination_typetermination_idz	%(class)sr0   r~   r   related_query_namec                       e Zd ZdZdS )CabledObjectModel.MetaTNr   rN   rO   rP   rQ   r      r   rO   rQ   c                 T   t                                                       | j        r%| j        st	          dt          d          i          | j        r%| j        st	          dt          d          i          | j        r%| j        r t	          dt          d          i          d S d S )N	cable_endz7Must specify cable end (A or B) when attaching a cable.z*Cable end must not be set without a cable.mark_connectedz/Cannot mark as connected with a cable attached.)rT   ri   cabler   r   rl   r   rm   s    rP   ri   zCabledObjectModel.clean   s    : 	dn 	!QXYY#    > 	$* 	!QKLL#     	4: 	! !$U"V"V#   	 	 	 	rO   c                     | j         S )zo
        Generic wrapper for a Cable, WirelessLink, or some other relation to a connected termination.
        )r   r`   s    rP   linkzCabledObjectModel.link   s    
 zrO   c                     | j         rD| j         j                            | j                                      d          }d |D             S g S )N)r   terminationc                     g | ]	}|j         
S rN   )r   ).0peers     rP   
<listcomp>z0CabledObjectModel.link_peers.<locals>.<listcomp>   s    777D$777rO   )r   terminationsexcluder   prefetch_related)rZ   peerss     rP   
link_peerszCabledObjectModel.link_peers   sQ    : 	8J+33dn3MM^^_lmmE777777	rO   c                 8    t          | j        p| j                  S rc   )boolr   cable_idr`   s    rP   	_occupiedzCabledObjectModel._occupied   s    D'84=999rO   c                 v    t          t          d                              | j        j                            )Nz9{class_name} models must declare a parent_object property)
class_name)NotImplementedErrorrl   formatr]   rG   r`   s    rP   rp   zCabledObjectModel.parent_object   s8    !IJJQQ]a]k]tQuu
 
 	
rO   c                 n    | j         sd S | j         t          j        k    rt          j        nt          j        S rc   )r   CableEndChoicesSIDE_BSIDE_Ar`   s    rP   opposite_cable_endz$CabledObjectModel.opposite_cable_end   s2    ~ 	4)-?;Q)Q)Q%%WfWmmrO   )rG   rH   rI   rq   r	   rr   SET_NULLr   rt   rl   r   r   BooleanFieldr   r   cable_terminationsrQ   ri   ru   r   r   r   r   rp   r   rv   rw   s   @rP   r   r      s         F/  E ! Q{^^	  I )V(Q'((!677  N )"-(&	                 X   _ : : X: 
 
 X

 n n Xn n n n nrO   r   c                       e Zd ZdZ ej        dej        dd          Z G d d          Zd Z	e
d             Zed	             Zd
S )r'   a  
    An abstract model inherited by any CabledObjectModel subclass which represents the end of a CablePath; specifically,
    these include ConsolePort, ConsoleServerPort, PowerPort, PowerOutlet, Interface, and PowerFeed.

    `_path` references the CablePath originating from this instance, if any. It is set or cleared by the receivers in
    dcim.signals in response to changes in the cable path, and complements the `origin` GenericForeignKey field on the
    CablePath model. `_path` should not be accessed directly; rather, use the `path` property.

    `connected_endpoints()` is a convenience method for returning the destination of the associated CablePath, if any.
    zdcim.CablePathT)r0   r1   r{   r9   c                       e Zd ZdZdS )PathEndpoint.MetaTNr   rN   rO   rP   rQ   r      r   rO   rQ   c                    | }g }||j         n|                    |j         j                   t          |          dz  dk    r|                    g g f           n,t          |          dz  dk    r|                    dg            |j         j        }t          |          dk    rt          |d         dd           }nd }|t          t          t          |          gdz             S )N   r      r   bridge)
_pathextendpath_objectsleninsertdestinationsgetattrlistzipiter)rZ   originpathr   s       rP   tracezPathEndpoint.trace   s      |#KK1222 4yy1}!!RH%%%%TQ!##B### "<4L<  A%% a(DAA'  , C$t**)*+++rO   c                     | j         S rc   )r   r`   s    rP   r   zPathEndpoint.path  s
    zrO   c                 ,    | j         r| j         j        ng S )zT
        Caching accessor for the attached CablePath's destination (if any)
        )r   r   r`   s    rP   connected_endpointsz PathEndpoint.connected_endpoints  s    
 +/*<tz&&"<rO   N)rG   rH   rI   rq   r	   rr   r   r   rQ   r   ru   r   r   r   rN   rO   rP   r'   r'      s        	 	 F/	  E       , , ,:   X = = _= = =rO   r'   c            	           e Zd ZdZ ej         ed          ded ed                    Z ej	         ed          e
dd ed          	          Zd
Z G d dej                  Zd ZdS )r   z^
    A physical console port within a Device. ConsolePorts connect to ConsoleServerPorts.
    rj   2   TPhysical port typer5   r6   r   r9   r<   speedPort speed in bits per secondr5   r   r9   r{   r<   rA   r   rj   r   c                   :    e Zd Z ed          Z ed          ZdS )ConsolePort.Metazconsole portzconsole portsNrG   rH   rI   rl   r5   verbose_name_pluralrN   rO   rP   rQ   r   ,  /        q((a00rO   rQ   c                 2    t          dd| j        i          S )Nzdcim:consoleportrk   r\   r   rk   r`   s    rP   get_absolute_urlzConsolePort.get_absolute_url0      )4/BBBBrO   NrG   rH   rI   rq   r	   rt   rl   ConsolePortTypeChoicesrj   PositiveIntegerFieldConsolePortSpeedChoicesr   clone_fieldsry   rQ   r   rN   rO   rP   r   r     s          6QvYY&!())  D (F'QwZZ'!344  E 9L1 1 1 1 1$) 1 1 1C C C C CrO   r   c            	           e Zd ZdZ ej         ed          ded ed                    Z ej	         ed          e
dd ed          	          Zd
Z G d dej                  Zd ZdS )r    zx
    A physical port within a Device (typically a designated console server) which provides access to ConsolePorts.
    rj   r   Tr   r   r   r   r   r   c                   :    e Zd Z ed          Z ed          ZdS )ConsoleServerPort.Metazconsole server portzconsole server portsNr   rN   rO   rP   rQ   r   I  s1        q.//a 677rO   rQ   c                 2    t          dd| j        i          S )Nzdcim:consoleserverportrk   r   r   r`   s    rP   r   z"ConsoleServerPort.get_absolute_urlM  s    /twHHHHrO   Nr   rN   rO   rP   r    r    4  s          6QvYY&!())  D (F'QwZZ'!344  E 9L8 8 8 8 8$) 8 8 8I I I I IrO   r    c            	       r    e Zd ZdZ ej         ed          ded ed                    Z ej	         ed          dd e
d          g ed	          
          Z ej	         ed          dd e
d          g ed          
          ZdZ G d dej                  Zd Z fdZddZd Z xZS )r)   zd
    A physical power supply (intake) port within a Device. PowerPorts connect to PowerOutlets.
    rj   r   Tr   r   zmaximum drawr   zMaximum power draw (watts))r5   r9   r{   
validatorsr<   zallocated drawzAllocated power draw (watts))rA   r   maximum_drawallocated_drawc                   :    e Zd Z ed          Z ed          ZdS )PowerPort.Metaz
power portzpower portsNr   rN   rO   rP   rQ   r   q  -        qa..rO   rQ   c                 2    t          dd| j        i          S )Nzdcim:powerportrk   r   r   r`   s    rP   r   zPowerPort.get_absolute_urlu      'tw@@@@rO   c                     t                                                       | j        N| j        I| j        | j        k    r;t	          dt          d                              | j                  i          d S d S d S )Nr   z@Allocated draw cannot exceed the maximum draw ({maximum_draw}W).)r   )rT   ri   r   r   r   rl   r   rm   s    rP   ri   zPowerPort.cleanx  s    (T-@-L"T%666%$aZ' 'f$*;f<<'    )(-L-L66rO   Nc                 H   | j                             d          }|r|                    |          }|st          j                                        S t                      }|D ] }|t          |j        |j                  z  }!t          j                            |          S )aE  
        Return a queryset of all PowerPorts connected via cable to a child PowerOutlet. For example, in the topology
        below, PP1.get_downstream_powerports() would return PP2-4.

               ---- PO1 <---> PP2
             /
        PP1 ------- PO2 <---> PP3
                            ---- PO3 <---> PP4

        F)cable__isnullfeed_leg)r   r   )poweroutletsfilterr)   objectsnoneQr   r   )rZ   legr   qpoweroutlets        rP   get_downstream_powerportsz#PowerPort.get_downstream_powerports  s     (//e/DD 	='...<<L 	,$))+++CC' 	 	K!'%8   AA
  ''***rO   c           	      l   ddl m} | j        {| j        s|                                                     t          d          t          d                    }|d         pd|d         pd| j                                        g d	}t          | j
                  d
k    rt          | j
        d         |          r| j
        d         j        t          j        k    rt          D ]\  }}|                     |                              t          d          t          d                    }|d                             ||d         pd|d         pd| j                            |                                          d           |S | j        pd| j        pd| j                                        g d	S )zu
        Return the allocated and maximum power draw (in VA) and child PowerOutlet count for this PowerPort.
        r   )	PowerFeedNr   r   )maximum_draw_totalallocated_draw_totalr   r   )	allocatedmaximumoutlet_countlegsr   )r   r  r   )r3   r  r  r  )dcim.modelsr   r   r   r   	aggregater   r   countr   r   
isinstancephasePowerFeedPhaseChoicesPHASE_3PHASEPowerOutletFeedLegChoicesappendr   )rZ   r   utilizationretr   leg_names         rP   get_power_drawzPowerPort.get_power_draw  s    	*))))) &4+<+D88::DD#&~#6#6%()9%:%: E  K
 ))?@EA&';<A $ 1 7 7 9 9	 C 4?##q((Z8JI-V-V(OA&,0E0RRR%> 
 
MC"&"@"@S"@"I"I"S"S+.~+>+>-01A-B-B #T # #K K&& (%01G%H%MA#./C#D#I(,(9(@(@#(@(N(N(T(T(V(V	( (     J ,1(-A -3355	
 
 	
rO   rc   )rG   rH   rI   rq   r	   rt   rl   PowerPortTypeChoicesrj   r   r   r   r   r   ry   rQ   r   ri   r   r  rv   rw   s   @rP   r)   r)   U  s         6QvYY$!())  D /6.Q~&&%%a(()!011  L 1V0Q'((%%a(()!233  N JL/ / / / /$) / / /A A A	 	 	 	 	+ + + +6*
 *
 *
 *
 *
 *
 *
rO   r)   c            	       "    e Zd ZdZ ej         ed          ded ed                    Z ej	        dej
        ddd	          Z ej         ed
          ded ed                    ZdZ G d dej                  Zd Z fdZ xZS )r(   z_
    A physical power outlet (output) within a Device which provides power to a PowerPort.
    rj   r   Tr   r   zdcim.PowerPortr   )r0   r1   r9   r{   r2   zfeed legzPhase (for three-phase feeds))rA   r   rj   
power_portr   c                   :    e Zd Z ed          Z ed          ZdS )PowerOutlet.Metazpower outletzpower outletsNr   rN   rO   rP   rQ   r    r   rO   rQ   c                 2    t          dd| j        i          S )Nzdcim:poweroutletrk   r   r   r`   s    rP   r   zPowerOutlet.get_absolute_url  r   rO   c                     t                                                       | j        rJ| j        j        | j        k    r7t	          t          d                              | j                            d S d S )Nz?Parent power port ({power_port}) must belong to the same device)r  )rT   ri   r  rA   r   rl   r   rm   s    rP   ri   zPowerOutlet.clean  st     ? 	t5DD!STT[[gkgv[ww  	 	DDrO   )rG   rH   rI   rq   r	   rt   rl   PowerOutletTypeChoicesrj   rr   r   r  r  r   r   ry   rQ   r   ri   rv   rw   s   @rP   r(   r(     s0         6QvYY&!())  D #"/#  J  vQz]])!344  H JL1 1 1 1 1$) 1 1 1C C C        rO   r(   c            
       "    e Zd ZdZ ej         ed          d          Z edd ed                    Z	 ej
        dd ee           ee          g ed                    Z ej         ed	          d
ed ed                    Z ej        dej        ddd ed                    Z ej        dej        ddd ed                    Z G d d          Z fdZed             Zed             Zed             Z xZS )r   za
    Abstract base class for fields shared by dcim.Interface and virtualization.VMInterface.
    enabledTr5   r   zMAC address)r{   r9   r5   MTUr9   r{   r   r5   moder   zIEEE 802.1Q tagging strategyr   rZ   child_interfaceszparent interfacer0   r1   r2   r{   r9   r5   bridge_interfaceszbridge interfacec                       e Zd ZdZdS )BaseInterface.MetaTNr   rN   rO   rP   rQ   r$  *  r   rO   rQ   c                     | j         sd | _        | j        j        s.| j         t          j        k    r| j                                          t                      j	        |i |S rc   )
r  untagged_vlan_stateaddingInterfaceModeChoicesMODE_TAGGEDtagged_vlansclearrT   saverY   s      rP   r-  zBaseInterface.save-  sf     y 	&!%D {! 	&di3G3S&S&S##%%%uww|T,V,,,rO   c                 4    | j                                         S rc   )tunnel_terminationsfirstr`   s    rP   tunnel_terminationz BaseInterface.tunnel_termination9  s    '--///rO   c                 4    | j                                         S rc   )ip_addressesr  r`   s    rP   count_ipaddresseszBaseInterface.count_ipaddresses=  s     &&(((rO   c                 4    | j                                         S rc   )fhrp_group_assignmentsr  r`   s    rP   count_fhrp_groupszBaseInterface.count_fhrp_groupsA  s    *00222rO   )rG   rH   rI   rq   r	   r   rl   r  r   mac_addressr   r   INTERFACE_MTU_MINr   INTERFACE_MTU_MAXmturt   r)  r  rr   RESTRICTparentr   r   rQ   r-  ru   r1  r4  r7  rv   rw   s   @rP   r   r     s         "f!Qy\\  G "/Q}%%  K
 &&
%/00/00
 QuXX  C 6QvYY$!233  D V/'Q)**  F V/(Q)**  F       
- 
- 
- 
- 
- 0 0 X0 ) ) X) 3 3 X3 3 3 3 3rO   r   c            
       `    e Zd ZdZ ededd          Z ej        dd          Z	 ej
        d	ej        d
dd ed                    Z ej         ed          de          Z ej        d ed           ed                    Z ej        dd ed                    Z ej         ed          ddde          Z edd ed           ed                    Z ej        ded ed                    Z ej        ded ed                    Z ej        dd dd ed!           ed"          #          Z ej        dd$ddd% ed"          #          Z ej         dd e!d&          f ed'          (          Z" ej        de#d ed)                    Z$ ej        de%d ed*                    Z& ej
        d+ej        d,dd-          Z' ej        d.dd ed/          0          Z( ej
        d1ej        d2dd ed3                    Z) ej        d1d4d ed5          0          Z* ej
        d6ej        ddd ed7                    Z+ e,d8d9d:d;<          Z- e,d=d>d?d,<          Z. e,d@dAdBd;<          Z/ e,dCd9d:d;<          Z0dDZ1 G dE dFe2j3                  Z3dG Z4 fdHZ5 fdIZ6e7 fdJ            Z8e7dK             Z9e7dL             Z:e7dM             Z;e7dN             Z<e7dO             Z=e7dP             Z>e? fdQ            Z@e7dR             ZA xZBS )Sr#   zo
    A network interface within a Device. A physical Interface can connect to exactly one other Interface.
    r3   r7   T)r8   naturalize_functionr6   r9   zdcim.VirtualDeviceContext
interfaces)r0   r2   rZ   member_interfacesz
parent LAGr!  rj   r   r5   r6   r   Fzmanagement onlyz6This interface is used only for out-of-band management)r   r5   r<   zspeed (Kbps))r9   r{   r5   duplex)r5   r6   r9   r{   r   WWNz64-bit World Wide Name)r{   r9   r5   r<      zwireless role)r6   r   r9   r5   zwireless channel   r   zchannel frequency (MHz)z&Populated by selected channel (if set))
max_digitsdecimal_placesr9   r{   r5   r<   r   zchannel width (MHz)   ztransmit power (dBm)r  zPoE modezPoE typezwireless.WirelessLinkr   rz   zwireless.WirelessLANzwireless LANs)r0   r2   r9   r5   z	ipam.VLANinterfaces_as_untaggedzuntagged VLANinterfaces_as_taggedztagged VLANszipam.VRFVRFzipam.IPAddressassigned_object_typeassigned_object_id	interfacer   zipam.FHRPGroupAssignmentinterface_typeinterface_idzvpn.TunnelTerminationr   r   zvpn.L2VPNTermination)rA   r   r=  r   lagrj   	mgmt_onlyr;  r  r   rC  rf_role
rf_channelrf_channel_frequencyrf_channel_widthtx_powerpoe_modepoe_typevrfc                   T    e Zd Zd ed          fZ ed          Z ed          ZdS )Interface.MetarA   rB   rO  r@  N)rG   rH   rI   r   rK   rl   r5   r   rN   rO   rP   rQ   r]    s?        mmG445q~~aoorO   rQ   c                 2    t          dd| j        i          S )Nzdcim:interfacerk   r   r   r`   s    rP   r   zInterface.get_absolute_url  r   rO   c           
         t                                                       | j        rK| j        rDt	          dt          d                              |                                           i          | j        rK| j        rDt	          dt          d                    |                                                     i          | j	        r.| j
        | j	        k    rt	          dt          d          i          | j        t          j        k    r%| j        t	          dt          d          i          | j        r| j        j        | j        k    r| j        j        Bt	          dt          d	                              | j        | j        j        
          i          | j        j        j        | j        j        k    rHt	          dt          d                              | j        | j        | j        j                  i          | j	        r.| j        | j	        k    rt	          dt          d          i          | j        r| j        j        | j        k    r| j        j        Bt	          dt          d                              | j        | j        j                  i          | j        j        j        | j        j        k    rMt	          dt          d                              | j        | j        j        | j        j                  i          | j        t          j        k    r%| j        t	          dt          d          i          | j	        r.| j        | j	        k    rt	          dt          d          i          | j        r| j        j        | j        k    r| j        j        Bt	          dt          d                              | j        | j        j                  i          | j        j        j        | j        j        k    rMt	          dt          d                    | j        | j        j        | j        j                            i          | j        r%| j        rt	          dt          d          i          | j        r%| j        rt	          dt          d          i          | j        r%| j        st	          dt          d          i          | j        r%| j        st	          dt          d          i          | j        r%| j        st	          d t          d!          i          | j        rh| j        st	          d"t          d#          i          | j        r<| j        t9          | j        d$          k    rt	          d"t          d%          i          | j        rh| j        st	          d&t          d'          i          | j        r<| j        t9          | j        d(          k    rt	          d&t          d)          i          | j        rQ| j        j        | j        j        d fvr9t	          d*t          d+                              | j        ,          i          d S d S )-Nrj   z7{display_type} interfaces cannot have a cable attached.)display_typer   z8{display_type} interfaces cannot be marked as connected.r=  z&An interface cannot be its own parent.z>Only virtual interfaces may be assigned to a parent interface.zTThe selected parent interface ({interface}) belongs to a different device ({device}))rO  rA   zxThe selected parent interface ({interface}) belongs to {device}, which is not part of virtual chassis {virtual_chassis}.)rO  rA   virtual_chassisr   z)An interface cannot be bridged to itself.zRThe selected bridge interface ({bridge}) belongs to a different device ({device}).)r   rA   zxThe selected bridge interface ({interface}) belongs to {device}, which is not part of virtual chassis {virtual_chassis}.rR  z6Virtual interfaces cannot have a parent LAG interface.z)A LAG interface cannot be its own parent.zLThe selected LAG interface ({lag}) belongs to a different device ({device}).)rR  rA   zoThe selected LAG interface ({lag}) belongs to {device}, which is not part of virtual chassis {virtual_chassis}.)rR  rA   ra  rY  z*Virtual interfaces cannot have a PoE mode.rZ  z*Virtual interfaces cannot have a PoE type.z2Must specify PoE mode when designating a PoE type.rT  z5Wireless role may be set only on wireless interfaces.rU  z/Channel may be set only on wireless interfaces.rV  z9Channel frequency may be set only on wireless interfaces.	frequencyz6Cannot specify custom frequency with channel selected.rW  z5Channel width may be set only on wireless interfaces.widthz2Cannot specify custom width with channel selected.r&  zxThe untagged VLAN ({untagged_vlan}) must belong to the same site as the interface's parent device, or it must be global.)r&  ) rT   ri   
is_virtualr   r   rl   r   get_type_displayr   rk   	parent_idrj   InterfaceTypeChoicesTYPE_VIRTUALr=  rA   ra  parent_device	bridge_idr   rR  lag_idrY  rZ  rT  is_wirelessrU  rV  r   rW  r&  siterm   s    rP   ri   zInterface.clean  s    ? 	tz 	!STT[[!%!6!6!8!8 \  #    ? 	t2 	! !$^$e$e!%!6!6!8!8 %f %: %: # ##    7 	[t~00!8Q/W-X-X"YZZZ 9,999dk>U!8Q/o-p-p"qrrr ; 	4;-<<{*2%an ft{4;;MfNN'   
 #3t{7RRR%a=  f"&+#1(,(C   		' 	 	 	 7 	^t~00!8Q/Z-[-["\]]] ; 	4;-<<{*2%al fDK8JfKK'   
 #3t{7RRR%a5  f"&+dk6HZ^ZeZu   	'    9,999dh>R!5!,d*e*e"fggg 7 	[t{dg--!5!,W*X*X"YZZZ 8 	4;66{*2%1f f$(/fBB'   
 0DK4OOO%1--3V $RVR]Rm .4 .o .o '    = 	T_ 	!AJKK#    = 	T_ 	!AJKK#   
 = 	 	!ARSS#    < 	k 0 	k!9a0g.h.h"ijjj? 	h4#3 	h!<3d1e1e"fggg $ 	# %*A.i,j,j'     4#<@PQUQ`bm@n@n#n#n%*A.f,g,g'   
   	u# x%'91=t;u;u&vwww u4#8<LT_^e<f<f#f#f%'91=q;r;r&sttt
  	$"4"9$+BRTXAY"Y"Y!4" " &t'9&::	#   	 	"Y"YrO   c                     | j         r!| j        st          | j         d          | _        | j         r!| j        st          | j         d          | _         t	                      j        |i | d S )Nrb  rc  )rU  rV  r   rW  rT   r-  rY   s      rP   r-  zInterface.save  sz     ? 	W4#< 	W(8+(V(VD%? 	O4#8 	O$4T_g$N$ND!d%f%%%%%rO   c                 R    t                      j        pt          | j                  S rc   )rT   r   r   wireless_link_idrm   s    rP   r   zInterface._occupied  s     ww ?D)>$?$??rO   c                 "    | j          o| j         S rc   )rd  rl  r`   s    rP   is_wiredzInterface.is_wired  s    ?";4+;';;rO   c                     | j         t          v S rc   )rj   VIRTUAL_IFACE_TYPESr`   s    rP   rd  zInterface.is_virtual  s    y///rO   c                     | j         t          v S rc   )rj   WIRELESS_IFACE_TYPESr`   s    rP   rl  zInterface.is_wireless  s    y000rO   c                 ,    | j         t          j        k    S rc   )rj   rg  TYPE_LAGr`   s    rP   is_lagzInterface.is_lag  s    y0999rO   c                 ,    | j         t          j        k    S rc   )rj   rg  TYPE_BRIDGEr`   s    rP   	is_bridgezInterface.is_bridge  s    y0<<<rO   c                     | j         p| j        S rc   )r   wireless_linkr`   s    rP   r   zInterface.link  s    z/T//rO   c                     | j         rt                      j        S | j        r*| j        j        | k    r| j        j        gS | j        j        gS g S rc   )r   rT   r   r~  interface_ainterface_brm   s    rP   r   zInterface.link_peers  sY    : 	&77%% 	8!-55*677*677	rO   c                 4    | j                                         S rc   )l2vpn_terminationsr0  r`   s    rP   l2vpn_terminationzInterface.l2vpn_termination  s    &,,...rO   )CrG   rH   rI   rq   r   r   rB   r	   ManyToManyFieldvdcsrr   r   rl   rR  rt   rg  rj   r   rS  r   r   InterfaceDuplexChoicesrC  r   wwnWirelessRoleChoicesrT  WirelessChannelChoicesrU  DecimalFieldrV  rW  PositiveSmallIntegerFieldr   rX  InterfacePoEModeChoicesrY  InterfacePoETypeChoicesrZ  r~  wireless_lansr&  r+  r[  r   r3  r6  r/  r  r   ry   rQ   r   ri   r-  ru   r   rr  rd  rl  ry  r|  r   r   r   r  rv   rw   s   @rP   r#   r#   F  s=         ! 0	  E "6!&!  D &
/(Q|__  C 6QvYY$  D
 $#Q())!LMM  I
 (F'Q~&&  E
 VQx[[&  F (QuXX!,--	  C f#Q''	  G "!&Q)**	  J /6.Q011!<==   +v*+!<==   0v/%%c**,Q-..	  H  v'Qz]]	  H  v'Qz]]	  H &F%"/  M +F*!!Q''	  M &F%/-Q''  M *6)+Q~&&	  L &
/!QuXX  C #?1,&	  L -_%+&	   */"-(&	   )!1,&	  L
. . . . .$) . . .
A A AY Y Y Y Yv& & & & & @ @ @ @ X@ < < X< 0 0 X0 1 1 X1 : : X: = = X= 0 0 X0 	 	 	 	 _	 / / X/ / / / /rO   r#   c                   Z    e Zd ZdZ ej         ed          de          Z e	 ed          d          Z
 ej        dej        d	
          Z ej         ed          d ee           ee          g ed                    ZdZ G d dej                  Zd Z fdZ xZS )r"   z7
    A pass-through port on the front of a Device.
    rj   r   rB  colorTr5   r9   zdcim.RearPort
frontportsr/   zrear port positionr   z*Mapped position on corresponding rear portr5   r   r   r<   )rA   rj   r  c                       e Zd Z ej        dd           ej        dd          fZ ed          Z ed          ZdS )	FrontPort.MetarC   rD   rE   )	rear_portrear_port_positionz1%(app_label)s_%(class)s_unique_rear_port_positionz
front portzfront portsN	rG   rH   rI   r	   rL   rM   rl   r5   r   rN   rO   rP   rQ   r    sr        #F#)A   $F#:H  	
 qa..rO   rQ   c                 2    t          dd| j        i          S )Nzdcim:frontportrk   r   r   r`   s    rP   r   zFrontPort.get_absolute_url  r   rO   c                    t                                                       t          | d          r| j        j        | j        k    r7t          dt          d                              | j                  i          | j        | j        j	        k    rOt          dt          d                              | j        | j        j
        | j        j	                  i          d S d S )Nr  z6Rear port ({rear_port}) must belong to the same device)r  r  zcInvalid rear port position ({rear_port_position}): Rear port {name} has only {positions} positions.)r  r3   	positions)rT   ri   hasattrr  rA   r   rl   r   r  r  r3   rm   s    rP   ri   zFrontPort.clean  s    4%% 	 ~$33%P" "ft~f66'    &)AAA%(!%+ + f+/+B!^0"&.":   		' 	 	 		 	 BArO   )rG   rH   rI   rq   r	   rt   rl   PortTypeChoicesrj   r   r  rr   rs   r  r  r   REARPORT_POSITIONS_MINr   REARPORT_POSITIONS_MAXr  r   ry   rQ   r   ri   rv   rw   s   @rP   r"   r"     sa         6QvYY  D
 JQwZZ  E "!.!  I
 :9Q+,,455455
 !@AA   /L/ / / / /$) / / /A A A        rO   r"   c                   *    e Zd ZdZ ej         ed          de          Z e	 ed          d          Z
 ej         ed          d	 ee           ee          g ed
                    ZdZ G d dej                  Zd Z fdZ xZS )r*   z6
    A pass-through port on the rear of a Device.
    rj   r   rB  r  Tr  r  r   z)Number of front ports which may be mappedr  )rA   rj   r  r  c                   :    e Zd Z ed          Z ed          ZdS )RearPort.Metaz	rear portz
rear portsNr   rN   rO   rP   rQ   r  (  s+        q~~aoorO   rQ   c                 2    t          dd| j        i          S )Nzdcim:rearportrk   r   r   r`   s    rP   r   zRearPort.get_absolute_url,  s    dg????rO   c                    t                                                       | j        j        sV| j                                        }| j        |k     r4t          dt          d          	                    |          i          d S d S )Nr  z`The number of positions cannot be less than the number of mapped front ports ({frontport_count}))frontport_count)
rT   ri   r'  r(  r  r  r  r   rl   r   )rZ   r  r]   s     rP   ri   zRearPort.clean/  s     {! 	"o3355O~//%." " f_f==	'   	 	//rO   )rG   rH   rI   rq   r	   rt   rl   r  rj   r   r  r  r   r  r   r  r  r   ry   rQ   r   ri   rv   rw   s   @rP   r*   r*     s7         6QvYY  D
 JQwZZ  E 10Q{^^455455
 !?@@  I <L. . . . .$) . . .@ @ @        rO   r*   c            	           e Zd ZdZ edej        ddddd          Z ej         e	d          dd e	d	          
          Z
 e            ZdZ G d dej                  Z G d d          Zd Z fdZ fdZ xZS )r&   G
    An empty space within a Device which can house a child device
    rZ   childrenTF)r0   r1   r2   r9   r{   editabledb_indexpositionrE  z:Identifier to reference when renaming installed componentsr;   ro   c                   `    e Zd Z ej        dd          fZ ed          Z ed          ZdS )ModuleBay.Meta)rA   r   r3   z1%(app_label)s_%(class)s_unique_device_module_namerE   z
module bayzmodule baysNr  rN   rO   rP   rQ   r  Z  sS        #F#3H  
 qa..rO   rQ   c                       e Zd ZdZdS )ModuleBay.MPTTMeta)r   N)rG   rH   rI   order_insertion_byrN   rO   rP   MPTTMetar  d  s        (rO   r  c                 2    t          dd| j        i          S )Nzdcim:modulebayrk   r   r   r`   s    rP   r   zModuleBay.get_absolute_urlg  r   rO   c                    t                                                       | j        x}r| j        g}g }|r|j        |v s|j        j        |v rt          t          d                    |                    |j                   |                    |j        j                   |j        r|j        j        nd }|d S d S d S )Nz;A module bay cannot belong to a module installed within it.)rT   ri   r   rk   
module_bayr   rl   r  )rZ   r   module_baysmodulesr]   s       rP   ri   zModuleBay.cleanj  s     [ 6 	Q7)KG Q9''6+<+?;+N+N)!,i*j*jkkkvy)))""6#4#78885;5FP*11D  Q Q Q	Q 	QQ QrO   c                 j    | j         r| j         j        | _         t                      j        |i | d S rc   )r   r  r=  rT   r-  rY   s      rP   r-  zModuleBay.savex  s:    ; 	1+0DKd%f%%%%%rO   )rG   rH   rI   rq   r   r	   rs   r=  rt   rl   r  r   r   r   ry   rQ   r  r   ri   r-  rv   rw   s   @rP   r&   r&   B  sC         ^.  F  vQz]]!PQQ	  H kmmGL/ / / / /$) / / /) ) ) ) ) ) ) )A A AQ Q Q Q Q& & & & & & & & &rO   r&   c                        e Zd ZdZ ej        dej        ddd          ZdZ G d de	j
                  Z
d	 Z fd
Z xZS )r!   r  r-   
parent_bayTrz   ro   c                   :    e Zd Z ed          Z ed          ZdS )DeviceBay.Metaz
device bayzdevice baysNr   rN   rO   rP   rQ   r    r   rO   rQ   c                 2    t          dd| j        i          S )Nzdcim:devicebayrk   r   r   r`   s    rP   r   zDeviceBay.get_absolute_url  r   rO   c                 p   t                                                       t          | d          rK| j        j        j        s:t          t          d                              | j        j                            | j	        r6t          | dd           | j	        k    rt          t          d                    | j	        rqt          j                            | j	                                                  }|r:|| k    r6t          dt          d                              |          i          d S d S d S )	NrA   zAThis type of device ({device_type}) does not support device bays.)device_typez$Cannot install a device into itself.)installed_devicer  zJCannot install the specified device; device is already installed in {bay}.)bay)rT   ri   r  rA   r  is_parent_devicer   rl   r   r  r   r!   r   r   r0  )rZ   current_bayr]   s     rP   ri   zDeviceBay.clean  sI    4"" 	4;+B+S 	!!$g"h"h"o"o K3 #p # #   
   	MWT8T%B%BdF[%[%[!!$J"K"KLLL   	#+22DDY2ZZ``bbK {d22%&d) )ff--'   	 	 22rO   )rG   rH   rI   rq   r	   OneToOneFieldr   r  r   r,   rQ   r   ri   rv   rw   s   @rP   r!   r!   ~  s          ,v+/!   L/ / / / /~" / / /A A A        rO   r!   c                   h    e Zd ZdZ e ed          ej                  Z G d d          Z	d Z
dS )r%   zG
    Inventory items may optionally be assigned a functional role.
    r  r  c                   >    e Zd ZdZ ed          Z ed          ZdS )InventoryItemRole.Meta)r3   zinventory item rolezinventory item rolesN)rG   rH   rI   rK   rl   r5   r   rN   rO   rP   rQ   r    s6        q.//a 677rO   rQ   c                 0    t          d| j        g          S )Nzdcim:inventoryitemrole)r[   r   r`   s    rP   r   z"InventoryItemRole.get_absolute_url  s    /twi@@@@rO   N)rG   rH   rI   rq   r   rl   r   
COLOR_GREYr  rQ   r   rN   rO   rP   r%   r%     s          JQwZZ'  E
8 8 8 8 8 8 8 8
A A A A ArO   r%   c            
           e Zd ZdZ edej        dddd          Z ej        de	ej
        ddd          Z ej        dd	          Z ed
d          Z ej        dej
        ddd          Z ej        dej
        ddd          Z ej        d ed          d ed                    Z ej        d ed          d          Z ej        dddd ed           ed                    Z ej         ed          d ed                    Z e            ZdZ G d d           Zd! Z fd"Z xZS )#r$   z
    An InventoryItem represents a serialized piece of hardware within a Device, such as a line card or power supply.
    InventoryItems are used only for inventory purposes.
    rZ   child_itemsT)r0   r1   r2   r9   r{   r  zcontenttypes.ContentTyper   )r0   limit_choices_tor1   r2   r9   r{   )r9   r{   r|   r}   )ct_fieldfk_fieldzdcim.InventoryItemRoler   rz   zdcim.Manufacturerr   zpart IDz%Manufacturer-assigned part identifier)r6   r5   r9   r<   zserial number)r6   r5   r9   z	asset tagz'A unique tag used to identify this item)r6   uniquer9   r{   r5   r<   
discoveredFz&This item was automatically discoveredr   )rA   r=  rolemanufacturerpart_idc                       e Zd ZdZ ej        d          fZ ej        dd          fZ e	d          Z
 e	d          Zd	S )
InventoryItem.Meta)
device__id
parent__idrB   )r|   r}   )rF   )rA   r=  r3   z1%(app_label)s_%(class)s_unique_device_parent_namerE   zinventory itemzinventory itemsN)rG   rH   rI   rK   r	   IndexindexesrL   rM   rl   r5   r   rN   rO   rP   rQ   r  
  sx        8FL BCCC
 $F#3H  
 q)**a 122rO   rQ   c                 2    t          dd| j        i          S )Nzdcim:inventoryitemrk   r   r   r`   s    rP   r   zInventoryItem.get_absolute_url  s    +T47ODDDDrO   c                    t                                                       | j        r.| j        | j        k    rt	          dt          d          i          | j        j        s| j        r3| j        j	        | j	        k    rt	          dt          d          i          | 
                                                                }|r,|j	        | j	        k    rt	          t          d                    | j        r| j        j	        | j	        k    rd | _        d S d S d S | j        r3| j        j	        | j	        k    r t	          dt          d          i          d S d S )Nr=  zCannot assign self as parent.z9Parent inventory item does not belong to the same device.z5Cannot move an inventory item with dependent childrenrA   z;Cannot assign inventory item to component on another device)rT   ri   rk   rf  r   rl   r'  r(  r=  rA   get_childrenr0  	component)rZ   first_childr]   s     rP   ri   zInventoryItem.clean  sz    7 	t~00!!;<<#   
 {! 	{ t{1T[@@%a [\\'   
 ++--3355K b{1T[@@%a(_&`&`aaa ~ &$."74;"F"F!%& &"F"F ~ $."74;"F"F%a ]^^'    "F"FrO   ) rG   rH   rI   rq   r   r	   rs   r=  rr   MODULAR_COMPONENT_MODELSPROTECTr|   PositiveBigIntegerFieldr}   r   r  r  r  rt   rl   r  serial	asset_tagr   r  r   r   r   rQ   r   ri   rv   rw   s   @rP   r$   r$     s`         ^."  F 'V&%1.  N 261  L "!!  I 6#.&  D %6$.&  L fQy\\!;<<	  G VQ''  F
 ! Q{^^!=>>  I %$Q|__!<==  J kmmGKL3 3 3 3 3 3 3 3E E E        rO   r$   N)A	functoolsr   "django.contrib.contenttypes.fieldsr   r   django.core.exceptionsr   django.core.validatorsr   r   	django.dbr	   django.db.modelsr
   r   django.urlsr   django.utils.translationr   rl   mptt.modelsr   r   dcim.choicesdcim.constantsdcim.fieldsr   r   netbox.choicesr   netbox.modelsr   r   utilities.fieldsr   r   utilities.mpttr   utilities.orderingr   utilities.query_functionsr   utilities.trackingr   wireless.choiceswireless.utilsr   __all__r,   ry   Modelr   r'   r   r    r)   r(   r   r#   r"   r*   r&   r!   r%   r$   rN   rO   rP   <module>r     s    % % % % % % Q Q Q Q Q Q Q Q 2 2 2 2 2 2 G G G G G G G G       # # # # # # # #       6 6 6 6 6 6 1 1 1 1 1 1 1 1         1 1 1 1 1 1 1 1 ' ' ' ' ' ' : : : : : : : : = = = = = = = = & & & & & & 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1     + + + + + +$C C C C C[ C C CL    N   $Nn Nn Nn Nn Nn Nn Nn Nnb;= ;= ;= ;= ;=6< ;= ;= ;=DC C C C C'):LJ\ C C C:I I I I I-/@,Pb I I IBs
 s
 s
 s
 s
%'8,HZ s
 s
 s
l* * * * *'):LJ\ * * *bG3 G3 G3 G3 G3FL G3 G3 G3Ty/ y/ y/ y/ y/%}6GWi y/ y/ y/@G G G G G%'8:L G G GT+ + + + +$&79K + + +d9& 9& 9& 9& 9&%'99 9& 9& 9&x* * * * * 2 * * *dA A A A A+ A A A$v v v v vI~/A v v v v vrO   