
    	]j;                        d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
mZ ej                  dk(  r	 ed       ddl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dlmZ  ej:                  e      Z e  ejB                  e"      jF                  jI                               Z%dZ&d Z'd Z(d Z)d Z*d Z+d Z,ddZ-d Z.d Z/d Z0d Z1d Z2d Z3d Z4d Z5edk(  r ejl                   e5              yy) zThis file and its contents are licensed under the Apache License 2.0. Please see the included NOTICE for copyright information and LICENSE for a copy of the license.
    N)Foreinitwin32T)convert)call_command)get_wsgi_application)DEFAULT_DB_ALIASIntegrityErrorconnections)connection_created)MigrationExecutor)parse_input_args)get_envzdefault_user@localhostc                      t         j                  j                  dt               t        j
                  j                  dd       t                y )Nr   DJANGO_SETTINGS_MODULEz'label_studio.core.settings.label_studio)syspathinsertLS_PATHosenviron
setdefaultr        =/root/env/lib/python3.12/site-packages/label_studio/server.py
_setup_envr       s0    HHOOAwJJ24]^r   c                 B    dj                  | |      }t        dd|       y )Nz{}:{}	runserverz
--noreload)formatr   )hostporthttp_sockets      r   _app_runr#   &   s    ..t,KlK8r   c                 ~    |j                   dk(  r.t        d      r"|j                         }|j                  d       yyy)z(Enable integrity constraint with sqlite.sqliteAZURE_MOUNT_FIXzPRAGMA journal_mode=wal;N)vendorr   cursorexecute)sender
connectionkwargsr(   s       r   _set_sqlite_fix_pragmar-   +   s<    H$1B)C""$12 *D$r   c                     t         |    }|j                          t        |      }|j                  j                  j                         }|j                  |       S )N)r   prepare_databaser   loadergraph
leaf_nodesmigration_plan)databaser+   executortargetss       r   is_database_synchronizedr7   2   sN    X&J! ,Hoo##..0G&&w///r   c                      t        j                  t               t        t              st        d       t        ddd       y y )NzInitializing database..migratez
--no-colorr   )	verbosity)r   connectr-   r7   r	   printr   r   r   r   _apply_database_migrationsr=   :   s4    56#$45'(Y: 6r   c                     t        j                  t        j                  j	                  |       d      5 }t        j                  |      }d d d        |S # 1 sw Y   S xY w)Nzutf-8)encoding)ioopenr   r   abspathjsonload)config_pathcconfigs      r   _get_configrH   A   sF    	-	@ A1MMs   AAc                    ddl m} ddlm} |j                  j                  |       j                         }|t        dj                  |              nc|j                  j                         }	|	j                  |       |j                  j                  | ||	      }t        dj                  |              |Ft        t        j                  j                  |            5 }
|
j                         |_        d d d        |||_        |||_        |@ddlm} |D ]5  }t*        j-                  d	|       |j                  j                  ||
       7 |j/                          |S # 1 sw Y   oxY w)Nr   OrganizationProjecttitlez&Project with title "{}" already exists)rO   
created_byorganizationz,Project with title "{}" successfully created)	MLBackendzAdding new ML backend %s)projecturl)organizations.modelsrK   projects.modelsrM   objectsfilterfirstr<   r   add_usercreaterA   r   r   rB   readlabel_configsamplingdescription	ml.modelsrR   loggerinfosave)rO   userr]   r^   r_   ml_backendsrK   rM   rS   orgrF   rR   rT   s                r   _create_projectrg   G   sB   1'oo$$5$1779G6==eDE""((*T//((uTW(X<CCEJK"''//,/0 	,A#$668G 	, #)'  	?CKK2C8$$W#$>	? LLNN%	, 	,s   !E%%E.c                 X   ddl m} ddlm} | st        } |j
                  j                  |       }|j                         st        dd|  dd       y |j                         } ||      j                  }|j                  j                  |d	<   d
