a
    YÒOcá5  ã                   @   sî   d dl 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 d dlmZ d dlmZ d d	lmZ zd dlZW n eyš   dZY n0 d d
lmZmZ e  d¡ZG dd„ dejƒZG dd„ dejƒZG dd„ de
ƒZdS )é    N)Úforms)Úre_path)Úadmin)Ú
ChangeList)ÚValidationError)Úredirect)ÚTemplateResponse)Úgettext_lazy)ÚReversionReverterÚReversionVersionÚdjangoc                   @   s"   e Zd Zejdedƒffd�ZdS )ÚHistoryActionsFormÚrevertZRevert)ÚchoicesN)Ú__name__Ú
__module__Ú__qualname__r   ZChoiceFieldÚ_Úaction© r   r   úM/var/www/html/gsl.tools/lib/python3.9/site-packages/django_handleref/admin.pyr      s   r   c                       sÎ   e Zd ZdZdZdZdZdZeZ	e
Zdedƒfded	ƒfd
edƒfdedƒfdedƒfdedƒfgZ‡ fdd„Zdd„ Zdd„ Zdd„ Z‡ fdd„Zd'dd„Zd(dd „Zd)d!d"„Zd*d#d$„Zd+d%d&„Z‡  ZS ),ÚVersionAdminzi
    ModelAdmin mixin that will enable handleref version
    history for any model it is attached to
    zhandleref/object_history.htmlzhandleref/version_details.htmlzhandleref/version_revert.htmlzhandleref/version_rollback.htmlÚ
version_idz
Version IDÚversionÚVersionZversion_dateÚDateZversion_userZUserÚstatuszObject StatusÚversion_changesZChangesc              	      s¬   t ƒ  ¡ }| jj}|j|jf}td| j | j	¡d| d�td| j | j
¡d| d�td| j | j¡d| d�td| j | j¡d	| d�td
| j | j¡d| d�g}|| S )Nz!^([^/]+)/history/revert/process/$z%s_%s_version_revert_process)Únamez^([^/]+)/history/revert/$z%s_%s_version_revertz)^([^/]+)/history/(\d+)/rollback/process/$z%s_%s_version_rollback_processz!^([^/]+)/history/(\d+)/rollback/$z%s_%s_version_rollbackz^([^/]+)/history/(\d+)/$z%s_%s_version)ÚsuperÚget_urlsÚmodelÚ_metaÚ	app_labelÚ
model_namer   Ú
admin_siteZ
admin_viewÚversion_revert_processÚversion_revert_viewÚversion_rollback_processÚversion_rollback_viewÚversion_details_view)ÚselfÚurlsÚoptsÚinfoZmy_urls©Ú	__class__r   r   r    C   s@    
þýýýýýëzVersionAdmin.get_urlsc                 C   s.   | j jj|d�}tjjj |¡}| d¡}|S )z~
        Arguments:

            - object_id(int)

        Returns:

            - reversion.models.Version queryset

        ©Úpkz-revision_id)r!   ÚobjectsÚgetÚ	reversionÚmodelsr   Zget_for_objectZorder_by)r+   Ú	object_idÚinstanceÚhistory_qsetr   r   r   Úhistory_query_setg   s    
zVersionAdmin.history_query_setc              	   C   sª   g }|j ||jdœ}| jD ]Š\}}|dkr@| || |¡f¡ q|dkr^| || |¡f¡ q| d¡dkrŒ| |t|| d¡d ƒf¡ q| ||j	 
|d¡f¡ q|S )	a]  
        Compile object history list entry dict

        Argument(s):

            - version(handleref.Version.Version): newer version
            - previous(handleref.version.Version): older version
              if no older version exists will be an empty Version instance

        Returns:

            - dict: {"id","fields","comment"}

        )ÚidÚfieldsÚcommentr   Zversion_changed_fieldsZversion_r   r   é   Ú )r;   r=   Úversion_list_fieldsÚappendÚchangesZchanged_fieldsÚfindÚgetattrÚsplitÚdatar4   )r+   r   Úpreviousr<   ÚentryÚfieldÚlabelr   r   r   Úhistory_entry}   s     zVersionAdmin.history_entryc                 C   sb   g }dd„ |D ƒ}|  ¡  |s"|S |  |d ¡j}|D ]&}|  |¡}| d|  ||¡¡ |}q6|S )zð
        Compile and return history listing data from history queryset

        Argument(s):

            - history_qset (queryset): queryset of versions

        Returns:

            - list: list containing `history_entry` dicts

        c                 S   s   g | ]}|‘qS r   r   )Ú.0Úvr   r   r   Ú
