bgdZddlZddlmZmZddlmZddlmZddl m Z ddl m Z ddl mZd ZGd d ejZGd d ejZdZdZdZdS)z Various suggestions around migrations. Disabled by default! Enable with pylint --load-plugins=pylint_django.checkers.migrations N)checkers interfaces)utils)suppress_message)compat)BASE_ID)is_migrations_modulect|jtjsdS|jjdksdS|jD]J}|jdkr=t|jtjr|jjD]}|jdkrdSKdS)NFAddFieldfielddefaultT) isinstancefuncastroid AttributeattrnamekeywordsargvalueCall)callkeyword field_keywords r/builddir/build/BUILD/cloudlinux-venv-1.0.7/venv/lib/python3.11/site-packages/pylint_django/checkers/migrations.py_is_addfield_with_defaultrs di!2 3 3u 9  + +u=    ;' ! !j &M&M ! ")!7   $ 114442 5c|eZdZdZejfZdZdeddiZ gZ iZ dZ dZ ejddZd S) NewDbFieldWithDefaultCheckera Looks for migrations which add new model fields and these fields have a default value. According to Django docs this may have performance penalties especially on large tables: https://docs.djangoproject.com/en/2.0/topics/migrations/#postgresql The preferred way is to add a new DB column with null=True because it will be created instantly and then possibly populate the table with the desired default values. new-db-field-with-defaultW98)z%s AddField with default valuerzKUsed when Pylint detects migrations adding new fields with a default value.c\t|r|j|dSdSN)r _migration_modulesappend)selfnodes r visit_modulez)NewDbFieldWithDefaultChecker.visit_moduleEs9  % % 1  # * *4 0 0 0 0 0 1 1rc |j}n#YdSxYwt|sdSt|rD||jvr g|j|<||j|vr$|j||dSdSdSr#)frameparentr r_possible_offencesr%)r&r'modules r visit_callz'NewDbFieldWithDefaultChecker.visit_callIs ZZ\\(FF  FF#F++  F $T * * =T44424'/426:::'/66t<<<<<  = =;:!cpd}|j|dd}g}|jD]E}|jddd}||kr|}||F|jD]+\}}||vr"|D]}|d|j| ,dS) Nc|jSr#)pathr's r_pathz1NewDbFieldWithDefaultChecker.close.._path[s 9 rT)keyreverser migrationsr)argsr') r$sortr2splitr%r,items add_messagename)r&r4last_name_spacelatest_migrationsr- name_spacenodesr's rclosez"NewDbFieldWithDefaultChecker.closeYs    $$$=== - 1 1FQ--l;;A>J_,,",!((000!4::<< _ _MFE***!__D$$%@v{Y]$^^^^ _ _rN)__name__ __module__ __qualname____doc__rIAstroidChecker__implements__r>rmsgsr$r,r(r.rcheck_messagesrCrrrr*s  !02N 'DG  D111=== U566__76___rrcdeZdZejfZdZdeddiZe j ddZ dS) MissingBackwardsMigrationChecker$missing-backwards-migration-callabler 97)z+Always include backwards migration callablerOzbAlways include a backwards/reverse callable counterpart so that the migration is not irreversable.c |j}n#YdSxYwt|sdS|jdrit |jdkrS|jr1|jD]}|j dkrdS| d|dS| d|dSdSdS)N RunPython reverse_coderOr3) r*r+r r as_stringendswithlenr9rrr=)r&r'r-rs rr.z+MissingBackwardsMigrationChecker.visit_calls ZZ\\(FF  FF#F++  F 9   ) )+ 6 6 T3ty>>A;M;M} T#}G{n445  !Gd SSSSS  !Gd SSSSS T T;M;Mr/N) rDrErFrrHrIr>rrJrrKr.rLrrrNrNssm 02N 1D G  DU@AATTBATTTrrNc*t|jS)a RunPython() migrations receive forward/backwards functions with signature: def func(apps, schema_editor): which could be unused. This augmentation will suppress all 'unused-argument' messages coming from functions in migration modules. )r r+r3s ris_in_migrationsrYs  , ,,rct|jj}d|vr|d||j_dS)Nr8)listconfig black_listremove)linternew_black_lists rload_configurationrasC&-233N~%%l+++-FMrc|t||t|tjst |t |tjj j dtdS)z.Required method to auto register this checker.zunused-argumentN) register_checkerrrNrLOAD_CONFIGURATION_SUPPORTEDrarr variablesVariablesCheckerleave_functiondefrY)r_s rregisterrhs 8@@AAA rpsF  ''''''''!!!!!!000000 ------444444*F_F_F_F_F_8#7F_F_F_RTTTTTx';TTTB - - -...r