ó
¸9—^c           @   sG  d  Z  d d l Z d d l Z d d l Z d d l Z d d l m Z d d l m Z m	 Z	 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 f Z d d d d d d d d d d d d d g Z d „  Z d e f d „  ƒ  YZ d d „ Z  d „  Z! d  „  Z" d S(!   sÃ   
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
iÿÿÿÿN(   t   apps(   t
   ForeignKeyt   ManyToManyFieldt   OneToOneFieldt   RelatedField(   t   GenericRelation(   t   Contextt   Templatet   loader(   t
   force_text(   t	   mark_safe(   t   activates   1.1t   Pythons'   Bas van Oostveen <v.oostveen@gmail.com>sO   Antonio Cavedoni <http://cavedoni.com/>Stefano J. Attardi <http://attardi.org/>s(   limodou <http://www.donews.net/limodou/>s   Carlo C8E Mirons    Andre Campos <cahenan@gmail.com>s#   Justin Findlay <jfindlay@gmail.com>s&   Alexander Houben <alexander@houben.ch>s    Joern Hees <gitdev@joernhees.de>s%   Kevin Cherepski <cherepski@gmail.com>s&   Jose Tomas Tocino <theom3ga@gmail.com>s#   Adam Dobrawy <naczelnik@jawnosc.tk>s6   Mikkel Munch Mortensen <https://www.detfalskested.dk/>s+   Andrzej Bistram <andrzej.bistram@gmail.com>s%   Daniel Lipsitt <danlipsitt@gmail.com>c         C   s“   |  s
 g  St  |  t t t f ƒ r& |  Sd |  k rm t j j |  ƒ rm g  t |  ƒ j ƒ  D] } | j	 ƒ  ^ qW Sg  |  j
 d ƒ D] } | j	 ƒ  ^ q} S(   Nt   ,(   t
   isinstancet   listt   tuplet   sett   ost   patht   isfilet   opent	   readlinest   stript   split(   t   argt   e(    (    sG   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/modelviz.pyt   parse_file_or_list0   s    )t
   ModelGraphc           B   sÔ   e  Z d  „  Z d „  Z e 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 RS(   c         K   s°  g  |  _  | j d d  ƒ |  _ | j d t ƒ |  _ | j d t ƒ |  _ t | j d d ƒ ƒ |  _ | j d t ƒ |  _	 | j d t ƒ |  _
 | j d t ƒ |  _ | j d	 t ƒ |  _ | j d
 t ƒ |  _ | j d t ƒ |  _ | j d d  ƒ |  _ |  j d  k	 rt |  j ƒ n  t | j d d ƒ ƒ |  _ t | j d d ƒ ƒ |  _ | j d t ƒ |  _ | j d ƒ |  _ |  j	 r£g  t j ƒ  D] } | j ^ qˆ|  _ n	 | |  _ d  S(   Nt   cli_optionst   disable_fieldst   disable_abstract_fieldst   include_modelst    t   all_applicationst   group_modelst   verbose_namest   inheritancet   relations_as_fieldst   sort_fieldst   languaget   exclude_columnst   exclude_modelst   hide_edge_labelst   arrow_shape(   t   graphst   gett   NoneR   t   FalseR   R   R   R    R"   t   use_subgraphR$   t   TrueR%   R&   R'   R(   t   activate_languageR)   R*   R+   R,   R    t   get_app_configst   labelt
   app_labels(   t   selfR6   t   kwargst   app(    (    sG   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/modelviz.pyt   __init__;   s0    		(c         C   sº   |  j  ƒ  g  } x9 |  j D]. } | j g  | d D] } | d ^ q1 ƒ q Wxg |  j D]\ } xS | d D]G } x> | d D]2 } | d  k	 rx | d | k rª t | d <qª qx qx Wqg WqV Wd  S(   Nt   modelst   namet	   relationst   targett
   needs_node(   t   process_appsR-   t   extendR/   R0   (   R7   t   nodest   graphR   t   modelt   relation(    (    sG   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/modelviz.pyt   generate_graph_dataY   s    
,c         C   s   t  j  j ƒ  } i | j d ƒ d 6|  j d 6|  j d 6|  j d 6|  j d 6} | r| g  |  j D] } | j ƒ  ^ q] | d <n |  j | d <| S(   Ns   %Y-%m-%d %H:%Mt
   created_atR   R   R   R1   R-   (	   t   datetimet   nowt   strftimeR   R   R   R1   R-   t   flatten(   R7   t   as_jsonRI   t
   graph_datat   context(    (    sG   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/modelviz.pyt   get_graph_datag   s    


)c         C   sÕ   |  j  r? | j r? t | j ƒ } | j ƒ  rH | j ƒ  } qH n	 | j } t | ƒ j } t | t	 t
 f ƒ rˆ | d j | j j ƒ 7} n  i | j d 6| d 6| d 6| j d 6| | k d 6t | t ƒ d 6| j d 6S(	   Ns    ({0})R<   R5   t   typet   blankt   abstractRE   t   primary_key(   R$   t   verbose_nameR	   t   islowert
   capitalizeR<   RP   t   __name__R   R   R   t   formatt   remote_fieldt
   field_nameRQ   R   RS   (   R7   t   fieldt   abstract_fieldsR5   t   t(    (    sG   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/modelviz.pyt   add_attributesx   s     	

R!   c   
      C   s¨  |  j  r? | j r? t | j ƒ } | j ƒ  rH | j ƒ  } qH n	 | j } t | d ƒ r® | j ƒ  } |  j  r“ | j ƒ  r“ | j d d ƒ j ƒ  } n  d j	 | t | ƒ ƒ } n  |  j
 rÀ d } n  t | j j t j ƒ rY| j j d k rö | j } qed | j j k r)| j j j d d ƒ \ } } n | j j j } | j j } t j | | ƒ } n | j j } |  j | | | | ƒ }	 |	 | d	 k r¤|  j |	 d
 ƒ r¤|	 Sd  S(   Nt   related_query_namet   _t    u   {} ({})R!   R7   t   .i   R=   R>   (   R$   RT   R	   RU   RV   R<   t   hasattrR_   t   replaceRX   R+   R   RY   RD   t   sixt   string_typesR   t   _metat	   app_labelR    t	   get_modelt   get_relation_contextt	   use_model(
   R7   R[   RD   t   extrasR5   R_   t   target_modelRh   t
   model_namet   _rel(    (    sG   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/modelviz.pyt   add_relation   s0    			!#c         C   sh   g  } xI | D]A } | g  | j  D]' } t | d ƒ r  | j j r  | ^ q  7} q Wt t | ƒ ƒ } | S(   NRg   (   t	   __bases__Rc   Rg   RR   R   R   (   R7   t	   appmodelst   abstract_modelst   appmodelt   abstract_model(    (    sG   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/modelviz.pyt   get_abstract_models³   s    ,c         C   sG   t  i d | j d 6d | j d 6d | j j d d ƒ d 6g  d	 6ƒ S(
   Ns   "%s"R<   s   %st   app_names
   cluster_%sRb   R`   t   cluster_app_nameR;   (   R   R<   Rd   (   R7   R9   (    (    sG   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/modelviz.pyt   get_app_context½   s
    c         C   s]   |  j  r+ g  | j j D] } | ^ q } n. g  | j j D] } t | t ƒ s8 | ^ q8 } | S(   N(   R&   Rg   t   local_fieldsR   R   (   R7   Rt   R[   t
   attributes(    (    sG   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/modelviz.pyt   get_appmodel_attributesÅ   s
    	"c         C   s8   g  | j  D]* } t | d ƒ r
 | j j r
 | j ^ q
 S(   NRg   (   Rq   Rc   Rg   RR   RW   (   R7   Rt   Ru   (    (    sG   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/modelviz.pyt   get_appmodel_abstractsÎ   s    c         C   s{   i | j  j d d ƒ d 6| j d 6| d 6g  d 6g  d 6} |  j ri | j j ri t | j j ƒ | d <n | d | d <| S(	   NRb   R`   Rw   R<   t	   abstractst   fieldsR=   R5   (   t
   __module__Rd   RW   R$   Rg   RT   R	   (   R7   Rt   t   appmodel_abstractsRN   (    (    sG   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/modelviz.pyt   get_appmodel_contextÔ   s    

c         C   se   g  } xX | j  D]M } t | d ƒ r | j j r | j | j j ƒ | j |  j | ƒ ƒ q q W| S(   NRg   (   Rq   Rc   Rg   RR   RA   R   t   get_bases_abstract_fields(   R7   t   ct   _abstract_fieldsR   (    (    sG   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/modelviz.pyRƒ   ä   s    c         C   s“   d } | j  j r d } n  | j  j r0 d } n  | d 7} |  j rL d } n  i | j j d d ƒ d 6| j d	 6d
 d 6d
 d 6| d 6d d 6t d 6S(   Ns   multi-tableRR   t   proxys   \ninheritanceR!   Rb   R`   t
   target_appR>   R%   RP   R<   R5   s+   [arrowhead=empty, arrowtail=none, dir=both]t   arrowsR?   (   Rg   RR   R†   R+   R€   Rd   RW   R2   (   R7   Rt   t   parentR5   (    (    sG   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/modelviz.pyt   get_inheritance_contextì   s     		
		
c         C   s   t  | j ƒ  ƒ } | S(   N(   R   t
   get_models(   R7   R9   Rr   (    (    sG   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/modelviz.pyR‹   ÿ   s    c         C   sS   i | j  j d d ƒ d 6| j d 6t | ƒ j d 6| j d 6| d 6| d 6t d	 6S(
   NRb   R`   R‡   R>   RP   R<   R5   Rˆ   R?   (   R€   Rd   RW   RP   R<   R2   (   R7   Rm   R[   R5   Rl   (    (    sG   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/modelviz.pyRj     s    

c         C   sR   | j  ƒ  } |  j | ƒ s- | r1 | | k r1 | S| d j |  j | | ƒ ƒ | S(   NR   (   t   copyt
   skip_fieldt   appendR^   (   R7   R[   RD   t   pkR\   t   newmodel(    (    sG   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/modelviz.pyt   process_attributes  s
    !c         C   s  x|  j  D]
} t j | ƒ } | s+ q
 n  |  j | ƒ } |  j | ƒ } |  j | ƒ } | | } x’| D]Š} |  j | j j ƒ sŠ qi n  |  j	 | ƒ } |  j
 | ƒ } |  j | | ƒ }	 |  j | ƒ }
 | j j } | r| j j r| |
 k r|	 d j |  j | | ƒ ƒ n  x& |
 D] } |  j | |	 | | ƒ }	 qW|  j rX|  j |	 ƒ }	 n  x) | j j D] } |  j | |	 | ƒ }	 qeWx& | j j D] } |  j | |	 ƒ }	 q‘W|  j râx) | j D] } |  j | | |	 ƒ }	 qÀWn  | d j |	 ƒ qi W| d r
 |  j j | ƒ q
 q
 Wd  S(   NR   R;   (   R6   R    t   get_app_configRy   R‹   Rv   Rk   Rg   t   object_nameR}   Rƒ   R‚   R|   R   RR   RŽ   R^   R‘   R'   t   sort_model_fieldsRz   t   process_local_fieldst   local_many_to_manyt   process_local_many_to_manyR%   Rq   t   process_parentR-   (   R7   Rh   R9   t	   app_grapht
   app_modelsRs   Rt   R   R\   RD   R{   R   R[   R‰   (    (    sG   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/modelviz.pyR@     s@    
 		
c         C   sÁ   | j  ƒ  } | j j d ƒ s9 | | k s9 |  j | ƒ r= | St | t ƒ rd |  j | | d ƒ } n9 t | t ƒ r— |  j | | d j |  j	 ƒ ƒ } n d  } | d  k	 r½ | d j | ƒ n  | S(   Nt   _ptr_ids*   [arrowhead=none, arrowtail=none, dir=both]s(   [arrowhead=none, arrowtail={}, dir=both]R=   (   RŒ   t   attnamet   endswithR   R   R   Rp   R   RX   R,   R/   RŽ   (   R7   R[   RD   R\   R   RE   (    (    sG   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/modelviz.pyR•   A  s     -c         C   sÙ   | j  ƒ  } |  j | ƒ r | Sd  } t | t ƒ rˆ t | j j d ƒ rµ | j j j j	 rµ |  j
 | | d j |  j |  j ƒ ƒ } qµ n- t | t ƒ rµ |  j
 | | t d ƒ ƒ } n  | d  k	 rÕ | d j | ƒ n  | S(   NRg   s%   [arrowhead={} arrowtail={}, dir=both]s>   [style="dotted", arrowhead=normal, arrowtail=normal, dir=both]R=   (   RŒ   R   R/   R   R   Rc   RY   t   throughRg   t   auto_createdRp   RX   R,   R   R
   RŽ   (   R7   R[   RD   R   RE   (    (    sG   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/modelviz.pyR—   Y  s     'c         C   sk   | j  ƒ  } t | d ƒ rg |  j | | ƒ } | | d k rg |  j | d ƒ rg | d j | ƒ qg n  | S(   NRg   R=   R>   (   RŒ   Rc   RŠ   Rk   RŽ   (   R7   R‰   Rt   RD   R   Ro   (    (    sG   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/modelviz.pyR˜   m  s    #c         C   s-   | j  ƒ  } t | d d d „  ƒ| d <| S(   NR   t   keyc         S   s   |  d |  d |  d f S(   NRS   RE   R5   (    (   R[   (    (    sG   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/modelviz.pyt   <lambda>x  R!   (   RŒ   t   sorted(   R7   RD   R   (    (    sG   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/modelviz.pyR”   v  s    c         C   s    |  j  rL x@ |  j  D]2 } d | j d d ƒ } t j | | ƒ r t Sq Wn  |  j r˜ x@ |  j D]2 } d | j d d ƒ } t j | | ƒ r_ t Sq_ Wn  |  j  S(   s€   
        Decide whether to use a model, based on the model name and the lists of
        models to exclude and include.
        s   ^%s$t   *s   .*(   R    Rd   t   ret   searchR2   R*   R0   (   R7   Rn   t   model_pattern(    (    sG   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/modelviz.pyRk   {  s    		c         C   sQ   |  j  rM |  j r4 | j r4 | j |  j  k r4 t Sn  | j |  j  k rM t Sn  t S(   N(   R)   R$   RT   R2   R<   R0   (   R7   R[   (    (    sG   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/modelviz.pyR     s    	(   RW   R€   R:   RF   R0   RO   R^   Rp   Rv   Ry   R|   R}   R‚   Rƒ   RŠ   R‹   Rj   R‘   R@   R•   R—   R˜   R”   Rk   R   (    (    (    sG   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/modelviz.pyR   :   s,   			$	
											,						s*   django_extensions/graph_models/digraph.dotc         C   sŠ   t  | t j ƒ r$ t j | ƒ } n  t  | t ƒ re t | d ƒ oR t  | j t ƒ re t d ƒ ‚ n  t	 |  ƒ j
 ƒ  } | j | ƒ } | S(   Nt   templatesy   Default Django template loader isn't used. This can lead to the incorrect template rendering. Please, check the settings.(   R   Re   Rf   R   t   get_templateR   Rc   R§   t	   ExceptionR   RK   t   render(   RM   R§   R„   t   dot(    (    sG   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/modelviz.pyt   generate_dot™  s    2c          O   s#   t  |  | Ž  } | j ƒ  | j ƒ  S(   N(   R   RF   RO   (   t   argsR8   t	   generator(    (    sG   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/modelviz.pyRF   ¨  s    
c         C   s%   t  g  d | d | ƒ} | j |  ƒ S(   NR    R*   (   R   Rk   (   RD   R    R*   R®   (    (    sG   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/modelviz.pyRk   ®  s    (#   t   __doc__RH   R   R¤   Re   t   django.appsR    t   django.db.models.fields.relatedR   R   R   R   t"   django.contrib.contenttypes.fieldsR   t   django.templateR   R   R   t   django.utils.encodingR	   t   django.utils.safestringR
   t   django.utils.translationR   R3   t   __version__t   __license__t
   __author__t   __contributors__R   t   objectR   R¬   RF   Rk   (    (    (    sG   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/modelviz.pyt   <module>	   sB   "			
ÿ `	