
    >TfE?                        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 d dl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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 dl!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+m,Z,  G d de          Z- G d de"          Z. G d de"          Z/ G d de"          Z0 G d  d!e"          Z1 G d" d#e"          Z2 G d$ d%e"          Z3 G d& d'e"          Z4 G d( d)e"          Z5 G d* d+e"          Z6 G d, d-e"          Z7 G d. d/e"          Z8 G d0 d1e"          Z9 G d2 d3e"          Z: G d4 d5e"          Z; G d6 d7e"          Z< G d8 d9e"          Z=d: Z> G d; d<e$e          Z? G d= d>e?          Z@ G d? d@e?          ZA G dA dBe?          ZB G dC dDeB          ZC G dE dFeB          ZD G dG dHe?          ZEdIS )J    )deepcopy)ObjectDoesNotExistPermissionDenied)transaction)get_object_or_404)gettext)advisory_lock)extend_schema)IPSetstatus)ValidationError)Response)APIRootView)APIView)
filtersets)*)get_next_available_prefix)NetBoxModelViewSet)ObjectValidationMixin)
get_config)ADVISORY_LOCK_KEYS)get_serializer_for_model   )serializersc                       e Zd ZdZd ZdS )IPAMRootViewz
    IPAM API root view
    c                     dS )NIPAM )selfs    3/var/www/html/netbox-4.1.3/netbox/ipam/api/views.pyget_view_namezIPAMRootView.get_view_name   s    v    N)__name__
__module____qualname____doc__r#   r    r$   r"   r   r      s-             r$   r   c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )ASNRangeViewSetN)r%   r&   r'   ASNRangeobjectsallquerysetr   ASNRangeSerializerserializer_classr   ASNRangeFilterSetfilterset_classr    r$   r"   r*   r*   '   s3        ##%%H"5 2OOOr$   r*   c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )
ASNViewSetN)r%   r&   r'   ASNr,   r-   r.   r   ASNSerializerr0   r   ASNFilterSetr2   r    r$   r"   r4   r4   -   0        {  H"0 -OOOr$   r4   c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )
VRFViewSetN)r%   r&   r'   VRFr,   r-   r.   r   VRFSerializerr0   r   VRFFilterSetr2   r    r$   r"   r:   r:   3   r8   r$   r:   c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )RouteTargetViewSetN)r%   r&   r'   RouteTargetr,   r-   r.   r   RouteTargetSerializerr0   r   RouteTargetFilterSetr2   r    r$   r"   r?   r?   9   s3        "&&((H"8 5OOOr$   r?   c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )
RIRViewSetN)r%   r&   r'   RIRr,   r-   r.   r   RIRSerializerr0   r   RIRFilterSetr2   r    r$   r"   rD   rD   ?   r8   r$   rD   c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )AggregateViewSetN)r%   r&   r'   	Aggregater,   r-   r.   r   AggregateSerializerr0   r   AggregateFilterSetr2   r    r$   r"   rI   rI   E   3         $$&&H"6 3OOOr$   rI   c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )RoleViewSetN)r%   r&   r'   Roler,   r-   r.   r   RoleSerializerr0   r   RoleFilterSetr2   r    r$   r"   rO   rO   K   s2        |!!H"1 .OOOr$   rO   c                   p     e Zd Zej                                        Zej        Z	e
j        ZeZ fdZ xZS )PrefixViewSetc                     | j         dk    r| j        j        dk    rt          j        S t                                                      S )Navailable_prefixesPOST)actionrequestmethodr   PrefixLengthSerializersuperget_serializer_class)r!   	__class__s    r"   r]   z"PrefixViewSet.get_serializer_classX   s?    ;...4<3F&3P3P55ww++---r$   )r%   r&   r'   Prefixr,   r-   r.   r   PrefixSerializerr0   r   PrefixFilterSetr2   parent_modelr]   __classcell__r^   s   @r"   rT   rT   Q   sa        ~!!##H"3 0OL. . . . . . . . .r$   rT   c                   `    e Zd Zej                                        Zej        Z	e
j        ZeZdS )IPRangeViewSetN)r%   r&   r'   IPRanger,   r-   r.   r   IPRangeSerializerr0   r   IPRangeFilterSetr2   rb   r    r$   r"   rf   rf   ^   s7        ""$$H"4 1OLLLr$   rf   c                   
    e Zd Zej                                        Zej        Z	e
