B
    ?cO              #   @   s  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 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mZmZ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(Z(d dl)m*Z* d dl+m,Z, d dl-m.Z/ d dl0m1Z1 d dl-m2Z2 d dl3m4Z5 d dl3m6Z7 d dl3m8Z9 d dl:m;Z;m<Z<m=Z= d dl>m?Z? d dl@m8Z8 d dlAmBZBmCZCmDZDmEZE d dlFmGZG d dlFmHZHmIZImJZJ d dlKmLZL dZMd ZNejOd!e8jPiejQd!e8jRiejSd!e8jTiejUd!e8jViejWd!e8jXiejYd!e8jZiej[d!e8jZiej\d!e8jZiej]d!e8j^iej_d!e8j^iej`d!e8jaiejbd!e8jaiejcd!e8jdiejed!e8jfiejgd!e8jhiejid!e8jhie5jjd!e8jkiiZlG d"d# d#eeBeCeDeEZmdS )$    )print_functionN)OrderedDict)update_wrapper)messages)DisallowedModelAdminToField)
ModelAdmincsrf_protect_m)add_preserved_filters)unquoteget_deleted_objects)cache)ImproperlyConfigured)modelsroutertransactionDatabaseError)	all_valid)Http404HttpResponseRedirectHttpResponseForbiddenJsonResponse)TemplateResponse)reverse)	force_str)format_html)gettext)settings)activate)fields)helpers)widgets)GeneralActionDeleteActionHandleErrorGeneralActionNew)AdminRuntimeWarning)ModelMixinEssentialModelMixinActionModelMixinExtendModelMixinExport)effective_user_required)log_operationexport_error_dictget_error_message)CompanyZ_popupZ	_to_fieldwidgetc               @   st  e Zd ZeegZdZg ZdZg Z	dZ
dZdZdZdZi Zdddddd	Zi ZdZedHd
dZdd ZdIddZde_dd Zdd Zedd Zejdd ZdJddZdd Zdd Zdd Z ed d! Z!d"d# Z"dKd%d&Z#d'd( Z$d)d* Z%e&dLd,d-Z'd.d/ Z(d0d1 Z)dMd2d3Z*d4d5 Z+d6d7 Z,e&dNd8d9Z-d:d; Z.d<d= Z/d>d? Z0dOd@dAZ1dBdC Z2dDdE Z3dFdG Z4dS )PZKModelAdminNid -zAapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheetzapplication/pdfzapplication/downloadz
text/plain)ZxlsxZxlsZpdfZcsvZtxtc             C   s   |j | |j| |}|S )N)GETgetPOST)keyrequestdefaultresultr1   r1   ,G:\easytimepro\master/mysite/admin\kernel.py	get_param]   s    zZKModelAdmin.get_paramc             C   s   t  | j| _|| _d| _|j| _| jj| jjf| _	d| j	 dg}| j
sN|| _
| jsZ|| _|| _t t}x(| j D ]\}}||i | qvW || _d | _d S )NTz%s/%s/edit.htmlzincludes/data_edit.html)copyZlist_displayZ_list_displaymodelZshow_bookmarks_metaopts	app_label
model_nameinfoadd_form_templatechange_form_template
admin_sitedeepcopyFORMFIELD_FOR_DBFIELD_DEFAULTSformfield_overridesitems
setdefaultupdate_change_list)selfr=   rE   Zdefault_templateZ	overrideskvr1   r1   r:   __init__c   s     
zZKModelAdmin.__init__c             C   s   dS )N r1   )rM   objr1   r1   r:   row_operationw   s    zZKModelAdmin.row_operationZ	Operationc             K   s4  |j r| j||f|S t|tjs.t|tjr|j| jkrNt| j|j f|}t|tjrl| j	||f|}n"t|tjr| j
||f|}nd}|r|j| jkr| jj|jj}i }|r|jdddd tj|j|j| jf||_|S x@|j D ]2}|| jkrtt| j| f|}|jf |S qW |jf |S )z
        Hook for specifying the form Field instance for a given database Field
        instance.

        If kwargs are given, they're passed to the form Field's constructor.
        NF)Zcan_add_relatedZcan_change_relatedZcan_delete_related)choicesZformfield_for_choice_field
