
    >Tf^                     j   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 d dlmZmZ d dlmZmZmZ d d	lmZmZmZ d d
lmZ d dlmZ d dlmZ d dlm Z m!Z!m"Z" d dl#m$Z$m%Z% d dl&m'Z'm(Z(m)Z) d dl*m+Z+ d dl,m-Z- d dl.m/Z0m1Z2 d dl3m4Z4m5Z5m6Z6m7Z7m8Z8 d dl9m:Z: d dl;m<Z< d dl=m>Z>m?Z? d dl@mAZA d dlBmCZC d dlDmEZE d dlFmGZG d dlHmIZI d dlJmKZK d dlLmMZM d dlNmOZO d dlPmQZQmRZRmSZS d d!lTmUZUmVZVmWZW d d"lXmYZY d d#lZm[Z[ d d$l\T d d%l]m^Z^m_Z_ d d&lWm`Z`maZa  G d' d(eAjb                  Zc eSed           G d) d*eReAje                              Zf eSedd+           G d, d-eC                      Zg eSedd.           G d/ d0eAjh                              Zi eSedd1           G d2 d3eAjj                              Zk G d4 d5eAjl                  Zm G d6 d7eAjn                  Zo G d8 d9eAjp                  Zq G d: d;eAjb                  Zr eSes           G d< d=eAje                              Zt eSesd1           G d> d?eAjj                              Zu G d@ dAeAjp                  Zv G dB dCeAjb                  Zw G dD dEeAje                  Zx G dF dGeAjj                  Zy G dH dIeAjp                  Zz G dJ dKeAjb                  Z{ eSe|           G dL dMeAje                              Z} G dN dOeAjb                  Z~ eSe           G dP dQeAje                              Z G dR dSeAjh                  Z eSed1           G dT dUeAjj                              Z G dV dWeAjp                  Z G dX dYeQe          Z G dZ d[e
e          Z G d\ d]eEe          Z G d^ d_eEe          Z G d` dae          Z G db dce          Z G dd dee          Z G df dge          Z G dh die          Z G dj dkeEe          Z G dl dme          Z G dn doe
e          Z G dp dqe
e          Z G dr dse          Z G dt due          ZdS )v    N)__version__)settings)messages)UserPassesTestMixin)cache)
connectionProgrammingError)HttpResponseHttpResponseForbiddenHttp404)get_object_or_404redirectrender)reverse)gettext_lazy)View)get_connectionget_queue_by_indexget_redis_connection)
QUEUES_MAPQUEUES_LIST)get_jobsget_statistics	stop_jobs)requeue_job)NoSuchJobError)Job	JobStatus)DeferredJobRegistryFailedJobRegistryFinishedJobRegistryScheduledJobRegistryStartedJobRegistry)Worker)clean_worker_registry)
get_configPARAMS)generic)BaseObjectView)
TableMixin)shallow_compare_dict)ConfirmationForm)htmx_partial)ConfigJSONEncoder)count_related)"ContentTypePermissionRequiredMixinGetRelatedModelsMixinregister_model_view   )
filtersetsformstables)DataSourceStatusChoices)SyncDataSourceJob)*)get_catalog_pluginsget_local_plugins)CatalogPluginTablePluginVersionTablec                       e Zd Zej                             eed                    Ze	j
        Zej        Zej        ZdS )DataSourceListViewsource)
file_countN)__name__
__module____qualname__
DataSourceobjectsannotater/   DataFilequerysetr4   DataSourceFilterSet	filtersetr5   DataSourceFilterFormfilterset_formr6   DataSourceTabletable     //var/www/html/netbox-4.1.3/netbox/core/views.pyr?   r?   1   sT        !** =844 +  H .I/N"EEErQ   r?   c                   F    e Zd Zej                                        Zd ZdS )DataSourceViewc                 2    d|                      ||          iS )Nrelated_models)get_related_models)selfrequestinstances      rR   get_extra_contextz DataSourceView.get_extra_context>   s!    d55gxHH
 	
rQ   N)rB   rC   rD   rE   rF   allrI   r[   rP   rQ   rR   rT   rT   :   s7        !%%''H
 
 
 
 
rQ   rT   syncc                   R    e Zd Zej                                        Zd Zd Zd Z	dS )DataSourceSyncViewc                     dS )Nzcore.sync_datasourcerP   rX   s    rR   get_required_permissionz*DataSourceSyncView.get_required_permissionH   s    %%rQ   c                 p    t          | j        |          }t          |                                          S )Npk)r   rI   r   get_absolute_url)rX   rY   re   
datasources       rR   getzDataSourceSyncView.getK   s0    &t}<<<

3355666rQ   c                    t          | j        |          }t          j        ||j                  }t
          j        |_        t          j	        
                    |j                                      |j                   t          j        |t          d                              |j        |                     t#          |                                          S )Nrd   )rZ   user)statusz%Queued job #{id} to sync {datasource})idrg   )r   rI   r8   enqueuerj   r7   QUEUEDrk   rE   rF   filterre   updater   success_formatr   rf   )rX   rY   re   rg   jobs        rR   postzDataSourceSyncView.postP   s    &t}<<<
  '',OOO3:
!!Z]!33::*BS:TTT566==T^=__	
 	
 	
 
3355666rQ   N)
rB   rC   rD   rE   rF   r\   rI   rb   rh   ru   rP   rQ   rR   r_   r_   D   sU        !%%''H& & &7 7 7
7 7 7 7 7rQ   r_   editc                   N    e Zd Zej                                        Zej        Z	dS )DataSourceEditViewN)
rB   rC   rD   rE   rF   r\   rI   r5   DataSourceFormformrP   rQ   rR   rx   rx   _   s*        !%%''HDDDrQ   rx   deletec                   @    e Zd Zej                                        ZdS )DataSourceDeleteViewN)rB   rC   rD   rE   rF   r\   rI   rP   rQ   rR   r}   r}   e   s"        !%%''HHHrQ   r}   c                   N    e Zd Zej                                        Zej        Z	dS )DataSourceBulkImportViewN)
rB   rC   rD   rE   rF   r\   rI   r5   DataSourceImportForm
model_formrP   rQ   rR   r   r   j   s*        !%%''H+JJJrQ   r   c                       e Zd Zej                             eed                    Ze	j
        Zej        Zej        ZdS )DataSourceBulkEditViewr@   count_filesN)rB   rC   rD   rE   rF   rG   r/   rH   rI   r4   rJ   rK   r6   rN   rO   r5   DataSourceBulkEditFormrz   rP   rQ   rR   r   r   o   sT        !**!M(H55 +  H .I"E'DDDrQ   r   c                   t    e Zd Zej                             eed                    Ze	j
        Zej        ZdS )DataSourceBulkDeleteViewr@   r   N)rB   rC   rD   rE   rF   rG   r/   rH   rI   r4   rJ   rK   r6   rN   rO   rP   rQ   rR   r   r   x   sL        !**!M(H55 +  H .I"EEErQ   r   c                   v    e Zd Zej                            d          Zej        Z	e
j        Zej        ZddhiZdS )DataFileListViewdatabulk_deleter{   N)rB   rC   rD   rH   rF   deferrI   r4   DataFileFilterSetrK   r5   DataFileFilterFormrM   r6   DataFileTablerO   actionsrP   rQ   rR   r   r      sJ        %%f--H,I-N EzGGGrQ   r   c                   @    e Zd Zej                                        ZdS )DataFileViewNrB   rC   rD   rH   rF   r\   rI   rP   rQ   rR   r   r      "        ##%%HHHrQ   r   c                   @    e Zd Zej                                        ZdS )DataFileDeleteViewNr   rP   rQ   rR   r   r      r   rQ   r   c                   ^    e Zd Zej                            d          Zej        Z	e
j        ZdS )DataFileBulkDeleteViewr   N)rB   rC   rD   rH   rF   r   rI   r4   r   rK   r6   r   rO   rP   rQ   rR   r   r      s4        %%f--H,I EEErQ   r   c                   x    e Zd Zej                                        Zej        Z	e
j        Zej        ZdhdhdZdS )JobListViewviewr{   )exportr   N)rB   rC   rD   r   rF   r\   rI   r4   JobFilterSetrK   r5   JobFilterFormrM   r6   JobTablerO   r   rP   rQ   rR   r   r      sL        {  H'I(NOE( z GGGrQ   r   c                   @    e Zd Zej                                        ZdS )JobViewNrB   rC   rD   r   rF   r\   rI   rP   rQ   rR   r   r              {  HHHrQ   r   c                   @    e Zd Zej                                        ZdS )JobDeleteViewNr   rP   rQ   rR   r   r      r   rQ   r   c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )JobBulkDeleteViewN)rB   rC   rD   r   rF   r\   rI   r4   r   rK   r6   r   rO   rP   rQ   rR   r   r      s.        {  H'IOEEErQ   r   c                   x    e Zd Zej                                        Zej        Z	e
j        Zej        ZdZddhiZdS )ObjectChangeListViewzcore/objectchange_list.htmlr   r   N)rB   rC   rD   ObjectChangerF   valid_modelsrI   r4   ObjectChangeFilterSetrK   r5   ObjectChangeFilterFormrM   r6   ObjectChangeTablerO   template_namer   rP   rQ   rR   r   r      sM        #0022H0I1N$E1M6(GGGrQ   r   c                   F    e Zd Zej                                        Zd ZdS )ObjectChangeViewc                    t           j                                                            |j        d                              |j                                      |j                  }t          j
        |d d         d          }t           j                                                            |j        d                              |j        |j                  }|                    |j                                      d	                                          }|                    |j        
                              d                                          }|j        s|j        dv r|r
d}|j        n	d}|j        rN|j        rGt+          pt-                      |j        pt-                      dg          }	rfd|	D             ni }
nd }	d }
|	|
||||                                |dS )Nr   )
request_idrd   2   F)r   	orderable)changed_object_typechanged_object_id)time__gttime)time__ltz-time)rp   r{   Tlast_updated)excludec                 <    i | ]}|                     |          S rP   )rh   ).0xprechange_datas     rR   
<dictcomp>z6ObjectChangeView.get_extra_context.<locals>.<dictcomp>   s6       -.>%%a((  rQ   )
diff_addeddiff_removednext_changeprev_changerelated_changes_tablerelated_changes_countnon_atomic_change)r   rF   r   restrictrj   ro   r   r   re   r6   r   r   r   r   order_byfirstr   actionpostchange_data_cleanprechange_data_cleanpostchange_datar+   dictcount)rX   rY   rZ   related_changesr   objectchangesr   r   r   r   r   r   s              @rR   r[   z"ObjectChangeView.get_extra_context   s<   &.;;==FFw|U[\\cc* d 
 

'{  
 
 	
 !' 8 "%!
 !
 !

 %,99;;DDW\SYZZaa ( <&8 b 
 

 $**HM*BBKKFSSYY[[#**HM*BBKKGTTZZ\\& 	;8?>R+R+RWb+R $(>NN %%:N 	 h6 	 -($&&.8$&&'(  J  (    2<   %' L JL %(&&%:%4%:%:%<%<!2
 
 	
rQ   N)rB   rC   rD   r   rF   r   rI   r[   rP   rQ   rR   r   r      s7        #0022H/
 /
 /
 /
 /
rQ   r   c                   j    e Zd Zej                                        Zej        Z	e
j        Zej        ZdS )ConfigRevisionListViewN)rB   rC   rD   ConfigRevisionrF   r\   rI   r4   ConfigRevisionFilterSetrK   r5   ConfigRevisionFilterFormrM   r6   ConfigRevisionTablerO   rP   rQ   rR   r   r     s:        %))++H2I3N&EEErQ   r   c                   @    e Zd Zej                                        ZdS )ConfigRevisionViewNrB   rC   rD   r   rF   r\   rI   rP   rQ   rR   r   r     "        %))++HHHrQ   r   c                   N    e Zd Zej                                        Zej        Z	dS )ConfigRevisionEditViewN)
rB   rC   rD   r   rF   r\   rI   r5   ConfigRevisionFormrz   rP   rQ   rR   r   r     s*        %))++H#DDDrQ   r   c                   @    e Zd Zej                                        ZdS )ConfigRevisionDeleteViewNr   rP   rQ   rR   r   r     r   rQ   r   c                   \    e Zd Zej                                        Zej        Z	e
j        ZdS )ConfigRevisionBulkDeleteViewN)rB   rC   rD   r   rF   r\   rI   r4   r   rK   r6   r   rO   rP   rQ   rR   r   r     s2        %))++H2I&EEErQ   r   c                        e Zd Zd Zd Zd ZdS )ConfigRevisionRestoreViewc                     dS )Ncore.configrevision_editrP   ra   s    rR   rb   z1ConfigRevisionRestoreView.get_required_permission"  s    ))rQ   c           	         t          t          |          }t                      j        }t          j                            |                                          }g }t          D ]_}|                    |j	        |r |j
                            |j	        d           nd |j
                            |j	        d           f           `t          |d||d          S )Nrd   z core/configrevision_restore.html)objectparams)r   r   r&   versionrF   ro   r   r'   appendnamer   rh   r   )rX   rY   re   candidate_configconfig_versioncurrent_configr   params           rR   rh   zConfigRevisionRestoreView.get%  s    ,^CCC $-'/66.6IIOOQQ 	 	EMM
