def api_project_switch(): """ Switch projects in multi-session mode """ input_args = current_app.label_studio.input_args if request.args.get('uuid') is None: return make_response("Not a valid UUID", 400) uuid = request.args.get('uuid') user = Project.get_user_by_project(uuid, input_args.root_dir) # not owner user tries to open shared project if user != g.user: # create/append shared projects for user if 'shared_projects' not in session: session['shared_projects'] = {} session['shared_projects'].update({uuid: {}}) # switch project session['project'] = uuid output = g.project.serialize() output['multi_session_mode'] = input_args.command == 'start-multi-session' if request.method == 'GET': return redirect(url_for('label_studio.setup_page')) else: return make_response(jsonify(output), 200)
def setup_page(): """ Setup labeling config """ input_values = {} project = g.project input_args = current_app.label_studio.input_args g.project.description = project.get_config(project.name, input_args).get( 'description', 'Untitled') # evaluate all projects for this user: user_projects + shared_projects if project.config.get("show_project_links_in_multisession", True) and hasattr(g, 'user'): user = g.user project_ids = g.project.get_user_projects(user, input_args.root_dir) # own projects project_names = [os.path.join(user, uuid) for uuid in project_ids] project_desc = [ Project.get_config(name, input_args).get('description', 'Untitled') for name in project_names ] own_projects = dict(zip(project_ids, project_desc)) # shared projects shared_projects = {} for uuid in session.get('shared_projects', []): tmp_user = Project.get_user_by_project(uuid, input_args.root_dir) project_name = os.path.join(tmp_user, uuid) project_desc = Project.get_config(project_name, input_args).get( 'description', 'Untitled') shared_projects[uuid] = project_desc else: own_projects, shared_projects = {}, {} # this is useful for the transfer to playground templates template_mode = request.args.get('template_mode') page = 'includes/setup_templates.html' if template_mode else 'setup.html' templates = get_config_templates(g.project.config) return flask.render_template( page, config=g.project.config, project=g.project, label_config_full=g.project.label_config_full, templates=templates, input_values=input_values, multi_session=input_args.command == 'start-multi-session', own_projects=own_projects, shared_projects=shared_projects, template_mode=template_mode, serialized_project=g.project.serialize())
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})
def setup_page(): """ Setup label config """ input_values = {} project = g.project g.project.description = project.get_config(project.name, input_args).get( 'description', 'Untitled') # evaluate all projects for this user: user_projects + shared_projects if project.config.get("show_project_links_in_multisession", True) and hasattr(g, 'user'): user = g.user project_ids = g.project.get_user_projects(user, input_args.root_dir) # own projects project_names = [os.path.join(user, uuid) for uuid in project_ids] project_desc = [ Project.get_config(name, input_args).get('description', 'Untitled') for name in project_names ] own_projects = dict(zip(project_ids, project_desc)) # shared projects shared_projects = {} for uuid in session.get('shared_projects', []): tmp_user = Project.get_user_by_project(uuid, input_args.root_dir) project_name = os.path.join(tmp_user, uuid) project_desc = Project.get_config(project_name, input_args).get( 'description', 'Untitled') shared_projects[uuid] = project_desc else: own_projects, shared_projects = {}, {} templates = get_config_templates(g.project.config) return flask.render_template( 'setup.html', config=g.project.config, project=g.project, label_config_full=g.project.label_config_full, templates=templates, input_values=input_values, multi_session=input_args.command == 'start-multi-session', own_projects=own_projects, shared_projects=shared_projects)