Ejemplo n.º 1
0
def _upload_files(request_files, project):
    filelist = []
    for _, file in request_files.items():
        if file and file.filename and _is_allowed_file(file.filename):
            filename = secure_filename(file.filename)

            # read as text or binary file
            if isinstance(file, io.TextIOWrapper):
                with open(filename, mode='rb') as f:
                    data = f.read()
            else:
                data = file.read()

            # assign unique filename
            filename = convert_string_to_hash(
                data, trim=6) + '-' + os.path.basename(filename)

            # eval upload dir
            upload_dir = os.environ.get('LS_UPLOAD_DIR', '')
            upload_dir = upload_dir if upload_dir else project.upload_dir
            os.makedirs(upload_dir, exist_ok=True)

            # save file to path on disk
            with open(os.path.join(upload_dir, filename), mode='wb') as f:
                f.write(data)

            filelist.append(filename)

    return filelist
Ejemplo n.º 2
0
def project_get_or_create(multi_session_force_recreate=False):
    """
    Return existed or create new project based on environment. Currently supported methods:
    - "fixed": project is based on "project_name" attribute specified by input args when app starts
    - "session": project is based on "project_name" key restored from flask.session object
    :return:
    """
    if input_args.command == 'start-multi-session':
        # get user from session
        if 'user' not in session:
            session['user'] = str(uuid4())
        user = session['user']

        # get project from session
        if 'project' not in session or multi_session_force_recreate:
            session['project'] = str(uuid4())
        project = session['project']

        project_name = user + '/' + project
        return Project.get_or_create(project_name,
                                     input_args,
                                     context={
                                         'multi_session': True,
                                         'user': convert_string_to_hash(user)
                                     })
    else:
        if multi_session_force_recreate:
            raise NotImplementedError(
                '"multi_session_force_recreate" option supported only with "start-multi-session" mode'
            )
        return Project.get_or_create(input_args.project_name,
                                     input_args,
                                     context={'multi_session': False})
Ejemplo n.º 3
0
def project_get_or_create(multi_session_force_recreate=False):
    """ Return existed or create new project based on environment. Currently supported methods:
        - "fixed": project is based on "project_name" attribute specified by input args when app starts
        - "session": project is based on "project_name" key restored from flask.session object

        :param multi_session_force_recreate: create a new project if True
        :return: project
    """
    input_args = current_app.label_studio.input_args
    if input_args and input_args.command == 'start-multi-session':
        # get user from session
        if 'user' not in session:
            session['user'] = str(uuid4())
        user = session['user']
        g.user = user

        # get project from session
        if 'project' not in session or multi_session_force_recreate:
            session['project'] = str(uuid4())
        project = session['project']

        # check for shared projects and get owner user
        if project in session.get('shared_projects', []):
            owner = Project.get_user_by_project(project, input_args.root_dir)
            if owner is None:  # owner is None when project doesn't exist
                raise Exception(
                    'No such shared project found: project_uuid = ' + project)
            else:
                user = owner

        project_name = user + '/' + project
        return Project.get_or_create(project_name,
                                     input_args,
                                     context={
                                         'multi_session':
                                         True,
                                         'user':
                                         convert_string_to_hash(user.encode())
                                     })
    else:
        if multi_session_force_recreate:
            raise NotImplementedError(
                '"multi_session_force_recreate" option supported only with "start-multi-session" mode'
            )
        return Project.get_or_create(input_args.project_name,
                                     input_args,
                                     context={'multi_session': False})