§
    kÍâhZL  ã                   óT  — d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	m
Z
mZmZ ddlmZmZ ddl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ZdZdZg d¢Z ej!        dej"        dej#        dej$        dej%        dej&        dej'        diZ(d„ Z) G d„ d¦  «        Z*dd„Z+d„ Z,d„ Z-dS )zÃ
modelviz.py - DOT file generator for Django Models

Based on:
  Django model to DOT (Graphviz) converter
  by Antonio Cavedoni <antonio@cavedoni.org>
  Adapted to be used with django-extensions
é    N)Úapps)Údeletion)Ú
ForeignKeyÚManyToManyFieldÚOneToOneFieldÚRelatedField)ÚOneToOneRelÚManyToOneRel)ÚGenericRelation)ÚContextÚTemplateÚloader)Ú	force_str)Ú	mark_safe)Úactivatez1.1ÚPython)z'Bas van Oostveen <v.oostveen@gmail.com>)zQAntonio Cavedoni <https://cavedoni.com/>Stefano J. Attardi <https://attardi.org/>ÚlimodouzCarlo C8E Mironz Andre Campos <cahenan@gmail.com>z#Justin Findlay <jfindlay@gmail.com>z&Alexander Houben <alexander@houben.ch>z Joern Hees <gitdev@joernhees.de>z%Kevin Cherepski <cherepski@gmail.com>z&Jose Tomas Tocino <theom3ga@gmail.com>z#Adam Dobrawy <naczelnik@jawnosc.tk>z6Mikkel Munch Mortensen <https://www.detfalskested.dk/>z+Andrzej Bistram <andrzej.bistram@gmail.com>z%Daniel Lipsitt <danlipsitt@gmail.com>z%Florian Anceau <flow.gunso@gmail.com>ÚredÚblueÚorangeÚgreenÚyellowÚgreyÚpurplec                 ó,  — | sg S t          | t          t          t          f¦  «        r| S d| vrJt          j                             | ¦  «        r+d„ t          | ¦  «                             ¦   «         D ¦   «         S d„ |  	                    d¦  «        D ¦   «         S )Nú,c                 ó6   — g | ]}|                      ¦   «         ‘ŒS © ©Ústrip©Ú.0Úes     ú\/var/www/histauto/venv/lib/python3.11/site-packages/django_extensions/management/modelviz.pyú
<listcomp>z&parse_file_or_list.<locals>.<listcomp>H   s    € Ð9Ð9Ð9˜a�—’‘	”	Ð9Ð9Ð9ó    c                 ó6   — g | ]}|                      ¦   «         ‘ŒS r   r   r!   s     r$   r%   z&parse_file_or_list.<locals>.<listcomp>I   s    € Ð.Ð.Ð.˜!ˆA�GŠG‰IŒIÐ.Ð.Ð.r&   )
Ú
isinstanceÚlistÚtupleÚsetÚosÚpathÚisfileÚopenÚ	readlinesÚsplit)Úargs    r$   Úparse_file_or_listr3   B   sŒ   € Øð Øˆ	Ý�#��e¥SÐ)Ñ*Ô*ð Øˆ
Ø
�#€~€~�"œ'Ÿ.š.¨Ñ-Ô-€~Ø9Ð9¥4¨¡9¤9×#6Ò#6Ñ#8Ô#8Ð9Ñ9Ô9Ð9Ø.Ð.˜sŸyšy¨™~œ~Ð.Ñ.Ô.Ð.r&   c                   ó–   — e Zd Zd„ Zd„ Zdd„Zd„ Zdd„Zd	„ Zd
„ Z	d„ Z
d„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )Ú
ModelGraphc                 ó,  — g | _         |                     dd ¦  «        | _        |                     dd¦  «        | _        |                     dd¦  «        | _        t          |                     dd¦  «        ¦  «        | _        |                     dd¦  «        | _        |                     dd¦  «        | _        |                     d	d¦  «        | _	        |                     d
d¦  «        | _
        |                     dd¦  «        | _        |                     dd¦  «        | _        |                     dd¦  «        | _        |                     dd ¦  «        | _        | j        �t          | j        ¦  «         t          |                     dd¦  «        ¦  «        | _        t          |                     dd¦  «        ¦  «        | _        |                     dd¦  «        | _        |                     d¦  «        | _        |                     dd¦  «        | _        | j        r#d„ t+          j        ¦   «         D ¦   «         | _        n|| _        |                     d¦  «        | _        |                     dd¦  «        | _        |                     d¦  «        | _        d S )NÚcli_optionsÚdisable_fieldsFÚdisable_abstract_fieldsÚinclude_modelsÚ Úall_applicationsÚgroup_modelsÚverbose_namesÚinheritanceTÚrelations_as_fieldsÚrelation_fields_onlyÚsort_fieldsÚlanguageÚexclude_columnsÚexclude_modelsÚhide_edge_labelsÚarrow_shapeÚcolor_code_deletionsc                 ó   — g | ]	}|j         ‘Œ