isinstancer   ZManyToManyField
ForeignKey	__class__rH   dictZformfield_for_foreignkeyformfield_for_manytomanynameraw_id_fieldsrE   Z	_registryr4   remote_fieldr=   rK   admin_widgetsZZKRelatedFieldWidgetWrapperr.   mror<   rF   	formfield)rM   db_fieldr7   kwargsr_   Zrelated_modeladminZwrapper_kwargsklassr1   r1   r:   formfield_for_dbfield|   s4    	
z"ZKModelAdmin.formfield_for_dbfieldc             K   s  ddl m} ddl m} ddlm} |jjjjs4dS |	dd}|dkrP|j
j}|j| jkrvtj|j| j|d|d< n0|jt| jt| j krt|jjjj|d< d	|kr| |||}|dk	r||d	< |jf |}	t|	j|rt|	j|sd
}
|	j}|r|d||
n|
|	_|	S )z
        Get a form Field for a ManyToManyField.
        :param db_field:
        :param request:
        :param kwargs:
        :return:
        r   )SelectMultiple)CheckboxSelectMultiple)format_lazyNusing)rg   r.   querysetrQ   z{} {})Zdjango.formsrd   re   django.utils.textrf   r\   Zthroughr>   Zauto_createdr4   Zrelr=   rZ   r[   r    ZZKManyToManyRawIdWidgetrE   listZfilter_verticalZfilter_horizontalZGeneralMultiSelectrA   Zget_field_querysetr_   rU   r.   	help_text)rM   r`   r7   ra   rd   re   rf   Zdbrh   Z
form_fieldmsgrk   r1   r1   r:   rY      s,    

z%ZKModelAdmin.formfield_for_manytomanyc             C   s   | j d krtd| j S )Nz#Changelist was not initialized yet.)rL   r$   )rM   r1   r1   r:   change_list   s    
zZKModelAdmin.change_listc             C   s
   || _ d S )N)rL   )rM   valuer1   r1   r:   rm      s    c             C   s    |||f}d| }| j ||S )Nz%s_%s_%s)rE   get_url)rM   r@   rA   ZpostfixZparamsrB   Z	view_namer1   r1   r:   ro      s    
zZKModelAdmin.get_urlc             K   s   ddl m} |S )N   )ZKChangeList)Z
views.mainrq   )rM   r7   ra   rq   r1   r1   r:   get_changelist   s    zZKModelAdmin.get_changelistc             C   sN   ddl m} ddlm} |}t|dr.|j}n||jdd}|||j|S )Nr   )capfirst)ActionDetailshort_description_ )ri   rs   mysite.admin.mixinsrt   hasattrru   __name__replace)rM   actionrs   rt   rb   descriptionr1   r1   r:   
get_action   s    
zZKModelAdmin.get_actionc          	      s  ddl m} ddlm  jd kr(t S j\}}|jj||d}t	
|d }|d krtg }xpj d d d d d D ]P}|j|jkrqzt||jg }	tjrt|dg }	|	sqz|fdd	|	D  qzW xtj d d d d d D ]T}|j|jkrqt||jg }
|
sqx*|
D ]"}|fd
d	|d D  qW qW td |}t fdd	|D }t	|j| nrg }xd|D ]\}t|ttfr|dd	 ttfdd|d D  n|}||j|f q~W t|}|S )Nr   )const)rt   )Zappr=      Zcloud_actionc                s   g | ]}  |qS r1   )r~   ).0r|   )rM   r1   r:   
<listcomp>   s    z,ZKModelAdmin.get_actions.<locals>.<listcomp>c                s   g | ]}  |qS r1   )r~   )r   r|   )rM   r1   r:   r   *  s    rp   c                s"   g | ]\}}}| |||fqS r1   r1   )r   rb   rZ   Zdesc)rt   r1   r:   r   1  s   c             S   s   g | ]}|j |fqS r1   )rZ   )r   _detailr1   r1   r:   r   :  s    c                s
     | S )N)r~   )x)rM   r1   r:   <lambda>:      z*ZKModelAdmin.get_actions.<locals>.<lambda>)mysite.adminr   rx   rt   actionsr   rB   ZACTION_CACHE_KEYformatr   r4   rW   r^   ZADMIN_ACTION_FILED__dict__getattrr   CLOUD_VERSIONextendZADMIN_ACTION_SET_FIELDfiltersetrU   tuplerj   mapr~   appendrZ   )rM   r7   r   r@   rA   Zaction_cache_keyZ_cached_actionsr   rb   Zclass_actionsZclass_action_setsZ
action_setZ_actionsZ
action_clsr   r1   )rt   rM   r:   get_actions  sP    
	

""
&



(
zZKModelAdmin.get_actionsc               C   s   d S )Nr1   r1   r1   r1   r:   get_init_sort_fieldC  s    z ZKModelAdmin.get_init_sort_fieldc             C   s.   |  || || || || |dS )N)addchangedeleteviewmodule)Zhas_add_permissionZhas_change_permissionhas_delete_permissionhas_view_permissionhas_module_permission)rM   r7   r1   r1   r:   _get_all_permsG  s
    zZKModelAdmin._get_all_perms../%s/c             C   s   t ddiS )zE
        Determines the HttpResponse for the add_view stage.
        coder   )r   )rM   r7   rR   Zpost_url_continuer1   r1   r:   response_addQ  s    "zZKModelAdmin.response_addc             C   s   t ddiS )zH
        Determines the HttpResponse for the change_view stage.
        r   r   )r   )rM   r7   rR   r1   r1   r:   response_changeu  s    zZKModelAdmin.response_changec             C   s8   |j d|jdd }|r.| j||dd dS t d S )Nobj_idrQ   )form_urlextra_context)r5   r4   r3   _changeform_viewr   )rM   r7   Z_idr1   r1   r:   	edit_view  s    zZKModelAdmin.edit_viewrQ   c          	   C   s0   t jt| jd | ||||S Q R X d S )N)rg   )r   atomicr   db_for_writer=   r   )rM   r7   	object_idr   r   r1   r1   r:   changeform_view  s    zZKModelAdmin.changeform_viewc             C   s   d S )Nr1   )rM   Z
model_formr1   r1   r:   check_domain_rules  s    zZKModelAdmin.check_domain_rulesc       '      C   sn  |j t|jt}|dkr(t|j}| j}|j}|jdkrLd|j krLd }|d k}|r^d }	n(| 	|t
||}	|	d kr| |||S d}
| ||	}|jdkr||j |j|	d}d}d}d}| rRtjstjtjk rdt|kr|rNd}ttd	d}|d
k r,|j  }td	| |tjkrNtddtd dS tjtjk r|j d}|j d}|dkr|jjdd}	|r|	j|d}	|	 }tjd|d dd |tjkrtddtd dS n
t d d}
y | !| | j"||| d}W nB t#k
rN } z"|r0t d tdt$|dS d }~X Y nX n
d}
|j%}| j&||| d\}}t'|r|
ry| (||||  W n6 t#t)fk
r } ztdt$|dS d }~X Y nX | *||||  |rtjd	|d dd |j+rtjd|d dd | ,||||}g }|rx|j-D ]|}|j.|}t/|t0j1j2r|d d }d}x|D ]}|t| d }qpW |d d }|3dj4|j5|j6|d q:W dt|kr|d d }d7|}| 8||| t9||dj4tdd | | :||S d!d"g}xv|j-D ]j}|j;|}|j.|}||ks$|d#ks$t|t|krlq$|d$krt<jj|j;|dj=}|t|j.|krq$d%j4|j5|j6||j.|d&} |3|  nt/|t>rd}|d d }x|D ]}|t| d }qW |d d }t/|t0j1j2rj|d d }d}x|D ]}|t| d }qDW |d d }d%j4|j5|j6||d&} |3|  q$W dt|kr|d d }d7|}| ?||| t9||dj4td'd | | @||S nd}
nJ|r i }!||!d(}| j&||j%dd\}}n||	d}| j&||	dd\}}|jArdt d tdtB|jAdS tCjD|t>| E||	| F||	| G||	| d)}"| jH|"jH }#| I||||	}$x|$D ]}%|#|%jH }#qW tJ| jKL|| jMjN|"||	tO|j kptO|jk||#|$tCP||| Q|d*}&|jdkrF|
sFd|j krFd|&d+< d|&d,< d}|&R|pRi  | jS||&|| |	|d-S ).NrQ   r5   Z
_saveasnewF)instancer   z(personnel.models.model_employee.EmployeeTZemployee_cache_countr   z%sZ'login_authorize_license_employee_exceed)r   rl   
app_statusr   1rp   )r   )r0   Zemployee_cache_app_counti,  )timeoutZ"login_authorize_license_app_exceed)r      ,z{field}={val})fieldvalzmodel_employee.Employeez{action}ZadminLog_action_add)r|   Zpayment_modeZpayment_type)NrQ   Zcompanyz{field}({initial}->{changed}))r   initialZchangedZadminLog_action_change)r   )model_admin)
rA   Z	adminformr   ZoriginalZis_popupto_fieldmediaZinline_admin_formsetserrorsZpreserved_filtersZ	show_saveZshow_save_and_continue)r   r   rR   r   )Tr5   r4   TO_FIELD_VARr3   r   pathr=   r>   method
get_objectr
    _get_obj_does_not_exist_redirectZget_formZFILESZis_validr   r   ZAUTHORIZED_EMPLOYEEZUNLIMITED_EMPLOYEEstrintr   objectsallcountr   r   rv   ZAUTHORIZED_APPZUNLIMITED_APPr   Zexcluder   r   Z	save_formr$   r,   r   Z_create_formsetsr   Z
save_modelr   Zsave_relatedr   Zconstruct_change_messageZchanged_dataZcleaned_datarU   r   ZqueryZQuerySetr   r   r   labeljoinZlog_additionr*   r   r   r-   rZ   rj   Z
log_changer   Z_errorsr+   defined_helpersZZKAdminFormZget_fieldsetsZget_prepopulated_fieldsZget_readonly_fieldsr   Zget_inline_formsetsrX   rE   Zeach_contextr?   rA   IS_POPUP_VARZAdminErrorListZget_preserved_filtersrK   Zrender_change_form)'rM   r7   r   r   r   r   r=   r?   r   rR   Zform_validatedZ	ModelFormZformZemp_cache_countZemp_cache_app_countZemp_add_flagr   r   Z
new_objecteZformsetsZinline_instancesZchange_messageZmessage_listr6   Zchanged_valuessrO   Zchanged_messageZignore_keysvaluesZcompany_namemessager   Zcls_admin_formr   Zinline_formsetsZinline_formsetcontextr1   r1   r:   r     s@   






" 
$
&











zZKModelAdmin._changeform_viewc             C   s   |  |d ||S )N)r   )rM   r7   r   r   r1   r1   r:   add_view  s    zZKModelAdmin.add_viewc             C   s   | j S )N)sort_fields)rM   r7   r1   r1   r:   get_sort_fields  s    zZKModelAdmin.get_sort_fieldsc             C   s  |j d|jdd }| t}|rt|}yt| W n tk
rX   |g}Y nX yxt	j
t| jdZ ||| |}| }|  }t||djtddd|jjt|dd| jd	 W d Q R X W n6 ttfk
r } ztd
t|dS d }~X Y nX tddiS d S )NZobj_ids)rg   z{action}ZadminLog_action_delete)r|   z	{0} = {1}|rQ   )r=   r   )r   rl   r   r   )r5   r4   r3   Z&_get_first_subclass_of_specific_actionr!   jsonloadsiter	TypeErrorr   r   r   r   r=   r|   r*   r   rv   rW   rz   r   r{   r$   r"   r   )rM   r7   Zsome_idZdelete_actionZaction_instancer   rA   r   r1   r1   r:   del_view  s&    

 zZKModelAdmin.del_viewc          	   C   s.   t jt| jd | |||S Q R X d S )N)rg   )r   r   r   r   r=   _delete_view)rM   r7   r   r   r1   r1   r:   delete_view  s    zZKModelAdmin.delete_viewc             C   sT  | j j}|jt|jt}|r:| ||s:td| | |t	||}| 
||s^t S |dkrt| |||S t| j }t|g||j| j|\}}	}
}|jr|s|
rt S t|}|rt|n|jj}||}| ||| t||d | || | |||S t|j}|
s&|rHd||r4dndd }t|ntddS )	z'The 'delete' admin view for this model.z"The field %s cannot be referenced.Nr   z Cannot delete %(name)s.%(extra)szThis item is in protected.rQ   )rZ   extrazDelete Failed.)r=   r>   r5   r4   r   r3   Zto_field_allowedr   r   r
   r   r   r   r   r   r   userrE   r   r   ZpkZattnameZserializable_valueZlog_deletionr*   Zdelete_modelresponse_deleteZverbose_namer$   )rM   r7   r   r   r?   r   rR   rg   Zdeleted_objectsZmodel_countZperms_neededZ	protectedobj_displayattrr   Zobject_namerl   r1   r1   r:   r     s:    


zZKModelAdmin._delete_viewc             C   s`   | j j}t|jkrTtdt|d}t|| jpJd|j	|j
f d|j	 dgd|iS tddiS )	zH
        Determines the HttpResponse for the delete_view stage.
        r   )r|   rn   zadmin/%s/%s/popup_response.htmlzadmin/%s/popup_response.htmlzadmin/popup_response.htmlpopup_response_datar   r   )r=   r>   r   r5   r   dumpsr   r   Zpopup_response_templater@   rA   r   )rM   r7   r   r   r?   r   r1   r1   r:   r     s    


