Index: openacs-4/packages/imsld/www/admin/imsld-export-xo.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/imsld/www/admin/imsld-export-xo.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/imsld/www/admin/imsld-export-xo.tcl 23 Jun 2009 17:22:32 -0000 1.1 @@ -0,0 +1,153 @@ +ad_page_contract { + Export Uol stored in xowiki + + @author cvalencia@inv.it.uc3m.es + @creation-date Mayo 2009 +} { + imsld_id:integer +} + +#Check if the user who attemps to enter the page has admin priviledges +set package_id [ad_conn package_id] +set admin_p [permission::permission_p -object_id $package_id \ + -privilege admin] + +#Delete all files in tmp +exec rm -fr [acs_package_root_dir imsld]/www/tmp/ + +#Get UoL name +db_1row get_imsld_identifier {select title from cr_revisions where revision_id = :imsld_id} +if {$title == ""} { + set uol_name "exported_uol" +} else { + set uol_name $title +} + +#Zip file name +if {$uol_name != ""} { + set download_name "${uol_name}.zip" +} else { + set download_name "exported_UoL.zip" +} +regsub -all { } $download_name {_} download_name + +#We need the manifest_id +db_1row get_manifest {select manifest_id from imsld_cp_organizations, cr_items cr1 where organization_id = cr1.latest_revision and cr1.item_id = imsld_imslds.organization_id and imsld_imslds.imsld_id = :imsld_id} + + +################################### +# Parse xowiki pages to get files # +################################### + +#Create tmp directory if it doesn't exist +if {[file isdirectory [acs_package_root_dir imsld]/www/tmp] == 0} { + exec mkdir [acs_package_root_dir imsld]/www/tmp +} + +#Create new temporal directory to store output +set in_path [ns_tmpnam] +set path [acs_package_root_dir imsld]/www$in_path +exec mkdir $path + +#Declare list to store aditional resources +set resource_list [list] + +set last_file "" +db_multirow get_xowiki_pages get_xowiki_pages {select cr3.name, cr3.item_id, cr3.content_type from acs_rels, cr_items cr1, cr_items cr2, cr_items cr3 where object_id_one = cr1.item_id and imsld_cp_resources.resource_id = cr1.latest_revision and imsld_cp_resources.manifest_id = :manifest_id and object_id_two = cr3.item_id and (cr3.content_type = '::xowiki::File' or cr3.content_type = '::xowiki::Page')} { + #Avoid repiting rows + if {$last_file == $name} {continue} else { + set last_file $name + } + + #Don't know what to do with links yet + if {[string first "link" $name] == 0} {continue} + + if {$content_type == "::xowiki::Page"} { + #Get resource href + set resource_href [string range $name [expr [string first "/" $name]+1] [expr [string last "/" $name]]] +########################################## + db_1row get_page_name {select title from acs_objects where object_id=:item_id} + + set page_title [string map {"%2f" "/"} $title] + set page_name [string range $page_title [expr [string last "/" $page_title]+1] end] + + #Change : for _ in case language is specified in name + regsub -all {:} $page_name {_} page_name + if {[string first "." $page_name] == -1} { + set page_name ${page_name}.html + } + set resource_href ${resource_href}$page_name +# db_1row get_page_name {select title from acs_objects where object_id=:xo_page_id} +########################################## + set resource_files_list [imsld::export::files::modify_links -manifest_id $manifest_id -xo_page_id $item_id -path $path] + #Store new files with href of associated resource in the resource_list + if {[llength $resource_files_list] > 0} { + lappend resource_list $resource_href $resource_files_list + } + } elseif {$content_type == "::xowiki::File"} { + #Create new directories if necessary (from subdirectory path) + file mkdir $path[string range $name [string first "/" $name] [string last "/" $name]] + if {[db_0or1row get_file_id {select object_id from acs_objects where title=:name and object_type='::xowiki::File' and context_id=:item_id}] == 1} { + #Get file and copy it to export folder + set data [fs__datasource $object_id] + #Get url of folder to copy file + set url [lindex $data [expr [lsearch $data content]+1]] + #Get file name from xowiki file identifier + set file_name [string range $name [expr [string first "/" $name]+1] end] + #Copy file + file copy -force $url "$path/$file_name" + } + } +} + + +########################## +# Create imsmanifest.xml # +########################## + +#Open a new file to write imsmanifest.xml +set manifest [open "${path}/imsmanifest.xml" w] + +#Write manifest document +set information [imsld::export::uol -run_imsld_id $imsld_id -resource_list $resource_list] + +#Write manifest file +puts $manifest "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +puts $manifest $information + +#Close imsmanifest.xml file +close $manifest + + + +################### +# Create zip file # +################### + +#Create output file +set out_file [file join ${path} ${download_name}] + +#Create zip archive +set cmd "zip -r '$out_file' *" +set copy "cp ${path}/imsmanifest.xml ./imsmanifest.xml" +with_catch errmsg { + exec bash -c "cd '$path'; $cmd; cd -" +} { + error $errmsg +} + +########################################################################## +########################################################################## +##Return file download url +if {[string index $in_path 0] ne "/"} { + ad_returnredirect "../${in_path}/${download_name}" +} else { + ad_returnredirect "..${in_path}/${download_name}" +} +#set a [ns_http list] +#ns_returnredirect "${in_path}/${download_name}" +#ad_returnredirect "export_down" +#Remove temporary files and folder +#exec rm -fr $path +########################################################################## +##########################################################################