j        Z eed                    fd            Z eed                    fd            Z eed                    fd            Z xZS )IPAddressViewSetavailable-ipsc                 >     t                      j        |g|R i |S N)r\   creater!   rY   argskwargsr^   s       r"   ro   zIPAddressViewSet.createk   )    uww~g7777777r$   c                 >     t                      j        |g|R i |S rn   )r\   updaterp   s       r"   ru   zIPAddressViewSet.updateo   rs   r$   c                 >     t                      j        |g|R i |S rn   )r\   destroyrp   s       r"   rw   zIPAddressViewSet.destroys   s)    uwww8888888r$   )r%   r&   r'   	IPAddressr,   r-   r.   r   IPAddressSerializerr0   r   IPAddressFilterSetr2   r	   r   ro   ru   rw   rc   rd   s   @r"   rk   rk   f   s         $$&&H"6 3O]%o6778 8 8 8 878 ]%o6778 8 8 8 878 ]%o6779 9 9 9 879 9 9 9 9r$   rk   c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )FHRPGroupViewSetN)r%   r&   r'   	FHRPGroupr,   r-   r.   r   FHRPGroupSerializerr0   r   FHRPGroupFilterSetr2   r    r$   r"   r|   r|   x   rM   r$   r|   c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )FHRPGroupAssignmentViewSetN)r%   r&   r'   FHRPGroupAssignmentr,   r-   r.   r   FHRPGroupAssignmentSerializerr0   r   FHRPGroupAssignmentFilterSetr2   r    r$   r"   r   r   ~   s3        "*..00H"@ =OOOr$   r   c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )VLANGroupViewSetN)r%   r&   r'   	VLANGroupr,   annotate_utilizationr.   r   VLANGroupSerializerr0   r   VLANGroupFilterSetr2   r    r$   r"   r   r      s3         5577H"6 3OOOr$   r   c                   ^    e Zd Zej                            d          Zej        Z	e
j        ZdS )VLANViewSetl2vpn_terminationsN)r%   r&   r'   VLANr,   prefetch_relatedr.   r   VLANSerializerr0   r   VLANFilterSetr2   r    r$   r"   r   r      s;        |,, H #1 .OOOr$   r   c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )ServiceTemplateViewSetN)r%   r&   r'   ServiceTemplater,   r-   r.   r   ServiceTemplateSerializerr0   r   ServiceTemplateFilterSetr2   r    r$   r"   r   r      s3        &**,,H"< 9OOOr$   r   c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )ServiceViewSetN)r%   r&   r'   Servicer,   r-   r.   r   ServiceSerializerr0   r   ServiceFilterSetr2   r    r$   r"   r   r      s2        ""$$H"4 1OOOr$   r   c                     t                      }	 t          | j                            d|j                            p|j        }n# t          $ r
 |j        }Y nw xY w|j        rt          ||j                  }|S )z]
    Return the lesser of the specified limit (if any) and the configured MAX_PAGE_SIZE.
    limit)r   intquery_paramsgetPAGINATE_COUNTMAX_PAGE_SIZE
ValueErrormin)rY   configr   s      r"   get_results_limitr      s     \\F&G(,,Wf6KLLMMeQWQe & & &%& 1E6/00Ls   4A AAc                   J    e Zd ZdZdZdZdZd Zd
dZd Z	d Z
d Zd Zd	 ZdS )AvailableObjectsViewzo
    Return a list of dicts representing child objects that have not yet been created for a parent object.
    Nc                     t                      )z+
        Return the parent object.
        NotImplementedr!   rY   pks      r"   
get_parentzAvailableObjectsView.get_parent        r$   c                     t                      )z>
        Return all available objects for the parent.
        r   r!   parentr   s      r"   get_available_objectsz*AvailableObjectsView.get_available_objects   r   r$   c                     i S )zC
        Return any extra context data for the serializer.
        r    r!   r   s     r"   get_extra_contextz&AvailableObjectsView.get_extra_context   s	     	r$   c                 B    t          |          t          |          k    S )zg
        Check if there exist a sufficient number of available objects to satisfy the request.
        )len)r!   requested_objectsavailable_objectss      r"   check_sufficient_availablez/AvailableObjectsView.check_sufficient_available   s!     $%%->)?)???r$   c                     |S )z
        Prepare data by setting any programmatically determined object attributes (e.g. next available VLAN ID)
        on the request data.
        r    )r!   r   r   r   s       r"   prep_object_dataz%AvailableObjectsView.prep_object_data   s
    
 ! r$   c                     |                      ||          }t          |          }|                     ||          }|                     |dd|i|                     |                    }t          |j                  S )NTrY   )manycontext)r   r   r   read_serializer_classr   r   data)r!   rY   r   r   r   r   
