def _create_user(input_args, config): from users.models import User from organizations.models import Organization username = input_args.username or config.get('username') or get_env( 'USERNAME') password = input_args.password or config.get('password') or get_env( 'PASSWORD') token = input_args.user_token or config.get('user_token') or get_env( 'USER_TOKEN') if not username: user = User.objects.filter(email=DEFAULT_USERNAME).first() if user is not None: if password and not user.check_password(password): user.set_password(password) user.save() print(f'User {DEFAULT_USERNAME} password changed') return user print( f'Please enter default user email, or press Enter to use {DEFAULT_USERNAME}' ) username = input('Email: ') if not username: username = DEFAULT_USERNAME if not password: password = getpass.getpass( f'Default user password {DEFAULT_USERNAME}: ') try: user = User.objects.create_user(email=username, password=password) user.is_staff = True user.is_superuser = True user.save() if token and len(token) > 5: from rest_framework.authtoken.models import Token Token.objects.filter(key=user.auth_token.key).update(key=token) else: print(f"Token {token} is not applied to user {DEFAULT_USERNAME} " f"because it's empty or len(token) < 5") except IntegrityError: print('User {} already exists'.format(username)) user = User.objects.get(email=username) org = Organization.objects.first() if not org: org = Organization.create_organization(created_by=user, title='Label Studio') else: org.add_user(user) user.active_organization = org user.save(update_fields=['active_organization']) return user
def _create_user(input_args, config): from users.models import User from organizations.models import Organization DEFAULT_USERNAME = '******' username = input_args.username or config.get('username') or get_env( 'USERNAME') password = input_args.password or config.get('password') or get_env( 'PASSWORD') if not username: user = User.objects.filter(email=DEFAULT_USERNAME).first() if user is not None: if password and not user.check_password(password): user.set_password(password) user.save() print('User password changed') return user print( 'Please enter default user email, or press Enter to use "default_user@localhost"' ) username = input('Email: ') if not username: username = DEFAULT_USERNAME if not password: password = getpass.getpass('Default user password: '******'User {} already exists'.format(username)) user = User.objects.get(email=username) org = Organization.objects.first() if not org: Organization.create_organization(created_by=user, title='Label Studio') else: org.add_user(user) return user
def main(): input_args = parse_input_args(sys.argv[1:]) # setup logging level if input_args.log_level: os.environ.setdefault("LOG_LEVEL", input_args.log_level) if input_args.database: database_path = pathlib.Path(input_args.database) os.environ.setdefault("DATABASE_NAME", str(database_path.absolute())) if input_args.data_dir: data_dir_path = pathlib.Path(input_args.data_dir) os.environ.setdefault("LABEL_STUDIO_BASE_DATA_DIR", str(data_dir_path.absolute())) config = _get_config(input_args.config_path) # set host name host = input_args.host or config.get('host', '') if not get_env('HOST'): os.environ.setdefault('HOST', host) # it will be passed to settings.HOSTNAME as env var _setup_env() _apply_database_migrations() from label_studio.core.utils.common import collect_versions versions = collect_versions() if input_args.command == 'reset_password': _reset_password(input_args) return if input_args.command == 'shell': call_command('shell_plus') return # print version if input_args.command == 'version': from label_studio import __version__ print('\nLabel Studio version:', __version__, '\n') print(json.dumps(versions, indent=4)) # init elif input_args.command == 'user' or getattr(input_args, 'user', None): _get_user_info(input_args.username) return # init elif input_args.command == 'init' or getattr(input_args, 'init', None): _init(input_args, config) print('') print('Label Studio has been successfully initialized.') if input_args.command != 'start': print('Start the server: label-studio start ' + input_args.project_name) return # start with migrations from old projects, '.' project_name means 'label-studio start' without project name elif input_args.command == 'start' and input_args.project_name != '.': from label_studio.core.old_ls_migration import migrate_existing_project from projects.models import Project sampling_map = {'sequential': Project.SEQUENCE, 'uniform': Project.UNIFORM, 'prediction-score-min': Project.UNCERTAINTY} if not _project_exists(input_args.project_name): migrated = False project_path = pathlib.Path(input_args.project_name) if project_path.exists(): print('Project directory from previous verion of label-studio found') print('Start migrating..') config_path = project_path / 'config.json' config = _get_config(config_path) user = _create_user(input_args, config) label_config_path = project_path / 'config.xml' project = _create_project( title=input_args.project_name, user=user, label_config=label_config_path, sampling=sampling_map.get(config.get('sampling', 'sequential'), Project.UNIFORM), description=config.get('description', ''), ) migrate_existing_project(project_path, project, config) migrated = True print( Fore.LIGHTYELLOW_EX + '\n*** WARNING! ***\n' + f'Project {input_args.project_name} migrated to Label Studio Database\n' + "YOU DON'T NEED THIS FOLDER ANYMORE" + '\n****************\n' + Fore.WHITE ) if not migrated: print( 'Project "{project_name}" not found. ' 'Did you miss create it first with `label-studio init {project_name}` ?'.format( project_name=input_args.project_name ) ) return # on `start` command, launch browser if --no-browser is not specified and start label studio server if input_args.command == 'start' or input_args.command is None: from label_studio.core.utils.common import start_browser if get_env('USERNAME') and get_env('PASSWORD') or input_args.username: _create_user(input_args, config) # ssl not supported from now cert_file = input_args.cert_file or config.get('cert') key_file = input_args.key_file or config.get('key') if cert_file or key_file: logger.error("Label Studio doesn't support SSL web server with cert and key.\n" 'Use nginx or other servers for it.') return # internal port and internal host for server start internal_host = input_args.internal_host or config.get('internal_host', '0.0.0.0') internal_port = input_args.port or get_env('PORT') or config.get('port', 8080) internal_port = int(internal_port) internal_port = _get_free_port(internal_port, input_args.debug) # save selected port to global settings from django.conf import settings settings.INTERNAL_PORT = str(internal_port) # browser url = ('http://localhost:' + str(internal_port)) if not host else host start_browser(url, input_args.no_browser) _app_run(host=internal_host, port=internal_port)
import os import re import logging import json # for printing messages before main logging config applied if not logging.getLogger().hasHandlers(): logging.basicConfig(level=logging.DEBUG, format='%(message)s') from label_studio.core.utils.io import get_data_dir from label_studio.core.utils.params import get_bool_env, get_env, get_env_list_int logger = logging.getLogger(__name__) # Hostname is used for proper path generation to the resources, pages, etc HOSTNAME = get_env('HOST', '') if HOSTNAME: if not HOSTNAME.startswith('http://') and not HOSTNAME.startswith('https://'): logger.info( "! HOST variable found in environment, but it must start with http:// or https://, ignore it: %s", HOSTNAME ) HOSTNAME = '' else: logger.info("=> Hostname correctly is set to: %s", HOSTNAME) if HOSTNAME.endswith('/'): HOSTNAME = HOSTNAME[0:-1] # for django url resolver if HOSTNAME: # http[s]://domain.com:8080/script_name => /script_name pattern = re.compile(r'^http[s]?:\/\/([^:\/\s]+(:\d*)?)(.*)?')
Django Base settings for Label Studio. For more information on this file, see https://docs.djangoproject.com/en/3.1/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/3.1/ref/settings/ """ import os import re from label_studio.core.utils.io import get_data_dir from label_studio.core.utils.params import get_bool_env, get_env # Hostname is used for proper path generation to the resources, pages, etc HOSTNAME = get_env('HOST', '') if HOSTNAME: if not HOSTNAME.startswith('http://') and not HOSTNAME.startswith( 'https://'): print( "! HOST variable found in environment, but it must start with http:// or https://, ignore it:", HOSTNAME) HOSTNAME = '' else: print("=> Hostname correctly is set to:", HOSTNAME) if HOSTNAME.endswith('/'): HOSTNAME = HOSTNAME[0:-1] # for django url resolver if HOSTNAME: # http[s]://domain.com:8080/script_name => /script_name
def get_image_local_path(url, image_cache_dir=None, project_dir=None, image_dir=None): return get_local_path(url, image_cache_dir, project_dir, get_env('HOSTNAME'), image_dir)
from django.db.models import Q, F, Count from django.conf import settings from requests.adapters import HTTPAdapter from core.version import get_git_version from core.utils.common import get_bool_env from data_export.serializers import ExportDataSerializer from label_studio.core.utils.params import get_env from users.models import Token from core.feature_flags import flag_set from core.utils.common import load_func version = get_git_version() logger = logging.getLogger(__name__) CONNECTION_TIMEOUT = float(get_env('ML_CONNECTION_TIMEOUT', 1)) # seconds TIMEOUT_DEFAULT = float(get_env('ML_TIMEOUT_DEFAULT', 100)) # seconds TIMEOUT_TRAIN = float(get_env('ML_TIMEOUT_TRAIN', 30)) TIMEOUT_PREDICT = float(get_env('ML_TIMEOUT_PREDICT', 100)) TIMEOUT_HEALTH = float(get_env('ML_TIMEOUT_HEALTH', 1)) TIMEOUT_SETUP = float(get_env('ML_TIMEOUT_SETUP', 3)) TIMEOUT_DUPLICATE_MODEL = float(get_env('ML_TIMEOUT_DUPLICATE_MODEL', 1)) TIMEOUT_DELETE = float(get_env('ML_TIMEOUT_DELETE', 1)) TIMEOUT_TRAIN_JOB_STATUS = float(get_env('ML_TIMEOUT_TRAIN_JOB_STATUS', 1)) class BaseHTTPAPI(object): MAX_RETRIES = 2 HEADERS = { 'User-Agent': 'heartex/' + (version or ''),