S r   )Úlabel)r"   Úapps     r$   r%   z'ModelGraph.__init__.<locals>.<listcomp>c   s   € ÐKÐKÐK¨S˜sœyÐKÐKÐKr&   ÚrankdirÚdisplay_field_choicesÚordering)ÚgraphsÚgetr7   r8   r9   r3   r:   r<   Úuse_subgraphr>   r?   r@   rA   rB   rC   Úactivate_languagerD   rE   rF   rG   rH   r   Úget_app_configsÚ
app_labelsrL   rM   rN   )ÚselfrT   Úkwargss      r$   Ú__init__zModelGraph.__init__M   s*  € ØˆŒØ!Ÿ:š: m°TÑ:Ô:ˆÔØ$ŸjšjÐ)9¸5ÑAÔAˆÔØ'-§z¢zÐ2KÈUÑ'SÔ'SˆÔ$Ý0°·²Ð<LÈbÑ1QÔ1QÑRÔRˆÔØ &§
¢
Ð+=¸uÑ EÔ EˆÔØ"ŸJšJ ~°uÑ=Ô=ˆÔØ#ŸZšZ¨¸Ñ?Ô?ˆÔØ!Ÿ:š: m°TÑ:Ô:ˆÔØ#)§:¢:Ð.CÀTÑ#JÔ#JˆÔ Ø$*§J¢JÐ/EÀuÑ$MÔ$MˆÔ!Ø!Ÿ:š: m°TÑ:Ô:ˆÔØŸ
š
 :¨tÑ4Ô4ˆŒØŒ=Ð$Ý˜dœmÑ,Ô,Ð,Ý1°&·*²*Ð=NÐPRÑ2SÔ2SÑTÔTˆÔÝ0°·²Ð<LÈbÑ1QÔ1QÑRÔRˆÔØ &§
¢
Ð+=¸uÑ EÔ EˆÔØ!Ÿ:š: mÑ4Ô4ˆÔØ$*§J¢JÐ/EÀuÑ$MÔ$MˆÔ!ØÔ ð 	)ØKÐKµDÔ4HÑ4JÔ4JÐKÑKÔKˆDŒOˆOà(ˆDŒOØ—z’z )Ñ,Ô,ˆŒØ%+§Z¢ZÐ0GÈÑ%OÔ%OˆÔ"ØŸ
š
 :Ñ.Ô.ˆŒˆˆr&   c                 óò   — |                       ¦   «          g }| j        D ]'}|                     d„ |d         D ¦   «         ¦  «         Œ(| j        D ])}|d         D ]}|d         D ]}|�|d         |v rd|d<   ŒŒŒ*d S )Nc                 ó   — g | ]
}|d          ‘ŒS )Únamer   r!   s     r$   r%   z2ModelGraph.generate_graph_data.<locals>.<listcomp>o   s   € Ð=Ð=Ð=¨˜!˜Fœ)Ð=Ð=Ð=r&   ÚmodelsÚ	relationsÚtargetFÚ
needs_node)Úprocess_appsrO   Úextend)rU   ÚnodesÚgraphÚmodelÚrelations        r$   Úgenerate_graph_datazModelGraph.generate_graph_dataj   s¿   € Ø×ÒÑÔÐàˆØ”[ð 	?ð 	?ˆEØ�LŠLÐ=Ð=¨U°8¬_Ð=Ñ=Ô=Ñ>Ô>Ð>Ð>à”[ð 	;ð 	;ˆEØ˜xœð ;ð ;�Ø % kÔ 2ð ;ð ;�HØÐ+Ø# HÔ-°Ð6Ð6Ø5:˜H \Ñ2øð;ð;ð	;ð 	;r&   Fc           	      ó”  — t           j                              ¦   «         }|                     d¦  «        | j        | j        | j        | j        | j        | j        | j	        dœ}|r\d„ | j
        D ¦   «         }|D ]B}|d         D ]7}|                     d¦  «         |d         D ]}|                     d¦  «         ŒŒ8ŒC||d<   n
| j
        |d<   |S )	Nz%Y-%m-%d %H:%M)Ú
