B
    bl                 @   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
mZ d dlmZmZ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 d d
lmZ d dlmZ d dlmZ d dl 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* d dl+m,Z, dZ-dZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5dZ6dZ7dZ8dZ9dZ:d Z;d!Z<d"Z=d#Z>dZ?d$Z@d%ZAd&ZBd'ZCd(ZDd)ZEe.e-e.e/e0e1e3e4e5e6e7e8e9e:e;e<e=e>e?e@eAeBeee2eCeDeEfZFe,jGfZHG d*d+ d+eZIdS ),    N)OrderedDict)literal_eval)FieldListFilter)DisallowedModelAdminLookupDisallowedModelAdminToField)IS_POPUP_VARTO_FIELD_VARIncorrectLookupParameters)get_fields_from_pathlookup_needs_distinctprepare_lookup_valuequote)
ChangeList)FieldDoesNotExistImproperlyConfiguredSuspiciousOperation)
FieldError)models)reverse)	force_str	smart_str)	urlencode)gettext)r   unquote)constlimitalloZotpageZcsrfmiddlewaretokenqesftZstampyZisContainChildZsidxZexporttblNamerowsZ
exporttypeZtransmeetidZmod_nameZ
show_styleZ_colsZ_rel_ c               @   s   e Zd Zdd Zdd Zdd Zd$dd	Zd
d Zd%ddZd&ddZ	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# ZdS )'ZKChangeListc          
   C   s*  || _ |j| _| j| _||| _|| _|| _|| _|| _	|| _
|| _|	| _|| _|| _||| _yt|jdd| _W n tk
r   d| _Y nX y*t|jd|
| _| jdk rtdW nD tk
r } z
|
| _W d d }~X Y n tk
r   tdY nX t|jk| _t|jk| _|jt}|rL|||sLtd| || _ t!|j"# | _$t%| j$krv| j$t%= t&| j$kr| j$t&= t'| j$kr| j$t'= t(| j$kr| j$t(= | jrd| _)n|| _)|jt*d| _+| || _,| -| | jr t.d	}nt.d
}|t/| jj0 | _1| jj2j3| _4d S )Nr   r      r   zIllegal page limitz"The field %s cannot be referenced. r&   z	Select %szSelect %s to change)5model_metaoptslookup_optsget_querysetroot_querysetlist_displaylist_display_linkssort_fieldslist_filterdate_hierarchysearch_fieldslist_select_relatedlist_max_show_allmodel_adminZget_preserved_filtersZpreserved_filtersintGETgetpage_num
ValueErrorlist_per_pager	   	TypeErrorALL_VARshow_allr   Zis_popupr   Zto_field_allowedr   to_fielddictPOSTitemsparamsPAGE_VARPAGE_LIMIT_VARCSRF_VAR
ERROR_FLAGlist_editable
SEARCH_VARqueryquerysetget_results_r   Zverbose_nametitlepkZattname
pk_attname)selfrequestr*   r0   r2   r1   r3   r4   r5   r6   r>   r7   rK   r8   r    rB   rQ   r)   r)   0G:\easytimepro\master/mysite/admin\views\main.py__init__P   sh    


