
    >Tf3                     \   d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlZd dl	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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 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Z, e j-        d          Z.d Z/d Z0d Z1 G d dej2                  Z3 G d d          Z4e+ G d de4                      Z5e+ G d  d!e4                      Z6e+ G d" d#e4                      Z7e+ G d$ d%e4                      Z8e+ G d& d'e4                      Z9dS )(    N)cached_property)sha256)	urlencode)forms)settings)cache)render_to_string)NoReverseMatchresolvereverse)gettext)
ObjectType)BookmarkOrderingChoices)ButtonColorChoicesobject_type_identifierobject_type_name)get_permission_for_model)dict_to_querydict)render_markdown)get_viewname   )register_widget)BookmarksWidgetDashboardWidget
NoteWidgetObjectCountsWidgetObjectListWidgetRSSFeedWidgetWidgetConfigFormznetbox.data_backendsc                  z    d t           j                                                            dd          D             S )Nc                 J    g | ] }t          |          t          |          f!S  r   .0ots     =/var/www/html/netbox-4.1.3/netbox/extras/dashboard/widgets.py
<listcomp>z+get_object_type_choices.<locals>.<listcomp>(   >        
 	#	#%5b%9%9:      	app_labelmodel)r   objectspublicorder_byr#   r*   r'   get_object_type_choicesr0   '   sB     $++--66{GLL   r*   c                  |    d t           j                            d                              dd          D             S )Nc                 J    g | ] }t          |          t          |          f!S r#   r   r$   s     r'   r(   z5get_bookmarks_object_type_choices.<locals>.<listcomp>/   r)   r*   	bookmarksr+   r,   )r   r-   with_featurer/   r#   r*   r'   !get_bookmarks_object_type_choicesr5   .   sE     $11+>>GGU\]]   r*   c                    g }| D ]}|                     d          \  }}	 t          j                            ||          }|                                r(|                    |                                           n t                              d| d|            # t          j        $ r# t                              d| d|            Y w xY w|S )zf
    Return a list of models corresponding to the given content types, identified by natural key.
    .(Dashboard Widget model_class not found: :z'Dashboard Widget ObjectType not found: )	splitr   r-   get_by_natural_keymodel_classappendloggerdebugDoesNotExist)content_typesmodelscontent_type_idr+   
model_namecontent_types         r'   get_models_from_content_typesrF   5   s     F( 	] 	] / 5 5c : :	:	]%-@@JWWL'')) bl66889999`	``T^``aaa& 	] 	] 	]LL[9[[z[[\\\\\	] Ms   A<B/CCc                       e Zd ZdS )r    N)__name__
__module____qualname__r#   r*   r'   r    r    H   s        Dr*   r    c                       e Zd ZdZdZdZi ZdZdZ G d de	          Z
ddZd Zd	 Zd
 Zed             Zed             ZdS )r   a  
    Base class for custom dashboard widgets.

    Attributes:
        description: A brief, user-friendly description of the widget's function
        default_title: The string to show for the widget's title when none has been specified.
        default_config: Default configuration parameters, as a dictionary mapping
        width: The widget's default width (1 to 12)
        height: The widget's default height; the number of rows it consumes
    N      c                       e Zd ZdZdS )DashboardWidget.ConfigFormz2
        The widget's configuration form.
        N)rH   rI   rJ   __doc__r#   r*   r'   