created_atr7   r8   r9   rM   rQ   rL   rN   c                 ó6   — g | ]}|                      ¦   «         ‘ŒS r   )Úflatten)r"   Úcontexts     r$   r%   z-ModelGraph.get_graph_data.<locals>.<listcomp>ˆ   s"   € ÐCÐCÐC¨G�g—o’oÑ'Ô'ÐCÐCÐCr&   r[   rc   ÚfieldsÚfieldrO   )ÚdatetimeÚnowÚstrftimer7   r8   r9   rM   rQ   rL   rN   rO   Úpop)rU   Úas_jsonrn   Ú
graph_datarO   rj   Ú
model_dataÚ
field_datas           r$   Úget_graph_datazModelGraph.get_graph_datax   s  € ÝÔ×#Ò#Ñ%Ô%ˆàŸ,š,Ð'7Ñ8Ô8ØÔ+Ø"Ô1Ø'+Ô'CØ%)Ô%?Ø Ô-Ø”|Øœð	
ð 	
ˆ
ð ð 	/ð DÐC°t´{ÐCÑCÔCˆFØ!ð 0ð 0�Ø")¨(Ô"3ð 0ð 0�JØ—N’N 7Ñ+Ô+Ð+Ø&0°Ô&:ð 0ð 0˜
Ø"Ÿš wÑ/Ô/Ð/Ð/ð0ð0ð $*ˆJ�xÑ Ð à#'¤;ˆJ�xÑ àÐr&   c           
      ó4  ‡— | j         rD‰j        r=t          ‰j        ¦  «        }|                     ¦   «         r|                     ¦   «         }n‰j        }t          ‰¦  «        j        }t          ‰t          t          f¦  «        r"|d                     ‰j        j        ¦  «        z  }| j        r'‰j        � d„ ‰j        D ¦   «         }t!          |¦  «        }‰‰j        ||‰j        t%          ˆfd„|D ¦   «         ¦  «        t          ‰t&          ¦  «        ‰j        dœS )Nz ({0})c                 ó   — h | ]\  }}|’ŒS r   r   )r"   ÚcÚ_s      r$   ú	<setcomp>z,ModelGraph.add_attributes.<locals>.<setcomp>    s   € Ð3Ð3Ð3™T˜Q �qÐ3Ð3Ð3r&   c              3   ó8   •K  — | ]}‰j         |j         k    V — Œd S ©N)Úcreation_counter)r"   Úabstract_fieldrl   s     €r$   ú	<genexpr>z,ModelGraph.add_attributes.<locals>.<genexpr>ª   sB   øè è € ð ð à"ð Ô&¨.Ô*IÒIðð ð ð ð ð r&   )rl   rZ   rJ   ÚtypeÚblankÚabstractrd   Úprimary_key)r>   Úverbose_namer   ÚislowerÚ
