
    h	$                        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Z	d d	lmZmZmZ 	 d d
lmZmZmZmZ dZd dlmZ edk\  Zd Zd Zd Zd Zd Z d Z! G d de      Z"y# e
$ r d dlmZ d dlmZ eZ	Y Ww xY w# e
$ r d dlmZ dZY Qw xY w)    N)make_option)chain)BaseCommand)
force_textT)	force_str)
ALL_CHECKS)FSMFieldMixin	GET_STATERETURN_VALUE)get_appsget_app
get_models	get_modelF)apps)VERSION)   
   c                    t         r;| j                  j                         D cg c]  }t        |t              s|| f c}S | j                  j
                  D cg c]  }t        |t              s|| f c}S c c}w c c}w N)NEW_META_API_meta
get_fields
isinstancer	   fields)modelfields     `/home/dcms/DCMS/lib/python3.12/site-packages/django_fsm/management/commands/graph_transitions.pyall_fsm_fields_datar      sd    ,1KK,B,B,Di5
SXZgHhii,1KK,>,>c5*UTaBbcc jcs   A9A9A>0A>c                     | j                   j                  }|j                  d|j                  j	                  dd      d| j
                  d|S )N. _)r   r   	app_labelverbose_namereplacename)r   stateoptss      r   	node_namer)   &   s?    ;;D NND,=,=,E,Ec3,OQVQ[Q[]bcc    c                     t        |      t        k(  st        |      t        k(  r9t        | d      r-t	        t        | j                        j                  |            S |S )Nchoices)typeintboolhasattrr   dictr,   get)r   r'   s     r   
node_labelr3   +   sF    E{cd5kT1geY6O$u}}-11%899r*   c                    t        j                         }| D ]<  \  }t               t               t               t               t               f\  }}}}}j                  |      D ]  }|j                  dk(  r(|j                  |j                  |j                  f       ;|j                  dk(  r(|j                  |j                  |j                  f       rt        |j                  t        t        f      rd |j                  j                  D        n|j                  f}	t        |j                  t        t        f      rfd|j                  j                  D        n"|j                  t        |j                        ff}
|
D ]  \  }}|j                  rQt        |j                        }|j                  |t        |j                        f       |j                  ||df       |	D ]  }t        |||j                  ||||           |j!                  t        fdt#        ||      D                     |D ]J  \  }}t        |      }||z  }|D ]/  \  }}|j                  ||f       |j                  ||d|fff       1 L |D ]g  \  }}t        |      }||z  }|j%                  |t        |      f       |D ]/  \  }}|j                  ||f       |j                  ||d|fff       1 i j&                  j(                  }t        j                  d|j*                  d	|j,                  d	j                  d|j*                  d
|j,                  d
j                  i      }||z
  }|D ]"  \  }}|j/                  |t1        |      d       $ ||z  |z
  D ]q  \  }}|j/                  |t1        |      d       j2                  s0|j2                  k(  s@t        d      }|j/                  |dd       |j5                  ||       s |D ]#  \  }}} |j4                  ||fi t7        |       % |j9                  |       ? |S )N*+c              3       K   | ]  }|  y wr    ).0r'   s     r   	<genexpr>zgenerate_dot.<locals>.<genexpr>@   s     IuUIs   c              3   :   K   | ]  }|t        |      f  y wr   )r)   )r9   r'   r   s     r   r:   zgenerate_dot.<locals>.<genexpr>E   s     d%eYue45ds   ))styledottedc              3   T   K   | ]  \  }}t        |      t        |      f ! y wr   )r)   r3   )r9   targetr"   r   s      r   r:   zgenerate_dot.<locals>.<genexpr>R   s)     ~)&RS5&):eV+DE~s   %(labelcluster_r"   r    )r&   
graph_attrdoublecircle)r@   shapecircle_initial point)r&   r@   rD   )graphvizDigraphsetget_all_transitionssourceaddr?   r&   r   r
   r   allowed_statesr)   on_errorr3   add_transitionupdater   remover   r   r#   object_namenodestrdefaultedger1   subgraph)fields_dataresultr   sourcestargetsedgesany_targetsany_except_targets
transition_targetssource_name_pairrM   source_nameon_error_namer?   r&   target_name	all_nodesr@   r(   rY   final_statesinitial_nameattrsr   s                           @r   generate_dotrk   2   sP   F# B"uCF5#%QTQVX[X]_b_dCd@%.@  33E: 	uJ  C'!2!2JOO DE""c)"&&
(9(9:??'KL "*"3"3i5NO J
(9(9(H(HI$++-  "*"3"3i5NO e:CTCTCcCcd%,,iz?P?P.QRT !
 ,< u'FK!**(1%9L9L(M]JujFYFY4Z$[\		;?U"VW"* u&vvzUZ\celnstuu!	u0 	~W\]hj|W}~~	
 ( 	JLFD#E62K')I&/ J"U[%01		;wo5GHIJ	J / 	JLFD#E62K')I{Juf,EFH&/ J"U[%01		;wo5GHIJ		J {{  ##'+~~t7G7GTt~~t?O?OQVQ[Q[!\]

 (' 	HKD%MM$c%jMG	H#g-= 	6KD%MM$c%jMA}}EMM)#,UJ#?LMM|2WMMMM,5	6 05 	C+KeHMM+{Bd5kB	C 	!EB"H Mr*   c                     t        ||      }|j                  |t        ||       f       |j                  |t        ||      f       |j                  ||d|fff       y )Nr@   )r)   rN   r3   )	transition_sourcetransition_targettransition_namerd   r   r\   r]   r^   rf   s	            r   rQ   rQ   |   s\    E#45KKKj0ABCDKKj0ABCD	II{K7O*D)FGHr*   c                  ^    	 dd l } | j                  j                  S # t        $ r h dcY S w xY w)Nr   >   dotfdpsfdpcirconeatoosagetwopi	patchwork)rI   backendENGINES	Exception)rI   s    r   get_graphviz_layoutsr|      s4    W''' WVVWs    ,,c                       e Zd ZeZesBej                   eddddd       edddd	d
ddj                   e
             z        fz   ZdZnd ZdZd Zd Zy)Command--output-ostore
outputfileiRender output file. Type of output dependent on file extensions. Use png or jpg to render graph to image.actiondesthelp--layout-llayoutrq   =Layout to be used by GraphViz for visualization. Layouts: %s.r!   r   r   rW   r   [appname[.model[.field]]]c                     |j                  ddddd       |j                  dddd	d
ddj                  t                     z         |j                  ddd       y )Nr   r   r   r   r   r   r   r   r   rq   r   r!   r   argsr5   r   )nargsr   )add_argumentjoinr|   )selfparsers     r   add_argumentszCommand.add_arguments   s{    ! C    X[^[c[cdxdz[{{    c9TVr*   z@Creates a GraphViz dot file with transitions for selected fieldsc                 x    |d   j                  dd      \  }}|d   |_        ||_        |j                  |       y )Nr   r    r   r   )rsplitengineformatrender)r   graphoptionsfilenamer   s        r   render_outputzCommand.render_output   s=    "<077Q?&x(Xr*   c                    g }t        |      dk7  r0|D ])  }|j                  d      }t        |      dk(  rct        r.t        j                  |d         }t        j
                  |      }nt	        |d         }t        |      }|D ]  }|t        |      z  } t        |      dk(  rDt        rt        j                  |d   |d         }nt        |d   |d         }|t        |      z  }t        |      dk(  st        rt        j                  |d   |d         }nt        |d   |d         }|t        |      z  }, n[t        r(t        j
                         D ]  }|t        |      z  } n-t               D ]   }t        |      D ]  }|t        |      z  } " t        |      }	|d   r | j                  |	fi | y t        |	       y )Nr   r    r         r   )lensplitr   r   r   r   r   r   r   rk   r   print)
r   r   r   rZ   arg
field_specappmodelsr   dotdatas
             r   handlezCommand.handle   s   t9> > YYs^
z?a'#"ll:a=9!%!5%jm4!+C!' B#':5'AAB_)# $z!}jm L )*Q-A G#6u#==K_)# $z!}jm L )*Q-A G#6u#==K/>2 !__. >E#6u#==K> $: BC!+C B#':5'AABB {+< Dw2'2'Nr*   N)__name__
__module____qualname___requires_system_checksrequires_system_checksHAS_ARGPARSEr   option_listr   r   r|   r   r   r   r   r   r8   r*   r   r~   r~      s    4!--! C X[^[c[cdxdz[{{1
 
( +	W( ND)r*   r~   )#rI   optparser   	itertoolsr   django.core.management.baser   django.utils.encodingr   r   ImportErrorr   r   
django_fsmr	   r
   r   django.db.modelsr   r   r   r   r   django.appsr   djangor   r   r   r)   r3   rk   rQ   r|   r~   r8   r*   r   <module>r      s        3)0" > =IIL '!dd
GTIWak aE  )=6()   Ls"   A" A; "A87A8;B
B