B
    bI                 @   s*  d dl 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l
mZ G dd dejZG d	d
 d
ejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZ G dd dej!Z"G dd  d ej#Z$G d!d" d"ej#Z%G d#d$ d$ej&Z'G d%d& d&ej&Z(G d'd( d(ej)Z*G d)d* d*e*Z+G d+d, d,eZ,G d-d. d.e*Z-G d/d0 d0e-Z.G d1d2 d2ej/Z0G d3d4 d4ej-Z1G d5d6 d6e2Z3G d7d8 d8e3Z4G d9d: d:e0e4Z5G d;d< d<e1e4Z6dS )=    N)partial)forms)ForeignKeyRawIdWidget)	force_str)cprintc                   s"   e Zd ZdZd fdd	Z  ZS )ZKTextInputzlayui/forms/widgets/text.htmlNc                s0   ddi}|d k	r| | tt| j|d d S )Nclasszlayui-input)attrs)updatesuperr   __init__)selfr	   final_attrs)	__class__ 3G:\easytimepro\master/mysite/admin\forms\widgets.pyr      s    
zZKTextInput.__init__)N)__name__
__module____qualname__template_namer   __classcell__r   r   )r   r   r      s   r   c                   s   e Zd Zd fdd	Z  ZS )ZKNumberInputNc                s0   ddi}|d k	r| | tt| j|d d S )Nr   zlayui-input)r	   )r
   r   r   r   )r   r	   r   )r   r   r   r      s    
zZKNumberInput.__init__)N)r   r   r   r   r   r   r   )r   r   r      s   r   c                   s.   e Zd ZG dd deZd fdd	Z  ZS )ZKEmailInputc               @   s   e Zd ZdZdS )zZKEmailInput.Mediar   N)r   r   r   jsr   r   r   r   Media%   s   r   Nc                s0   ddi}|d k	r| | tt| j|d d S )Nr   zlayui-input)r	   )r
   r   r   r   )r   r	   r   )r   r   r   r   (   s    
zZKEmailInput.__init__)N)r   r   r   objectr   r   r   r   r   )r   r   r   $   s   r   c                   s.   e Zd ZG dd deZd fdd	Z  ZS )
ZKURLInputc               @   s   e Zd ZdZdS )zZKURLInput.Mediar   N)r   r   r   r   r   r   r   r   r   0   s   r   Nc                s0   ddi}|d k	r| | tt| j|d d S )Nr   zlayui-input)r	   )r
   r   r   r   )r   r	   r   )r   r   r   r   3   s    
zZKURLInput.__init__)N)r   r   r   r   r   r   r   r   r   )r   r   r   /   s   r   c                   s6   e Zd ZdZdZG dd deZd fdd	Z  ZS )	ZKPasswordInputZpasswordz!layui/forms/widgets/password.htmlc               @   s   e Zd ZdZdS )zZKPasswordInput.Mediar   N)r   r   r   r   r   r   r   r   r   >   s   r   Nc                s.   ddi}|r| | tt| j|dd d S )Nr   zlayui-inputT)r	   Zrender_value)r
   r   r   r   )r   r	   r   )r   r   r   r   A   s    
zZKPasswordInput.__init__)N)	r   r   r   
input_typer   r   r   r   r   r   r   )r   r   r   :   s   r   c               @   s   e Zd ZdS )ZKHiddenInputN)r   r   r   r   r   r   r   r   H   s   r   c               @   s   e Zd ZdS )ZKFileInputN)r   r   r   r   r   r   r   r    L   s   r    c               @   s   e Zd ZdS )ZKClearableFileInputN)r   r   r   r   r   r   r   r!   P   s   r!   c                   s.   e Zd ZG dd deZd fdd	Z  ZS )
ZKTextAreac               @   s   e Zd ZdZdS )zZKTextArea.Mediar   N)r   r   r   r   r   r   r   r   r   U   s   r   Nc                s,   ddi}|r| | tt| j|d d S )Nr   zlayui-input layui-textarea)r	   )r
   r   r"   r   )r   r	   r   )r   r   r   r   X   s    
