B
    CVvgâ@  ã               @   sÎ  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 d dl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mZmZ d dl m!Z! d dl"m#Z# d dl$m%Z%m&Z&m'Z'm(Z( d dl)m*Z+ d dl,m-Z- ddlm.Z. dZ/G dd„ de-ƒZ0G dd„ de0ƒZ1G dd„ de0ƒZ2G dd„ de0ƒZ3G d d!„ d!e0ƒZ4G d"d#„ d#e0ƒZ5G d$d%„ d%e0ƒZ6G d&d'„ d'e0ƒZ7G d(d)„ d)e0ƒZ8d*d+„ Z9d,d-„ Z:d3d/d0„Z;d1d2„ Z<dS )4é    N)Úimport_module)Úcleandoc)ÚPath)Úapps)Úsettings)Úadmin)Ústaff_member_required)Úutils)Úreplace_named_groupsÚreplace_unnamed_groups)ÚImproperlyConfiguredÚViewDoesNotExist)Úmodels)ÚHttp404)ÚEngine)Úget_mod_funcÚget_resolverÚget_urlconf)Ú	safe_join)Úmethod_decorator)Úfunc_accepts_kwargsÚfunc_accepts_var_argsÚget_func_full_argsÚmethod_has_no_args)Úgettext)ÚTemplateViewé   )Úget_view_name)Ú_Zadd_ÚdeleteÚsaveÚset_c                   s4   e Zd ZdZeeƒ‡ fdd„ƒZ‡ fdd„Z‡  ZS )ÚBaseAdminDocsViewz(
    Base view for admindocs views.
    c                s2   t jsd| _|  tj |¡¡S tƒ j|f|ž|ŽS )Nzadmin_doc/missing_docutils.html)	r	   Zdocutils_is_availableÚtemplate_nameZrender_to_responser   ÚsiteÚeach_contextÚsuperÚdispatch)ÚselfÚrequestÚargsÚkwargs)Ú	__class__© úB/tmp/pip-install-o3oxmrkh/Django/django/contrib/admindocs/views.pyr'   &   s    zBaseAdminDocsView.dispatchc                s   t ƒ jf |tj | j¡–ŽS )N)r&   Úget_context_datar   r$   r%   r)   )r(   r+   )r,   r-   r.   r/   .   s    z"BaseAdminDocsView.get_context_data)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r'   r/   Ú__classcell__r-   r-   )r,   r.   r"   "   s   r"   c               @   s   e Zd ZdZdS )ÚBookmarkletsViewzadmin_doc/bookmarklets.htmlN)r0   r1   r2   r#   r-   r-   r-   r.   r5   5   s   r5   c                   s    e Zd ZdZ‡ fdd„Z‡  ZS )ÚTemplateTagIndexViewz!admin_doc/template_tag_index.htmlc          
      s  g }yt  ¡ }W n tk
r$   Y näX t|j ¡ ƒ}dd„ |jD ƒ}xÂ|| D ]¶\}}x¬|j ¡ D ]ž\}}	t 	|	j
¡\}
}}|
o”t |
dtdƒ| ¡}
|o®t |dtdƒ| ¡}x*|D ]"}t || dtdƒ| ¡||< q¶W | d¡d }| ||
|||dœ¡ qbW qNW tƒ jf |d|i–ŽS )	Nc             S   s   g | ]}d |f‘qS )Ú r-   )Ú.0Úlibr-   r-   r.   ú
<listcomp>E   s    z9TemplateTagIndexView.get_context_data.<locals>.<listcomp>Útagztag:Ú.éÿÿÿÿ)ÚnameÚtitleÚbodyÚmetaÚlibraryÚtags)r   Úget_defaultr   ÚsortedÚtemplate_librariesÚitemsÚtemplate_builtinsrC   r	   Úparse_docstringr3   Ú	parse_rstr   ÚsplitÚappendr&   r/   )r(   r+   rC   ÚengineÚapp_libsÚbuiltin_libsÚmodule_namerB   Ztag_nameZtag_funcr?   r@   ÚmetadataÚkeyÚtag_library)r,   r-   r.   r/   <   s,    
"z%TemplateTagIndexView.get_context_data)r0   r1   r2   r#   r/   r4   r-   r-   )r,   r.   r6   9   s   r6   c                   s    e Zd ZdZ‡ fdd„Z‡  ZS )ÚTemplateFilterIndexViewz$admin_doc/template_filter_index.htmlc          
      s  g }yt  ¡ }W n tk
