B
    Ib.>                 @   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 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 d dlmZ yd dlZW n  e k
r   d dlm!Z Y nX yd dl"m#Z$ W n" e k
r$   d dl"m%Z$ Y nX dd Z&dd Z'dd Z(dd Z)dd Z*dd Z+dd  Z,G d!d" d"eZ-d#d$ Z.dJd%d&Z/d'd( Z0dKd)d*Z1d+d, Z2d-d. Z3d/d0 Z4dLd2d3Z5G d4d5 d5e6Z7d6d7 Z8d8d9 Z9d:d; Z:d<d= Z;d>d? Z<d@dA Z=dBdC Z>dDdE Z?dFdG Z@dHdI ZAdS )M    )absolute_importN)settings)models)FieldDoesNotExist)	Collector)ForeignObjectRel)
LOOKUP_SEP)Media)formats)	force_str	smart_str)	mark_safe)get_language)ngettext)static)
simplejson)template_localtime)	localtimec        
         sJ  ddl m } |}g }t  x| D ]}y x|dD ]}|| }q6W W nZ tk
r } z<|dr|dd }|dkrd||f }q|n|W d d }~X Y nX t|tr|}nNd}	tjst	td	d
rdpd}	|	dkr|	|krd}	|	dkr|	|krd}	||	 }t
|ttfkr|p|g}| fdd|D  q"W dd |D S )N   )vendors.Zxadmin)cssjszxadmin/%s/%sZdevZSTATIC_USE_CDNFZcdnZ
productionc                s    g | ]}|d   ddi qS )lang_-)replace).0f)r    1G:\easytimepro\master/mysite/admin\xadmin\util.py
<listcomp>H   s    zxstatic.<locals>.<listcomp>c             S   s"   g | ]}| d r|pt|qS )zhttp://)
startswithr   )r   r   r    r    r!   r"   J   s    )r   r   split	Exceptionr#   
isinstancestrr   DEBUGgetattrtypelisttupleextend)
tagsr   ZnodeZfstagpe	file_typefilesmoder    )r   r!   xstatic$   s:    

r5   c              G   sh   dg i}g }xN| D ]F}| dd }t|}|dkr@|| q|dkr|d  |7  < qW t||dS )NZscreenr   r   r   r   )r   r   )r$   r5   r-   r	   )r.   r   r   r/   r2   r3   r    r    r!   vendorM   s    
r6   c             C   sJ   | ddd }| |}t|dr2t|jtjsBt|rF|jj	sFdS dS )zU
    Returns True if 'distinct()' should be used to query the given lookup path.
    __r   r   remote_fieldTF)
r$   	get_fieldhasattrr&   r8   r   ManyToManyRelis_related_fieldfieldunique)optsZlookup_pathZ
field_namer=   r    r    r!   lookup_needs_distinctZ   s    

r@   c             C   sD   |  dr|d}|  dr@t|tkr@| dkr<d}nd}|S )zK
    Returns a lookup value prepared to be used in queryset filtering.
    Z__in,Z__isnull) ZfalseFT)endswithr$   r*   r'   lower)keyvaluer    r    r!   prepare_lookup_valueh   s    

rG   c             C   sV   t | ts| S t| }x4tt|D ]$}|| }|dkr$dt| ||< q$W d|S )a  
    Ensure that primary key values do not confuse the admin URLs by escaping
    any '/', '_' and ':' characters. Similar to urllib.quote, except that the
    quoting is slightly different so that it doesn't get automatically
    unquoted by the Web browser.
    z:/_#?;@&=+$,"<>%\z_%02XrB   )r&   r'   r+   rangelenordjoin)sresicr    r    r!   quotex   s    
rP   c          	   C   s   t | ts| S t}t}| d}|d g}|j}|d= xr|D ]j}|dd ry*||||dd d|dd   W q tk
r   |d|  Y qX q<|d|  q<W d|S )zI
    Undo the effects of quote(). Based heavily on urllib.unquote().
    r   r   r      N   rB   )r&   r'   chrintr$   append
ValueErrorrK   )rL   ZmychrZmyatoir+   rM   Zmyappenditemr    r    r!   unquote   s     