zZKChangeList.__init__c             C   s`   |j }d}|dd}|dkr nd}|dd}|r>| |}g }t|dkr\|||  |S )Nr&   orderasc-fieldr   )r:   r;   get_ordering_fieldlenappend)rT   rU   rF   prefixrX   r[   resultr)   r)   rV   get_sort_fields   s    
zZKChangeList.get_sort_fieldsc       
   
   C   sf  | j jr| j }nd }| |}t|dkr<| jj| | _| j || j| j	}d}d|j
krd|j
kry
|j}W nZ tk
r } ztt|W d d }~X Y n. tk
r } ztt|W d d }~X Y nX || jk}|| j	k}| jr|s|s| j }	n$| j|jkr|j| _|| jj}	|| _| j j| _| j p@t|| _|| _|	| _|| _|| _|| _d S )Nr   r   r   )r8   Zshow_full_result_countr/   countra   r]   rN   order_byZget_paginatorr>   r:   r=   r	   strOverflowErrorr7   rA   Z_cloner<   Z
page_rangeZ	num_pagesr   Zobject_listresult_countboolZshow_admin_actionsfull_result_countresult_listcan_show_all
multi_page	paginator)
rT   rU   rh   Zrequest_sortingrl   rf   r    rj   rk   ri   r)   r)   rV   rO      s<    




zZKChangeList.get_resultsNc             C   sn   |s
| j }| }xtD ]}||kr||= qW t| }x.|D ]&}x tD ]}||}|rJ||= qJW q@W |S )z:
        Returns all params except IGNORED_PARAMS
        )rF   copyIGNORED_PARAMSlistkeysIGNORED_PATTERNsearch)rT   rF   lookup_paramsZignoredZparam_as_keysZ	param_keypatmatchr)   r)   rV   get_filters_params   s    




zZKChangeList.get_filters_paramsc          
   C   s  |   }d}x.| D ]"\}}| j||std| qW g }| jr2t| jdd }|rh|  j|7  _x| jD ]}t|r|||| j| j}	nd }
t	|t
tfr|\}}n|tj }}t	|tjs|}
t| j|
d }t|}||||| j| j|
d}	|t|kr|pt| j|
}|	rp|	 rp||	 qpW yHx6| D ]*\}}t||||< |pdt| j|}q>W |t|||fS  tk
r } zttt|t d  W d d }~X Y nX d S )NFzFiltering by %s not allowedZcalculated_filter)
field_path   )rv   rE   r8   Zlookup_allowedr   r3   getattrcallabler*   
isinstancetuplero   r   creater   ZFieldr
   r]   r   r-   Z
has_outputr^   r   rg   r   sixZreraiser	   sysexc_info)rT   rU   rs   Zuse_distinctkeyvaluefilter_specsZspec_filterr3   specrx   r[   Zfield_list_filter_classZlookup_params_countr    r)   r)   rV   get_filters   sF    
zZKChangeList.get_filtersc             C   s   |d kri }|d krg }| j  }x.|D ]&}x t|D ]}||r6||= q6W q(W x4| D ](\}}|d kr|||kr||= q\|||< q\W dtt|  S )Nz?%s)rF   rm   ro   
startswithrE   r   sorted)rT   
new_paramsremoveprkvr)   r)   rV   get_query_string5  s    


zZKChangeList.get_query_stringc       	      C   s   ddl m} |d kri }|d kr$g }t| j }t| }x*|D ]"}x|D ]}||rN||= qNW qDW x4| D ](\}}|d kr||kr||= qt|||< qtW |d	dd | D S )Nr   )	mark_safer&   c             s   s"   | ]\}}|rd ||f V  qdS )z+<input type="hidden" name="%s" value="%s"/>Nr)   ).0r   r   r)   r)   rV   	<genexpr>Z  s    z/ZKChangeList.get_form_params.<locals>.<genexpr>)
Zdjango.utils.safestringr   rC   rF   rm   ro   rp   r   rE   join)	rT   r   r   r   r   Zarr_keysr   r   r   r)   r)   rV   get_form_paramsG  s$    


zZKChangeList.get_form_paramsc             C   s6   ddl m} | j}g }| jr(t|| }dd||dS )Nr   )yield_resultsr&   )codemsgrb   data)Zmysite.admin.admin_listr   rf   ri   ro   )rT   r   totalr%   r)   r)   rV   get_json_result\  s    zZKChangeList.get_json_resultc             C   s*   g }| j jr| j j}n| jjr&| jj}|S )N)r8   orderingr-   )rT   r   r)   r)   rV   _get_default_orderingi  s    
z"ZKChangeList._get_default_orderingc             C   sh   y| j |}|jS  tk
rb   t|r0|}n&t| j|rJt| j|}nt| j|}t|ddS X dS )ak  
        Returns the proper model field name corresponding to the given
        field_name to use for ordering. field_name may either be the name of a
        proper model field or the name of a method (on the admin or model) or a
        callable with the 'admin_order_field' attribute. Returns None if no
        proper model field name can be matched.
        Zadmin_order_fieldN)	r-   	get_fieldnamer   r{   hasattrr8   rz   r*   )rT   
field_namer[   attrr)   r)   rV   r\   q  s    zZKChangeList.get_ordering_fieldc          
   C   s(  | j }t| j|p|  }t|krg }|t d}x|D ]}yl|d\}}}	| jt	|	 }
| 
|
}|srw>|dr|dkr|dd }n|| }||kr|| W q> ttfk
r   w>Y q>X q>W | jjj}t|dd|d| h@ s$t| jdr| jjr$|| jj n
|d |S )a  
        Returns the list of ordering fields for the change list.
        First we check the get_ordering() method in model admin, then we check
        the object's default ordering. Then, any manually-specified ordering
        from the query string overrides anything. Finally, a deterministic
        order is guaranteed by ensuring the primary key is used as the last
        ordering field.
        .rZ   r(   NrR   z-pkpk_ordering)rF   ro   r8   get_orderingr   	ORDER_VARsplit
rpartitionr0   r9   r\   r   r^   
IndexErrorr=   r-   rR   r   setr   r   )rT   rU   rN   rF   r   Zorder_paramsr   nonepfxidxr   Zorder_fieldZordering_itemZpk_namer)   r)   rV   r     s4    	




zZKChangeList.get_orderingc          	   C   s   |   }t }t| jkrxx|D ]T}|dr>|dd }d}nd}x.t| jD ] \}}| ||krN|||< P qNW qW nbx`| jt dD ]L}|	d\}}	}
yt
|
}
W n tk
r   wY nX |	dkrdnd||
< qW |S )zV
        Returns an OrderedDict of ordering field column numbers and asc/desc
        rZ   r(   NZdescrY   r   )r   r   r   rF   r   	enumerater0   r\   r   r   r9   r=   )rT   r   Zordering_fieldsr[   Z
order_typeindexr   r   r   r   r   r)   r)   rV   get_ordering_field_columns  s(    


z'ZKChangeList.get_ordering_field_columnsc             C   s   ddl m} d|kr"|dd }| jj|}| }|jd k	rh| }|	|}t
|drh||}t|tjr|jddddd}n| }|S )Nr   )timezone__	normalize)ZhourZminutesecondZmicrosecond)Zdjango.utilsr   r   r*   r+   r   nowZtzinfoZget_current_timezoneZ
astimezoner   r   r|   r   ZDateTimeFieldreplacedate)rT   r[   r   Z_fieldr   Z
current_tztodayr)   r)   rV   _set_up_relative_date  s    



