Forum OpenACS Development: fs::copy_folder

Collapse
3: fs::copy_folder (response to 1)
Posted by Malte Sussdorff on
ad_proc fs::copy_folder {
    -source_folder_id
    -destination_folder_id
} {
    @author Malte Sussdorff (mailto:malte.sussdorff@cognovis.de)
    @creation-date 2010-09-24

    Copies the folder to another parent folder
    Makes sure to copy the permissions as well

    @param destination_folder_id Folder ID of the destination folder below which the folder will be copied
    @param source_folder_id Folder ID of the folder to be copied
} {
    set user_id [ad_conn user_id]
    set peer_addr [ad_conn peeraddr]

    # Make sure we have write permission on the destination folder                                                                                                     
    permission::require_permission \
        -party_id $user_id \
        -object_id $destination_folder_id \
        -privilege "write"

    permission::require_permission \
        -party_id $user_id \
        -object_id $source_folder_id \
        -privilege "read"

    # Make sure both are actually folders                                                                                                                              
    if {![content::folder::is_folder -item_id $source_folder_id] || ![content::folder::is_folder -item_id $destination_folder_id]} {
        return 0
    }

    set new_parent_folder_id [db_string copy_folder {}]

    db_foreach folder_compare {
        select source.item_id as old_folder_id, target.item_id as new_folder_id, security_inherit_p
        from (select children.item_id, children.name, security_inherit_p
              from cr_items children, cr_items parent, acs_objects o
              where children.tree_sortkey between parent.tree_sortkey and tree_right(parent.tree_sortkey)
              and parent.tree_sortkey <> children.tree_sortkey
              and parent.item_id = :source_folder_id
              and children.item_id = o.object_id
              order by children.tree_sortkey) source,
        (select children.item_id, children.name
         from cr_items children, cr_items parent
         where children.tree_sortkey between parent.tree_sortkey and tree_right(parent.tree_sortkey)
         and parent.tree_sortkey <> children.tree_sortkey
         and parent.item_id = :new_parent_folder_id
         order by children.tree_sortkey) target
        where source.name = target.name
    } {
        if {$security_inherit_p eq "t"} {
            permission::copy -from_object_id $old_folder_id -to_object_id $new_folder_id -overwrite
        } else {
            permission::copy -from_object_id $old_folder_id -to_object_id $new_folder_id -overwrite -clean_inheritance
        }
    }

    if {[permission::inherit_p -object_id $source_folder_id]} {
        permission::copy -from_object_id [content::item::get_parent_folder -item_id $source_folder_id] -to_object_id $new_parent_folder_id -clean_inheritance -overwrite
    } else {
        permission::copy -from_object_id $source_folder_id -to_object_id $new_parent_folder_id -clean_inheritance -overwrite
    }
}