ConfigFormrO   ]   s        	 	 	r*   rQ   c	                     |pt          t          j                              | _        |p| j        | _        |p| j        | _        || _        |r|| _	        |r|| _
        ||c| _        | _        d S N)struuiduuid4iddefault_configconfigdefault_titletitlecolorwidthheightxy)	selfrW   r[   r\   rY   r]   r^   r_   r`   s	            r'   __init__zDashboardWidget.__init__c   sr    )DJLL))3 30d0

 	DJ 	! DKAr*   c                 (    | j         p| j        j        S rS   )r[   	__class__rH   ra   s    r'   __str__zDashboardWidget.__str__n   s    z4T^44r*   c                     |                     dd          | _        |                     dd          | _        |                     d          | _        |                     d          | _        d S )Nwr   hr_   r`   )getr]   r^   r_   r`   )ra   	grid_items     r'   
set_layoutzDashboardWidget.set_layoutq   sV    ]]3**
mmC++s##s##r*   c                 l    t          t          d                              | j                            )z
        This method is called to render the widget's content.

        Params:
            request: The current request
        z+{class_name} must define a render() method.)
class_name)NotImplementedError_formatrd   ra   requests     r'   renderzDashboardWidget.renderw   s<     "!$Q"R"R"Y"Y~ #Z #
 #
   	r*   c                 j    | j         j                            d          d          d| j         j         S )Nr7   r   )rd   rI   r:   rH   re   s    r'   namezDashboardWidget.name   s3    .+11#66q9UUDN<SUUUr*   c                 ,    | j         | j        | j        dS )Nr[   r\   rY   rx   re   s    r'   	form_datazDashboardWidget.form_data   s"     ZZk
 
 	
r*   )NNNNNNNN)rH   rI   rJ   rP   descriptionrZ   rX   r]   r^   r    rQ   rb   rf   rl   rt   propertyrv   ry   r#   r*   r'   r   r   L   s        	 	 KMNEF    %   	 	 	 	5 5 5$ $ $	 	 	 V V XV 
 
 X
 
 
r*   r   c                   \    e Zd Z ed          Z ed          Z G d de          Zd ZdS )r   Notez=Display some arbitrary custom content. Markdown is supported.c                   J    e Zd Z ej         ej                              ZdS )NoteWidget.ConfigForm)widgetN)rH   rI   rJ   r   	CharFieldTextareacontentr#   r*   r'   rQ   r      s3        !%/!5>##
 
 
r*   rQ   c                 P    t          | j                            d                    S )Nr   )r   rY   rj   rr   s     r'   rt   zNoteWidget.render   s    t{y99:::r*   N)	rH   rI   rJ   rp   rZ   rz   r    rQ   rt   r#   r*   r'   r   r      sk        AfIIM!STTK
 
 
 
 
% 
 
 

; ; ; ; ;r*   r   c                   `    e Zd Z ed          Z ed          ZdZ G d de          Zd Z	dS )r   zObject CountszODisplay a set of NetBox models and the number of objects created for each type.z*extras/dashboard/widgets/objectcounts.htmlc                   n    e Zd Z ej        e          Z ej        dd ed                    Z	d Z
dS )ObjectCountsWidget.ConfigFormchoicesFzObject filtersz4Filters to apply when counting the number of objects)requiredlabel	help_textc                     | j         d         x}r@	 t          |           n/# t          $ r" t          j        t          d                    w xY w|S )Nfiltersz>Invalid format. Object filters must be passed as a dictionary.)cleaned_datadict	TypeErrorr   ValidationErrorrp   ra   datas     r'   clean_filtersz+ObjectCountsWidget.ConfigForm.clean_filters   si    (33t uuJJJJ  u u u/2r0s0stttuKs	   ! ,AN)rH   rI   rJ   r   MultipleChoiceFieldr0   rB   	JSONFieldrp   r   r   r#   r*   r'   rQ   r      sm        **+
 
 
 "%/"aNOO
 
 
	 	 	 	 	r*   rQ   c                    g }t          | j        d                   D ]6}t          |d          }|j                            |          r	 t          t          |d                    }n# t          $ r d }Y nw xY w|j        	                    |j        d          }|r}| j        
                    d          x}rat          |          }t          t          |          j        j        dd           }	 |	||          j        }| d|                                 }|j        }
|                    ||
|f           |                    |d d f           8t)          | j        d|i          S )NrB   viewlistr   	filterset?counts)rF   rY   r   userhas_permr   r   r
   r-   restrictrj   r   getattrr   func
view_classqsr   countr=   r	   template_name)ra   rs   r   r,   
permissionurlr   r   paramsr   object_counts              r'   rt   zObjectCountsWidget.render   s   24;x3HII 	3 	3E1%@@J|$$Z00 3!,uf"="=>>CC%   CCC]++GL&AA 8t{y'A'AAG 8.w77F '(9(DkSW X XI"62..1B 776#3#3#5#577C!xulC89999udD12222 2f5
   	s   A))A87A8N)
