pgcontents/query.py
def rename_directory(db, user_id, old_api_path, new_api_path):
    """
    Rename a directory.
    """
    old_db_path = from_api_dirname(old_api_path)
    new_db_path = from_api_dirname(new_api_path)

    if old_db_path == '/':
        raise RenameRoot('Renaming the root directory is not permitted.')

    # Overwriting existing directories is disallowed.
    if _dir_exists(db, user_id, new_db_path):
        raise DirectoryExists(new_api_path)

    # Set this foreign key constraint to deferred so it's not violated
    # when we run the first statement to update the name of the directory.
    db.execute('SET CONSTRAINTS '
               'pgcontents.directories_parent_user_id_fkey DEFERRED')

    # Update name column for the directory that's being renamed
    db.execute(
        directories.update().where(
            and_(
                directories.c.user_id == user_id,
                directories.c.name == old_db_path,
            )
        ).values(
            name=new_db_path,
        )
    )

    # Update the name and parent_name of any descendant directories.  Do
    # this in a single statement so the non-deferrable check constraint
    # is satisfied.
    db.execute(
        directories.update().where(
            and_(
                directories.c.user_id == user_id,
                directories.c.name.startswith(old_db_path),
                directories.c.parent_name.startswith(old_db_path),
            )
        ).values(
            name=func.concat(
                new_db_path,
                func.right(directories.c.name, -func.length(old_db_path))
            ),
            parent_name=func.concat(
                new_db_path,
                func.right(
                    directories.c.parent_name,
                    -func.length(old_db_path)
                )
            ),
        )
    )
def rename_directory(db, user_id, old_api_path, new_api_path):
    old_db_path = from_api_dirname(old_api_path)
    new_db_path = from_api_dirname(new_api_path)

    if old_db_path == '/':
        raise RenameRoot('Renaming the root directory is not permitted.')

    # Overwriting existing directories is disallowed.
    if _dir_exists(db, user_id, new_db_path):
        raise DirectoryExists(new_api_path)

    # Set this foreign key constraint to deferred so it's not violated
    # when we run the first statement to update the name of the directory.
    db.execute('SET CONSTRAINTS '
               'pgcontents.directories_parent_user_id_fkey DEFERRED')

    # Update name column for the directory that's being renamed
    db.execute(
        directories.update().where(
            and_(
                directories.c.user_id == user_id,
                directories.c.name == old_db_path,
            )
        ).values(
            name=new_db_path,
        )
    )

    # Update the name and parent_name of any descendant directories.  Do
    # this in a single statement so the non-deferrable check constraint
    # is satisfied.
    db.execute(
        directories.update().where(
            and_(
                directories.c.user_id == user_id,
                directories.c.name.startswith(old_db_path),
                directories.c.parent_name.startswith(old_db_path),
            )
        ).values(
            name=func.concat(
                new_db_path,
                func.right(directories.c.name, -func.length(old_db_path))
            ),
            parent_name=func.concat(
                new_db_path,
                func.right(
                    directories.c.parent_name,
                    -func.length(old_db_path)
                )
            ),
        )
    )
def rename_directory ( db , user_id , old_api_path , new_api_path ) : old_db_path = from_api_dirname ( old_api_path ) new_db_path = from_api_dirname ( new_api_path ) if old_db_path == '/' : raise RenameRoot ( 'Renaming the root directory is not permitted.' ) # Overwriting existing directories is disallowed. if _dir_exists ( db , user_id , new_db_path ) : raise DirectoryExists ( new_api_path ) # Set this foreign key constraint to deferred so it's not violated # when we run the first statement to update the name of the directory. db . execute ( 'SET CONSTRAINTS ' 'pgcontents.directories_parent_user_id_fkey DEFERRED' ) # Update name column for the directory that's being renamed db . execute ( directories . update ( ) . where ( and_ ( directories . c . user_id == user_id , directories . c . name == old_db_path , ) ) . values ( name = new_db_path , ) ) # Update the name and parent_name of any descendant directories.  Do # this in a single statement so the non-deferrable check constraint # is satisfied. db . execute ( directories . update ( ) . where ( and_ ( directories . c . user_id == user_id , directories . c . name . startswith ( old_db_path ) , directories . c . parent_name . startswith ( old_db_path ) , ) ) . values ( name = func . concat ( new_db_path , func . right ( directories . c . name , - func . length ( old_db_path ) ) ) , parent_name = func . concat ( new_db_path , func . right ( directories . c . parent_name , - func . length ( old_db_path ) ) ) , ) )
Rename a directory.
Rename a directory .