|d<   t        d       t        |       |S )Nr   User)UserSerializeremailerrorzuser z doesn't exist)statusmessagetokenokro   z=> User info:)users.modelsrj   users.serializersrk   DEFAULT_USERNAMErW   rX   existsr<   rY   data
auth_tokenkey)usernamerj   rk   rd   	user_datas        r   _get_user_infor|   j   s    !0#<<X.D;;=uXJn-MNO::<Dt$))I,,IgIh	/	)r   c                 z   ddl m} ddlm} | j                  xs |j                  d      xs t        d      }| j                  xs |j                  d      xs t        d      }| j                  xs |j                  d      xs t        d	      }|s|j                  j                  t        
      j                         }|I|rE|j                  |      s4|j                  |       |j                          t!        dt         d       |S | j"                  ry t!        dt                t%        d      }|st        }|s%| j"                  st'        j&                  d| d      }	 |j                  j)                  ||      }d|_        d|_        |j                          |rUt/        |      dkD  rGddlm} |j                  j                  |j4                  j6                        j9                  |       n|rt!        d| dt         d       |j                  j                  |
      }|j                  j                         }	|	s|j?                  |d| j@                        }	n|	jC                  |       |	|_"        |j                  dg       |S # t:        $ r t!        dj=                  |             Y w xY w)Nr   rJ   ri   rz   USERNAMEpasswordPASSWORD
user_token
USER_TOKENrl   zUser z password changedz7Please enter default user email, or press Enter to use zEmail: zUser password for z: )rm   r   T   )Token)ry   zToken z is not applied to user z% because it's empty or len(token) < 5zUser {} already existszLabel Studio)rP   rO   legacy_api_tokens_enabledactive_organization)update_fields)#rU   rK   rs   rj   rz   getr   r   r   rW   rX   ru   rY   check_passwordset_passwordrc   r<   
quiet_modeinputgetpasscreate_useris_staffis_superuserlenrest_framework.authtoken.modelsr   rx   ry   updater
   r   create_organizationenable_legacy_api_tokenrZ   r   )

input_argsrG   rK   rj   rz   r   rq   rd   r   rf   s
             r   _create_userr      sc   1!""Sfjj&<S
@SH""Sfjj&<S
@SH!!VVZZ%=VAVE||"")9":@@B 3 3H =!!(+		.//@ABK  GHXGYZ[#'HJ11??%7z#DE9||''h'J 		SZ!^=MM  T__%8%8 9@@U@KF5'!9:J9KKtuv
 <<(+D



$
$
&C..>ZMoMo / 
 	T"DII23I4K  9&--h789s   &B*J #J:9J:c           
         t        | |      }|r| j                  rt        | j                        s~ddlm} |j
                  |j                  |j                  d}t        | j                  || j                  | j                  |j                  | j                  d      | j                         y | j                  r%t        dj                  | j                               y y )Nr   rL   
sequentialuniformzprediction-score-minr   )rO   rd   r]   r_   r^   re   zProject "{0}" already exists)r   project_name_project_existsrV   rM   SEQUENCEUNIFORMUNCERTAINTYrg   r]   project_descr   r^   re   r<   r   )r   rG   rd   rM   sampling_maps        r   _initr      s    
F+D
''
@W@W0X+ "**$+$7$7

 	))#00"//!%%j&9&9<H"..	
 
	 	 ,33J4K4KLM 