capitalizerZ   r€   Ú__name__r(   r   r   ÚformatÚremote_fieldÚ
field_namerM   ÚchoicesÚstrr�   Úanyr   rƒ   )rU   rl   Úabstract_fieldsrJ   Útr‹   s    `    r$   Úadd_attributeszModelGraph.add_attributes”   s1  ø€ ØÔð 	 %Ô"4ð 	Ý˜eÔ0Ñ1Ô1ˆEØ�}Š}‰Œð +Ø×(Ò(Ñ*Ô*�øà”JˆEå�‰KŒKÔ ˆÝ�e�m­ZÐ8Ñ9Ô9ð 	@Ø�—’ Ô!3Ô!>Ñ?Ô?Ñ?ˆAØÔ%ð 	¨%¬-Ð*CØ3Ð3 U¤]Ð3Ñ3Ô3ˆGÝ�G‘”ˆAð Ø”JØØØ”[Ýð ð ð ð à&5ðñ ô ñ ô õ # 5­,Ñ7Ô7Ø Ô,ð
ð 
ð 	
r&   r;   Nc                 óâ  — | j         rD|j        r=t          |j        ¦  «        }|                     ¦   «         r|                     ¦   «         }n|j        }t          |d¦  «        rz|                     ¦   «         }| j         r<|                     ¦   «         r(|                     dd¦  «                             ¦   «         }d 	                    |t          |¦  «        ¦  «        }| j
        rd}t          |j        j        t          ¦  «        r}|j        j        dk    r|j        }nqd|j        j        v r$|j        j                             dd¦  «        \  }}	n|j        j        j        }|j        j        }	t%          j        ||	¦  «        }n|j        j        }|rd	 	                    |dd
…         |¦  «        }|                      ||||¦  «        }
|
|d         vr|                      |
d         ¦  «        r|
S d S d S )NÚrelated_query_namery   ú z{} ({})r;   rU   ú.é   z[{}, color={}]éÿÿÿÿr\   r]   )r>   r„   r   r…   r†   rZ   Úhasattrr’   Úreplacerˆ   rF   r(   r‰   rc   rŒ   r1   Ú_metaÚ	app_labelr   Ú	get_modelÚget_relation_contextÚ	use_model)rU   rl   rc   ÚextrasÚcolorrJ   r’   Útarget_modelrš   Ú
model_nameÚ_rels              r$   Úadd_relationzModelGraph.add_relation²   sþ  € ØÔð 	 %Ô"4ð 	Ý˜eÔ0Ñ1Ô1ˆEØ�}Š}‰Œð +Ø×(Ò(Ñ*Ô*�øà”JˆEõ �5Ð.Ñ/Ô/ð 	KØ!&×!9Ò!9Ñ!;Ô!;ÐØÔ!ð WÐ&8×&@Ò&@Ñ&BÔ&Bð WØ%7×%?Ò%?ÀÀSÑ%IÔ%I×%TÒ%TÑ%VÔ%VÐ"Ø×$Ò$ U­IÐ6HÑ,IÔ,IÑJÔJˆEØÔ ð 	ØˆEõ �eÔ(Ô.µÑ4Ô4ð 	4ØÔ!Ô'¨6Ò1Ð1Ø$œ{��à˜%Ô,Ô2Ð2Ð2Ø,1Ô,>Ô,D×,JÒ,JÈ3ÐPQÑ,RÔ,RÑ)�I˜z˜zà %¤Ô 1Ô ;�IØ!&Ô!3Ô!9�JÝ#œ~¨i¸ÑDÔD��à Ô-Ô3ˆLàð 	BØ%×,Ò,¨V°A°b°D¬\¸5ÑAÔAˆFà×(Ò(¨°u¸eÀVÑLÔLˆà�u˜[Ô)Ð)Ð)¨d¯nªn¸TÀ(¼^Ñ.LÔ.LÐ)ØˆKð *Ð)Ð)Ð)r&   c                 ót   — g }|D ]}|d„ |j         D ¦   «         z  }Œt          t          |¦  «        ¦  «        }|S )Nc                 óJ   — g | ] }t          |d ¦  «        ¯|j        j        ¯|‘Œ!S ©r™   )r—   r™   r‚   ©r"   Úabstract_models     r$   r%   z2ModelGraph.get_abstract_models.<locals>.<listcomp>Ü   sI   € ð  ð  ð  à"Ý˜>¨7Ñ3Ô3ð ð 9GÔ8LÔ8Uð Øð ð  ð  r&   )Ú	__bases__r)   r+   )rU   Ú	appmodelsÚabstract_modelsÚappmodels       r$   Úget_abstract_modelszModelGraph.get_abstract_modelsÙ   s^   € ØˆØ!ð 	ð 	ˆHØð  ð  à&.Ô&8ð ñ  ô  ñ ˆOˆOõ
 �s ?Ñ3Ô3Ñ4Ô4ˆØÐr&   c           	      ó‚   — t          d|j        z  d|j        z  d|j                             dd¦  «        z  g dœ¦  «        S )Nz"%s"z%sz
cluster_%sr”   ry   )rZ   Úapp_nameÚcluster_app_namer[   )r   rZ   r˜   )rU   rK   s     r$   Úget_app_contextzModelGraph.get_app_contextä   sN   € Ýà ¤Ñ)Ø  3¤8™OØ$0°3´8×3CÒ3CÀCÈÑ3MÔ3MÑ$MØð	ð ñ
ô 
ð 	
r&   c                 ón   — | j         rd„ |j        j        D ¦   «         }nd„ |j        j        D ¦   «         }|S )Nc                 ó   — g | ]}|‘ŒS r   r   ©r"   rl   s     r$   r%   z6ModelGraph.get_appmodel_attributes.<locals>.<listcomp>ð   s   € ÐIÐIÐI E˜%ÐIÐIÐIr&   c                 ó<   — g | ]}t          |t          ¦  «        °|‘ŒS r   )r(   r   r´   s     r$   r%   z6ModelGraph.get_appmodel_attributes.<locals>.<listcomp>ô   s8   € ð ð ð àÝ! %­Ñ6Ô6ðØðð ð r&   )r@   r™   Úlocal_fields)rU   r¬   Ú
attributess      r$   Úget_appmodel_attributesz"ModelGraph.get_appmodel_attributesî   sR   € ØÔ#ð 		ØIÐI¨X¬^Ô-HÐIÑIÔIˆJˆJðð à%œ^Ô8ðñ ô ˆJð
 Ðr&   c                 ó$   — d„ |j         D ¦   «         S )Nc                 óT   — g | ]%}t          |d ¦  «        ¯|j        j        ¯|j        ‘Œ&S r¦   )r—   r™   r‚   r‡   r§   s     r$   r%   z5ModelGraph.get_appmodel_abstracts.<locals>.<listcomp>ü   sL   € ð 
ð 
ð 
àÝ�~ wÑ/Ô/ð
ð 5CÔ4HÔ4Qð
ØÔ#ð
ð 
ð 
r&   )r©   )rU   r¬   s     r$   Úget_appmodel_abstractsz!ModelGraph.get_appmodel_abstractsû   s&   € ð
ð 
à"*Ô"4ð
ñ 
ô 
ð 	
r&   c                 óÊ   — ||j                              dd¦  «        |j        |g g dœ}| j        r)|j        j        rt          |j        j        ¦  «        |d<   n|d         |d<   |S )Nr”   ry   )rc   r¯   rZ   Ú	abstractsrk   r\   rJ   rZ   )Ú
__module__r˜   r‡   r>   r™   r„   r   )rU   r¬   Úappmodel_abstractsrj   s       r$   Úget_appmodel_contextzModelGraph.get_appmodel_context  s|   € àØ Ô+×3Ò3°C¸Ñ=Ô=ØÔ%Ø+ØØð
ð 
ˆð Ôð 	/ (¤.Ô"=ð 	/Ý(¨¬Ô)DÑEÔEˆG�GÑÐà& vœˆG�GÑàˆr&   c                 óä   — g }|j         D ]e}t          |d¦  «        rS|j        j        rG|                     |j        j        ¦  «         |                     |                      |¦  «        ¦  «         Œf|S )Nr™   )r©   r—   r™   r‚   r`   rk   Úget_bases_abstract_fields)rU   rx   Ú_abstract_fieldsr#   s       r$   rÂ   z$ModelGraph.get_bases_abstract_fields  s|   € ØÐØ”ð 	Kð 	KˆAÝ�q˜'Ñ"Ô"ð K q¤wÔ'7ð KØ ×'Ò'¨¬¬Ñ7Ô7Ð7Ø ×'Ò'¨×(FÒ(FÀqÑ(IÔ(IÑJÔJÐJøØÐr&   c                 óª   — d}|j         j        rd}|j         j        rd}|dz  }| j        rd}|j                             dd¦  «        |j        dd|d	d
dœS )Nzmulti-tabler‚   Úproxyz\ninheritancer;   r”   ry   r?   z+[arrowhead=empty, arrowtail=none, dir=both]T©Ú
target_appr]   r€   rZ   rJ   Úarrowsr^   )r™   r‚   rÅ   rF   r¾   r˜   r‡   )rU   r¬   ÚparentrJ   s       r$   Úget_inheritance_contextz"ModelGraph.get_inheritance_context  s   € ØˆØŒ<Ô ð 	ØˆEØŒ>Ôð 	ØˆEØÐ!Ñ!ˆØÔ ð 	ØˆEà Ô+×3Ò3°C¸Ñ=Ô=Ø”oØ!Ø!ØØCØð
ð 
ð 	
r&   c                 óH   — t          |                     ¦   «         ¦  «        }|S r|   )r)   Ú
get_models)rU   rK   rª   s      r$   rÌ   zModelGraph.get_models.  s   € Ý˜ŸšÑ)Ô)Ñ*Ô*ˆ	ØÐr&   c                 ó€   — |j                              dd¦  «        |j        t          |¦  «        j        |j        ||ddœS )Nr”   ry   TrÆ   )r¾   r˜   r‡   r€   rZ   )rU   r    rl   rJ   rž   s        r$   rœ   zModelGraph.get_relation_context2  sG   € à&Ô1×9Ò9¸#¸sÑCÔCØ"Ô+Ý˜‘K”KÔ(Ø”JØØØð
ð 
ð 	
r&   c                 óÊ   — |                      ¦   «         }|                      |¦  «        s|r||k    r|S |d                              |                      ||¦  «        ¦  «         |S )Nrk   )ÚcopyÚ
skip_fieldÚappendr�   )rU   rl   rc   ÚpkrŽ   Únewmodels         r$   Úprocess_attributeszModelGraph.process_attributes=  se   € Ø—:’:‘<”<ˆØ�?Š?˜5Ñ!Ô!ð 	 Rð 	¨E°RªK¨KØˆOØ�Ô×!Ò! $×"5Ò"5°e¸_Ñ"MÔ"MÑNÔNÐNØˆr&   c           	      ó8  — | j         D �]}t          j        |¦  «        }|sŒ|                      |¦  «        }|                      |¦  «        }|                      |¦  «        }||z   }|D �]Œ}|                      |j        j        ¦  «        sŒ#|  	                    |¦  «        }|  
                    |¦  «        }|                      ||¦  «        }	|                      |¦  «        }
