
v^T                 @   s  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 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 Z* d Z+ d Z, d Z- d Z. d Z/ e* e+ e, e. e e f Z0 Gd d   d e j1  Z2 Gd d   d  Z3 d 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)models)
CombinableFOrderBy)reverse)	urlencode)
make_aware)gettextalloZotpqec                   s"   e  Z d  Z   f d d   Z   S)ChangeListSearchFormc                s8   t    j | |   t t j d d d d  i |  _ d  S)NrequiredFstrip)super__init__
SEARCH_VARr   Z	CharFieldfields)selfargskwargs)	__class__ A/tmp/pip-build-8lau8j11/django/django/contrib/admin/views/main.pyr&   (   s    zChangeListSearchForm.__init__)__name__
__module____qualname__r&   r-   r-   )r,   r.   r"   '   s   r"   c               @   s   e  Z d  Z e Z d d   Z d d d  Z d d   Z d 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  |  _	 | |  _
 | |  _ | |  _ |	 |  _ |
 |  _ | |  _ | j |  |  _ | |  _ |  j | j  } | j   s x0 | j j   D] } t j | d j |   q W| j j t  pd |  _ y" t | j j t  d   |  _! Wn t" k
 rSd |  _! Yn Xt# | j k |  _$ t% | j k |  _& | j j t'  } | r| j( | |  rt) d |   | |  _* t+ | j j,    |  _- t  |  j- k r|  j- t  =t. |  j- k r|  j- t. =|  j& rf  |  _/ n	 | |  _/ |  j |  |  _0 |  j1 |  |  j& r[t2 d  } n- |  j j3 |  r|t2 d  } n t2 d  } | |  j j4 |  _5 |  j j6 j7 |  _8 d  S)Nz,  r   z"The field %s cannot be referenced.z	Select %szSelect %s to changezSelect %s to view)9modelZ_metaoptslookup_optsget_querysetroot_querysetlist_displaylist_display_linkslist_filterhas_filters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)   requestr4   r9   r:   r;   r=   r>   r?   r@   rA   rW   rB   rC   Z_search_formrH   rR   rZ   r-   r-   r.   r&   3   s`    												"	

			zChangeList.__init__Nc             C   sC   | p |  j  } | j   } x! t D] } | | k r" | | =q" W| S)z:
        Return all params except IGNORED_PARAMS.
        )rU   copyIGNORED_PARAMS)r)   rU   lookup_paramsZignoredr-   r-   r.   get_filters_paramsl   s    zChangeList.get_filters_paramsc             C   s  |  j    } d } x? | j   D]1 \ } } |  j j | |  s t d |   q Wg  } x|  j D]} t |  r | | | |  j |  j  } n d  }	 t | t	 t
 f  r | \ }
 } n | t j }
 } t |
 t j  s |
 }	 t |  j |	  d }
 t |  } | |
 | | |  j |  j d |	 } | t |  k rV| pSt |  j |	  } | rd | j   rd | j |  qd W|  j r| j d |  j d   } | d  k	 r| j d |  j d   } | j d |  j d   } yL t t |  t | d  k	 r| n d  t | d  k	 r| n d   } Wn4 t k
 r[} z t |  |  WYd  d  } ~ Xn Xt j rqt |  } | r| t d d  } nA | r| t d d	  j d
 d  } n | j d | j  d  } | j! d |  j | d |  j | i  yb xE | j   D]7 \ } } t" | |  | | <| p9t |  j |  } qW| t# |  | | f SWn4 t$ k
 r} z t |  |  WYd  d  } ~ Xn Xd  S)NFzFiltering by %s not allowed   
