Index: openacs-4/packages/scorm-importer/catalog/scorm-importer.en_US.ISO-8859-1.xml =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/scorm-importer/catalog/scorm-importer.en_US.ISO-8859-1.xml,v diff -u -r1.1 -r1.2 --- openacs-4/packages/scorm-importer/catalog/scorm-importer.en_US.ISO-8859-1.xml 13 May 2010 01:03:47 -0000 1.1 +++ openacs-4/packages/scorm-importer/catalog/scorm-importer.en_US.ISO-8859-1.xml 18 May 2010 02:00:23 -0000 1.2 @@ -6,6 +6,7 @@ Import failed No Normal +The course is not a SCORM 2004 package. Online Select SCORM 2004 course to upload The uploaded file does not exist. Index: openacs-4/packages/scorm-importer/embed/admin/import-2.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/scorm-importer/embed/admin/import-2.tcl,v diff -u -r1.2 -r1.3 --- openacs-4/packages/scorm-importer/embed/admin/import-2.tcl 14 May 2010 16:59:29 -0000 1.2 +++ openacs-4/packages/scorm-importer/embed/admin/import-2.tcl 18 May 2010 02:00:23 -0000 1.3 @@ -33,19 +33,14 @@ ad_script_abort } -scorm_importer::import \ +if { [catch {scorm_importer::import \ -package_id [ad_conn package_id] \ -tmp_dir $tmp_dir \ -online $online \ - -default_lesson_mode $default_lesson_mode -#if { [catch {scorm_importer::import \ -# -package_id [ad_conn package_id] \ -# -tmp_dir $tmp_dir \ -# -online $online \ -# -default_lesson_mode $default_lesson_mode} errMsg] } { -# ad_return_complaint 1 "[_ scorm-importer.Import_failed]: $errMsg" -# ad_script_abort -#} + -default_lesson_mode $default_lesson_mode} errMsg] } { + ad_return_complaint 1 "[_ scorm-importer.Import_failed]: $errMsg" + ad_script_abort +} file delete -force $tmp_dir Index: openacs-4/packages/scorm-importer/tcl/import-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/scorm-importer/tcl/import-procs.tcl,v diff -u -r1.3 -r1.4 --- openacs-4/packages/scorm-importer/tcl/import-procs.tcl 14 May 2010 23:30:31 -0000 1.3 +++ openacs-4/packages/scorm-importer/tcl/import-procs.tcl 18 May 2010 02:00:23 -0000 1.4 @@ -5,7 +5,7 @@ namespace eval scorm_importer { } -ad_proc -public scorm_importer::create_course { +ad_proc scorm_importer::create_course { -package_id:required -manifest:required -folder_id:required @@ -16,24 +16,19 @@ Create a Scorm course skeleton based on a parsed manifest. } { - # build activity tree before we transform the document - array set adl_info \ - [scorm_importer::rte_activity_tree::create -manifest [$manifest documentElement]] + # Version check. At the moment, it's scorm 2004 or or else it's an error. + set metadata [[$manifest documentElement] child 1 metadata] + set schemaversion [$metadata child 1 schemaversion] + if { $schemaversion eq "" || + [string trim [string tolower [$schemaversion nodeValue]]] eq "adl scorm" && + [string trim [string tolower [$schemaversion nodeValue]]] eq "2004 3rd edition" } { + return -code error [_ scorm-importer.NotSCORM2004] + } - set activity_tree $adl_info(activity_tree) - set global_to_system [expr { [string is true $adl_info(global)] ? "t" : "f" }] + set transform [scorm_importer::transform -manifest $manifest] + set transform_doc [$transform documentElement] - # Ilias saves the transformed document in XML. We will store the original in order - # to facilitate course export. - set xmldata [$manifest asXML] - - # transform scorm xml using ilias's normalizing xsl - set xsl_src "[acs_root_dir]/packages/scorm-importer/templates/xsl/op/op-scorm13.xsl" - dom parse [::tDOM::xmlReadFile $xsl_src] transform - $manifest xslt $transform manifest - set document_element [$manifest documentElement] - - set organization_node [$document_element child all organization] + set organization_node [$transform_doc child all organization] set title [$organization_node getAttribute title ""] set var_list [subst { @@ -50,22 +45,69 @@ # create row for package even though we don't have any info yet db_dml insert_package {} - import_node -cp_package_id $scorm_course_id -node $document_element + scorm_importer::update_rte_data \ + -scorm_course_id $scorm_course_id \ + -manifest $manifest \ + -transform_doc $transform_doc - set jsdata [scorm_importer::rte_jsdata::create -manifest $document_element] + $transform delete +} - db_dml update_package {} +ad_proc scorm_importer::edit_course { + -manifest:required + -scorm_course_id:required +} { + Edit the course information. +} { + set transform [scorm_importer::transform -manifest $manifest] + + scorm_importer::update_rte_data \ + -scorm_course_id $scorm_course_id \ + -manifest $manifest \ + -transform_doc [$transform documentElement] + $transform delete - $manifest delete +} +ad_proc scorm_importer::update_rte_data { + -scorm_course_id:required + -manifest:required + -transform_doc:required +} { + Update the RTE data - activity tree, jsdata, xmldata +} { + # build activity tree with the original document. + array set adl_info \ + [scorm_importer::rte_activity_tree::create -manifest [$manifest documentElement]] + + set activity_tree $adl_info(activity_tree) + set global_to_system [expr { [string is true $adl_info(global)] ? "t" : "f" }] + + import_node -cp_package_id $scorm_course_id -node $transform_doc + set xmldata [$transform_doc asXML] + + set jsdata [scorm_importer::rte_jsdata::create -manifest $transform_doc] + + db_dml update_package {} + } -ad_proc scorm_importer::create_subfolder { +ad_proc scorm_importer::transform { + -manifest:required +} { + Transfrom the manifest using ilias's normalizing xsl. +} { + set xsl_src "[acs_root_dir]/packages/scorm-importer/templates/xsl/op/op-scorm13.xsl" + return [$manifest xslt [dom parse [::tDOM::xmlReadFile $xsl_src]]] +} + +ad_proc scorm_importer::create_folder { -name:required -parent_id:required -package_id:required } { + Create a subr (or main) for a class with the necessary } { set folder_id [content::folder::new \ -name $name \ @@ -85,7 +127,7 @@ return $folder_id } -ad_proc -public scorm_importer::import { +ad_proc scorm_importer::import { -tmp_dir:required -package_id:required {-online f} @@ -106,7 +148,7 @@ regsub -all { +} $cr_dir {_} name set parent_folder_id [scorm_core::default_folder_id -package_id $package_id] - set folder_id [scorm_importer::create_subfolder \ + set folder_id [scorm_importer::create_folder \ -name $name \ -parent_id $parent_folder_id \ -package_id $package_id] @@ -118,6 +160,7 @@ -manifest $manifest \ -online $online \ -default_lesson_mode $default_lesson_mode] + $manifest delete # Copy the files into the course folder in the content repository. @@ -128,17 +171,20 @@ } +# This needs to be fixed to skip nodes that already exist, by selecting a unique node +# for the package using the attributes ... ad_proc scorm_importer::import_node { {-node:required} {-cp_package_id:required} {-depth 1} {-parent 0} } { - Import given node + Import a node and its children. + } { set nodename [$node nodeName] - + # create the node set cp_node_id [db_nextval cp_node_seq] set rgt $cp_node_id @@ -158,10 +204,11 @@ # [lassign $a name namespace uri] - # however, the uri may be empty and the name and namespace equal. In that case, the attribute appears - # to be a definition of the uri for the namespace given by $name, although the uri thus defined is not - # returned in the uri field, the uri-defining attribute is named as if it were $ns:$ns. Finally, the - # {xmlns {} {}} form appears to be special, and to indicate that the xmlns namespace's uri is being defined. + # however, the uri may be empty and the name and namespace equal. In that case, the + # attribute appears to be a definition of the uri for the namespace given by $name, + # although the uri thus defined is not returned in the uri field, the uri-defining + #attribute is named as if it were $ns:$ns. Finally, the {xmlns {} {}} form appears + #to be special, and to indicate that the xmlns namespace's uri is being defined. # build up generic attribute list for insertion foreach attribute [$node attributes] { @@ -195,7 +242,6 @@ -depth [expr $depth + 1] -parent $cp_node_id] } - # update cp_tree db_dml update_rgt {} return $rgt @@ -206,14 +252,13 @@ -folder_id:required -package_id:required } { - foreach file_name [glob -directory $dir *] { set cr_file_name [file tail $file_name] if { [file isdirectory $file_name] } { scorm_importer::import_files \ -dir $file_name \ -package_id $package_id \ - -folder_id [scorm_importer::create_subfolder \ + -folder_id [scorm_importer::create_folder \ -name $cr_file_name \ -parent_id $folder_id \ -package_id $package_id] Index: openacs-4/packages/scorm-importer/tcl/import-procs.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/scorm-importer/tcl/Attic/import-procs.xql,v diff -u -r1.3 -r1.4 --- openacs-4/packages/scorm-importer/tcl/import-procs.xql 14 May 2010 23:30:31 -0000 1.3 +++ openacs-4/packages/scorm-importer/tcl/import-procs.xql 18 May 2010 02:00:23 -0000 1.4 @@ -4,51 +4,56 @@ - insert into cp_package (cp_package_id) values (:scorm_course_id) + insert into cp_package + (cp_package_id) + values + (:scorm_course_id) - + update cp_package - set jsdata = :jsdata, - xmldata = :xmldata, - activitytree = :activity_tree, - global_to_system = :global_to_system - where cp_package_id = :scorm_course_id + set jsdata = :jsdata, + xmldata = :xmldata, + activitytree = :activity_tree, + global_to_system = :global_to_system + where cp_package_id = :scorm_course_id insert into cp_node - (cp_node_id, nodename, cp_package_id) + (cp_node_id, nodename, cp_package_id) values - (:cp_node_id, :nodename, :cp_package_id) + (:cp_node_id, :nodename, :cp_package_id) insert into cp_tree - (child, depth, cp_package_id, parent, rgt) + (child, depth, cp_package_id, parent, rgt) values - (:cp_node_id, :depth, :cp_package_id, :parent, '0') + (:cp_node_id, :depth, :cp_package_id, :parent, '0') insert into cp_[string tolower ${nodename}] - ([join $attributes ", "]) + ([join $attributes ", "]) values - (:[join $attributes ", :"]) + (:[join $attributes ", :"]) - update cp_tree set rgt = :rgt where child = :cp_node_id + update cp_tree + set rgt = :rgt + where child = :cp_node_id