!r   c                    ddl m} | j                  }|st        d      }|j                  j                  |      j                         }|t        dj                  |             y | j                  }|st        j                  d      }|st        d       y |j                  |      rt        d       y |j                  |       |j                          t        d	       y )
Nr   ri   z
Username: rl   zUser with username {} not foundzNew password:zCan not set empty passwordz'Entered password is the same as currentzPassword successfully changed)rs   rj   rz   r   rW   rX   rY   r<   r   r   r   r   r   rc   )r   rj   rz   rd   r   s        r   _reset_passwordr      s    !""H&<<X.446D|/66x@A""H???3*+8$78hIIK	
)*r   c                 b   t         j                  dt        |       z   dz   t        |      z          | j                  dd      j                  dd      } t	        j                  t        j
                  t        j                        5 }|j                  | |f      dk(  cd d d        S # 1 sw Y   y xY w)Nz(Checking if host & port is available :: :zhttps:// zhttp://r   )ra   rb   strreplacesocketAF_INETSOCK_STREAM
connect_ex)r    r!   ss      r   check_port_in_user      s    
KK:SYFLsSWyXY<<
B'//	2>D	v~~v'9'9	: /a||T4L)Q./ / /s   B%%B.c                     |sy| }t        d|       rk| }t        |       dz   } | |z
  dk\  rt        dt        |       z   dz         t	        dt        |      z   dz   dz   t        |       z   dz          t        d|       rk| S )	N	localhost   i  zd
*** WARNING! ***
 Could not find an available port
 to launch label studio. 
 Last tested port was 
****************
z
*** WARNING! ***
* Port z is in use.
z* Trying to start at )r   intConnectionErrorr   r<   )r!   debugoriginal_portold_ports       r   _get_free_portr      s    T2Ht9q=Dm#t+%J$i  --  -h- !" ** d)	
 ))  T2$ Kr   c                 b    ddl m} |j                  j                  |       j	                         S )Nr   rL   rN   )rV   rM   rW   rX   rv   )r   rM   s     r   r   r     s&    '??!!!5<<>>r   c                  v   t        t        j                  dd        } | j                  r*t        j
                  j                  d| j                         | j                  rVt        j                  | j                        }t        j
                  j                  dt        |j                                      | j                  rVt        j                  | j                        }t        j
                  j                  dt        |j                                      t        | j                        }| j                  xs |j!                  dd      }t#        d      s t        j
                  j                  d|       t%                t'                dd	lm}  |       }| j,                  d
k(  rt/        |        y | j,                  dk(  rt1        d       y | j,                  dk(  rddlm}  || j6                  d       y | j,                  dk(  rTddlm} 	  || j:                  | j<                  | j>                  | j@                        }	tB        jE                  d|	        y | j,                  dk(  s| jJ                  r5ddl&m'} tQ        d|d       tQ        tS        jT                  |d             nM| j,                  dk(  stW        | dd       rtY        | jZ                         y | j,                  dk(  stW        | dd       rXt]        | |       tQ        d       tQ        d       | j,                  dk7  r| j^                  rtQ        d | j^                  z          y | j,                  dk(  r| j^                  d!k7  rdd"l0m1} dd#l2m3} |jh                  |jj                  |jl                  d$}| j^                  rJto        | j^                        s4d%}t        j                  | j^                        }|jq                         rtQ        d&       tQ        d'       |d(z  }t        |      }ts        | |      }|d)z  }tu        | j^                  |||j!                  |j!                  d*d+      |jj                        |j!                  d,d      -      } ||||       d}tQ        tv        jx                  d.z   d/| j^                   d0z   d1z   d2z   tv        jz                  z          |s&tQ        d3j}                  | j^                  4             y | j,                  dk(  s| j,                  Ddd5lm?} t#        d6      rt#        d7      s| jZ                  rts        | |       | j                  xs |j!                  d8      }| j                  xs |j!                  d9      }|s|rtB        j                  d:       y | j                  xs |j!                  d;d<      }| j                  xs t#        d=      xs |j!                  d>d?      }	 t        |      }t        || j                        }ddClJmK} t        |      |_L        |sdDt        |      z   n|} ||| j                         t        ||E       y y # tF        $ r"}
tB        jI                  d|
        Y d }
~
y d }
~
ww xY w# t        $ r(}
tB        j                  d@| dA|
 dB       d?}Y d }