zZKModelAdmin.response_deletec             C   s   d S )Nr1   )rM   r1   r1   r:   get_addition_urls  s    zZKModelAdmin.get_addition_urlsc             C   s2   ddl m} | j}|d|}|jd|j|f S )a  
        Returns True if the given request has permission to view the given
        Django model instance, the default implementation doesn't examine the
        `obj` parameter.

        Can be overridden by the user in subclasses. In such case it should
        return True if the given request has permission to view the `obj`
        model instance. If `obj` is None, this should return True if the given
        request has permission to view *any* object of the given type.
        r   )get_permission_codenamer   z%s.%s)Zdjango.contrib.authr   r?   r   has_permr@   )rM   r7   rR   r   r?   codenamer1   r1   r:   r     s    
z ZKModelAdmin.has_view_permissionc             C   s   |j | jjS )a  
        Returns True if the given request has any permission in the given
        app label.

        Can be overridden by the user in subclasses. In such case it should
        return True if the given request has permission to view the module on
        the admin index page and access the module's index page. Overriding it
        does not restrict access to the view, add, change, and delete views. Use
        `ModelAdmin.has_(view|add|change|delete)_permission` for that.
        )r   Zhas_module_permsr?   r@   )rM   r7   r1   r1   r:   r   "  s    z"ZKModelAdmin.has_module_permissionc             C   s   |j | jj| jjS )zp
        Returns True if the given request has any operation permission in the given
        app label.
        )r   Zhas_model_op_permsr?   r@   rA   )rM   r7   r1   r1   r:   has_model_op_permission/  s    z$ZKModelAdmin.has_model_op_permissionc                s  ddl m} ddlm  jfddfddd, fd	d
	}|d|jdd d|d|jdd d|d|jdddd d|d|jdd d|d|j	dd d|d|j
