a
    g                     @  sd  U d Z ddlmZ ddl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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dlmZ ddlmZ eeddZeejdddddddZe
 Z de!d< dd ddd!d"d#d$Z"eej#dd%dddd&d'Z$dd d d(d!d)d*d+Z%dS ),z
Add on_delete=models.CASCADE to ForeignKey and OneToOneField:
https://docs.djangoproject.com/en/stable/releases/1.9/#features-deprecated-in-1-9
    )annotationsN)Iterable)MutableMapping)partial)WeakKeyDictionary)Offset)Token)ast_start_offset)is_rewritable_import_from)Fixer)State)	TokenFunc)OP)extract_indent)find)insert)parse_call_args)   	   )min_versionr   zast.ImportFromztuple[ast.AST, ...]z"Iterable[tuple[Offset, TokenFunc]])statenodeparentsreturnc                 c  sB   |j dkr>t|r>tdd |jD r>t|tt|| dfV  d S )Ndjango.db.modelsc                 s  s   | ]}|j d v V  qdS )   Z
ForeignKeyZOneToOneFieldN)name).0alias r   ^/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/django_upgrade/fixers/on_delete.py	<genexpr>+       z#visit_ImportFrom.<locals>.<genexpr>)r   r   )moduler
   anynamesr	   r   update_django_models_import)r   r   r   r   r   r    visit_ImportFrom"   s    r'   zMutableMapping[State, bool]should_update_importzlist[Token]intNone)tokensir   r   r   c                C  s:   t |dr6dt |< t| |\}}t| || dd d S )NFz%from django.db.models import CASCADE
new_src)r(   getr   r   )r+   r,   r   r   jindentr   r   r    r&   8   s    r&   zast.Callc                 c  s   t |jtjrJ|jjdv rJd| jd v  }rJt |jjtjrJ|jjjdkst |jtjr|jjdv r|jj| jd v rd }du rt	|j
dk rtdd |jD r| t| < t|ttt	|j
|d	fV  d S )
Nr   modelsz	django.dbr   F   c                 s  s   | ]}|j d kV  qdS )Z	on_deleteN)arg)r   kwr   r   r    r!   \   r"   zvisit_Call.<locals>.<genexpr>)num_pos_argsmodels_imported)
isinstancefuncast	AttributeattrZfrom_importsvalueNameidlenargsallkeywordsr(   r	   r   add_on_delete_keyword)r   r   r   r7   r   r   r    
visit_CallE   s8    	




rE   bool)r+   r,   r6   r7   r   c                C  s   t | |tdd}t| |\}}|r(d}nd}|dkrRt|dkrH|d7 }|d }n^||d  \}	}
|
d }| |
 jdkr|d8 }d| }n$t|dkrd	| }nd	| d
}t| ||d d S )N()r   srczon_delete=models.CASCADEzon_delete=CASCADEr   z, r   ) ,r-   )r   r   r   r@   rH   r   )r+   r,   r6   r7   Zopen_idx	func_argsZ	close_idxr.   Z
insert_idxZpos_start_idxZpos_end_idxr   r   r    rD   f   s$    
rD   )&__doc__
__future__r   r:   collections.abcr   r   	functoolsr   weakrefr   Ztokenize_rtr   r   Zdjango_upgrade.astr	   r
   Zdjango_upgrade.datar   r   r   Zdjango_upgrade.tokensr   r   r   r   r   __name__Zfixerregister
ImportFromr'   r(   __annotations__r&   CallrE   rD   r   r   r   r    <module>   s:   

 