zZKTextArea.__init__)N)r   r   r   r   r   r   r   r   r   )r   r   r"   T   s   r"   c                   s.   e Zd ZG dd deZd fdd	Z  ZS )ZKRemarkc               @   s   e Zd ZdZdS )zZKRemark.Mediar   N)r   r   r   r   r   r   r   r   r   `   s   r   Nc                s.   ddd}|r| | tt| j|d d S )Nzlayui-input layui-textarea2)r   Zrows)r	   )r
   r   r#   r   )r   r	   r   )r   r   r   r   c   s    

zZKRemark.__init__)N)r   r   r   r   r   r   r   r   r   )r   r   r#   _   s   r#   c                   s   e Zd Zd fdd	Z  ZS )ZKDateInputNc                s0   ddd}|r| | tt| j||d d S )Nzlayui-input layui-dateoff)r   autocomplete)r	   format)r
   r   r%   r   )r   r	   r(   r   )r   r   r   r   k   s    

zZKDateInput.__init__)NN)r   r   r   r   r   r   r   )r   r   r%   j   s   r%   c                   s   e Zd Zd fdd	Z  ZS )ZKTimeInputNc                s0   ddd}|r| | tt| j||d d S )Nzlayui-input layui-timer&   )r   r'   )r	   r(   )r
   r   r)   r   )r   r	   r(   r   )r   r   r   r   s   s    

zZKTimeInput.__init__)NN)r   r   r   r   r   r   r   )r   r   r)   r   s   r)   c                   s.   e Zd ZG dd deZd fdd	Z  ZS )ZKDateTimeInputc               @   s   e Zd ZdZdS )zZKDateTimeInput.Mediar   N)r   r   r   r   r   r   r   r   r   {   s   r   Nc                s<   |d kri }ddd}|r$| | tt| j||d d S )Nzlayui-input layui-datetimer&   )r   r'   )r	   r(   )r
   r   r*   r   )r   r	   r(   r   )r   r   r   r   ~   s    

zZKDateTimeInput.__init__)NN)r   r   r   r   r   r   r   r   r   )r   r   r*   z   s   r*   c                   s2   e Zd ZdZG dd deZd fdd	Z  ZS )ZKDateTimeRangeInputz'layui/forms/widgets/datetime_range.htmlc               @   s   e Zd ZdZdS )zZKDateTimeRangeInput.Mediar   N)r   r   r   r   r   r   r   r   r      s   r   Nc                s<   |d kri }ddd}|r$| | tt| j||d d S )Nz layui-input layui-datetime-ranger&   )r   r'   )r	   r(   )r
   r   r+   r   )r   r	   r(   r   )r   r   r   r      s    

zZKDateTimeRangeInput.__init__)NN)r   r   r   r   r   r   r   r   r   r   )r   r   r+      s   r+   c                   s:   e Zd ZG dd deZd fdd	Z fddZ  ZS )	ZKCheckboxInputc               @   s   e Zd ZdZdS )zZKCheckboxInput.Mediar   N)r   r   r   r   r   r   r   r   r      s   r   Nc                s:   |d kri }ddd}|r$| | tt| j|d d S )Nzlayui-inputZprimary)r   zlay-skin)r	   )r
   r   r,   r   )r   r	   r   )r   r   r   r      s    

zZKCheckboxInput.__init__c                s"   | d|i tt| |||S )Nz
lay-filter)r
   r   r,   get_context)r   namevaluer	   )r   r   r   r-      s    zZKCheckboxInput.get_context)N)r   r   r   r   r   r   r-   r   r   r   )r   r   r,      s   r,   c                   s.   e Zd ZG dd deZd fdd	Z  ZS )ZKSwitchCheckboxInputc               @   s   e Zd ZdZdS )zZKSwitchCheckboxInput.Mediar   N)r   r   r   r   r   r   r   r   r      s   r   Nc                s:   |d kri }ddd}|r$| | tt| j|d d S )Nzlayui-inputZswitch)r   zlay-skin)r	   )r
   r   r0   r   )r   r	   r   )r   r   r   r      s    

zZKSwitchCheckboxInput.__init__)N)r   r   r   r   r   r   r   r   r   )r   r   r0      s   r0   c               @   s   e Zd ZdZdZdS )ZKSelectzlayui/forms/widgets/select.htmlz&layui/forms/widgets/select_option.htmlN)r   r   r   r   option_template_namer   r   r   r   r1      s   r1   c                   s   e Zd Zd fdd	Z  ZS )ZKTypeSelectNr   c                s.   ddi}|r| | tt| j||d d S )Nz
lay-searchzchoice-search)r	   choices)r
   r   r3   r   )r   r	   r4   r   )r   r   r   r      s    
zZKTypeSelect.__init__)Nr   )r   r   r   r   r   r   r   )r   r   r3      s   r3   c                   sD   e Zd ZdZdZ fddZdd Zdd Zd	d
 Zdd Z	  Z
S )ZKManyToManyRawIdWidgetzv
    A Widget for displaying ManyToMany ids in the "raw_id" interface rather than
    in a <select multiple> box.
    z,layui/forms/widgets/many_to_many_raw_id.htmlc                s8   t t| |||}| jj| jjkr4d|d d d< |S )NZvManyToManyRawIdAdminFieldwidgetr	   r   )r   r5   r-   ZrelmodelZ
admin_siteZ	_registry)r   r.   r/   r	   context)r   r   r   r-      s    z#ZKManyToManyRawIdWidget.get_contextc             C   s   |   S )N)Zbase_url_parameters)r   r   r   r   url_parameters   s    z&ZKManyToManyRawIdWidget.url_parametersc             C   s   dS )N) r:   r   )r   r/   r   r   r   label_and_url_for_value   s    z/ZKManyToManyRawIdWidget.label_and_url_for_valuec             C   s   | |}|r|dS d S )N,)getsplit)r   datafilesr.   r/   r   r   r   value_from_datadict   s    
z+ZKManyToManyRawIdWidget.value_from_datadictc             C   s   |rd dd |D S dS )Nr<   c             s   s   | ]}t |V  qd S )N)r   ).0vr   r   r   	<genexpr>   s    z7ZKManyToManyRawIdWidget.format_value.<locals>.<genexpr>r:   )join)r   r/   r   r   r   format_value   s    z$ZKManyToManyRawIdWidget.format_value)r   r   r   __doc__r   r-   r9   r;   rA   rF   r   r   r   )r   r   r5      s   r5   c               @   s    e Zd ZdZdd Zdd ZdS )SelectMultipleTc             C   s.   y
|j }W n tk
r$   |j}Y nX ||S )N)ZgetlistAttributeErrorr=   )r   r?   r@   r.   getterr   r   r   rA      s
    
z"SelectMultiple.value_from_datadictc             C   s   dS )NFr   )r   r?   r@   r.   r   r   r   value_omitted_from_data   s    z&SelectMultiple.value_omitted_from_dataN)r   r   r   allow_multiple_selectedrA   rK   r   r   r   r   rH      s   rH   c                   sh   e Zd ZdZdZdZi Zedd Zedd Z	d fd
d	Z
 fddZedd ZdddZ  ZS )ZKFilteredSelectMultiplez
    A SelectMultiple with a JavaScript filter interface.

    Note that the resulting JavaScript assumes that the jsi18n
    catalog has been loaded in the page
    z$layui/forms/widgets/select_tree.htmlz+layui/forms/widgets/select_option_tree.htmlc                s    fdd}|S )Nc                s   t  jr j|  f |S d S )N)len_opt_tree_partial)r.   kwargs)r   r   r   inner   s    
z8ZKFilteredSelectMultiple.opt_tree_partial.<locals>.innerr   )r   rQ   r   )r   r   opt_tree_partial   s    z)ZKFilteredSelectMultiple.opt_tree_partialc             C   s    dddg}t jdd |D dS )Nzcore.jszSelectBox.jszSelectFilter2.jsc             S   s   g | ]}d | qS )zadmin/js/%sr   )rB   pathr   r   r   
<listcomp>  s    z2ZKFilteredSelectMultiple.media.<locals>.<listcomp>)r   )r   r   )r   r   r   r   r   media  s    
zZKFilteredSelectMultiple.mediaNr   c                s.   || _ || _|| _|| _tt| || d S )N)source_modeldestination_modelverbose_name
is_stackedr   rM   r   )r   rX   rY   rV   rW   r	   r4   )r   r   r   r     s
    z!ZKFilteredSelectMultiple.__init__c                s   t t| |||}t| j||d d |d| j|< | j|d d< | j|d d< d|d d d< | jr~|d d d  d	7  < | j	|d d d
< t
| j|d d d< |S )Nr6   r/   )r.   r/   r	   rV   self_ref_fieldZselectfilterr	   r   Zstackedzdata-field-namezdata-is-stacked)r   rM   r-   r   opt_treerO   rV   rZ   rY   rX   int)r   r.   r/   r	   r8   )r   r   r   r-     s     z$ZKFilteredSelectMultiple.get_contextc             C   sH   ddl m} | j}x0|jjD ] }t||r||jkr|j}P qW d S |S )Nr   )
ForeignKey)Zdjango.db.models.fields.relatedr]   rW   _metaZfields
isinstancer7   r.   )r   r]   r7   Zfieldself_referred_fieldr   r   r   rZ     s    z'ZKFilteredSelectMultiple.self_ref_fieldc             K   sd  ddl m} | j}yt|dd}W n tk
r>   d}Y nX | }| j}	d}
|j }x|D ]}i }t	|}t
||	d}tt
||jjj}t	||ko|
dkp| j}|dkr|
dkrd}
|dk	rt|j|d< ||jdkr|jt|jd	 ||}|dk	r0||r|jpd|  |_|_|_q`|j|||rF|jpHdd
}||_q`W |j|dS )u  
        1. 判断是否存在自身引用的字段，是的话进行树形表示 #
        2. 如果数量过多则开启， 每 {pseudo_node_limit} 个叶子结点抱团成一个伪父结点
        Return a tree of optgroups for this widget.

        :param name: widget name
        :param form_selected: the selected value of  M2M field
        :param attrs: other attributes
        :return:
        r   )Treelevel   NFTZpid)identity)tagrd   parent)rb   )Zmysite.admin.tree_structurera   rW   r\   r=   
ValueErrorrZ   objectsallr   getattrr^   pkr.   rL   Zget_nodeZcreate_nodere   rf   checkedZto_simple_data)r   r.   Zform_selectedr	   rP   ra   r7   rb   Ztreer`   Zhas_selectedquerysetrecordZ	node_datarf   _idselectedZnoder   r   r   r[   *  s:    




&
z!ZKFilteredSelectMultiple.opt_tree)NNNr   )N)r   r   r   rG   r   r2   rO   propertyrR   rU   r   r-   rZ   r[   r   r   r   )r   r   rM      s   	rM   c               @   s   e Zd ZdZdZdZdS )M2MRadioSelectz layui/includes/ztree_select.htmlZradioFN)r   r   r   r   r   is_multipler   r   r   r   rr   ^  s   rr   c               @   s   e Zd ZdZdZdZdS )M2MMultiSelectz layui/includes/ztree_select.htmlTZcheckboxN)r   r   r   r   rs   r   r   r   r   r   rt   d  s   rt   c               @   s"   e Zd ZdZdZdZdddZdS )M2MMixinNFTc          	      sx  dd l }dd l}ddlm} ddlm} ddlm} ddlm	}	m
}
m}m} ddlm} ddlm} t||j  }| jjj}||}| js|g}dt|d	 i }|  d k	r| |d fdd	| jr:ddlm} | }|js|| jd t |j! }n|| jd t |j" }n"| }|| jd t |j" }|rv|sv||krvnt|j#$ }| }|% }||kr|j#j&|d}dd |D }|j#j&|d}|js||	kr|j'( r|j'$ }n ||
kr|j)( r|j)$ }||
kr$|j)( rN||	kr:|j'( rN||ksN||krZ|j&|d}g }xH|D ]@i }x** D ]}|}|rv|||< qvW |+| qdW |js|,| jd t |j! | n|,| jd t |j" | xn|D ]f}|rLyt|dd}W n( t-k
r6   t.dd d|d< Y nX ||krTd|d< nd|d< qW ||j/j0tt12|d}|S )Nr   )cache)get_self_ref_field)threadlocals)
DepartmentAreaPositionLocation)Group)GroupProfilerk   )idr.   ZpIdFc                st   |r | }n| }t |r(|}nHt|tjrlt||}|sp|dkrp|  | krp| |ddS n|}|S )zA
            only allow enter to 'retry' status once
            NT)retry)callabler_   sixZstring_typesrj   )Z_objZ	attr_namedefaultr   Zattr_keyresult)default_field_map	field_mapget_attr_value_from_objobjr   r   r     s    

