o 3aY@sDddlmZmZddlmZddlmZddlmZddlm Z ddl m Z m Z ddl mZmZmZddlmZmZmZmZdd lmZmZmZdd lmZdd lmZmZmZm Z m!Z!m"Z"dd l#m$Z$dd l%m&Z&ddl'm(Z(ddl)m*Z*ddl+m,Z,dZ-dZ.dZ/dZ0dZ1dZ2e-e.e/e1eefZ3Gdddej4Z5GdddZ6dS))datetime timedelta)forms)settings)messages)FieldListFilter)DisallowedModelAdminLookupDisallowedModelAdminToField) IS_POPUP_VAR TO_FIELD_VARIncorrectLookupParameters)get_fields_from_pathlookup_needs_distinctprepare_lookup_valuequote)FieldDoesNotExistImproperlyConfiguredSuspiciousOperation) InvalidPage)ExistsFField ManyToOneRelOrderByOuterRef) Combinable)reverse) urlencode) make_aware)gettextallootpqecseZdZfddZZS)ChangeListSearchFormcs*tj|i|ttjdddi|_dS)NF)requiredstrip)super__init__ SEARCH_VARr CharFieldfields)selfargskwargs __class__A/usr/lib/python3/dist-packages/django/contrib/admin/views/main.pyr*(s zChangeListSearchForm.__init__)__name__ __module__ __qualname__r* __classcell__r3r3r1r4r&'sr&c@seZdZeZddZdddZddZddd Zd d Z d d Z ddZ ddZ ddZ ddZddZddZddZddZdS) ChangeListcCs||_|j|_|j|_| ||_||_||_||_d|_ d|_ d|_ ||_ ||_ ||_| |_| |_| |_| ||_| |_||j}|sY|jD] }t|d|qM|jtp`d|_ z t!|jt"d|_#Wn t$yzd|_#Ynwt%|jv|_&t'|jv|_(|jt)}|r| *||st+d|||_,t-|j.|_/t"|j/vr|j/t"=t0|j/vr|j/t0=|j(rd|_1n| |_1|||_2|3||j(rt4d}n|j5|rt4d}nt4d}||jj6|_7|jj8j9|_:dS) Nz, z"The field %s cannot be referenced.r3z Select %szSelect %s to changezSelect %s to view);model_metaopts lookup_opts get_queryset root_queryset list_displaylist_display_links list_filter has_filtershas_active_filtersclear_all_filters_qsdate_hierarchy search_fieldslist_select_related list_per_pagelist_max_show_all model_adminget_preserved_filterspreserved_filters sortable_bysearch_form_classGETis_validerrorsvaluesrerrorjoin cleaned_datagetr+queryintPAGE_VARpage_num ValueErrorALL_VARshow_allr is_popupr to_field_allowedr to_fielddictitemsparams ERROR_FLAG list_editablequeryset get_resultsrhas_change_permission verbose_nametitlepkattname pk_attname)r.requestr<rBrCrDrHrIrJrKrLrhrMrP _search_formrVrcrmr3r3r4r*3sf                zChangeList.__init__NcCs.|p|j}|}tD] }||vr||=q |S)z: Return all params except IGNORED_PARAMS. )rfcopyIGNORED_PARAMS)r.rf lookup_paramsignoredr3r3r4get_filters_paramsns zChangeList.get_filters_paramsc Cs|}d}d}|D]\}}|j||std|q g}|jD]d}t|} t|r7||||j|j} n=d} t |t t frE|\} } n|t j } } t | tsZ| } t|j| d} | | |||j|j| d} | t|krt|t|j| O}| r| r|| | t|krd}q#|jr|d|jd}|dur|d|jd}|d|jd}ztt|t|dur|nd t|dur|nd }Wnty}zt||d}~ww|r|td d }n|r|td d jd d }n |j|jd d }tjrt|}t|}| d|j|d|j|iz#|D]\}}t!||||<|t|j|O}q|t"||||fWSt#yI}zt||d}~ww)NFzFiltering by %s not allowed) field_pathTz%s__yearz %s__monthz%s__dayr;)days )day)yearz%s__gtez%s__lt)$rwrerMlookup_allowedrrDlencallabler< isinstancetuplelistrcreaterr rr? has_outputappendrHpoprr[r^r rreplacer}rUSE_TZrupdaterboolr)r.rqrumay_have_duplicatesrFkeyvalue filter_specsrDlookup_params_countspecryfieldfield_list_filter_classr}monthr| from_dater%to_dater3r3r4 get_filters{s                 zChangeList.get_filterscCs|duri}|dur g}|j}|D]}t|D] }||r#||=qq|D]\}}|dur9||vr8||=q)|||<q)dtt|S)Nz?%s)rfrsr startswithrersorted)r. new_paramsremover#rkvr3r3r4get_query_strings$    zChangeList.get_query_stringcCs|j||j|j}|j}|jjr|j}nd}||jk}||jk}|jr(|s*|s0|j }nz | |j j }Wn t yBtw||_|jj|_|j pRt||_||_||_||_||_||_dSN)rM get_paginatorrirKcountshow_full_result_countrArLr`_clonepager] object_listrr result_countrshow_admin_actionsfull_result_count result_list can_show_all multi_page paginator)r.rqrrrrrrr3r3r4rjs,       zChangeList.get_resultscCs,g}|jjr |jj}|S|jjr|jj}|Sr)rMorderingr?)r.rr3r3r4_get_default_ordering sz ChangeList._get_default_orderingcCsz |j|}|jWSty@t|r|}nt|j|r%t|j|}nt|j|}t |t r8t|dr8|j }t|ddYSw)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. fgetadmin_order_fieldN) r? get_fieldnamerrhasattrrMgetattrr<rpropertyr)r. field_namerattrr3r3r4get_ordering_fields    zChangeList.get_ordering_fieldc Cs0|j}t|j|p |}t|vrg}|td}|D]m}z`|d\}}} |jt | } | | } | s9Wqt | t rP|dkrJ| } | || n/t| dre||dkr_| n| n| drx|dkrx|| ddn||| WqttfyYqw||jj||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. .-resolve_expressionr;N)rfrrM get_orderingr ORDER_VARsplit rpartitionrBr[rrrrsreverse_orderingrrdescascr IndexErrorr^extendrZorder_by_get_deterministic_ordering) r.rqrirfr order_paramsr#nonepfxidxr order_fieldr3r3r4r)s8       zChangeList.get_orderingc sHt|}t}dhddjjDB}|D]R}d}t|tr$|d}nt|tr-|j}nt|t r]sz9ChangeList._get_deterministic_ordering..Nrcs|]}|jVqdSr)r-)r constraintr3r3r4 ~s  z9ChangeList._get_deterministic_ordering..csg|]}j|qSr3)r?r)rrr.r3r4 sz:ChangeList._get_deterministic_ordering..csrr)rrr3r3r4rcsrr)rorr3r3r4rrz-pk)rsetr?r-rstrlstriprrr expressionrr remote_fieldroaddunique_togethertotal_unique_constraintsany issupersetr) r.rordering_fieldstotal_ordering_fieldspartrrconstraint_field_names field_namesr-r3rr4rTsV        z&ChangeList._get_deterministic_orderingc Cs|}i}t|jvr\|D]L}t|ttfr2t|ts|}t|jtr1|j r*dnd}|jj }nq | dr@|dd}d}nd}t |j D]\}}|||krX|||<nqGq |S|jtdD]$}|d\}} } zt| } Wn ty}Yqdw| dkrdnd|| <qd|S)zT Return a dictionary of ordering field column numbers and asc/desc. rrrr;Nr)rrrfrrrrrr descendingrr enumeraterBrrrr[r^) r.rrr order_typeindexrr#rrrr3r3r4get_ordering_field_columnss>         z%ChangeList.get_ordering_field_columnsc Cs ||\|_|_}}|_|j}|jD]}|||}|dur!|}qz |jdi|}Wnttfy6t yE}zt |d}~ww|j |||j \}}|j||d|_||Bro|jtdd}|jt|}|||} |j| }|j js||}|S)N)rrrn)rnr3)rrrErFrArifilterrr Exceptionr rMget_search_resultsrZrrwrGrrrrselect_relatedapply_select_related) r.rqremaining_lookup_paramsfilters_may_have_duplicatesqs filter_specnew_qsr%search_may_have_duplicatesrr3r3r4r@sH      zChangeList.get_querysetcCsB|jdur |S|jdur|r|S|jr|j|jS|SNTF)rJr!has_related_field_in_list_display)r.rr3r3r4rs   zChangeList.apply_select_relatedc CsR|jD]#}z|j|}Wn tyYqwt|jtr&||kr&dSqdSr)rBr?rrrrr get_attname)r.rrr3r3r4rs    z,ChangeList.has_related_field_in_list_displaycCs6t||j}td|jj|jjft|f|jjj dS)Nzadmin:%s_%s_change)r/ current_app) rrprr> app_label model_namerrM admin_siter)r.resultrnr3r3r4url_for_result s  zChangeList.url_for_resultr)NN)r5r6r7r&rQr*rwrrrjrrrrrr@rrrr3r3r3r4r90s  ; [!+>(9 r9N)7rrdjangor django.confrdjango.contribrdjango.contrib.adminrdjango.contrib.admin.exceptionsrr django.contrib.admin.optionsr r r django.contrib.admin.utilsr rrrdjango.core.exceptionsrrrdjango.core.paginatorrdjango.db.modelsrrrrrrdjango.db.models.expressionsr django.urlsrdjango.utils.httprdjango.utils.timezonerdjango.utils.translationrr_rORDER_TYPE_VARr\r+rgrtFormr&r9r3r3r3r4s4