dddd d|d|jdddd d|d |jd! d|d"|jd# d|d$|jd% d|d&|jdd' d|d(|jd) d|d*|jddd+ dg} }|r||7 }|S )-Nr   )url)HttpRequestc                s(    \}}d ||}| jd ||S )Nz{}_{}z{}.{})r   r   r   )r7   r|   r@   rA   r   )rB   r1   r:   
check_perm=  s    z)ZKModelAdmin.get_urls.<locals>.check_permc                s
     | S )N)r   )r7   )rM   r1   r:   check_has_any_op_permB  s    z4ZKModelAdmin.get_urls.<locals>.check_has_any_op_permFc                s,   t  fdd}|_t|S )Nc                 s   rHt | d  r@| d r"qHdkr8| d r8qHt S ntdj| |}| d jdkrdkrxDtdg D ]4}| d j}t	| |j
s~t	dj||jd q~W |S )	Nr   r   z%The first argument need to be requestr3   TZ
cache_keysz{key}_{user_id})r6   Zuser_id)rU   r   r   rE   Z
admin_viewr   r   r   r   r   Zis_superuserr   r0   )argsra   r9   rN   r   )r   r|   r   r   clear_cacherM   r   r1   r:   wrapperG  s&    

z4ZKModelAdmin.get_urls.<locals>.wrap.<locals>.wrapper)r)   r   r   )r   r|   r   r   )r   r   r   rM   )r|   r   r   r:   wrapE  s    z#ZKModelAdmin.get_urls.<locals>.wrapz^$r   z
%s_%s_init)rZ   z^table/$z%s_%s_tablez^add/$r   T)r   z	%s_%s_addz^page/$z
%s_%s_pagez^tree$z
%s_%s_treez^del/$r   z	%s_%s_delz^edit/$r   z
%s_%s_editz	^action/$z%s_%s_actionz	^export/$z%s_%s_exportz	^import/$z%s_%s_importz^bookmark/$z%s_%s_bookmarkz
^history/$z%s_%s_historyz^import_template/$z%s_%s_import_template)NF)Zdjango.conf.urlsr   django.httpr   rB   Z	init_viewZ
table_viewr   Z	page_viewZ	tree_viewr   r   Zaction_viewZexportZimport_fileZbookmark_viewZmodel_history_viewZimport_templater   )rM   r   r   ZurlpatternsZaddition_urlsr1   )r   r   r   rB   rM   r:   get_urls7  s0    #zZKModelAdmin.get_urls)N)N)N)r   )NrQ   N)rQ   N)N)N)5rz   
__module____qualname__r#   r!   r   Zaction_setsZactions_disabledZcheckbox_namer   Zhidden_fieldsZempty_value_displayZgrid_templaterC   rD   Zexport_fields_dictZexport_mimesZm2m_url_handlerZsearch_formstaticmethodr;   rP   rS   ru   rc   rY   propertyrm   setterro   rr   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r1   r1   r1   r:   r/   F   sj   
:.
?