~
d }
~
ww xY w)FNr   	LOG_LEVELDATABASE_NAMELABEL_STUDIO_BASE_DATA_DIRr    r   HOSTr   )collect_versionsreset_passwordshell
shell_pluscalculate_stats_all_orgs)r   T)redisexport)export_project)serializer_contextzProject exported successfully: zFailed to export project: version)__version__z
Label Studio version:
   )indentrd   r   z/Label Studio has been successfully initialized.startz%Start the server: label-studio start .rL   )migrate_existing_projectr   Fz=Project directory from previous version of label-studio foundzStart migrating..zconfig.jsonz
config.xmlr^   r   r_   )rO   rd   r]   r^   r_   z
*** WARNING! ***
zProject z# migrated to Label Studio Database
z"YOU DON'T NEED THIS FOLDER ANYMOREr   zjProject "{project_name}" not found. Did you miss create it first with `label-studio init {project_name}` ?)r   )start_browserr~   r   certry   zaLabel Studio doesn't support SSL web server with cert and key.
Use nginx or other servers for it.internal_hostz0.0.0.0PORTr!   i  zCan't parse PORT 'z': z!; default value 8080 will be used)settingszhttp://localhost:)r    r!   )Or   r   argv	log_levelr   r   r   r4   pathlibPathr   absolutedata_dirrH   rE   r    r   r   r   r=   label_studio.core.utils.commonr   commandr   r   tasks.functionsr   from_scratchr   
project_idexport_formatexport_pathexport_serializer_contextra   rb   	Exception	exceptionr   label_studior   r<   rC   dumpsgetattrr|   rz   r   r   rV   rM   "label_studio.core.old_ls_migrationr   r   r   r   r   rv   r   rg   r   LIGHTYELLOW_EXWHITEr   r   	cert_filekey_filern   r   r!   r   
ValueErrorwarningr   r   django.confr   INTERNAL_PORT
no_browserr#   )r   database_pathdata_dir_pathrG   r    r   versionsr   r   filenameer   rM   r   r   migratedproject_pathrE   rd   label_config_pathrS   r   r   r   r   internal_portr   rT   s                               r   mainr     s   !#((12,/J 


k:+?+?@Z%8%89


os=3I3I3K/LMZ%8%89


:C@V@V@X<YZ//0F ??4fjj4D6?


fd+L ?!H--
#W$\"77< !8!8EX%2
	F%%%((&&#-#G#G	H KK9(DE Y&**<*<,'d;djj!,- 
		v	%VT)Jz**+ 
		v	%VT)Jj&!b	?@(Z-D-D9J<S<SST 
		w	&:+B+Bc+I+O "**$+$7$7
 ""?:;R;R+SH"<<
(?(?@L""$UV)**]:$[1#J7$0<$?!)$11!2)--fjj\.RT[TcTcd &

=" = )wG'',- !8!8 99]^_ ;; -	-
 jj! ]]c]c%/%<%< ^d ^  W$
(:(:(B@:7:#6*:M:MV, ((>FJJv,>	&&;&**U*;LLw  #00ZFJJPY4Z"V76?VfjjQU>V	!.M
 '}j6F6FG 	)!$]!3 AE"S%77$c:001m-8G )C_  	?9!=>> 		?F  	!NN/c!Defg M	!s0   4Y .Z 	Z"Y??Z	Z8Z33Z8__main__)NNNN)7__doc__r   r@   rC   loggingr   r   r   r   coloramar   r   platformdjango.core.managementr   django.core.wsgir   	django.dbr	   r
   r   django.db.backends.signalsr   django.db.migrations.executorr   label_studio.core.argparserr   label_studio.core.utils.paramsr   	getLogger__name__ra   r   r   __file__parentr   r   ru   r   r#   r-   r7   r=   rH   rg   r|   r   r   r   r   r   r   r   exitr   r   r   <module>r     s     	   	   
 <<7 / 1 C C 9 ; 8 2			8	$
lgll8$++446
7+ 9
30; F*7tN.+:/4?g9T zCHHTV r   