|j        j        }|r?|j        j        s3||
v r/|	d                              |                      ||¦  «        ¦  «         |
D ]}|                      ||	||¦  «        }	Œ| j        r|                      |	¦  «        }	|j        j        D ]}|                      ||	|¦  «        }	Œ|j        j        D ]}|                      ||	¦  «        }	Œ| j        r!|j        D ]}|                      |||	¦  «        }	Œ|d                              |	¦  «         �ŒŽ|d         r| j                             |¦  «         �Œd S )Nrk   r[   )rT   r   Úget_app_configr±   rÌ   r­   r�   r™   Úobject_namer»   rÂ   rÀ   r¸   rÒ   r‚   rÑ   r�   rÔ   rB   Úsort_model_fieldsr¶   Úprocess_local_fieldsÚlocal_many_to_manyÚprocess_local_many_to_manyr?   r©   Úprocess_parentrO   )rU   rš   rK   Ú	app_graphÚ
app_modelsr«   r¬   r¿   rŽ   rc   r·   rÒ   rl   rÉ   s                 r$   r_   zModelGraph.process_appsD  sh  € Øœð *	.ñ *	.ˆIÝÔ% iÑ0Ô0ˆCØð ØØ×,Ò,¨SÑ1Ô1ˆIØŸš¨Ñ-Ô-ˆJØ"×6Ò6°zÑBÔBˆOØ(¨:Ñ5ˆJà&ð 2ñ 2�Ø—~’~ h¤nÔ&@ÑAÔAð ØØ%)×%@Ò%@ÀÑ%JÔ%JÐ"Ø"&×"@Ò"@ÀÑ"JÔ"J�Ø×1Ò1°(Ð<NÑOÔO�Ø!×9Ò9¸(ÑCÔC�
ð ”^Ô&�Øð U˜hœnÔ5ð U¸"À
Ð:JÐ:JØ˜(”O×*Ò*¨4×+>Ò+>¸rÀ?Ñ+SÔ+SÑTÔTÐTà'ð Wð W�EØ ×3Ò3°E¸5À"ÀoÑVÔV�E�EàÔ#ð :Ø ×2Ò2°5Ñ9Ô9�Eà%œ^Ô8ð Uð U�EØ ×5Ò5°e¸UÀOÑTÔT�E�Eà%œ^Ô>ð Jð J�EØ ×;Ò;¸EÀ5ÑIÔI�E�EàÔ#ð Mà"*Ô"4ð Mð M˜Ø $× 3Ò 3°F¸HÀeÑ LÔ L˜˜à˜(Ô#×*Ò*¨5Ñ1Ô1Ð1Ñ1Ø˜Ô"ð .Ø”×"Ò" 9Ñ-Ô-Ð-ùðU*	.ð *	.r&   c                 óh  — |                      ¦   «         }|j                             d¦  «        s||v s|                      |¦  «        r|S d }| j        rLt          |t          t          f¦  «        r0t          |j	        dd ¦  «        }t                               |¦  «        }t          |t          ¦  «        r|                      ||d|¦  «        }nHt          |t          ¦  «        r1|                      ||d                     | j        ¦  «        |¦  «        }nd }|�|d                              |¦  «         |S )NÚ_ptr_idÚ	on_deletez*[arrowhead=none, arrowtail=none, dir=both]z([arrowhead=none, arrowtail={}, dir=both]r\   )rÏ   ÚattnameÚendswithrÐ   rH   r(   r   r   Úgetattrr‰   ÚON_DELETE_COLORSrP   r£   rˆ   rG   rÑ   )rU   rl   rc   rŽ   rÓ   rŸ   Úfield_on_deleterd   s           r$   rÙ   zModelGraph.process_local_fieldsq  s@  € Ø—:’:‘<”<ˆàŒM×"Ò" 9Ñ-Ô-ð	à˜Ð'Ð'Ø�Š˜uÑ%Ô%ð (ð ˆOàˆØÔ$ð 	:­°E½MÍ:Ð;VÑ)WÔ)Wð 	:Ý% eÔ&8¸+ÀtÑLÔLˆOÝ$×(Ò(¨Ñ9Ô9ˆEå�e�]Ñ+Ô+ð 	Ø×(Ò(Ø�xÐ!MÈuñô ˆHˆHõ ˜�zÑ*Ô*ð 	Ø×(Ò(ØØØ:×AÒAÀ$ÔBRÑSÔSØñ	ô ˆHˆHð ˆHØÐØ�[Ô!×(Ò(¨Ñ2Ô2Ð2Øˆr&   c                 ó  — |                      ¦   «         }|                      |¦  «        r|S d }t          |t          ¦  «        rft	          |j        j        d¦  «        rK|j        j        j        j        r5|  	                    ||d 
                    | j        | j        ¦  «        ¦  «        }n9t          |t          ¦  «        r$|  	                    ||t          d¦  «        ¦  «        }|�|d                              |¦  «         |S )Nr™   z%[arrowhead={} arrowtail={}, dir=both]z>[style="dotted", arrowhead=normal, arrowtail=normal, dir=both]r\   )rÏ   rÐ   r(   r   r—   r‰   Úthroughr™   Úauto_createdr£   rˆ   rG   r   r   rÑ   )rU   rl   rc   rÓ   rd   s        r$   rÛ   z%ModelGraph.process_local_many_to_many“  s  € Ø—:’:‘<”<ˆØ�?Š?˜5Ñ!Ô!ð 	ØˆOØˆÝ�e�_Ñ-Ô-ð 	å˜Ô*Ô2°GÑ<Ô<ð
