
 X?                 @   sb  d  d l  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 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 Z) Gd d   d e*  Z+ d S)    N)OrderedDict)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)reverse)six)
force_text)	urlencode)ugettextalloZotpqec               @   s   e  Z d  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 S)
ChangeListc             C   s9  | |  _  | j |  _ |  j |  _ | j |  |  _ | |  _ | |  _ | |  _ | |  _	 | |  _
 | |  _ |	 |  _ |
 |  _ | |  _ | j |  |  _ y" t | j j t d   |  _ Wn t k
 r d |  _ Yn Xt | j k |  _ t | j k |  _ | j j t  } | r8| j | |  r8t d |   n  | |  _ t | j j     |  _! t |  j! k ru|  j! t =n  t" |  j! k r|  j! t" =n  |  j rf  |  _# n	 | |  _# | j j t$ d  |  _% |  j |  |  _& |  j' |  |  j rt( d  } n t( d  } | t) |  j j*  |  _+ |  j j, j- |  _. d  S)Nr   z"The field %s cannot be referenced. z	Select %szSelect %s to change)/modelZ_metaoptslookup_optsget_querysetroot_querysetlist_displaylist_display_linkslist_filterdate_hierarchysearch_fieldslist_select_relatedlist_per_pagelist_max_show_allmodel_adminZget_preserved_filtersZpreserved_filtersintGETget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
SEARCH_VARqueryquerysetget_resultsr   r   Zverbose_nametitlepkZattname
pk_attname)selfrequestr   r#   r$   r%   r&   r'   r(   r)   r*   r9   r+   r4   r>    rC   M/home/ubuntu/projects/ifolica/build/django/django/contrib/admin/views/main.py__init__&   sP    										"				zChangeList.__init__Nc             C   sI   | s |  j  } n  | j   } x$ t D] } | | k r% | | =q% q% W| S)z:
        Returns all params except IGNORED_PARAMS
        )r7   copyIGNORED_PARAMS)rA   r7   lookup_paramsZignoredrC   rC   rD   get_filters_paramsW   s    zChangeList.get_filters_paramsc             C   s!  |  j    } d } xB | j   D]4 \ } } |  j j | |  s t d |   q q Wg  } |  j rpx|  j D] } t |  r | | | |  j |  j  } n d  }	 t | t	 t
 f  r | \ }
 } n | t j }
 } t |
 t j  s|
 }	 t |  j |	  d }
 n  | |
 | | |  j |  j d |	 } | pDt |  j |	  } | rp | j   rp | j |  qp qp Wn  yb xE | j   D]7 \ } } t | |  | | <| pt |  j |  } qW| t |  | | f SWnH t k
 r} z( t j t t |  t j   d  WYd  d  } ~ Xn Xd  S)NFzFiltering by %s not allowed   
field_path   )rI   r6   r+   Zlookup_allowedr   r%   callabler   
isinstancetuplelistr   creater   ZFieldr	   r
   r    Z
has_outputappendr   boolr   r   reraiser   sysexc_info)rA   rB   rH   Zuse_distinctkeyvaluefilter_specsr%   specrK   fieldZfield_list_filter_classr   rC   rC   rD   get_filterse   s<    		zChangeList.get_filtersc             C   s   | d  k r i  } n  | d  k r* g  } n  |  j  j   } x> | D]6 } x- t |  D] } | j |  rS | | =qS qS Wq@ WxI | j   D]; \ } } | d  k r | | k r | | =q q | | | <q Wd t t | j     S)Nz?%s)r7   rF   rQ   
startswithr6   r   sorted)rA   
new_paramsremover   rkvrC   rC   rD   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)NrJ   )r+   Zget_paginatorr<   r)   countZshow_full_result_countr"   r*   r3   Z_clonepager0   Zobject_listr   r   result_countrT   Zshow_admin_actionsfull_result_countresult_listcan_show_all
multi_page	paginator)rA   rB   rm   rh   ri   rk   rl   rj   rC   rC   rD   r=      s*    						zChangeList.get_resultsc             C   s@   g  } |  j  j r! |  j  j } n |  j j r< |  j j } n  | S)N)r+   orderingr    )rA   rn   rC   rC   rD   _get_default_ordering   s    z ChangeList._get_default_orderingc             C   s   y |  j  j |  } | j SWnp t k
 r t |  rB | } n9 t |  j |  ri t |  j |  } n t |  j |  } t | d d  SYn Xd 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   rN   hasattrr+   getattrr   )rA   