*rX   c             C   sN   g }xD| D ]<\}}x2|d D ]&}t |tkr8|| q|| qW q
W |S )z@Returns a list of field names from an admin fieldsets structure.fields)r*   r,   r-   rU   )Z	fieldsetsfield_namesnamer?   r=   r    r    r!   flatten_fieldsets   s    r\   c                   sP   e Zd Z fddZdd Zd fdd	Z fdd	Zd
d ZdddZ  Z	S )NestedObjectsc                s$   t t| j|| i | _t | _d S )N)superr]   __init__edgesset	protected)selfargskwargs)	__class__r    r!   r_      s    zNestedObjects.__init__c             C   s   | j |g | d S )N)r`   
setdefaultrU   )rc   sourcetargetr    r    r!   add_edge   s    zNestedObjects.add_edgeNc          
      s   x:|D ]2}|r,t ||r,| t||| q| d | qW ytt| j|fd|i|S  tjk
r } z| j	|j
 W d d }~X Y nX d S )Nsource_attr)r:   rj   r)   r^   r]   collectr   ZProtectedErrorrb   updateZprotected_objects)rc   objsrk   re   objr1   )rf   r    r!   rl      s    
zNestedObjects.collectc                s    t t| ||}||jjS )N)r^   r]   related_objectsZselect_relatedr=   r[   )rc   Zrelatedrn   Zqs)rf   r    r!   rp      s    zNestedObjects.related_objectsc             C   sn   ||krg S | | g }x*| j|dD ]}|| ||| q*W |rV||g}n|g}|rj|| |S )Nr    )addr`   getr-   _nestedrU   )rc   ro   seenformat_callbackZchildrenZchildZretr    r    r!   rs      s    