rH   rI   rJ   rp   rZ   rz   r   r    rQ   rt   r#   r*   r'   r   r      sr        Ao&&M!effK@M    %   $    r*   r   c                   h    e Zd Z ed          Z ed          ZdZdZdZ G d de	          Z
d Zd	S )
r   zObject Listz%Display an arbitrary list of objects.z(extras/dashboard/widgets/objectlist.html   rL   c                       e Zd Z ej        e          Z ej        ddd ed                    Z	 ej
        dd          Zd	 Zd
S )ObjectListWidget.ConfigFormr   Fr   d   z(The default number of objects to display)r   	min_value	max_valuer   zURL parameters)r   r   c                     | j         d         x}rG	 t          |           n6# t          t          f$ r" t	          j        t          d                    w xY w|S )N
url_paramsz>Invalid format. URL parameters must be passed as a dictionary.)r   r   r   
ValueErrorr   r   rp   r   s     r'   clean_url_paramsz,ObjectListWidget.ConfigForm.clean_url_params   sn    (66t uudOOOO!:. u u u/2r0s0stttuKs	   ! 3AN)rH   rI   rJ   r   ChoiceFieldr0   r,   IntegerFieldrp   	page_sizer   r   r   r#   r*   r'   rQ   r      s        !!+
 
 
 'E&aBCC	
 
 
	 %U_"
 
 


	 	 	 	 	r*   rQ   c                    | j         d                             d          \  }}t          j                            ||                                          }|s"t                              d| d|            d S t          |d          }t          |d          }|j
                            |          }	 t          |          }n# t          $ r d }Y nw xY w| j                             d          pi }	| j                             d	          x}
r|
|	d
<   d|	d<   |	r(	 | dt          |	d           }n# t           $ r Y nw xY wt#          | j        |||d          S )Nr,   r7   r8   r9   r   )actionr   r   r   per_pageTembeddedr   )doseq)viewnamehas_permissionhtmx_url)rY   r:   r   r-   r;   r<   r>   r?   r   r   r   r   r   r
   rj   r   r   r	   r   )ra   rs   r+   rD   r,   r   r   r   r   
parametersr   s              r'   rt   zObjectListWidget.render   s    $G 4 : :3 ? ?	:"55iLLXXZZ 	LL\I\\PZ\\]]]Ff555 .eV<<
 ..z::	x((HH 	 	 	HHH	[__\228b
4449 	/%.Jz"!%
: 	&LL:T)J)J)JLL    2 , 5
 5
   	s$   6C CCD4 4
E EN)rH   rI   rJ   rp   rZ   rz   r   r]   r^   r    rQ   rt   r#   r*   r'   r   r      s|        Am$$M!;<<K>MEF    %   .         r*   r   c                       e Zd Z ed          ZdddZ ed          ZdZdZdZ	 G d	 d
e
          Zd Zed             Zd ZdS )r   zRSS Feed
   i  )max_entriescache_timeoutz+Embed an RSS feed from an external website.z%extras/dashboard/widgets/rssfeed.html   rL   c                       e Zd Z ej         ed                    Z ej        dd ed                    Z ej        dd ed	                    Z	d
S )RSSFeedWidget.ConfigFormzFeed URL)r   r   i  z(The maximum number of objects to display)r   r   r   iX  iQ z2How long to stored the cached content (in seconds)N)
rH   rI   rJ   r   URLFieldrp   feed_urlr   r   r   r#   r*   r'   rQ   r     s        !5>!J--
 
 
 )e(aBCC
 
 

 +*aLMM
 
 
r*   rQ   c                 n    t          | j        d| j        d         i|                                           S )Nr   r   )r	   r   rY   get_feedrr   s     r'   rt   zRSSFeedWidget.render,  s:     24;z*5
mmoo5
   	r*   c                     | j         d         }t          |                    d                                                    }d| S )Nr   zutf-8dashboard_rss_)rY   r   encode	hexdigest)ra   r   url_checksums      r'   	cache_keyzRSSFeedWidget.cache_key2  sA    k*%cjj1122<<>>....r*   c                 ~   t          j        | j                  x}rdt          j        |          iS 	 t          j        | j        d         ddt          j        j	         it          j
        d          }|                                 n%# t
          j        j        $ r}d|icY d }~S d }~ww xY wt          j        |j                  }|j        sm| j                            d          }|d	         d |         |d	<   t          j        | j        t%          |          | j                            d
                     d|iS )Nfeedr   z