field_namer\   attrrC   rC   rD   get_ordering_field   s    	zChangeList.get_ordering_fieldc             C   sj  |  j  } t |  j j |  p' |  j    } t | k rg  } | t j d  } x | D] } y | j d  \ } } }	 |  j t	 |	  }
 |  j
 |
  } | s wY n  | j d  r | d k r | j | d d   n | j | |  WqY t t f k
 rwY YqY XqY Wn  | j | j j  |  j j j } t |  d d | d | h @sf| j d  n  | 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.
        .-rJ   Nr?   z-pk)r7   rQ   r+   get_orderingro   	ORDER_VARsplit
rpartitionr#   r,   rv   r^   rS   
IndexErrorr1   extendr;   order_byr    r?   rq   set)rA   rB   r<   r7   rn   Zorder_paramsr   nonepfxidxrt   Zorder_fieldZpk_namerC   rC   rD   ry      s,    		$ zChangeList.get_orderingc             C   s*  |  j    } t   } t |  j k r x | D]w } | j d  rY | d d  } d } n d } x@ t |  j  D]/ \ } } |  j |  | k ro | | | <Pqo qo Wq+ Wn} xz |  j t j d  D]b } | j	 d  \ } }	 }
 y t
 |
  }
 Wn t k
 rw Yn X|	 d k rd n d | |
 <q W| S)zV
        Returns an OrderedDict of ordering field column numbers and asc/desc
        rx   rJ   NdescZascrw   )ro   r   rz   r7   r^   	enumerater#   rv   r{   r|   r,   r1   )rA   rn   Zordering_fieldsr\   Z
order_typeindexru   r   r   r   r   rC   rC   rD   get_ordering_field_columns  s(    		
 z%ChangeList.get_ordering_field_columnsc       
      C   sB  |  j  |  \ |  _ |  _ } } |  j } x8 |  j D]- } | j | |  } | d  k	 r4 | } q4 q4 Wy | j |   } WnK t t f k
 r   Yn1 t k
 r } z t	 |   WYd  d  } ~ Xn X| j
 j s |  j |  } n  |  j | |  } | j |   } |  j j | | |  j
  \ } }	 | |	 Br:| j   S| Sd  S)N)r]   rZ   Zhas_filtersr"   r<   filterr   r   	Exceptionr   r;   select_relatedapply_select_relatedry   r   r+   Zget_search_resultsZdistinct)
rA   rB   Zremaining_lookup_paramsZfilters_use_distinctqsZfilter_specZnew_qsr   rn   Zsearch_use_distinctrC   rC   rD   r!   5  s(    !	!

zChangeList.get_querysetc             C   s^   |  j  d k r | j   S|  j  d k rA |  j   rA | j   Sn  |  j  rZ | j |  j    S| S)NTF)r(   r   !has_related_field_in_list_display)rA   r   rC   rC   rD   r   b  s    
	zChangeList.apply_select_relatedc             C   s\   xU |  j  D]J } y |  j j |  } Wn t k
 r: Yq
 Xt | j t j  r
 d Sq
 Wd S)NTF)r#   r    rp   r   rO   Zremote_fieldr   ZManyToOneRel)rA   rt   r\   rC   rC   rD   r   n  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_changeargsZcurrent_app)
rs   r@   r   r   Z	app_labelZ
model_namer   r+   Z
admin_siterq   )rA   resultr?   rC   rC   rD   url_for_resulty  s
    zChangeList.url_for_result)__name__
__module____qualname__rE   rI   r]   re   r=   ro   rv   ry   r   r!   r   r   r   rC   rC   rC   rD   r   %   s   12!,!-r   ),rV   collectionsr   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.urlsr   Zdjango.utilsr   Zdjango.utils.encodingr   Zdjango.utils.httpr   Zdjango.utils.translationr   r2   rz   ZORDER_TYPE_VARr/   r:   r8   rG   objectr   rC   rC   rC   rD   <module>   s*   "