3
gY                 @   sD  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	 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mZmZ d d
lmZ d dlmZmZmZ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Z-dZ.dZ/dZ0dZ1dZ2e-e.e/e1eefZ3G dd dej4Z5G dd dZ6dS )    )datetime	timedelta)forms)settings)messages)FieldListFilter)DisallowedModelAdminLookupDisallowedModelAdminToField)IS_POPUP_VARTO_FIELD_VARIncorrectLookupParameters)get_fields_from_pathlookup_needs_distinctprepare_lookup_valuequote)FieldDoesNotExistImproperlyConfiguredSuspiciousOperation)InvalidPage)ExistsFFieldManyToOneRelOrderByOuterRef)
Combinable)reverse)	urlencode)
make_aware)gettextalloZotpqec                   s   e Zd Z fddZ  ZS )ChangeListSearchFormc                s&   t  j|| ttjdddi| _d S )NF)requiredstrip)super__init__
SEARCH_VARr   Z	CharFieldfields)selfargskwargs)	__class__ ]/var/www/tester-filtro-web/env/lib/python3.6/site-packages/django/contrib/admin/views/main.pyr)   (   s    zChangeListSearchForm.__init__)__name__
__module____qualname__r)   __classcell__r0   r0   )r/   r1   r%   '   s   r%   c               @   s   e Zd ZeZdd ZdddZ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 ) 
ChangeListc             C   s  || _ |j| _| j| _|j|| _|| _|| _|| _d | _	d | _
d | _|| _|| _|| _|	| _|
| _|| _|j|| _|| _| j|j}|j sx$|jj D ]}tj|dj| qW |jjtpd| _ yt!|jjt"d| _#W n t$k
r   d| _#Y nX t%|jk| _&t'|jk| _(|jjt)}|rB|j*|| rBt+d| || _,t-|jj. | _/t"| j/krl| j/t"= t0| j/kr| j/t0= | j(rf | _1n|| _1| j|| _2| j3| | j(rt4d}n | jj5|rt4d}nt4d}|| jj6 | _7| jj8j9| _:d S )Nz,     z"The field %s cannot be referenced.z	Select %szSelect %s to changezSelect %s to view);modelZ_metaoptslookup_optsget_querysetroot_querysetlist_displaylist_display_linkslist_filterhas_filtershas_active_filtersclear_all_filters_qsdate_hierarchysearch_fieldslist_select_relatedlist_per_pagelist_max_show_allmodel_adminZget_preserved_filtersZpreserved_filterssortable_bysearch_form_classGETZis_validerrorsvaluesr   errorjoinZcleaned_datagetr*   queryintPAGE_VARpage_num
ValueErrorALL_VARshow_allr
   Zis_popupr   Zto_field_allowedr	   to_fielddictitemsparams
ERROR_FLAGlist_editablequerysetget_resultsr   Zhas_change_permissionZverbose_nametitlepkattname
pk_attname)r,   requestr9   r>   r?   r@   rD   rE   rF   rG   rH   r^   rI   rJ   Z_search_formrO   rY   ra   r0   r0   r1   r)   3   sd    


zChangeList.__init__Nc             C   s2   |p| j }|j }xtD ]}||kr||= qW |S )z:
        Return all params except IGNORED_PARAMS.
        )r\   copyIGNORED_PARAMS)r,   r\   lookup_paramsZignoredr0   r0   r1   get_filters_paramsn   s    


zChangeList.get_filters_paramsc             C   s  | j  }d}d}x.|j D ]"\}}| jj||std| qW g }x| jD ]}t|}	t|rt|||| j| j}
nzd }t	|t
tfr|\}}n|tj }}t	|ts|}t| j|d }||||| j| j|d}
|	t|kr|t| j|O }|
rL|
j rL|j|
 |	t|krLd}qLW | jrD|jd| j d }|d k	rD|jd| j d }|jd| j d }y8tt|t|d k	rz|ndt|d k	r|nd}W n. tk