àÔ&Ô.Ô4ÔAð
ð  ×,Ò,ØØØ;×BÒBØÔ(¨$Ô*:ñô ñô �øõ ˜�Ñ/Ô/ð 	Ø×(Ò(ØØÝØTñô ñô ˆHð ÐØ�[Ô!×(Ò(¨Ñ2Ô2Ð2Øˆr&   c                 óú   — |                      ¦   «         }t          |d¦  «        rV|                      ||¦  «        }||d         vr6|                      |d         ¦  «        r|d                              |¦  «         |S )Nr™   r\   r]   )rÏ   r—   rÊ   r�   rÑ   )rU   rÉ   r¬   rc   rÓ   r¢   s         r$   rÜ   zModelGraph.process_parent°  s{   € Ø—:’:‘<”<ˆÝ�6˜7Ñ#Ô#ð 	3Ø×/Ò/°¸&ÑAÔAˆDð ˜8 KÔ0Ð0Ð0°T·^²^ÀDÈÄNÑ5SÔ5SÐ0Ø˜Ô%×,Ò,¨TÑ2Ô2Ð2Øˆr&   c                 ód   — |                      ¦   «         }t          |d         d„ ¬¦  «        |d<   |S )Nrk   c                 ó4   — | d          | d          | d         fS )Nrƒ   rd   rJ   r   )rl   s    r$   ú<lambda>z.ModelGraph.sort_model_fields.<locals>.<lambda>¾  s&   € Ø˜-Ô(Ð(Ø˜*Ô%Ð%Ø�g”ð€ r&   )Úkey)rÏ   Úsorted)rU   rc   rÓ   s      r$   rØ   zModelGraph.sort_model_fieldsº  sA   € Ø—:’:‘<”<ˆÝ#Ø�XÔðð ð
ñ 
ô 
ˆ�Ñð ˆr&   c                 ó  — | j         r;| j         D ]3}d|                     dd¦  «        z  }t          j        ||¦  «        r dS Œ4| j        r;| j        D ]3}d|                     dd¦  «        z  }t          j        ||¦  «        r dS Œ4| j          S )z€
        Decide whether to use a model, based on the model name and the lists of
        models to exclude and include.
        z^%s$Ú*z.*TF)r:   r˜   ÚreÚsearchrE   )rU   r¡   Úmodel_patterns      r$   r�   zModelGraph.use_modelÆ  sÂ   € ð Ôð 	 Ø!%Ô!4ð  ð  �Ø &¨×)>Ò)>¸sÀDÑ)IÔ)IÑ I�Ý”9˜]¨JÑ7Ô7ð  Ø˜4˜4ð ð Ôð 	!Ø!%Ô!4ð !ð !�Ø &¨×)>Ò)>¸sÀDÑ)IÔ)IÑ I�Ý”9˜]¨JÑ7Ô7ð !Ø ˜5˜5ð!ð Ô&Ð&Ð&r&   c           	      óê   — | j         r.| j        r|j        r|j        | j         v rdS |j        | j         v rdS | j        r6t          |t          t          t          t          t          t          f¦  «        sdS dS )NTF)rD   r>   r„   rZ   rA   r(   r   r   r   r   r	   r
   )rU   rl   s     r$   rÐ   zModelGraph.skip_fieldÚ  s�   € ØÔð 	ØÔ!ð   eÔ&8ð  ØÔ%¨Ô)=Ð=Ð=Ø˜4ØŒz˜TÔ1Ð1Ð1Ø�tØÔ$ð 	ÝØåÝ#Ý!Ý ÝÝ ðñ
