def _scan_workspace_dir(ws_path, ws): """ Scan a workspace directory Scans the workspace directory for any projects. Will visit every one to add new functions and services via scan_project_dir :param ws_path: the workspaces path to scan :param ws: the current workspace from the database to attach the projects to """ from son_editor.models.project import Project session = db_session() # Scan private catalogue in workspace _scan_private_catalogue(ws_path + "/catalogues", ws) for project_name in os.listdir(os.path.join(ws_path, "projects")): if not Path(os.path.join(ws_path, "projects", project_name)).is_dir(): continue pj = session.query(Project). \ filter(Project.name == project_name). \ filter(Project.workspace == ws).first() if pj is None: logger.info("Found project in Workspace {}: {}".format(ws_path, project_name)) pj = Project(project_name, project_name, ws) sync_project_descriptor(pj) session.add(pj) session.commit() scan_project_dir(os.path.join(ws_path, "projects", project_name), pj)
def update_project(project_data, project_id): """ Update the Project :param project_data: The project Data :param project_id: The project ID to update :return: The updated project descriptor """ session = db_session() project = session.query(Project).filter(Project.id == project_id).first() if project is None: raise NotFound("Project with id {} could not be found".format(project_id)) # Update name if 'name' in project_data and project_data['name'] != project.name: if os.path.exists(get_project_path(project.workspace.path, project.rel_path)): new_name = shlex.quote(project_data['name']) old_path = get_project_path(project.workspace.path, project.rel_path) new_path = rreplace(old_path, project.name, new_name, 1) if os.path.exists(new_path): raise NameConflict("Invalid name parameter, workspace '{}' already exists".format(new_name)) # Do not allow move directories outside of the workspaces_dir if not new_path.startswith(WORKSPACES_DIR): raise Exception("Invalid path parameter, you are not allowed to break out of {}".format(WORKSPACES_DIR)) else: # Move the directory shutil.move(old_path, new_path) project.name = new_name project.rel_path = new_name set_data(project, project_data) sync_project_descriptor(project) db_session.commit() return project.as_dict()
def _scan_workspace_dir(ws_path, ws): """ Scan a workspace directory Scans the workspace directory for any projects. Will visit every one to add new functions and services via scan_project_dir :param ws_path: the workspaces path to scan :param ws: the current workspace from the database to attach the projects to """ from son_editor.models.project import Project session = db_session() # Scan private catalogue in workspace _scan_private_catalogue(ws_path + "/catalogues", ws) for project_name in os.listdir(os.path.join(ws_path, "projects")): if not Path(os.path.join(ws_path, "projects", project_name)).is_dir(): continue pj = session.query(Project). \ filter(Project.name == project_name). \ filter(Project.workspace == ws).first() if pj is None: logger.info("Found project in Workspace {}: {}".format( ws_path, project_name)) pj = Project(project_name, project_name, ws) sync_project_descriptor(pj) session.add(pj) session.commit() scan_project_dir(os.path.join(ws_path, "projects", project_name), pj)
def update_project(project_data, project_id): """ Update the Project :param project_data: :param project_id: :return: """ session = db_session() project = session.query(Project).filter(Project.id == project_id).first() if project is None: raise NotFound("Project with id {} could not be found".format(project_id)) # Update name if 'name' in project_data and project_data['name'] != project.name: if os.path.exists(get_project_path(project.workspace.path, project.rel_path)): new_name = shlex.quote(project_data['name']) old_path = get_project_path(project.workspace.path, project.rel_path) new_path = rreplace(old_path, project.name, new_name, 1) if os.path.exists(new_path): raise NameConflict("Invalid name parameter, workspace '{}' already exists".format(new_name)) # Do not allow move directories outside of the workspaces_dir if not new_path.startswith(WORKSPACES_DIR): raise Exception("Invalid path parameter, you are not allowed to break out of {}".format(WORKSPACES_DIR)) else: # Move the directory shutil.move(old_path, new_path) project.name = new_name project.rel_path = new_name set_data(project, project_data) sync_project_descriptor(project) db_session.commit() return project.as_dict()
def _scan_workspace_dir(ws_path, ws): from son_editor.models.project import Project session = db_session() # Scan private catalogue in workspace _scan_private_catalogue(ws_path + "/catalogues", ws) for project_name in os.listdir(os.path.join(ws_path, "projects")): if not Path(os.path.join(ws_path, "projects", project_name)).is_dir(): continue pj = session.query(Project). \ filter(Project.name == project_name). \ filter(Project.workspace == ws).first() if pj is None: logger.info("Found project in Workspace {}: {}".format(ws_path, project_name)) pj = Project(project_name, project_name, ws) sync_project_descriptor(pj) session.add(pj) session.commit() scan_project_dir(os.path.join(ws_path, "projects", project_name), pj)
def _scan_workspace_dir(ws_path, ws): from son_editor.models.project import Project session = db_session() # Scan private catalogue in workspace _scan_private_catalogue(ws_path + "/catalogues", ws) for project_name in os.listdir(os.path.join(ws_path, "projects")): if not Path(os.path.join(ws_path, "projects", project_name)).is_dir(): continue pj = session.query(Project). \ filter(Project.name == project_name). \ filter(Project.workspace == ws).first() if pj is None: logger.info("Found project in Workspace {}: {}".format( ws_path, project_name)) pj = Project(project_name, project_name, ws) sync_project_descriptor(pj) session.add(pj) session.commit() scan_project_dir(os.path.join(ws_path, "projects", project_name), pj)
def create_project(ws_id: int, project_data: dict) -> dict: """ Create a new Project in this workspace :param ws_id: The workpace ID :param project_data: The project data to create :return: The new project descriptor as a dict """ project_name = shlex.quote(project_data["name"]) repo = None if "repo" in project_data: repo = project_data["repo"] if repo: return gitimpl.clone(ws_id, repo, project_name) session = db_session() # test if ws Name exists in database workspace = session.query(Workspace). \ filter(Workspace.id == ws_id).first() if workspace is None: raise NotFound("No workspace with id {} was found".format(ws_id)) existing_projects = list(session.query(Project) .filter(Project.workspace == workspace) .filter(Project.name == project_name)) if len(existing_projects) > 0: raise NameConflict("Project with name '{}' already exists in this workspace".format(project_name)) # prepare db insert try: project = Project(name=project_name, rel_path=project_name, workspace=workspace) set_data(project, project_data) session.add(project) except: session.rollback() raise # create workspace on disk proc = Popen(['son-workspace', '--workspace', workspace.path, '--project', get_project_path(workspace.path, project_name)], stdout=PIPE, stderr=PIPE) out, err = proc.communicate() exitcode = proc.returncode if err.decode().find('exists') >= 0: project_exists = True else: project_exists = False if exitcode == 0 and not project_exists: sync_project_descriptor(project) session.commit() scan_project_dir(get_project_path(workspace.path, project_name), project) return project.as_dict() else: session.rollback() if project_exists: raise NameConflict("Project with name '{}' already exists in this workspace".format(project_name)) raise Exception(err.decode(), out.decode())
def create_project(ws_id: int, project_data: dict) -> dict: """ Create a new Project in this workspace :param ws_id: :param project_data: :return: The new project descriptor as a dict """ project_name = shlex.quote(project_data["name"]) repo = None if "repo" in project_data: repo = project_data["repo"] if repo: return gitimpl.clone(ws_id, repo, project_name) session = db_session() # test if ws Name exists in database workspace = session.query(Workspace). \ filter(Workspace.id == ws_id).first() if workspace is None: raise NotFound("No workspace with id {} was found".format(ws_id)) existing_projects = list(session.query(Project) .filter(Project.workspace == workspace) .filter(Project.name == project_name)) if len(existing_projects) > 0: raise NameConflict("Project with name '{}' already exists in this workspace".format(project_name)) # prepare db insert try: project = Project(name=project_name, rel_path=project_name, workspace=workspace) set_data(project, project_data) session.add(project) except: session.rollback() raise # create workspace on disk proc = Popen(['son-workspace', '--workspace', workspace.path, '--project', get_project_path(workspace.path, project_name)], stdout=PIPE, stderr=PIPE) out, err = proc.communicate() exitcode = proc.returncode if err.decode().find('exists') >= 0: project_exists = True else: project_exists = False if exitcode == 0 and not project_exists: sync_project_descriptor(project) session.commit() scan_project_dir(get_project_path(workspace.path, project_name), project) return project.as_dict() else: session.rollback() if project_exists: raise NameConflict("Project with name '{}' already exists in this workspace".format(project_name)) raise Exception(err.decode(), out.decode())