r } zt||W Y d d }~X nX |r|tdd	 }n0|r|td
d	 jdd}n|j|jd d}tjr&t|}t|}|j d| j |d| j |i yHx4|j D ](\}}t!||||< |t| j|O }qPW |t"||||fS  t#k
r } zt||W Y d d }~X nX d S )NFzFiltering by %s not allowedr8   )
field_pathTz%s__yearz	%s__monthz%s__day)days    )day)yearz%s__gtez%s__lt)$ri   r[   rI   Zlookup_allowedr   r@   lencallabler9   
isinstancetuplelistr   creater   r   r   r;   Z
has_outputappendrD   popr   rS   rV   r   r   replacern   r   ZUSE_TZr   updater   boolr   )r,   re   rh   Zmay_have_duplicatesrB   keyvaluefilter_specsr@   Zlookup_params_countspecrj   fieldZfield_list_filter_classrn   monthrm   Z	from_dater$   Zto_dater0   r0   r1   get_filters{   st    




	zChangeList.get_filtersc             C   s   |d kri }|d krg }| j j }x.|D ]&}x t|D ]}|j|r6||= q6W q(W x4|j D ](\}}|d kr|||kr||= q\|||< q\W dtt|j  S )Nz?%s)r\   rf   rt   
startswithr[   r   sorted)r,   
new_paramsremover"   rkvr0   r0   r1   get_query_string   s    