<listcomp>¬   ó    z(VersionAdmin.history.<locals>.<listcomp>r   )ÚreverseÚversion_clsrG   ÚinsertrK   )r+   r9   ÚhistoryÚversionsrG   Ú_versionr   r   r   r   rS   œ   s    
zVersionAdmin.historyc                    s–   |j jstdƒS |j d¡}|dkr0|  ||¡S |  |¡}t| ||ƒ}|  |j	¡}t
| j |¡|| jtƒ |||| jt| jƒtdƒd�
}tƒ  |||¡S )z%
        object history view
        úadmin:loginr   r   zVersion History)	r7   r!   Zaction_formrS   r9   Úlistingr@   Zfield_countÚtitle)ÚuserÚis_superuserr   ÚPOSTr4   r'   r:   ÚHistoryListingrS   Úresult_listÚdictr%   Úeach_contextr!   r   r@   Úlenr   r   Úhistory_view)r+   Úrequestr7   r   r9   rW   rS   Úcontextr/   r   r   ra   ¼   s*    

özVersionAdmin.history_viewNc                 C   s€   |j jstdƒS |  tjjjj|d�¡}|j	}t
| j |¡||| jjj|d�| jj||| |¡d�}| |pni ¡ t|| j|ƒS )z&
        Show version details
        rV   ©r;   )r7   r   r8   r-   r   rG   rB   )rY   rZ   r   rQ   r5   r6   r   r3   r4   rG   r^   r%   r_   r!   r"   rB   Úupdater   Úversion_details_template)r+   rb   r7   r   Úextra_contextr   rG   rc   r   r   r   r*   ã   s     
ø
z!VersionAdmin.version_details_viewc              	      s¤   |j jstdƒS |j d|j dg ¡¡}t|tƒs8|g}‡ fdd„|D ƒ}ˆ j 	|¡}t
ˆ j |¡|ˆ jjj|d�ˆ jj|t|ƒ|d�}| |p’i ¡ t|ˆ j|ƒS )zC
        Show version revert preview / confiformation view
        rV   r   c                    s$   g | ]}ˆ   tjjjj|d �¡‘qS )rd   )rQ   r5   r6   r   r3   r4   )rL   r   ©r+   r   r   rN     s   ÿz4VersionAdmin.version_revert_view.<locals>.<listcomp>rd   )r7   r8   r-   rT   ÚcountrB   )rY   rZ   r   ÚGETÚgetlistr[   Ú
isinstanceÚlistrQ   Zchanges_summaryr^   r%   r_   r!   r3   r4   r"   r`   re   r   Úversion_revert_template)r+   rb   r7   rg   Zversion_idsrT   rB   rc   r   rh   r   r'   ý   s,    ÿ

þ
ù	z VersionAdmin.version_revert_viewc              
   C   s6  |j jstdƒS i }|j ¡ D ]<\}}t d|¡}|s8qt|ƒsBq|  t|ƒ¡|| 	d¡< qi }z.|  
¡ }	| jjj|d�}
|	j|
||j d� W nf ty¸ } z|j}W Y d}~nFd}~0  tyô } z&ddgi}t t |¡¡ W Y d}~n
d}~0 0 |�r| j||d	|id
�S | jj}td | jj|j|j¡|
jƒS )z+
        Process revert version(s)
        rV   z
