B
    Ob8!                 @   s   d dl 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
mZ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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) dd Z*dd Z+dd Z,dd Z-dd Z.dd Z/dS )    N)reduce)IncorrectLookupParametersget_content_type_for_model)get_fields_from_pathlookup_needs_distinct)SuspiciousOperationImproperlyConfiguredValidationError)models)Q)FieldDoesNotExist)loader)RequestContext)	smart_str)gettext)	iteritems)RELATE_PREFIXCOL_LIST_VAR	ORDER_VAR)Bookmark   )manager)FILTER_PREFIX
SEARCH_VARc             C   s   t | tr|  }n| }|S )a  
     Contexts in django version 1.9+ must be dictionaries. As xadmin has a legacy with older versions of django,
    the function helps the transition by converting the [RequestContext] object to the dictionary when necessary.
    :param context: RequestContext
    :return: dict
    )
isinstancer   Zflatten)contextZctx r   ;G:\easytimepro\master/mysite/admin\xadmin\filters_plugin.pyget_context_dict!   s    

r   c             C   s   | tjdt| d d S )Nz.xadmin/blocks/model_list.nav_menu.filters.html)r   )appendr   render_to_stringr   )r   nodesr   r   r   block_nav_menu/   s    r"   c             C   s   | dtjdt| d d S )Nr   z0xadmin/blocks/model_list.nav_menu.bookmarks.html)r   )insertr   r    r   )r   r!   r   r   r   block_nav_bookmark5   s    r$   c             C   s   | j s
i S g }|j}| jj| jjf}td}t| j}tj	j
|dj
t|dtddB |jdjtjj }x |D ]}||j|jd qpW | jd| }	|||	ddd	}
|
S )
NZbase_model_bookmarks)content_type)userT)Zis_share)Z
company_id)titlefiltersz%s_%s_bookmark)Zbk_menu_titleZbk_bookmarksZbk_post_urlZhas_add_permission_bookmarkZhas_change_permission_bookmark)Zshow_bookmarksr&   optsZ	app_labelZ
model_name_r   modelr   Zobjectsfilterr   Zcurrent_companyZorder_byZ_metaZorderingr   r'   r(   Z
admin_siteZget_url)adminrequestZ	bookmarksr&   Z
model_infoZ
menu_titler%   Zbookmarks_querysetZbkZpost_urlZnew_contextr   r   r   get_bookmark_context:   s&    
&
r/   c          	   K   s  t |j }t dd | D }x$t|D ]\}}|dkr.d||< q.W d}|dd}t|}	g }
|rpd}nd}t| |i }t| dd }|r||7 }x|D ]}t|r|||| j| }nzd }g }t	|t
tfr|\}}n|tj }}t	|tjs|}t| j|}|d	 }||||| j| |d
}|p4t| j|}|r| r|
| qW |	|d< t|
|d< |
|d< tdd |
}tjrt|}t||d< |S )Nc             S   s>   g | ]6\}}t |tr|d krt |ttd |fqS ) N)r   
startswithr   len).0kvr   r   r   
<listcomp>[   s    z&get_filters_plugin.<locals>.<listcomp>FalseF
is_historyZhistory_list_filterlist_filterZcalculated_filter)
field_pathhas_query_paramZhas_filtersfilter_specsc             S   s   | j S )N)Zis_used)fr   r   r   <lambda>       z$get_filters_plugin.<locals>.<lambda>Zused_filter_num)dictGETitemsr   getboolgetattrcallabler+   r   tuplelistfilter_managercreater
   ZFieldr   r   r)   Z
has_outputr   r,   sixZPY3r2   )r-   r.   kwargsZparamslookup_paramsZp_keyZp_valuse_distinctr8   r<   r=   Zfilter_fieldZlist_filtersZspec_filterr9   specr;   Zfield_partsZfieldZfield_list_filter_classobjr   r   r   get_filters_pluginY   sZ    


rR   c                s>  y*x$|  D ]\}}|p"t| j|}qW W n* tk
rT }	 zt|	W d d }	~	X Y nX yrt|tjjr|rt	 }
xH|  D ]<\}}|
d}t|dkr|
||i qz|
||i qzW |jf |
}W nD ttfk
r    Y n< tk
r }	 zt|	W d d }	~	X Y nX t|tjjs|jtd}dd | jr|rfdd| jD }x6|
 D ]*  fdd|D }|ttj|}q`W |sx"|D ]}t| j|rd	}P qW ||d
< xf|D ]^}y||}W n: tk
r }	 zd }ttd|	 d W d d }	~	X Y nX |d k	r|}qW |r6| S |S d S )N,r   r0   c             S   sZ   |  drd| dd   S |  dr4d| dd   S |  drNd| dd   S d|  S d S )	N^z%s__istartswithr   =z
%s__iexact@z
%s__searchz%s__icontains)r1   )Z
field_namer   r   r   construct_search   s    


z.handle_lookup_params.<locals>.construct_searchc                s   g | ]} t |qS r   )str)r3   Zsearch_field)rW   r   r   r6      s   z(handle_lookup_params.<locals>.<listcomp>c                s   g | ]}t jf | iqS r   )r
   r   )r3   Z
orm_lookup)bitr   r   r6      s   TZsearch_queryz<b>Filtering error:</b> %serror)rC   r   r)   r   r   r   r
   queryZQuerySetrA   splitr2   updater,   r   r   	ExceptionrB   rD   r   Zsearch_fieldsr   operatoror_Zapply_filterr	   printr*   Zdistinct)r-   r.   ZquerysetrN   r=   rM   keyvaluerO   eZnew_lookup_paramesr4   r5   Zlist_vr[   Zorm_lookupsZ
or_queriesZsearch_specrP   Znew_qsr   )rY   rW   r   handle_lookup_params   sZ    






$

re   )0r_   	functoolsr   Zdjango.contrib.admin.optionsr   r   Zdjango.contrib.admin.utilsr   r   Zdjango.core.exceptionsr   r   r	   Z	django.dbr
   Zdjango.db.modelsr   Zdjango.db.models.fieldsr   Zdjango.templater   Zdjango.template.contextr   rL   Zdjango.utils.encodingr   Zdjango.utils.translationr   r*   r   Zmysite.admin.views.mainr   r   r   Zmysite.base.models.bookmarkr   r(   r   rJ   constr   r   r   r"   r$   r/   rR   re   r   r   r   r   <module>   s.   D