$N S
1
r/   )nZ
__future__r   r<   r   collectionsr   	functoolsr   Zdjango.contribr   Zdjango.contrib.admin.exceptionsr   Zdjango.contrib.admin.optionsr   r   Z,django.contrib.admin.templatetags.admin_urlsr	   Zdjango.contrib.admin.utilsr
   r   Zdjango.core.cacher   Zdjango.core.exceptionsr   Z	django.dbr   r   r   r   Zdjango.forms.formsetsr   r   r   r   r   r   Zdjango.template.responser   Zdjango.urlsr   ZsixZdjango.utils.encodingr   Zdjango.utils.htmlr   Zdjango.utils.translationr   rv   Zdjango.confr   r   r   r   Zadmin_fieldsr   r   r    r]   Zmysite.admin.actionr!   r"   r#   Zmysite.admin.exceptionsr$   Zmysite.admin.formsrx   r%   r&   r'   r(   Zmysite.admin.utilsr)   r*   r+   r,   Zmysite.cloud.modelsr-   r   r   ZDateTimeFieldZZKDateTimeInputZ	DateFieldZZKDateInputZ	TimeFieldZZKTimeInputZ	TextFieldZ
ZKTextAreaZURLFieldZ
ZKURLInputZ
FloatFieldZZKNumberInputZIntegerFieldZBigIntegerFieldZ	CharFieldZZKTextInputZGenericIPAddressFieldZ
ImageFieldZZKFileInputZ	FileFieldZ
EmailFieldZZKEmailInputZBooleanFieldZZKCheckboxInputrV   ZZKTypeSelectZOneToOneFieldZPasswordFieldZZKPasswordInputrG   r/   r1   r1   r1   r:   <module>   sj   