field_pathz%s__yearz	%s__monthz%s__daydays    dayyearz%s__gtez%s__lt)%rb   rT   rB   Zlookup_allowedr   r;   callabler4   
isinstancetuplelistr   creater   ZFieldr   lenr   r6   Z
has_outputappendr=   popr   rL   rO   r   r   ZUSE_TZr   r   replacerh   updater   boolr   )r)   r^   ra   Zuse_distinctkeyvaluefilter_specsr;   specrd   fieldZfield_list_filter_classZlookup_params_countrh   monthrg   Z	from_dater!   Zto_dater-   r-   r.   get_filtersy   sj    			%"	"	zChangeList.get_filtersc             C   s   | d  k r i  } | d  k r$ g  } |  j  j   } x; | D]3 } x* t |  D] } | j |  rM | | =qM Wq: WxF | j   D]8 \ } } | d  k r | | k r | | =q~ | | | <q~ Wd t t | j     S)Nz?%s)rU   r_   rm   
startswithrT   r   sorted)r)   
new_paramsremover   rkvr-   r-   r.   get_query_string   s    
zChangeList.get_query_stringc             C   s+  |  j  j | |  j |  j  } | j } |  j  j rE |  j j   } n d  } | |  j k } | |  j k } |  j rx | s | r |  j j	   } n8 y | j
 |  j d  j } Wn t k
 r t  Yn X| |  _ |  j  j |  _ |  j p t |  |  _ | |  _ | |  _ | |  _ | |  _ | |  _ d  S)Nrc   )rB   Zget_paginatorrX   r@   countZshow_full_result_countr8   rA   rQ   Z_clonepagerN   object_listr   r   result_countrt   Zshow_admin_actionsfull_result_countresult_listcan_show_all
multi_page	paginator)r)   r^   r   r   r   r   r   r   r-   r-   r.   rY      s*    						zChangeList.get_resultsc             C   s=   g  } |  j  j r! |  j  j } n |  j j r9 |  j j } | S)N)rB   orderingr6   )r)   r   r-   r-   r.   _get_default_ordering   s    z ChangeList._get_default_orderingc             C   s   y |  j  j |  } | j SWn t k
 r t |  rB | } n9 t |  j |  ri t |  j |  } n t |  j |  } t	 | t
  r t | d  r | j } t | d d  SYn Xd 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)r6   	get_fieldnamer   rj   hasattrrB   getattrr4   rk   propertyr   )r)   
field_namery   attrr-   r-   r.   get_ordering_field  s    		zChangeList.get_ordering_fieldc             C   sk  |  j  } t |  j j |  p' |  j    } t | k rKg  } | t j d  } x | D] } y | j d  \ } } }	 |  j t	 |	  }
 |  j
 |
  } | s wY t | d  r | j | d k r | j   n	 | j    nF | j d  r| d k r| j | d d   n | j | |  WqY t t f k
 rFwY YqY XqY 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as_sqlrc   N)rU   rm   rB   get_orderingr   	ORDER_VARsplit
rpartitionr9   rL   r   r   rp   descascr|   
IndexErrorrO   extendrK   order_by_get_deterministic_ordering)r)   r^   rX   rU   r   Zorder_paramsr   nonepfxidxr   Zorder_fieldr-   r-   r.   r      s*    		$.zChangeList.get_orderingc       	         s  t  |  } t   } d h d d     j j D B} xb| D] } d } t | t  ri | j d  } nH t | t  r | j } n- t | t	  r t | j
 t  r | j
 j } | r< y   j j |  } Wn t k
 r w< Yn X| j r | | j k r q< | j | k rP| j | j  q< Wxs   j j D]X }   f d d   | D } t d d	   | D  rlq1| j d
 d	   | D  r1Pq1W| 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.
        r[   c             S   s,   h  |  ]" } | j  r | j r | j  q Sr-   )uniquenullr\   ).0ry   r-   r-   r.   	<setcomp>O  s   	z9ChangeList._get_deterministic_ordering.<locals>.<setcomp>Nr   c                s"   g  |  ] }   j  j |   q Sr-   )r6   r   )r   r   )r)   r-   r.   