z7M2MMixin.get_tree_data.<locals>.get_attr_value_from_obj_)Zcompanyc             S   s   g | ]
}|j qS r   )Zgroup_ptr_id)rB   Zpror   r   r   rT     s    z*M2MMixin.get_tree_data.<locals>.<listcomp>)Zid__inr   r:   z0The id of tree node should be an integer number.ZredZfalserl   true)stampr7   r?   )NF)3timedatetimeZdjango.core.cacherv   Zmysite.admin.xadmin.utilrw   Zmysite.baserx   Zmysite.personnel.modelsry   rz   r{   r|   Zdjango.contrib.auth.modelsr}   Zmysite.base.modelsr~   r\   mktimeZnowZ	timetupler4   rm   r7   rs   r   r
   cached_by_userZget_current_userZis_superuserr=   	cache_keystrr   current_companyrh   ri   Zget_current_companyfilterZget_auth_deptexistsZget_auth_areakeysappendsetrg   r   r^   
model_namejsondumps)r   rp   r   Zforce_freshr   r   rv   rw   rx   ry   rz   r{   r|   r}   r~   r   Z
data_modelZ	ref_fieldZtmp_mapZauthorZ	tree_dataZobjsr   Zgroup_profilesZ	group_idsZ	tree_nodekeyr/   ro   	new_attrsr   )r   r   r   r   r   get_tree_datao  s    