z"ZKChangeList._set_up_relative_datec             C   s~  dd l }ddlm} dd tdD }ddlm} x|t|jt|j	D ]\}}t
|}t
|}	t|	dkrtd|tj|}
|
sqP||
 d  }d|ks|d	r t|	}	d
|	kr|	d
d}	y"d|	krt|	d }	||	}W n$ tk
r   td|Y nX n|	drt|	}	|	d}|d }t|dkr`t|d nd }|tjkr| |}|tjkr|}nn|tjkr|tj |! d d d }nD|tj"kr|jdd}n*|tj#kr|jddd}n|d| d |r|tj t|d }|
$ddkr(dnd}||| |< qPW | %|\| _&| _'}}| j(}x*| j&D ] }|)||}|d k	r`|}q`W y|j*f |}W nF t+t,fk
r    Y n, t-k
r } zt|W d d }~X Y nX |j.j/s| 0|}d}x@t1|D ]2\}}y|dkr$|j2f |}nt3|4 }xb|D ]Z}d|kr6d|ksXd|kr6|d}|d |kr6|5|||d d |d  < q6W x6|D ].}d|krd|krt|| d ||< qW |j*f |}W nV tk
r } zt|W d d }~X Y n, t6k
r0 } zt|W d d }~X Y nX q W | 7||}|j8| }| j9:||| j.\}}||B rv|; S |S d S )Nr   )cprintc             S   s   g | ]}i qS r)   r)   )r   ir)   r)   rV   
<listcomp>  s    z-ZKChangeList.get_queryset.<locals>.<listcomp>ry   )chainzBThe user specified value for query condition(`{}`) cannot be emptyZ__inZ__isnull'"\z@The user specified value for query condition(`{}`) was improper.r   ,r(   )Zdays)day)Zmonthr   z, Warning: Wrong Format to represent a date: Zred0)Z
punch_timeZ
start_timeZend_timeZupdate_timeZregister_timeZupload_timeZatt_dateZcommit_timeZtransfer_timeZreturn_timeZ	last_sendZlast_activityZaction_timeZdate_joinedZbackup_timeZ	post_timeZop_timeZ
time_savedZlteZgteZ__date__Zparent_id)<jsonZmysite._utilsr   range	itertoolsr   r   Z	iteritemsr:   rD   r   r]   r	   formatr   FILTER_PATTERNrr   endendswithr   r   r   loadsr=   r   r   r9   ZFILTER_DATE_PREFIXr   ZFILTER_TODAYZFILTER_THIS_WEEKdatetimeZ	timedeltaZisocalendarZFILTER_THIS_MONTHZFILTER_THIS_YEARgroupr   r   Zhas_filtersr/   rN   filterr   r   	ExceptionrM   select_relatedapply_select_relatedr   Zexcluder}   rp   popr   r   rc   r8   Zget_search_resultsZdistinct)rT   rU   r   r   Zall_lookup_paramsr   r   r   Z_kZ_vru   Zfield_and_paramZ_tZ
magic_codeZmagic_indexr   Zfilter_or_excludeZremaining_lookup_paramsZfilters_use_distinctqsZfilter_specZnew_qsr    filtersr   dZfilter_keysZ
filter_keyZfilter_key_splitr   Zsearch_use_distinctr)   r)   rV   r.     s    (








$
 

zZKChangeList.get_querysetc             C   sB   | j dkr| S | j dkr,|  r,| S | j r>|j| j  S |S )NTF)r6   r   !has_related_field_in_list_display)rT   r   r)   r)   rV   r   i  s    

z!ZKChangeList.apply_select_relatedc          	   C   sZ   xT| j D ]J}y| j|}W n tk
r0   Y qX t|jtjr|| krNqdS qW dS )NTF)	r0   r-   r   r   r|   Zremote_fieldr   ZManyToOneRelZget_attname)rT   r   r[   r)   r)   rV   r   u  s    z.ZKChangeList.has_related_field_in_list_displayc             C   s6   t || j}td| jj| jjf t|f| jjj	dS )Nzadmin:%s_%s_change)argsZcurrent_app)
rz   rS   r   r,   Z	app_labelZ
model_namer   r8   Z
admin_siter   )rT   r`   rR   r)   r)   rV   url_for_result  s
    