User-AgentzNetBox/rM   )r   headersproxiestimeouterrorr   entriesr   )r   rj   r   
feedparserFeedParserDictrequestsrY   r   RELEASEversionHTTP_PROXIESraise_for_status
exceptionsRequestExceptionparser   bozosetr   )ra   feed_contentresponseer   r   s         r'   r   zRSSFeedWidget.get_feed8  sb    9T^444< 	
1,?? 
	|K
+%'K1A1I'K'KL -	  H %%''''"3 	 	 	      	  011y 	T+//-88K"9ol{l;DOIdnd4jj$+///2R2RSSS D
 	
s   AB	 	B+B& B+&B+N)rH   rI   rJ   rp   rZ   rX   rz   r   r]   r^   r    rQ   rt   r   r   r   r#   r*   r'   r   r     s        AjMMM N !ABBK;MEF
 
 
 
 
% 
 
 
   / / _/
 
  
  
  
  
r*   r   c                   r    e Zd Z ed          Zdej        iZ ed          ZdZ	 G d de
          Zd ZdS )	r   	Bookmarksr/   zShow your personal bookmarksz'extras/dashboard/widgets/bookmarks.htmlc                   x    e Zd Z ej        ed          Z ej        e          Z	 ej
        dd          ZdS )BookmarksWidget.ConfigFormF)r   r   r   r   )r   r   N)rH   rI   rJ   r   r   r5   object_typesr   r   r/   r   	max_itemsr#   r*   r'   rQ   r   d  sl        0u05
 
 
 %5$+
 
 
 'E&
 
 
			r*   rQ   c                    ddl m} |j        j        rt	                      }n)|j                            |j                  }| j                            d          x}rJt          |          }t          j        j        |                                 }|                    |          }| j        d         t          j        k    rt          |d           }nO| j        d         t          j        k    rt          |d	 d
          }n |                    | j        d                   }| j                            d          x}r
|d |         }t%          | j        d|i          S )Nr   )Bookmark)r   r   )object_type__inr/   c                 N    |                                                                  S rS   rf   lowerbookmarks    r'   <lambda>z(BookmarksWidget.render.<locals>.<lambda>}      8CSCSCUCUC[C[C]C] r*   )keyc                 N    |                                                                  S rS   r   r   s    r'   r   z(BookmarksWidget.render.<locals>.<lambda>  r   r*   T)r   r   r   r3   )extras.modelsr   r   is_anonymousr   r-   filterrY   rj   rF   r   get_for_modelsvaluesr   ORDERING_ALPHABETICAL_AZsortedORDERING_ALPHABETICAL_ZAr/   r	   r   )ra   rs   r   r3   r   rB   rA   r   s           r'   rt   zBookmarksWidget.renderq  se   ******<$ 	2II (//W\/BBI#{~>>>| L6|DD * 2 A6 J Q Q S S%,,],KK	{:&*A*ZZZ"92]2]^^^		Z(,C,\\\"92]2]gklll		%..t{:/FGG	 KOOK888y 2%jyj1	 25
   	r*   N)rH   rI   rJ   rp   rZ   r   ORDERING_NEWESTrX   rz   r   r    rQ   rt   r#   r*   r'   r   r   [  s        AkNNM+;N !233K=M
 
 
 
 
% 
 
 
    r*   r   ):loggingrU   	functoolsr   hashlibr   urllib.parser   r   r   djangor   django.confr   django.core.cacher   django.template.loaderr	   django.urlsr
   r   r   django.utils.translationr   rp   core.modelsr   extras.choicesr   netbox.choicesr   utilities.object_typesr   r   utilities.permissionsr   utilities.querydictr   'utilities.templatetags.builtins.filtersr   utilities.viewsr   utilsr   __all__	getLoggerr>   r0   r5   rF   Formr    r   r   r   r   r   r   r#   r*   r'   <module>r     sK     % % % % % %       " " " " " "                        # # # # # # 3 3 3 3 3 3 8 8 8 8 8 8 8 8 8 8 1 1 1 1 1 1 " " " " " " 2 2 2 2 2 2 - - - - - - K K K K K K K K : : : : : : 1 1 1 1 1 1 C C C C C C ( ( ( ( ( ( " " " " " " 
	1	2	2      &	 	 	 	 	uz 	 	 	@
 @
 @
 @
 @
 @
 @
 @
F 
; 
; 
; 
; 
; 
; 
; 
; . . . . . . . .b > > > > > > > >B F
 F
 F
 F
 F
O F
 F
 F
R + + + + +o + + + + +r*   