ô 
ð ð �tØˆur&   )F)r;   N)r‡   r¾   Ú__qualname__rW   re   ru   r�   r£   r­   r±   r¸   r»   rÀ   rÂ   rÊ   rÌ   rœ   rÔ   r_   rÙ   rÛ   rÜ   rØ   r�   rÐ   r   r&   r$   r5   r5   L   sk  € € € € € ð/ð /ð /ð:;ð ;ð ;ðð ð ð ð8
ð 
ð 
ð<%ð %ð %ð %ðN	ð 	ð 	ð
ð 
ð 
ðð ð ð
ð 
ð 
ðð ð ð" ð  ð  ð
ð 
ð 
ð&ð ð ð	
ð 	
ð 	
ðð ð ð+.ð +.ð +.ðZ ð  ð  ðDð ð ð:ð ð ð
ð 
ð 
ð'ð 'ð 'ð(ð ð ð ð r&   r5   ú*django_extensions/graph_models/digraph.dotc                 ó`  — t          |t          ¦  «        rt          j        |¦  «        }t          |t          ¦  «        s9t          |d¦  «        rt          |j        t          ¦  «        st          d¦  «        ‚t          | ¦  «         	                    ¦   «         }| 
                    |¦  «        }|S )NÚtemplatezyDefault Django template loader isn't used. This can lead to the incorrect template rendering. Please, check the settings.)r(   rŒ   r   Úget_templater   r—   rù   Ú	Exceptionr   ri   Úrender)rr   rù   rx   Údots       r$   Úgenerate_dotrþ   ñ  s§   € Ý�(�CÑ Ô ð 1ÝÔ& xÑ0Ô0ˆå�h¥Ñ)Ô)ð 