=KU#''
D999QU %))%*d;;     gA&D
 D
   	rQ   c                 T   |j                             d          st                      S t          t          |          }|                                 t          j        |t          d          	                    |                     t          |                                          S )Nr   rd   z%Restored configuration revision #{id}rl   )rj   has_permr   r   r   activater   rq   rr   rs   r   rf   )rX   rY   re   r   s       rR   ru   zConfigRevisionRestoreView.post9  s    |$$%?@@ 	+(***,^CCC!!###!$K"L"L"S"SWY"S"Z"Z[[[(99;;<<<rQ   N)rB   rC   rD   rb   rh   ru   rP   rQ   rR   r   r      sA        * * *  (= = = = =rQ   r   c                       e Zd Zd ZdS )
BaseRQViewc                 $    | j         j        j        S NrY   rj   is_staffra   s    rR   	test_funczBaseRQView.test_funcJ      | ))rQ   N)rB   rC   rD   r   rP   rQ   rR   r   r   H  s#        * * * * *rQ   r   c                   "    e Zd Zej        Zd ZdS )BackgroundQueueListViewc                     t          d          d         }|                     ||d          }t          |dd|i          S )NT)run_maintenance_tasksqueuesF)bulk_actionszcore/rq_queue_list.htmlrO   )r   	get_tabler   )rX   rY   r   rO   s       rR   rh   zBackgroundQueueListView.getQ  sO    D999(CtW5AAg8U;
   	rQ   N)rB   rC   rD   r6   BackgroundQueueTablerO   rh   rP   rQ   rR   r  r  N  s+        'E    rQ   r  c                   (    e Zd Zej        Zd Zd ZdS )BackgroundTaskListViewc           
         g }|t           j        k    r|                                S 	 t           j        t          t           j        t          t           j        t          t           j	        t          t           j        t          i|         }n# t          $ r t          w xY w ||j        |j                  }|                                }|t           j        k    rt          |||          }nJ|D ]G}	 |                    t'          j        ||j        |j                             8# t,          $ r Y Dw xY w|r/|t           j        k    r|D ]}	|                    |	          |	_        |S )Nr   