r$   Y näX t|j ¡ ƒ}dd„ |jD ƒ}xÂ|| D ]¶\}}x¬|j ¡ D ]ž\}}	t 	|	j
¡\}
}}|
o”t |
dtdƒ| ¡}
|o®t |dtdƒ| ¡}x*|D ]"}t || dtdƒ| ¡||< q¶W | d¡d }| ||
|||dœ¡ qbW qNW tƒ jf |d|i–ŽS )	Nc             S   s   g | ]}d |f‘qS )r7   r-   )r8   r9   r-   r-   r.   r:   d   s    z<TemplateFilterIndexView.get_context_data.<locals>.<listcomp>Úfilterzfilter:r<   r=   )r>   r?   r@   rA   rB   Úfilters)r   rD   r   rE   rF   rG   rH   rV   r	   rI   r3   rJ   r   rK   rL   r&   r/   )r(   r+   rV   rM   rN   rO   rP   rB   Zfilter_nameZfilter_funcr?   r@   rQ   rR   rS   )r,   r-   r.   r/   [   s,    
"z(TemplateFilterIndexView.get_context_data)r0   r1   r2   r#   r/   r4   r-   r-   )r,   r.   rT   X   s   rT   c                   s    e Zd ZdZ‡ fdd„Z‡  ZS )ÚViewIndexViewzadmin_doc/view_index.htmlc       	   	      s„   g }t tjƒ}t|jƒ}xT|D ]L\}}}}| t|ƒt|ƒd |pDg |rN|gpPg  ¡d |p^g ¡|dœ¡ qW t	ƒ j
f |d|i–ŽS )Nú:)Z	full_nameÚurlZurl_nameÚ	namespacer>   Úviews)r   r   ZROOT_URLCONFÚextract_views_from_urlpatternsÚurlpatternsrL   r   Úsimplify_regexÚjoinr&   r/   )	r(   r+   r[   ÚurlconfZview_functionsÚfuncÚregexrZ   r>   )r,   r-   r.   r/   z   s    

zViewIndexView.get_context_data)r0   r1   r2   r#   r/   r4   r-   r-   )r,   r.   rW   w   s   rW   c                   s,   e Zd ZdZedd„ ƒZ‡ fdd„Z‡  ZS )ÚViewDetailViewzadmin_doc/view_detail.htmlc             C   sd   t ƒ }t|ƒ | ¡r`t| ƒ\}}ytt|ƒ|ƒS  tk
r^   t|ƒ\}}ttt|ƒ|ƒ|ƒS X d S )N)r   r   Z_is_callbackr   Úgetattrr   ÚImportError)Úviewr`   Úmodra   Úklassr-   r-   r.   Ú_get_view_funcŒ   s    zViewDetailView._get_view_funcc                s®   | j d }|  |¡}|d kr t‚t |j¡\}}}|oJt |dtdƒ| ¡}|odt |dtdƒ| ¡}x*|D ]"}t || dtdƒ| ¡||< qlW tƒ j	f |||||dœ–ŽS )Nrf   zview:Úmodel)r>   Úsummaryr@   rA   )
r+   ri   r   r	   rI   r3   rJ   r   r&   r/   )r(   r+   rf   Z	view_funcr?   r@   rQ   rR   )r,   r-   r.   r/   �   s    


"zViewDetailView.get_context_data)r0   r1   r2   r#   Ústaticmethodri   r/   r4   r-   r-   )r,   r.   rc   ‰   s   rc   c                   s    e Zd ZdZ‡ fdd„Z‡  ZS )ÚModelIndexViewzadmin_doc/model_index.htmlc                s(   dd„ t  ¡ D ƒ}tƒ jf |d|i–ŽS )Nc             S   s   g | ]
}|j ‘qS r-   )Ú_meta)r8   Úmr-   r-   r.   r:   ´   s    z3ModelIndexView.get_context_data.<locals>.<listcomp>r   )r   Z
get_modelsr&   r/   )r(   r+   Zm_list)r,   r-   r.   r/   ³   s    zModelIndexView.get_context_data)r0   r1   r2   r#   r/   r4   r-   r-   )r,   r.   rm   °   s   rm   c                   s    e Zd ZdZ‡ fdd„Z‡  ZS )ÚModelDetailViewzadmin_doc/model_detail.htmlc                sì  | j d }yt | j d ¡}W n& tk
rD   ttdƒ| j  ƒ‚Y nX y| |¡}W n& tk
rz   ttdƒ| j  ƒ‚Y nX |j}t 	|j
¡\}}}|o¬t |dtdƒ| ¡}|oÆt |dtdƒ| ¡}g }	x„|jD ]z}
t|
tjƒ�r"|
jjj}|
jjjj}t tdƒ||dœ dtdƒ| ¡}nt|
ƒ}|
j}|	 |
j||�pBd	|
jd
œ¡ qÔW x |jD ]–}
|
jjj}|
jjjj}tdƒ||dœ }|	 d|
j dt tdƒ| dtdƒ|j ¡dœ¡ |	 d|
j dt tdƒ| dtdƒ|j ¡dœ¡ �qZW g }�x4|j ¡ D �]$\}}t |¡�s(t|tƒ�ry$xt D ]}| !|¡�r0t"‚�q0W W n t"k
�rf   �wY nX |j
}|�oŽt t#|ƒdtdƒ|j ¡}t|tƒ�rº|	 |t$|ƒ|�p°d	dœ¡ npt%|ƒ�röt&|ƒ�söt'|ƒ�sö|	 |t$|ƒ|�pìd	dœ¡ n4t(|ƒ}d )dd„ |D ƒ¡}| |||�p"d	dœ¡ �qW xš|j*D ]�}tdƒ|j+jj|j+jj,dœ }| -¡ }|	 d| dt tdƒ| dtdƒ|j ¡dœ¡ |	 d| dt tdƒ| dtdƒ|j ¡dœ¡ �q8W t.ƒ j/f ||j0|||	|dœ–ŽS )NÚ
model_nameÚ	app_labelzApp %(app_label)r not foundz3Model %(model_name)r not found in app %(app_label)rrj   zmodel:z0the related `%(app_label)s.%(data_type)s` object)rr   Ú	data_typer7   )r>   rs   ÚverboseÚ	help_textz/related `%(app_label)s.%(object_name)s` objects)rr   Úobject_namez%s.allÚListzall %s)r>   rs   rt   z%s.countÚIntegerznumber of %sz, c          
   S   s.   g | ]&}d   |d ftt|dd… ƒ•¡‘qS )ú=r   r   N)r_   ÚmapÚrepr)r8   Zarg_elr-   r-   r.   r:     s   z4ModelDetailView.get_context_data.<locals>.<listcomp>)r>   Ú	argumentsrt   )r>   rk   ÚdescriptionÚfieldsÚmethods)1r+   r   Zget_app_configÚLookupErrorr   r   Z	get_modelrn   r	   rI   r3   rJ   r~   Ú
isinstancer   Z
ForeignKeyZremote_fieldrj   r0   rr   Úget_readable_field_data_typeZverbose_namerL   r>   ru   Zmany_to_manyrq   Ú__dict__rG   ÚinspectÚ
isfunctionÚpropertyÚMODEL_METHODS_EXCLUDEÚ
startswithÚStopIterationr   Úget_return_data_typer   r   r   r   r_   Zrelated_objectsZrelated_modelrv   Zget_accessor_namer&   r/   Úlabel)r(   r+   rq   Z
app_configrj   Úoptsr?   r@   rQ   r~   Úfieldrs   rr   rt   r   Ú	func_namera   Úexcluder|   Úprint_argumentsÚrelZaccessor)r,   r-   r.   r/   »   s¼    




&,


&,z ModelDetailView.get_context_data)r0   r1   r2   r#   r/   r4   r-   r-   )r,   r.   rp   ¸   s   rp   c                   s    e Zd ZdZ‡ fdd„Z‡  ZS )ÚTemplateDetailViewzadmin_doc/template_detail.htmlc       	         sœ   | j d }g }yt ¡ }W n tk
r.   Y nVX xRt|jƒD ]D\}}tt||ƒƒ}| ¡ rd| 	¡ }nd}| 
|| ¡ ||dœ¡ q<W tƒ jf |||dœ–ŽS )NÚtemplater7   )ÚfileÚexistsÚcontentsÚorder)r>   Ú	templates)r+   r   rD   r   Ú	enumerateÚdirsr   r   r•   Z	read_textrL   r&   r/   )	r(   r+   r“   r˜   Zdefault_engineÚindexÚ	directoryZtemplate_fileZtemplate_contents)r,   r-   r.   r/   B  s(    

z#TemplateDetailView.get_context_data)r0   r1   r2   r#   r/   r4   r-   r-   )r,   r.   r’   ?  s   r’   c             C   s*   |   d¡r&|  d¡rdS |  d¡r&dS dS )z9Return a somewhat-helpful data type given a function nameÚget_Z_listrw   Ú_countrx   r7   )rˆ   Úendswith)rŽ   r-   r-   r.   rŠ   d  s    


rŠ   c             C   s   | j | j S )zÑ
    Return the description for a given field type, if it exists. Fields'
    descriptions can contain format strings, which will be interpolated with
    the values of field.__dict__ before being output.
    )r}   rƒ   )r�   r-   r-   r.   r‚   n  s    r‚   r7   c          	   C   sÎ   g }xÄ| D ]¼}t |dƒrny
|j}W n tk
r8   w
Y nX | t||t|jƒ |pTg |jrb|jgpdg  ƒ¡ q
t |dƒr¶y$| |j	|t|jƒ ||j
f¡ W qÆ tk
r²   w
Y qÆX q
ttdƒ| ƒ‚q
W |S )z…
    Return a list of views from a list of urlpatterns.

    Each object in the returned list is a two-tuple: (view_func, regex)
    Úurl_patternsÚcallbackz,%s does not appear to be a urlpattern object)Úhasattrr    re   Úextendr\   ÚstrÚpatternrZ   rL   r¡   r>   r   Ú	TypeErrorr   )r]   ÚbaserZ   r[   ÚpÚpatternsr-   r-   r.   r\   w  s$    


 
$
r\   c             C   sB   t | ƒ} t| ƒ} |  dd¡ dd¡ dd¡} |  d¡s>d|  } | S )zÎ
    Clean up urlpattern regexes into something more readable by humans. For
    example, turn "^(?P<sport_slug>\w+)/athletes/(?P<athlete_slug>\w+)/$"
    into "/<sport_slug>/athletes/<athlete_slug>/".
    ú^r7   ú$ú?ú/)r
   r   Úreplacerˆ   )r¥   r-   r-   r.   r^   “  s    
r^   )r7   N)=r„   Ú	importlibr   r   Zpathlibr   Zdjango.appsr   Zdjango.confr   Zdjango.contribr   Z%django.contrib.admin.views.decoratorsr   Zdjango.contrib.admindocsr	   Zdjango.contrib.admindocs.utilsr
   r   Zdjango.core.exceptionsr   r   Z	django.dbr   Zdjango.httpr   Zdjango.template.enginer   Zdjango.urlsr   r   r   Zdjango.utils._osr   Zdjango.utils.decoratorsr   Zdjango.utils.inspectr   r   r   r   Zdjango.utils.translationr   r   Zdjango.views.genericr   r   r‡   r"   r5   r6   rT   rW   rc   rm   rp   r’   rŠ   r‚   r\   r^   r-   r-   r-   r.   Ú<module>   sF   ' %
	
