o a!@sddlZddlZddlmZddlmZddlmZddlm Z ddl m Z m Z m Z mZee jd ddZd d d Zee jd d d ZdS)N) defaultdict)chainapps)settings)ErrorTagsWarningregisterc KsRtt}tt}tt}g}|durt}n tdd|D}|D]Y}|jjr8|jjs8||jj  |jj t |jsO| td|j|jf|ddn ||jdi||jjD] }||j |jj q^|jjD] } || j |jj qoq#tjrtd} } d} ntd} } d} |D]$\} }t|d krd |}| | d | |f| | r| |nd| d q|D]1\}}t|d krt|}| td |t|d krdndd t|ft|d krdnddq|D]4\}}t|d kr&t|}| td|t|d krdndd t|ft|d kr!dnddq|S)Ncss|]}|VqdSN) get_models).0 app_configrA/usr/lib/python3/dist-packages/django/core/checks/model_checks.py sz#check_all_models..zks  z*_check_lazy_references..cSsX|gi}}}t|dr'|t|dg|t|di|j}t|ds |||fS)a Take a callable found in Apps._pending_operations and identify the original callable passed to Apps.lazy_model_operation(). If that callable was a partial, return the inner, non-partial function and any arguments and keyword arguments that were supplied with it. obj is a callback defined locally in Apps.lazy_model_operation() and annotated there with a `func` attribute so as to imitate a partial. funcargskeywords)hasattrr#getattrupdaterC)r operationrDrErrrextract_operationps  z1_check_lazy_references..extract_operationcs>z|dd|}W|Styd|d}Y|Sw)Nrz#app '%s' doesn't provide model '%s'zapp '%s' isn't installed)get_app_config LookupError) model_key model_errorrrrapp_model_errors  z/_check_lazy_references..app_model_errorcs4d}d||d|d}t|||dddS)Nz[The field %(field)s was declared with a lazy reference to '%(model)s', but %(model_error)s..field)r2rQrNz fields.E307rr*rrMrCrDrE error_msgparamsrOrr field_errorsz+_check_lazy_references..field_errorc sd}|d}t|tjrd|j}nt|tjr#d|jjj|jf}nd|jj}|jd}d||||d}t |||j d d S) Nz{%(receiver)s was connected to the '%(signal)s' signal with a lazy reference to the sender '%(model)s', but %(model_error)s.rzThe function '%s'zBound method '%s.%s'zAn instance of class '%s'unknownrP)r2receiverrArNz signals.E001r) r?types FunctionTyper" MethodType__self__ __class__getr*r __module__) rMrCrDrErTrY description signal_namerU)rO model_signalsrrsignal_connect_errors    z4_check_lazy_references..signal_connect_errorcs,d}|d||d}t|||ddS)NzC%(op)s contains a lazy reference to %(model)s, but %(model_error)s.rP)opr2rNz models.E022rrRrSrVrr default_errors z-_check_lazy_references..default_errorN))django.db.models.fields.relatedresolve_related_class)rg set_managed)zdjango.dispatch.dispatcherconnectcs.|j|jf}|}|r|||||SdSr )r`r"r_)rMrCrDrEkeyerror_fn)rf known_lazyrr build_errors  z+_check_lazy_references..build_errorc3s4|]}j|D] }|g|RVq qdSr )_pending_operations)r rMrC)rrnrJrrrs z)_check_lazy_references..cSs|jSr )msg)errorrrrsz(_check_lazy_references..)rk)r+rodjango.db.modelsr>varsr(r,filter)rignorepending_modelsrWrdr)rOrrnrfrJrmrcr>r_check_lazy_referencesYs,        rxcKsttSr )rxr)r-r.rrrcheck_lazy_referencessryr )rrZ collectionsr itertoolsr django.appsr django.confrdjango.core.checksrrr r r1r<rxryrrrrs      Mw