Ý�˜*Ñ%Ô%ð
Ý*4°XÔ5FÍÑ*QÔ*Qð
õ ð*ñ
ô 
ð 	
õ 	�
ÑÔ×#Ò#Ñ%Ô%€AØ
�/Š/˜!Ñ
Ô
€Cà€Jr&   c                  ój   — t          | i |¤Ž}|                     ¦   «          |                     ¦   «         S r|   )r5   re   ru   )ÚargsrV   Ú	generators      r$   re   re     s8   € Ý˜DÐ+ FÐ+Ð+€IØ×!Ò!Ñ#Ô#Ð#Ø×#Ò#Ñ%Ô%Ð%r&   c                 óP   — t          g ||¬¦  «        }|                     | ¦  «        S )N)r:   rE   )r5   r�   )rc   r:   rE   r  s       r$   r�   r�   
  s3   € ÝØ
˜>¸.ðñ ô €Ið ×Ò˜uÑ%Ô%Ð%r&   )r÷   ).Ú__doc__rm   r,   rò   Údjango.appsr   Údjango.db.modelsr   Údjango.db.models.fields.relatedr   r   r   r   Ú'django.db.models.fields.reverse_relatedr	   r
   Ú"django.contrib.contenttypes.fieldsr   Údjango.templater   r   r   Údjango.utils.encodingr   Údjango.utils.safestringr   Údjango.utils.translationr   rR   Ú__version__Ú__license__Ú
__author__Ú__contributors__ÚCASCADEÚPROTECTÚSET_NULLÚSET_DEFAULTÚSETÚ
DO_NOTHINGÚRESTRICTrå   r3   r5   rþ   re   r�   r   r&   r$   ú<module>r     sü  ððð ð €€€Ø 	€	€	€	Ø 	€	€	€	à Ð Ð Ð Ð Ð Ø %Ð %Ð %Ð %Ð %Ð %ðð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ?Ð >Ð >Ð >Ð >Ð >Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø +Ð +Ð +Ð +Ð +Ð +Ø -Ð -Ð -Ð -Ð -Ð -Ø BÐ BÐ BÐ BÐ BÐ Bð €Ø€Ø9€
ðð ð Ð ð& Ô�eØÔ�fØÔ�xØÔ˜'Ø„L�(ØÔ˜ØÔ�xðÐ ð/ð /ð /ðbð bð bð bð bñ bô bð bðJð ð ð ð&&ð &ð &ð&ð &ð &ð &ð &r&   