serializers          r"   r   zAvailableObjectsView.get   s    "--!'** 66vuEE//0AwW
$$V,,W
/  

 
(((r$   c                 n   | j                             |j        d          | _         |                     ||          }t	          |j        t                    r|j        n|j        g}t          |          }|                     |dd|i| 	                    |                    }|
                                s t          |j        t          j                  S t          t           | j                           5  |                     ||          }|                     |j        |          s)t          ddit          j                  cd d d            S |                     t/          |          ||          }t1          | j         j                  }d|i}	t	          |j        t                    r ||d|	          }n ||d         |		          }|
                                s,t          |j        t          j                  cd d d            S 	 t5          j                    5  |                                }
|                     |
           d d d            n# 1 swxY w Y   n# t<          $ r t?                      w xY wd d d            n# 1 swxY w Y   t          |j        t          j                   S )
NaddTrY   )r   r   r   r   detailz;Insufficient resources are available to satisfy the requestr   )r   r   )!r.   restrictuserr   
isinstancer   listr   write_serializer_classr   is_validr   errorsr   HTTP_400_BAD_REQUESTr	   r   advisory_lock_keyr   r   validated_dataHTTP_409_CONFLICTr   r   r   modelr   atomicsave_validate_objectsr   r   HTTP_201_CREATED)r!   rY   r   r   r   r   r   r   r0   r   createds              r"   postzAvailableObjectsView.post   s}   ..w|UCC"-- -7w|T,J,J^GLLQXQ]P^%&& 006Gdw]
$$V,,]
0  
 ""$$ 	!2   
 -d.DEFF 	) 	) $ : :65 I I 22:3LN_`` ]^!3  	) 	) 	) 	) 	) 	) 	) 	) !% 5 5h?P6Q6QSdfl m m  88KLL '*G',-- Z--3D4Y`aaa

--3DQ3GQXYYY
&&(( W
 1&:UVVV-	) 	) 	) 	) 	) 	) 	) 	)2) ')) 4 4(oo//G**73334 4 4 4 4 4 4 4 4 4 4 4 4 4 4 & ) ) )&((();	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)@ 
0GHHHHsV   6AJB0JI$"*II$I	I$I	 I$#J$I==JJJrn   )r%   r&   r'   r(   r   r   r   r   r   r   r   r   r   r   r    r$   r"   r   r      s          !!       @ @ @! ! !
) 
) 
)3I 3I 3I 3I 3Ir$   r   c                   H    e Zd Zej                                        Zej        Z	ej        Z
dZd ZddZd Zd Z edgd ej        d	
          i           fd            Z edgd ej        d	
          i ej        d	
                     fd            Z xZS )AvailableASNsViewzavailable-asnsc                 h    t          t          j                            |j                  |          S N)r   )r   r+   r,   r   r   r   s      r"   r   zAvailableASNsView.get_parent   s(     !1!:!:7<!H!HRPPPPr$   Nc                 :    |                                 d |         S rn   )get_available_asnsr   s      r"   r   z'AvailableASNsView.get_available_objects#      ((**6E622r$   c                 
    d|iS )Nranger    r   s     r"   r   z#AvailableASNsView.get_extra_context&      V
 	
r$   c                     t          |          D ]3\  }}|                    |j        j        |j        ||         d           4|S )N)rirr   asn)	enumerateru   r   r   r!   r   r   r   irequest_datas         r"   r   z"AvailableASNsView.prep_object_data+  sa    ():;; 	 	OA|z}(+! !     ! r$   r      Tr   methods	responsesc                 H    t                                          ||          S rn   r\   r   r!   rY   r   r^   s      r"   r   zAvailableASNsView.get5      ww{{7B'''r$   r      r   r   rY   c                 H    t                                          ||          S rn   r\   r   r   s      r"   r   zAvailableASNsView.post9       ww||GR(((r$   rn   )r%   r&   r'   r5   r,   r-   r.   r   AvailableASNSerializerr   r   r   r   r   r   r   r
   r   r6   r   rc   rd   s   @r"   r   r     sE       {  H'>(?(Q Q Q3 3 3 3
 
 

! ! ! ]E7s4VK4V\`4a4a4a.bccc( ( ( ( dc( ]11t<<<=))t444  
) ) ) ) 
) ) ) ) )r$   r   c                   N    e Zd Zej                                        Zej        Z	ej
        ZdZd ZddZd Zd Zd Z edgd	 ej        d
          i           fd            Z edgd ej        d
          i ej        d
                     fd            Z xZS )AvailablePrefixesViewzavailable-prefixesc                 h    t          t          j                            |j                  |          S r   r   r_   r,   r   r   r   s      r"   r   z AvailablePrefixesView.get_parentH  '     !8!8!F!F2NNNNr$   Nc                 N    |                                                                 S rn   )get_available_prefixes
iter_cidrsr   s      r"   r   z+AvailablePrefixesView.get_available_objectsK  s     ,,..99;;;r$   c                 `    t          |          }|D ]}t          ||d                   s dS dS )Nprefix_lengthFT)r   r   )r!   r   r   rV   requested_objects        r"   r   z0AvailablePrefixesView.check_sufficient_availableN  sL    "#455 1 	 	,-?AQRaAbcc uutr$   c                     ||j         dS )Nprefixvrfr  r   s     r"   r   z'AvailablePrefixesView.get_extra_contextU      :
 
 	
r$   c                    t          |          }t          |          D ]d\  }}t          ||d                   x}r,|                    ||j        r|j        j        nd d           It          t          d                    |S )Nr  r  zKInsufficient space is available to accommodate the requested prefix size(s))r   r   r   ru   r  r   r   _)r!   r   r   r   rV   r   r   allocated_prefixs           r"   r   z&AvailablePrefixesView.prep_object_data[  s    "#455():;; 		x 		xOA| $==OQ]^mQn#o#oo x##.,2J@6:==D% %    
 &a(u&v&vwww  r$   r   r   Tr   r   c                 H    t                                          ||          S rn   r   r   s      r"   r   zAvailablePrefixesView.getj  r   r$   r   r   r   c                 H    t                                          ||          S rn   r   r   s      r"   r   zAvailablePrefixesView.postn  r   r$   rn   )r%   r&   r'   r_   r,   r-   r.   r   AvailablePrefixSerializerr   r[   r   r   r   r   r   r   r   r
   r   r`   r   rc   rd   s   @r"   r   r   B  sV       ~!!##H'A(?,O O O< < < <  
 
 
! ! ! ]E7s4YK4Y_c4d4d4d.efff( ( ( ( gf( ]44$???@,,$777  
) ) ) ) 
) ) ) ) )r$   r   c                   B    e Zd Zej                                        Zej        Z	ej        Z
dZddZd Zd Z edgd ej        d	          i
           fd            Z edgd ej        d	          i ej        d	                     fd            Z xZS )AvailableIPAddressesViewrl   Nc                     g }t          |                                d          D ]"\  }}|                    |           ||k    r n#|S )Nr   )start)r   get_available_ipsappend)r!   r   r   ip_listindexips         r"   r   z.AvailableIPAddressesView.get_available_objects}  s]    "6#;#;#=#=QGGG 	 	IE2NN2~~ r$   c                     ||j         dS )N)r   r  r  r   s     r"   r   z*AvailableIPAddressesView.get_extra_context  r	  r$   c                     t          |          }t          |          D ]G\  }}|                    t          |           d|j         |j        r|j        j        nd d           H|S )N/)addressr  )iterr   ru   nextmask_lengthr  r   )r!   r   r   r   available_ipsr   r   s          r"   r   z)AvailableIPAddressesView.prep_object_data  s    .//():;; 	 	OA|"=11HHF4FHH(.
<vz}}! !    
 ! r$   r   r   Tr   r   c                 H    t                                          ||          S rn   r   r   s      r"   r   zAvailableIPAddressesView.get  r   r$   r   r   r   c                 H    t                                          ||          S rn   r   r   s      r"   r   zAvailableIPAddressesView.post  r   r$   rn   )r%   r&   r'   rx   r,   r-   r.   r   AvailableIPSerializerr   r   r   r   r   r   r
   r   ry   r   rc   rd   s   @r"   r  r  w  s6        $$&&H'=(>'   
 
 
! ! ! ]E7s4UK4U[_4`4`4`.abbb( ( ( ( cb( ]77TBBBC//T:::  
) ) ) ) 
) ) ) ) )r$   r  c                       e Zd Zd ZdS )PrefixAvailableIPAddressesViewc                 h    t          t          j                            |j                  |          S r   r   r   s      r"   r   z)PrefixAvailableIPAddressesView.get_parent  r   r$   Nr%   r&   r'   r   r    r$   r"   r%  r%    s(        O O O O Or$   r%  c                       e Zd Zd ZdS )IPRangeAvailableIPAddressesViewc                 h    t          t          j                            |j                  |          S r   )r   rg   r,   r   r   r   s      r"   r   z*IPRangeAvailableIPAddressesView.get_parent  s'     !9!9',!G!GBOOOOr$   Nr'  r    r$   r"   r)  r)    s(        P P P P Pr$   r)  c                   H    e Zd Zej                                        Zej        Z	ej
        ZdZd ZddZd Zd Z edgd ej        d	
          i           fd            Z edgd ej        d	
          i ej        d	
                     fd            Z xZS )AvailableVLANsViewzavailable-vlansc                 h    t          t          j                            |j                  |          S r   )r   r   r,   r   r   r   s      r"   r   zAvailableVLANsView.get_parent  s(     !2!;!;GL!I!IbQQQQr$   Nc                 :    |                                 d |         S rn   )get_available_vidsr   s      r"   r   z(AvailableVLANsView.get_available_objects  r   r$   c                 
    d|iS )Ngroupr    r   s     r"   r   z$AvailableVLANsView.get_extra_context  r   r$   c                     t          |          D ]5\  }}|                    |                    d          |j        d           6|S )Nr   )vidr1  )r   ru   popr   r   s         r"   r   z#AvailableVLANsView.prep_object_data  sc    ():;; 	 	OA|(,,Q//! !    
 ! r$   r   r   Tr   r   c                 H    t                                          ||          S rn   r   r   s      r"   r   zAvailableVLANsView.get  r   r$   r   r   r   c                 H    t                                          ||          S rn   r   r   s      r"   r   zAvailableVLANsView.post  r   r$   rn   )r%   r&   r'   r   r,   r-   r.   r   AvailableVLANSerializerr   CreateAvailableVLANSerializerr   r   r   r   r   r   r
   r   r   r   rc   rd   s   @r"   r,  r,    sG       |!!H'?(F)R R R3 3 3 3
 
 