<listcomp>o  s   	 z:ChangeList._get_deterministic_ordering.<locals>.<listcomp>c             s   s   |  ] } | j  Vq d  S)N)r   )r   ry   r-   r-   r.   	<genexpr>r  s    z9ChangeList._get_deterministic_ordering.<locals>.<genexpr>c             s   s   |  ] } | j  Vq d  S)N)r\   )r   ry   r-   r-   r.   r   t  s    z-pk)rm   setr6   r(   rk   strlstripr   r   r   
expressionr   r   remote_fieldr\   addZunique_togetherany
issupersetrp   )	r)   r   ordering_fieldsZtotal_ordering_fieldspartr   ry   field_namesr(   r-   )r)   r.   r   F  s<    	!z&ChangeList._get_deterministic_orderingc             C   s  |  j    } i  } t |  j k rxh| D] } t | t t f  r t | t  s^ | j   } t | j t  r( | j	 r d n d } | j j
 } q q( n. | j d  r | d d  } d } n d } x= t |  j  D], \ } } |  j |  | k r | | | <Pq Wq( Wn} xz |  j t j d  D]b } | j d  \ } }	 }
 y t |
  }
 Wn t k
 rkw&Yn X|	 d k r~d n d | |
 <q&W| S)zT
        Return a dictionary of ordering field column numbers and asc/desc.
        r   r   r   rc   Nr   )r   r   rU   rk   r   r   r   r   r   Z
descendingr   r|   	enumerater9   r   r   r   rL   rO   )r)   r   r   ry   Z
order_typeindexr   r   r   r   r   r-   r-   r.   get_ordering_field_columns|  s6    	
 z%ChangeList.get_ordering_field_columnsc       
      C   s<  |  j  |  \ |  _ |  _ } } |  j } x5 |  j D]* } | j | |  } | d  k	 r4 | } q4 Wy | j |   } WnK t t f k
 r   Yn1 t k
 r } z t	 |   WYd  d  } ~ Xn X| j
 j s |  j |  } |  j | |  } | j |   } |  j j | | |  j
  \ } }	 | |	 Br4| j   S| Sd  S)N)r{   rw   r<   r8   rX   filterr   r   	Exceptionr   rK   select_relatedapply_select_relatedr   r   rB   Zget_search_resultsZdistinct)
r)   r^   Zremaining_lookup_paramsZfilters_use_distinctqsZfilter_specZnew_qsr!   r   Zsearch_use_distinctr-   r-   r.   r7     s(    !	
!

zChangeList.get_querysetc             C   s[   |  j  d k r | j   S|  j  d k r> |  j   r> | j   S|  j  rW | j |  j    S| S)NTF)r?   r   !has_related_field_in_list_display)r)   r   r-   r-   r.   r     s    

	zChangeList.apply_select_relatedc             C   sn   xg |  j  D]\ } y |  j j |  } Wn t k
 r: Yq
 Xt | j t j  r
 | | j   k r
 d Sq
 Wd S)NTF)	r9   r6   r   r   rk   r   r   ZManyToOneRelZget_attname)r)   r   ry   r-   r-   r.   r     s    z,ChangeList.has_related_field_in_list_displayc             C   sP   t  | |  j  } t d |  j j |  j j f d t |  f d |  j j j	 S)Nzadmin:%s_%s_changer*   Zcurrent_app)
r   r]   r   r5   Z	app_labelZ
model_namer   rB   Z
admin_siter   )r)   resultr[   r-   r-   r.   url_for_result  s
    zChangeList.url_for_result)r/   r0   r1   r"   rD   r&   rb   r{   r   rY   r   r   r   r   r   r7   r   r   r   r-   r-   r-   r.   r2   0   s   9T!&6(-r2   N)4r   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.dbr   Zdjango.db.models.expressionsr   r   r   Zdjango.urlsr   Zdjango.utils.httpr   Zdjango.utils.timezoner   Zdjango.utils.translationr   rP   r   ZORDER_TYPE_VARrM   r'   rV   r`   ZFormr"   r2   r-   r-   r-   r.   <module>   s0   "	