serializer)RQJobStatusrn   r   STARTEDr#   DEFERREDr   FINISHEDr!   FAILEDr    	SCHEDULEDr"   KeyErrorr   r   r   get_job_idsr   RQ_Jobfetchr  r   get_scheduled_timescheduled_at)
rX   rY   queuerk   jobsregistry_clsregistryjob_idsjob_idrt   s
             rR   get_table_dataz%BackgroundTaskListView.get_table_data]  s    ['''>>###		#%7$&9$&9"$5%'; LL  	 	 	M	<
E,<==&&(([)))E7H55DD "  KKV@P]b]m n n noooo%   D  	DFk333 D D#+#>#>s#C#C  s   AB B,4D!!
D.-D.c                     t          |          }|                     |||          }|                     ||d          }t          |          rt	          |dd|i          S t	          |d|||d          S )NFhtmx/table.htmlrO   zcore/rq_task_list.html)rO   r  rk   )r   r  r  r-   r   )rX   rY   queue_indexrk   r  r   rO   s          rR   rh   zBackgroundTaskListView.get  s    ";//""7E6::tWe44    	'#47    g7:
 :
   	rQ   N)rB   rC   rD   r6   BackgroundTaskTablerO   r  rh   rP   rQ   rR   r	  r	  Z  s;        &E# # #J    rQ   r	  c                       e Zd Zd ZdS )BackgroundTaskViewc           
         t           d         }	 t          j        |t          |d                             }n># t          $ r1 t          t          d                              |                    w xY wt          |j	                 }t          |          }	 |j        }n# t          $ r d }Y nw xY wt          |d||||j        |d          S )Nr   connection_configr   Job {job_id} not foundr  zcore/rq_task.html)r  rt   r"  dependency_idexc_info)r   r  r  r   r   r   rr   rs   r   originr   	_exc_infoAttributeErrorr   _dependency_id)rX   rY   r  configrt   r"  r  r,  s           rR   rh   zBackgroundTaskView.get  s    Q	M,v2FvNaGb2c2ceeeCC 	M 	M 	M!455<<F<KKLLL	M !,";//	}HH 	 	 	HHH	 g2& / 5
 5
   	s   )9 ;A4B! !B0/B0NrB   rC   rD   rh   rP   rQ   rR   r%  r%    s#            rQ   r%  c                       e Zd Zd Zd ZdS )BackgroundTaskDeleteViewc                     |j         st          t          d                    S t          |j                  }t          |dd||t          dd|i          d          S )	Ncore:background_queue_list)initialzhtmx/delete_form.htmlzbackground taskzcore:background_task_deleter  )kwargs)object_typer   rz   form_url)htmxr   r   r,   GETr   )rX   rY   r  rz   s       rR   rh   zBackgroundTaskDeleteView.get  sw    | 	CG$@AABBB444g6, =xQWFXYYY	9
 9
   	rQ   c                     t          |j                  }|                                rt          d         }	 t	          j        |t          |d                             }n># t          $ r1 t          t          d          
                    |                    w xY wt          |j                 }t          |          }|j                            |j        d|j                   |                                 t'          j        |t          d          
                    |                     nBt'          j        |t          d          
                    ||j        d         	                     t/          t1          d
                    S )Nr   r'  r(  r)  r*  zJob {id} has been deleted.r   z Error deleting job {id}: {error})rl   errorr6  )r,   POSTis_validr   r  r  r   r   r   rr   rs   r   r-  r   r   lremkeyrl   r{   r   rq   r>  errorsr   r   )rX   rY   r  rz   r1  rt   r"  r  s           rR   ru   zBackgroundTaskDeleteView.post  sg   --==?? 	s ^FQl66J6ReKf6g6giii! Q Q Qa 899@@@OOPPPQ %SZ0K&{33E !!%)Q777JJLLLWa(D&E&E&L&LPV&L&W&WXXXXN7A&H$I$I$P$PTZbfbmnobp$P$q$qrrr <==>>>s   )A" ";BN)rB   rC   rD   rh   ru   rP   rQ   rR   r4  r4    s2          ? ? ? ? ?rQ   r4  c                       e Zd Zd ZdS )BackgroundTaskRequeueViewc                    t           d         }	 t          j        |t          |d                             }n># t          $ r1 t          t          d                              |                    w xY wt          |j	                 }t          |          }t          ||j        |j                   t          j        |t          d                              |                     t!          t#          d|g	                    S )
Nr   r'  r(  Job {id} not found.r   r  zJob {id} has been re-enqueued.core:background_taskargs)r   r  r  r   r   r   rr   rs   r   r-  r   r   r   r  r   rq   r   r   )rX   rY   r  r1  rt   r"  r  s          rR   rh   zBackgroundTaskRequeueView.get  s    Q	F,v2FvNaGb2c2ceeeCC 	F 	F 	F!12299V9DDEEE	F !,";//Fu'7EDTUUUU!$D"E"E"L"LPV"L"W"WXXX 6fXFFFGGG	   )9 ;A4Nr2  rP   rQ   rR   rE  rE    s(        H H H H HrQ   rE  c                       e Zd Zd ZdS )BackgroundTaskEnqueueViewc                 <   t           d         }	 t          j        |t          |d                             }n># t          $ r1 t          t          d                              |                    w xY wt          |j	                 }t          |          }	 |                    |           n%# t          $ r |                    |           Y nw xY w|                                t          j        k    r0t#          |j        |j                  }|                    |           n|                                t          j        k    r0t-          |j        |j                  }|                    |           nQ|                                t          j        k    r/t1          |j        |j                  }|                    |           t3          j        |t          d                              |                     t7          t9          d|g                    S )	Nr   r'  r(  rG  r   zJob {id} has been enqueued.rH  rI  )r   r  r  r   r   r   rr   rs   r   r-  r   _enqueue_jobr/  enqueue_job
get_statusr  r  r   r   r   remover  r!   r  r"   r   rq   r   r   )rX   rY   r  r1  rt   r"  r  r  s           rR   rh   zBackgroundTaskEnqueueView.get  s   Q	F,v2FvNaGb2c2ceeeCC 	F 	F 	F!12299V9DDEEE	F !,";//	# s#### 	# 	# 	#c"""""	# >>{333*5:u7GHHHOOC    ^^!555*5:u7GHHHOOC    ^^!666+EJ8HIIHOOC   !$A"B"B"I"IV"I"T"TUUU 6fXFFFGGGs   )9 ;A4B/ /CCNr2  rP   rQ   rR   rM  rM    s(        H H H H HrQ   rM  c                       e Zd Zd ZdS )BackgroundTaskStopViewc                    t           d         }	 t          j        |t          |d                             }n># t          $ r1 t          t          d                              |                    w xY wt          |j	                 }t          |          }t          ||          d         }t          |          dk    r7t          j        |t          d                              |                     n6t          j        |t          d	                              |                     t!          t#          d
|g                    S )Nr   r'  r(  r)  r*  r3   zJob {id} has been stopped.r   zFailed to stop job {id}rH  rI  )r   r  r  r   r   r   rr   rs   r   r-  r   r   lenr   rq   r>  r   r   )rX   rY   r  r1  rt   r"  r  stopped_jobss           rR   rh   zBackgroundTaskStopView.get  s:   Q	M,v2FvNaGb2c2ceeeCC 	M 	M 	M!455<<F<KKLLL	M !,";// //2|!!Wa(D&E&E&L&LPV&L&W&WXXXXN7A&?$@$@$G$G6$G$R$RSSS 6fXFFFGGGrK  Nr2  rP   rQ   rR   rT  rT    s(        H H H H HrQ   rT  c                   (    e Zd Zej        Zd Zd ZdS )WorkerListViewc                 t    t                     t          j        j                  }fd|D             }|S )Nc                 J    g | ]}j         |                                v | S rP   )r   queue_names)r   workerr  s     rR   
<listcomp>z1WorkerListView.get_table_data.<locals>.<listcomp>'  s1    ZZZfuzVEWEWEYEY7Y7Y67Y7Y7YrQ   )r%   r$   r\   r   )rX   rY   r  all_workersworkerss     `  rR   r  zWorkerListView.get_table_data$  sA    e$$$j!122ZZZZZZZrQ   c                 T   t          |          }|                     ||          }|                     ||d          }t          |          rJ|j        j        s*d|_        d|j        v r|j        	                    d           t          |d||d          S t          |d||d          S )NFTre   r!  )rO   r  zcore/rq_worker_list.html)r   r  r  r-   r;  targetembeddedbase_columnscolumnshider   )rX   rY   r"  r  r   rO   s         rR   rh   zWorkerListView.get*  s    ";//""7E22tWe44    		<& -!%5---M&&t,,,'#47 7   
 g9<
 <
   	rQ   N)rB   rC   rD   r6   WorkerTablerO   r  rh   rP   rQ   rR   rY  rY  !  s:        E      rQ   rY  c                       e Zd Zd ZdS )
WorkerViewc                     t           d         }t          j        d|z   t          |d                             }|j        dz  |_        t          |d||                                |j        dz  d          S )Nr   z
rq:worker:r'  r(  i  zcore/rq_worker.html)r]  rt   total_working_time)r   r$   find_by_keyr   rk  r   get_current_job)rX   rY   rB  r1  r]  s        rR   rh   zWorkerView.getD  s    Q#L3$6CWX^_rXsCtCtuuu$*$=$D!g4))++"(";d"B7
 7
   	rQ   Nr2  rP   rQ   rR   ri  ri  B  s#            rQ   ri  c                       e Zd Zd Zd ZdS )
SystemViewc                 $    | j         j        j        S r   r   ra   s    rR   r   zSystemView.test_funcX  r   rQ   c                    
 d x}x}}	 t          j                    5 }|                    d           |                                d         }|                    d          d                                         }|                    d           |                                d         }|                    d| d           |                                d         }d d d            n# 1 swxY w Y   n# t          t          f$ r Y nw xY wt          j	        t          t          j                    |||t          j        t          d                    d}	 t           j                            t'          j        d	          
          
n## t           j        $ r t+                      
Y nw xY wd|j        v r|d                                         |d<   d t0          D             }i |t          j        
fdt5          |          D             d}t7          t9          j        |t<          d          d          }	d|	d<   |	S t?          
d          r-
j         r&t9          j        
j         t<          d          
_         tC          |d|
d          S )NzSELECT version()r   (zSELECT current_database()z(SELECT pg_size_pretty(pg_database_size('z'))default)netbox_releasedjango_versionpython_versionpostgresql_versiondatabase_namedatabase_sizerq_worker_countr   rd   r   rt  c                     g | ]	}|j         
S rP   r   )r   r   s     rR   r^  z"SystemView.get.<locals>.<listcomp>~  s    555Uej555rQ   c                 2    i | ]}|t          |          S rP   )getattr)r   kr1  s     rR   r   z"SystemView.get.<locals>.<dictcomp>  s2       ./Awvq))  rQ   )pluginsr1     )clsindentz	text/json)content_typez"attachment; filename="netbox.json"zContent-DispositionCUSTOM_VALIDATORSzcore/system.html)statsr1  )"r   cursorexecutefetchonesplitstripr	   
IndexErrorr   RELEASEDJANGO_VERSIONplatformrv  r$   r   r   r   rF   rh   r   DoesNotExistr&   r<  asdictr'   PLUGINSsortedr
   jsondumpsr.   hasattrr  r   )rX   rY   psql_versiondb_namedb_sizer  r  r   r   responser1  s             @rR   rh   zSystemView.get[  s
    ,0//w
	"$$ /1222%003+11#66q9??AA:;;; //++A.V'VVVWWW //++A./ / / / / / / / / / / / / / / !*- 	 	 	D	 '.,&577".$$%|N9,E,EFF
 
	"#+//59=M3N3N/OOFF* 	" 	" 	"\\FFF	"
 w{""&+,<&=&D&D&F&FE"#55f555F#+   39&>>    D $DJt9JST$U$U$UdopppH.RH*+O 6.// 	mF4L 	m'+z&2JPajk'l'l'lF$g14
 4
   	sG   C3 B?C'C3 'C++C3 .C+/C3 3DD2F F'&F'N)rB   rC   rD   r   rh   rP   rQ   rR   ro  ro  V  s2        * * *6 6 6 6 6rQ   ro  c                       e Zd ZdZd Zd ZdS )BasePluginViewzplugins-catalog-errorc                 $    | j         j        j        S r   r   ra   s    rR   r   zBasePluginView.test_func  r   rQ   c                     i }t          j        | j        d          }|sMt                      }|s=t          j        | j        dd           t          j        |t          d                     t          |          S )NF)rs  Ti,  z#Plugins catalog could not be loaded)	r   rh   CACHE_KEY_CATALOG_ERRORr:   setr   warningrr   r;   )rX   rY   catalog_pluginscatalog_plugins_errors       rR   get_cached_pluginsz!BasePluginView.get_cached_plugins  s~     %	$*FPU V V V$ 	T133O" T	$6cBBB !,Q*R*RSSS 111rQ   N)rB   rC   rD   r  r   r  rP   rQ   rR   r  r    s8        5* * *
2 
2 
2 
2 
2rQ   r  c                       e Zd Zd ZdS )PluginListViewc                 h   |j                             dd           |                     |                                          }rfd|D             }t	          ||j                  }|                    |           t          |          rt          |dd|i          S t          |dd|i          S )Nqc                 n    g | ]1}                                 |j                                         v /|2S rP   )casefoldtitle_short)r   objr  s     rR   r^  z&PluginListView.get.<locals>.<listcomp>  s9    \\\sAYAYA[A[1[1[s1[1[1[rQ   rj   r!  rO   zcore/plugin_list.html)	r<  rh   r  valuesr<   rj   	configurer-   r   )rX   rY   r  rO   r  s       @rR   rh   zPluginListView.get  s    KOOC&&))'2299;; 	]\\\\g\\\G"7>>>       	'#47    g6U9
   	rQ   Nr2  rP   rQ   rR   r  r    s#            rQ   r  c                       e Zd Zd ZdS )
PluginViewc                 ,   |                      |          }||vr0t          t          d                              |                    ||         }t	          |j        |j                  }|                    |           t          |d||d          S )NzPlugin {name} not foundr|  r  zcore/plugin.html)pluginrO   )	r  r   rr   rs   r=   release_recent_historyrj   r  r   )rX   rY   r   r  r  rO   s         rR   rh   zPluginView.get  s    ))'22w!566==4=HHIII"6#@w|TTT   g14
 4
   	rQ   Nr2  rP   rQ   rR   r  r    s#            rQ   r  )r  r  djangor   r  django.confr   django.contribr   django.contrib.auth.mixinsr   django.core.cacher   	django.dbr   r	   django.httpr
   r   r   django.shortcutsr   r   r   django.urlsr   django.utils.translationr   rr   django.views.genericr   django_rq.queuesr   r   r   django_rq.settingsr   r   django_rq.utilsr   r   r   rqr   rq.exceptionsr   rq.jobr   r  r   r  rq.registryr   r    r!   r"   r#   	rq.workerr$   rq.worker_registrationr%   netbox.configr&   r'   netbox.viewsr(   netbox.views.generic.baser)   netbox.views.generic.mixinsr*   utilities.datar+   utilities.formsr,   utilities.htmxr-   utilities.jsonr.   utilities.queryr/   utilities.viewsr0   r1   r2    r4   r5   r6   choicesr7   r  r8   modelsr  r:   r;   r<   r=   ObjectListViewr?   rE   
ObjectViewrT   r_   ObjectEditViewrx   ObjectDeleteViewr}   BulkImportViewr   BulkEditViewr   BulkDeleteViewr   r   rH   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r	  r%  r4  rE  rM  rT  rY  ri  ro  r  r  r  rP   rQ   rR   <module>r     s
     0 0 0 0 0 0             # # # # # # : : : : : : # # # # # # 2 2 2 2 2 2 2 2 D D D D D D D D D D @ @ @ @ @ @ @ @ @ @       6 6 6 6 6 6 % % % % % % U U U U U U U U U U 6 6 6 6 6 6 6 6 ? ? ? ? ? ? ? ? ? ?       ( ( ( ( ( ( : : : : : : : :                    8 8 8 8 8 8 , , , , , , , ,             4 4 4 4 4 4 2 2 2 2 2 2 / / / / / / , , , , , , ' ' ' ' ' ' , , , , , , ) ) ) ) ) ) j j j j j j j j j j ' ' ' ' ' ' ' ' ' ' , , , , , , # # # # # #     ; ; ; ; ; ; ; ; : : : : : : : :# # # # #/ # # # Z  
 
 
 
 
*G,> 
 
 ! 
 Z((7 7 7 7 7 7 7 )(74 Z((         /     )( 
 Z**( ( ( ( (73 ( ( +*(, , , , ,w5 , , ,
( ( ( ( (W1 ( ( (# # # # #w5 # # #    w-    X& & & & &7% & & & Xx((& & & & &1 & & )(&! ! ! ! !W3 ! ! !    '(   ! ! ! ! !g  ! ! !! ! ! ! !G, ! ! !    .       71    \""2
 2
 2
 2
 2
w) 2
 2
 #"2
r' ' ' ' 'W3 ' ' ' ^$$, , , , ,+ , , %$,$ $ $ $ $W3 $ $ $
 ^X.., , , , ,w7 , , /.,' ' ' ' '7#9 ' ' '!= != != != != BD != != !=P* * * * *$d * * *	 	 	 	 	j* 	 	 	7 7 7 7 7Z 7 7 7t       6$? $? $? $? $?z $? $? $?NH H H H H
 H H H$ H  H  H  H  H
  H  H  HFH H H H HZ H H H,    Z   B       (; ; ; ; ;$d ; ; ;D2 2 2 2 2($ 2 2 2&    ^   .         rQ   