zZKChangeList.url_for_result)N)NN)NN)__name__
__module____qualname__rW   ra   rO   rv   r   r   r   r   r   r\   r   r   r   r.   r   r   r   r)   r)   r)   rV   r'   N   s"   EA
:

1!{r'   )Jrm   r   r   collectionsr   Zastr   Zdjango.contrib.adminr   Zdjango.contrib.admin.exceptionsr   r   Zdjango.contrib.admin.optionsr   r   r	   Zdjango.contrib.admin.utilsr
   r   r   r   Zdjango.contrib.admin.views.mainr   Zdjango.core.exceptionsr   r   r   r   Z	django.dbr   Zdjango.urlsr   r   Zdjango.utils.encodingr   r   Zdjango.utils.httpr   Zdjango.utils.translationr   rP   Zsix.moves.urllib.parser   Zmysite.admin.xadminr   rH   r@   r   ZORDER_TYPE_VARrG   rI   rL   rJ   Z	STATE_VARZEXPORT_FILE_VARZTMP_VARZ	STAMP_VARZYEAR_VARZ
IS_CONTAINZSIDXZEXPORT_TABLE_NAMEZROWS_VARZEXPORT_TYPEZ
EXPORT_VARZTRANSMIT_IDZMODULE_NAMEZ
SHOW_STYLEZCOL_LIST_VARZRELATE_PREFIXZ
EMPTY_NAMErn   r   rq   r'   r)   r)   r)   rV   <module>   sf   