zM2MMixin.get_tree_data)NF)r   r   r   r   r   Zabstractr   r   r   r   r   ru   j  s   ru   c               @   s   e Zd ZdZdZdS )GeneralM2MSelectz{model_name}_tree_nodesTN)r   r   r   r   r   r   r   r   r   r     s   r   c                   s*   e Zd Z fddZd fdd	Z  ZS )GeneralRadioSelectc                s.   t t| j|| | j| jjjjj	| _d S )N)
r   r   r   r   r(   r4   rm   r7   r^   r   )r   argsrP   )r   r   r   r     s    zGeneralRadioSelect.__init__Nc                sN   | j |ddid}|jtjd |d k	r4|| n|}tt| ||||S )Nr.   tree_node_name)rp   r   )r   )r   r
   r   r   r   render)r   r.   r/   r	   rendererr   )r   r   r   r     s    zGeneralRadioSelect.render)NN)r   r   r   r   r   r   r   r   )r   r   r     s   r   c                   s*   e Zd Z fddZd fdd	Z  ZS )GeneralMultiSelectc                s&   t t| j|| | jj|d| _d S )N)r   )r   r   r   r   r(   )r   r   r   rP   )r   r   r   r     s    zGeneralMultiSelect.__init__Nc                sN   | j |ddid}|jtjd |d k	r4|| n|}tt| ||||S )Nr.   r   )rp   r   )r   )r   r
   r   r   r   r   )r   r.   r/   r	   r   r   )r   r   r   r     s    zGeneralMultiSelect.render)NN)r   r   r   r   r   r   r   r   )r   r   r     s   r   )7r   	functoolsr   r   Zdjangor   Zdjango.contrib.admin.widgetsr   Zdjango.utils.encodingr   Zmysite._utilsr   Z	TextInputr   ZNumberInputr   Z
EmailInputr   ZURLInputr   ZPasswordInputr   ZHiddenInputr   Z	FileInputr    ZClearableFileInputr!   ZTextarear"   r#   Z	DateInputr%   Z	TimeInputr)   ZDateTimeInputr*   r+   ZCheckboxInputr,   r0   ZSelectr1   r3   r5   rH   rM   ZRadioSelectrr   rt   r   ru   r   r   r   r   r   r   r   <module>   sB   
py