zNestedObjects._nestedc             C   s:   t  }g }x*| jddD ]}|| ||| qW |S )z5
        Return the graph as a nested list.

        Nr    )ra   r`   rr   r-   rs   )rc   ru   rt   rootsrootr    r    r!   nested   s
    zNestedObjects.nested)N)N)
__name__
__module____qualname__r_   rj   rl   rp   rs   rx   __classcell__r    r    )rf   r!   r]      s   r]   c             C   sN   t | tjtjjfr| j}nt | tjjr4| jj}n| }t	|j
t	|jdS )z
    Return a `dict` with keys 'verbose_name' and 'verbose_name_plural',
    typically for use with string formatting.

    `obj` may be a `Model` instance, `Model` subclass, or `QuerySet` instance.

    )verbose_nameverbose_name_plural)r&   r   ModelbaseZ	ModelBase_metaqueryQuerySetmodelr   r}   r~   )ro   r?   r    r    r!   model_format_dict   s    
r   c             C   sN   t | tjjr$|dkr|  }| j} t| }|d |d  }}t|||pJdS )a.  
    Return the appropriate `verbose_name` or `verbose_name_plural` value for
    `obj` depending on the count `n`.

    `obj` may be a `Model` instance, `Model` subclass, or `QuerySet` instance.
    If `obj` is a `QuerySet` instance, `n` is optional and the length of the
    `QuerySet` is used.

    Nr}   r~   r   )r&   r   r   r   countr   r   r   )ro   ndZsingularZpluralr    r    r!   model_ngettext   s    
r   c             C   s<   t | dr8| ddkr8| d}|d |j kr8dS dS )Nr$   r7   r   TF)r:   findr$   r   Zget_all_field_names)r[   r   partsr    r    r!   is_rel_field  s
    
r   c          	   C   s   |j }y|| }W n tk
r   t| r:| }||}n|d k	rht|| rh| dkrht|| }||}nlt| |r| d}|d d|dd   }}	t||}
|
d k	rt	|	|
|S t|| }t|r| }n|}d }Y nX d }t|| }|||fS )N)__str__Z__unicode__r7   r   r   )
r   r9   r   callabler:   r)   r   r$   rK   lookup_field)r[   ro   Zmodel_adminr?   r   attrrF   r   Zrel_nameZsub_rel_nameZrel_objr    r    r!   r     s4    









r   c             C   s   d| j | j|f S )Nzxadmin:%s_%s_%s)Z	app_labelZ
model_name)rF   argr    r    r!   admin_urlname4  s    r   c             C   s   t ddddd|  | f S )Nz<i class="%s" alt="%s"></i>zfa fa-check-circle text-successzfa fa-times-circle text-errorzfa fa-question-circle muted)TFN)r   )Z	field_valr    r    r!   boolean_icon8  s    r   c             C   s   ddl m} |jr$t|j| |S t|tjs<t|tjrDt	| S | d krP|S t|tj
rjtt| S t|tjtjfrt| S t|tjrt| |jS t|tjrt| S t|jtjrddd |  D S t| S d S )Nr   )EMPTY_CHANGELIST_VALUEz, c             S   s   g | ]}t |qS r    )r   )r   ro   r    r    r!   r"   Q  s    z%display_for_field.<locals>.<listcomp>)xadmin.views.listr   Zflatchoicesdictrr   r&   r   ZBooleanFieldZNullBooleanFieldr   ZDateTimeFieldr
   localizetz_localtimeZ	DateFieldZ	TimeFieldZDecimalFieldnumber_formatZdecimal_placesZ
FloatFieldr8   r;   rK   allr   )rF   r=   r   r    r    r!   display_for_field=  s$    

r   Fc             C   s   ddl m} |rt| S | d kr$|S t| tjr>tt| S t| tjtj	frZt| S t| t
jtfrtt| S t| S d S )Nr   )r   )r   r   r   r&   datetimer
   r   r   datetimedecimalZDecimalfloatr   r   )rF   Zbooleanr   r    r    r!   display_for_valueV  s    

r   c               @   s   e Zd ZdS )NotRelationFieldN)ry   rz   r{   r    r    r    r!   r   g  s   r   c             C   s4   | j r| j S t| r| jS t| dr,| jjS td S )Nr8   )related_modelr<   r   r)   r8   tor   )r=   r    r    r!   get_model_from_relationk  s    
r   c       	   	   C   s   g }| }| t}x|D ]}|j|}|j p4|j}t|t|d krnyt| W n tk
rl   P Y nX |r|	 }|j
j}n|jj}|j}|d| qW |t|fS )z Create a reversed field path.

    E.g. Given (Order, "user__groups"),
    return (Group, "user__order").

    Final field must be a related model, not a data field.

    r   r   )r$   r   r   r9   Zauto_createdZconcreterI   r   r   Zrelated_query_nameZrelr   r=   r[   r   insertrK   )	r   pathZreversed_pathparentpiecespiecer=   ZdirectZrelated_namer    r    r!   reverse_field_pathv  s$    	


r   c             C   sH   | t}g }x4|D ],}|r*t|d }n| }||j| qW |S )a;   Return list of Fields given path relative to model.

    e.g. (ModelX, "user__groups__name") -> [
        <django.db.models.fields.related.ForeignKey object at 0x...>,
        <django.db.models.fields.related.ManyToManyField object at 0x...>,
        <django.db.models.fields.CharField object at 0x...>,
    ]
    r   )r$   r   r   rU   r   r9   )r   r   r   rY   r   r   r    r    r!   get_fields_from_path  s    	

r   c             C   s6   yt | d  W n  tk
r0   | dd } Y nX | S )z0 Discard trailing non-relation field if extant. r   N)r   r   )rY   r    r    r!   remove_trailing_data_field  s
    r   c             C   sb   t | |}t|}|o4t|d do4t|d jdd}|sBt S t|tjrR|S tjf |S dS )z Return Q object for limiting choices if applicable.

    If final model in path is linked via a ForeignKey or ManyToManyField which
    has a `limit_choices_to` attribute, return it as a Q object.
    r   r8   limit_choices_toN)r   r   r:   r)   r8   r   Qr&   )r   r   rY   r   r    r    r!   get_limit_choices_to_from_path  s    
r   c                s`   t  xFt D ]:\}}|d d dkr|dd   |< |dd   qW  fdd}|S )Nr   r   c                sH    fddD }x0t t|D ]\}\}}|kr"| ||< q"W |S )Nc                s   g | ]} | qS r    r    )r   k)adictr    r!   r"     s    z0sortkeypicker.<locals>.getit.<locals>.<listcomp>)	enumeratezip)r   Z	compositerN   r   v)keynamesnegate)r   r!   getit  s
    zsortkeypicker.<locals>.getit)ra   r   rq   )r   rN   r   r   r    )r   r   r!   sortkeypicker  s    r   c             C   s
   t | tS )N)r&   r   )r=   r    r    r!   r<     s    r<   c             C   s   t | dr| jd kpt| S )Nr8   )r:   r8   r<   )r=   r    r    r!   is_related_field2  s    r   c             C   st   dd l }ddlm} d }|| r4t| tjr4| }n| j}|d k	rpx,|jj	D ] }t
||rL|j|krL|j}P qLW |S )Nr   )
ForeignKey)inspectZdjango.db.modelsr   Zisclass
issubclassr   r   r   r   rY   r&   Zattname)r=   r   r   Zself_referred_fieldr   r   r    r    r!   get_self_ref_field  s    r   c             C   s   t | d k	S )N)r   )r=   r    r    r!   is_self_ref_field  s    r   )N)N)F)BZ
__future__r   r   r   Zdjango.confr   Z	django.dbr   Zdjango.core.exceptionsr   Zdjango.db.models.deletionr   Zdjango.db.models.fields.relatedr   Zdjango.db.models.sql.queryr   Zdjango.formsr	   Zdjango.utilsr
   ZsixZdjango.utils.encodingr   r   Zdjango.utils.safestringr   Zdjango.utils.translationr   r   Zdjango.templatetags.staticr   ZjsonImportErrorr   Zdjango.utils.timezoner   r   r   r5   r6   r@   rG   rP   rX   r\   r]   r   r   r   r   r   r   r   r   r%   r   r   r   r   r   r   r   r<   r   r   r   r    r    r    r!   <module>   sf   )4

$
	