! ! ! ]E7s4WK4W]a4b4b4b.cddd( ( ( ( ed( ]22===>**555  
) ) ) ) 
) ) ) ) )r$   r,  N)Fcopyr   django.core.exceptionsr   r   	django.dbr   django.shortcutsr   django.utils.translationr   r  django_pglocksr	   drf_spectacular.utilsr
   netaddrr   rest_frameworkr   rest_framework.exceptionsr   rest_framework.responser   rest_framework.routersr   rest_framework.viewsr   ipamr   ipam.models
ipam.utilsr   netbox.api.viewsetsr   netbox.api.viewsets.mixinsr   netbox.configr   netbox.constantsr   utilities.apir    r   r   r*   r4   r:   r?   rD   rI   rO   rT   rf   rk   r|   r   r   r   r   r   r   r   r   r   r  r%  r)  r,  r    r$   r"   <module>rO     s         G G G G G G G G ! ! ! ! ! ! . . . . . . 1 1 1 1 1 1 ( ( ( ( ( ( / / / / / /       ! ! ! ! ! ! 5 5 5 5 5 5 , , , , , , . . . . . . ( ( ( ( ( (           0 0 0 0 0 0 2 2 2 2 2 2 < < < < < < $ $ $ $ $ $ / / / / / / 2 2 2 2 2 2          ;   3 3 3 3 3( 3 3 3. . . . .# . . .. . . . .# . . .6 6 6 6 6+ 6 6 6. . . . .# . . .4 4 4 4 4) 4 4 4/ / / / /$ / / /
. 
. 
. 
. 
.& 
. 
. 
.    '   9 9 9 9 9) 9 9 9$4 4 4 4 4) 4 4 4> > > > >!3 > > >4 4 4 4 4) 4 4 4/ / / / /$ / / /: : : : :/ : : :2 2 2 2 2' 2 2 2  fI fI fI fI fI0' fI fI fIR%) %) %) %) %), %) %) %)P2) 2) 2) 2) 2)0 2) 2) 2)j)) )) )) )) ))3 )) )) ))XO O O O O%= O O OP P P P P&> P P P$) $) $) $) $)- $) $) $) $) $)r$   