zChangeList.get_query_stringc             C   s   | j j|| j| j}|j}| j jr.| jj }nd }|| jk}|| jk}| jrP|sV| rb| jj	 }n,y|j
| jj}W n tk
r   tY nX || _| j j| _| j pt|| _|| _|| _|| _|| _|| _d S )N)rI   Zget_paginatorr_   rG   countZshow_full_result_countr=   rH   rX   Z_clonepagerU   object_listr   r   result_countrz   Zshow_admin_actionsfull_result_countresult_listcan_show_all
multi_page	paginator)r,   re   r   r   r   r   r   r   r0   r0   r1   r`      s*    



zChangeList.get_resultsc             C   s*   g }| j jr| j j}n| jjr&| jj}|S )N)rI   orderingr;   )r,   r   r0   r0   r1   _get_default_ordering	  s    
z ChangeList._get_default_orderingc             C   s   y| j j|}|jS  tk
r|   t|r0|}n&t| j|rJt| j|}nt| j|}t	|t
rpt|drp|j}t|ddS X dS )ai  
        Return 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. Return None if no
        proper model field name can be matched.
        fgetZadmin_order_fieldN)r;   	get_fieldnamer   rq   hasattrrI   getattrr9   rr   propertyr   )r,   
field_namer   attrr0   r0   r1   get_ordering_field  s    zChangeList.get_ordering_fieldc             C   s<  | j }t| jj|p| j }t|kr$g }|t jd}x|D ]}y|jd\}}}	| jt	|	 }
| j
|
}|stw@t|tr|dkr|j }|j  |j| n^t|dr|j|dkr|j n|j  n4|jdr|dkr|j|dd  n|j||  W q@ ttfk
r   w@Y q@X q@W |j|jj | j|S )a  
        Return the list of ordering fields for the change list.
        First check the get_ordering() method in model admin, then check
        the object's default ordering. Then, any manually-specified ordering
        from the query string overrides anything. Finally, a deterministic
        order is guaranteed by calling _get_deterministic_ordering() with the
        constructed ordering.
        .-Zresolve_expressionr8   N)r\   rt   rI   get_orderingr   	ORDER_VARsplit
rpartitionr>   rS   r   rr   r   rf   Zreverse_orderingrv   r   descascr   
IndexErrorrV   extendrR   order_by_get_deterministic_ordering)r,   re   r_   r\   r   Zorder_paramsr"   nonepfxidxr   Zorder_fieldr0   r0   r1   r   )  s4    	




 zChangeList.get_orderingc       
         sJ  t |}t }dhdd  jjD B }x|D ]}d}t|trL|jd}n0t|tr^|j}nt|t	r|t|j
tr||j
j}|r.y jj|}W n tk
r   w.Y nX |jr||jkrq.|j|krP |j|j q.W  jjdd  jjD }xT|D ]B} fdd	|D }	td
d |	D r"q|jdd |	D rP qW |jd |S )a  
        Ensure a deterministic order across all database backends. Search for a
        single field or unique together set of fields providing a total
        ordering. If these are missing, augment the ordering with a descendant
        primary key.
        rb   c             S   s    h | ]}|j r|j r|jqS r0   )uniquenullrc   ).0r   r0   r0   r1   	<setcomp>]  s   z9ChangeList._get_deterministic_ordering.<locals>.<setcomp>Nr   c             s   s   | ]}|j V  qd S )N)r+   )r   
constraintr0   r0   r1   	<genexpr>  s   z9ChangeList._get_deterministic_ordering.<locals>.<genexpr>c                s   g | ]} j j|qS r0   )r;   r   )r   r   )r,   r0   r1   
<listcomp>  s    z:ChangeList._get_deterministic_ordering.<locals>.<listcomp>c             s   s   | ]}|j V  qd S )N)r   )r   r   r0   r0   r1   r     s    c             s   s   | ]}|j V  qd S )N)rc   )r   r   r0   r0   r1   r     s    z-pk)rt   setr;   r+   rr   strlstripr   r   r   
expressionr   r   remote_fieldrc   addZunique_togetherZtotal_unique_constraintsany
issupersetrv   )
r,   r   ordering_fieldsZtotal_ordering_fieldspartr   r   Zconstraint_field_namesfield_namesr+   r0   )r,   r1   r   T  sB    





z&ChangeList._get_deterministic_orderingc             C   s(  | j  }i }t| jkrx|D ]}t|ttfrht|ts@|j }t|jtr|j	rVdnd}|jj
}qqn |jdr|dd }d}nd}x.t| jD ] \}}| j||kr|||< P qW qW nfxd| jt jdD ]P}|jd\}}	}
yt|
}
W n tk
r   wY nX |	dkrdnd||
< qW |S )zT
        Return a dictionary of ordering field column numbers and asc/desc.
        r   r   r   r8   Nr   )r   r   r\   rr   r   r   r   r   r   Z
descendingr   r   	enumerater>   r   r   r   rS   rV   )r,   r   r   r   Z
order_typeindexr   r"   r   r   r   r0   r0   r1   get_ordering_field_columns  s6    




z%ChangeList.get_ordering_field_columnsc       
      C   s  | j |\| _| _}}| _| j}x&| jD ]}|j||}|d k	r(|}q(W y|jf |}W nB ttfk
rr    Y n* t	k
r } zt
|W Y d d }~X nX | jj||| j\}}| j|| j d| _||B r|jtdd}| jjt|}| j||}	|j|	 }|jjs| j|}|S )N)r   r   rb   )rb   )r   r}   rA   rB   r=   r_   filterr   r   	Exceptionr   rI   Zget_search_resultsrR   r   ri   rC   r   r   r   r   select_relatedapply_select_related)
r,   re   Zremaining_lookup_paramsZfilters_may_have_duplicatesqsZfilter_specZnew_qsr$   Zsearch_may_have_duplicatesr   r0   r0   r1   r<     s2    


zChangeList.get_querysetc             C   sB   | j dkr|j S | j dkr,| j r,|j S | j r>|j| j  S |S )NTF)rF   r   !has_related_field_in_list_display)r,   r   r0   r0   r1   r     s    

zChangeList.apply_select_relatedc             C   sV   xP| j D ]F}y| jj|}W n tk
r0   Y qX t|jtr||j krdS qW dS )NTF)r>   r;   r   r   rr   r   r   Zget_attname)r,   r   r   r0   r0   r1   r     s    z,ChangeList.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)r-   Zcurrent_app)
r   rd   r   r:   Z	app_labelZ
model_namer   rI   Z
admin_siter   )r,   resultrb   r0   r0   r1   url_for_result  s
    

zChangeList.url_for_result)N)NN)r2   r3   r4   r%   rK   r)   ri   r   r   r`   r   r   r   r   r   r<   r   r   r   r0   r0   r0   r1   r6   0   s   ;
[
!+>(9r6   N)7r   r   Zdjangor   Zdjango.confr   Zdjango.contribr   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.core.exceptionsr   r   r   Zdjango.core.paginatorr   Zdjango.db.modelsr   r   r   r   r   r   Zdjango.db.models.expressionsr   Zdjango.urlsr   Zdjango.utils.httpr   Zdjango.utils.timezoner   Zdjango.utils.translationr   rW   r   ZORDER_TYPE_VARrT   r*   r]   rg   ZFormr%   r6   r0   r0   r0   r1   <module>   s0    	