field_(.+)r>   r1   ©rY   NÚnon_field_errorsú"Internal Error (check server logs)Úerrors©rg   ú{}:{}_{}_history)rY   rZ   r   r[   ÚitemsÚreÚmatchÚintrQ   ÚgroupÚreverter_clsr!   r3   r4   Zrevert_fieldsr   Úmessage_dictÚ	ExceptionÚloggerÚerrorÚ	tracebackÚ
format_excr'   r"   Úformatr%   r   r#   r$   r;   )r+   rb   r7   rg   Zfield_versionsÚkeyÚvalueÚmrr   Úreverterr8   Úexcr-   r   r   r   r&      s>    
&
ÿÿüz#VersionAdmin.version_revert_processc                 C   sd   |j jstdƒS |  t|ƒ¡}t| j |¡|| jj	j
|d�| jj|d�}| |pRi ¡ t|| j|ƒS )z>
        Version rollback preview / confirmation view
        rV   rd   )r7   r8   r-   r   )rY   rZ   r   rQ   rx   r^   r%   r_   r!   r3   r4   r"   re   r   Úversion_rollback_template)r+   rb   r7   r   rg   r   rc   r   r   r   r)   b  s    
ûz"VersionAdmin.version_rollback_viewc              
   C   sø   |j jstdƒS |  t|ƒ¡}i }z.|  ¡ }| jjj|d�}|j	|||j d� W nf t
yz }	 z|	j}W Y d}	~	nFd}	~	0  ty¶ }	 z&ddgi}t t |	¡¡ W Y d}	~	n
d}	~	0 0 |rÒ| j|||d|id�S | jj}
td	 | jj|
j|
j¡|jƒS )
z*
        Version rollback process
        rV   r1   ro   Nrp   rq   rr   rs   rt   )rY   rZ   r   rQ   rx   rz   r!   r3   r4   Úrollbackr   r{   r|   r}   r~   r   r€   r)   r"   r�   r%   r   r#   r$   r;   )r+   rb   r7   r   rg   r   rr   r…   r8   r†   r-   r   r   r   r(   y  s0    

&ÿÿüz%VersionAdmin.version_rollback_process)N)N)N)N)N)r   r   r   Ú__doc__Zobject_history_templaterf   rn   r‡   r   rQ   r
   rz   r   r@   r    r:   rK   rS   ra   r*   r'   r&   r)   r(   Ú__classcell__r   r   r/   r   r      s2   	





ú	$ '

#
B
 ÿr   c                   @   s   e Zd ZdZdd„ ZdS )r\   z‚
    History listing view derived from how django admin does it's
    ChangeList. This is mostly so we can support pagination
    c                 C   sÈ   zt |j dd¡ƒ| _W n ty0   d| _Y n0 d| _| ||| j¡| _| jj}d| _	d| _
|| _| ¡ | _|| jk| _| j | jd ¡j| _t|j ¡ ƒ| _d| jv r²| jd= d| jv rÄ| jd= d S )NÚpr   éd   Fr>   Úe)rx   rj   r4   Zpage_numÚ
ValueErrorZlist_per_pageZget_paginatorZ	paginatorri   Zshow_allZcan_show_allÚresult_countZfull_result_countZ
multi_pageÚpageZobject_listr]   r^   ru   Úparams)r+   Zmodel_adminrb   Zqsetr�   r   r   r   Ú__init__¹  s$    


zHistoryListing.__init__N)r   r   r   r‰   r’   r   r   r   r   r\   ²  s   r\   ) Úloggingrv   r   r   r   Zdjango.conf.urlsr   Zdjango.contribr   Zdjango.contrib.admin.views.mainr   Zdjango.core.exceptionsr   Zdjango.shortcutsr   Zdjango.template.responser   Zdjango.utils.translationr	   r   r5   ÚImportErrorZdjango_handleref.versionr
   r   Ú	getLoggerr}   ZFormr   Z
ModelAdminr   r\   r   r   r   r   Ú<module>   s,   

   