Index: openacs-4/packages/lorsm/lorsm.info =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/lorsm.info,v diff -u -r1.12 -r1.13 --- openacs-4/packages/lorsm/lorsm.info 17 May 2007 12:24:54 -0000 1.12 +++ openacs-4/packages/lorsm/lorsm.info 13 Aug 2007 09:20:14 -0000 1.13 @@ -7,13 +7,13 @@ f f - + Ernie Ghiglione Application to manage the services from the Learning Object Repository. - 2005-05-26 + 2007-07-17 This application manages the services from the Learning Object Repository: upload courses, manage and create metadata, delete resources and courses. - + Index: openacs-4/packages/lorsm/lib/user-lorsm.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/lib/user-lorsm.tcl,v diff -u -r1.18 -r1.19 --- openacs-4/packages/lorsm/lib/user-lorsm.tcl 19 Apr 2007 19:44:22 -0000 1.18 +++ openacs-4/packages/lorsm/lib/user-lorsm.tcl 13 Aug 2007 09:20:14 -0000 1.19 @@ -20,6 +20,7 @@ set lors_central_package_id [apm_package_id_from_key "lors-central"] set lors_central_url [apm_package_url_from_id $lors_central_package_id] + set elements_list { course_name { label "[_ lorsm.Course_Name_1]" @@ -36,26 +37,45 @@ } html { width 70% } } +} + +if { [empty_string_p $community_id] } { + append elements_list { subject { label "[_ lorsm.Subject]" display_eval {[dotlrn_community::get_community_name $community_id]} html { align center width 20% } link_url_eval {[dotlrn_community::get_community_url $community_id]} link_html {title "[_ lorsm.Access_Course]"} } + } +} + +append elements_list { last_viewed { label "[_ lorsm.Last_Viewed_On]" html { align center width 10% } display_eval {[lc_time_fmt $last_viewed "%x"]} } + viewed_percent { label "[_ lorsm._Viewed]" html { align right } display_eval {[lc_numeric $viewed_percent "%.2f"]} } + + lesson_status { + label "Completed" + html { align center } + display_template { + @d_courses.lesson_status;noquote@ + } + } } +#label "[_ lorsm._CourseStatus]" + if { ![string equal $lors_central_package_id 0] && ![empty_string_p $community_id] } { if { [lors_central::check_inst -user_id $user_id -community_id $community_id] } { append elements_list " @@ -88,32 +108,36 @@ if {![empty_string_p $community_id]} { set extra_query "and cpmc.community_id = :community_id" } + foreach package $package_id { - db_multirow -extend { admin_p item_id ims_md_id last_viewed total_item_count viewed_item_count viewed_percent course_url } -append d_courses select_d_courses { } { + db_multirow -extend { admin_p item_id ims_md_id last_viewed total_item_count viewed_item_count viewed_percent course_url lesson_status } -append d_courses select_d_courses { } { set ims_md_id $man_id + if { [string eq $format_name "default"] } { # micheles set context [site_node::get_url_from_object_id -object_id $lorsm_instance_id] if ([db_0or1row query " select - cpr.man_id, - cpr.res_id, + cp.man_id, case when upper(scorm_type) = 'SCO' then 'delivery-scorm' else 'delivery' end as needscorte from - ims_cp_resources cpr + ims_cp_manifests cp left join (select man_id, max(scorm_type) as scorm_type from ims_cp_resources group by man_id ) as cpr using (man_id) where - cpr.man_id = :man_id - order by cpr.scorm_type desc limit 1" + cp.man_id = :man_id " ]) { - ns_log Debug "lorsm - $needscorte" set delivery_method delivery - set course_url_url [export_vars -base "[lindex $context 0]$delivery_method" -url {man_id}] + set course_url_url [export_vars -base "[lindex $context 0]$delivery_method/" -url {man_id}] + #this popup shouldn't affect delivery should popup blocker be in place + if { [string eq $needscorte "delivery-scorm"] } { + set course_url "> $course_name" + } else { set course_url "$course_name" + } ns_log Debug "lorsm - course_url: $course_url" } else { set course_url "NO RESOURCES ERROR" @@ -122,8 +146,78 @@ set course_url "$course_name" } + #LET's CHECK IF delivery is RTE, so there should be some tracking. + #the code, differentely than above, check the delivery method as per above + + # Get the course name + if {[db_0or1row manifest " + select + cp.course_name, + cp.fs_package_id, + isscorm, + pf.folder_name, + pf.format_name, + case + when upper(scorm_type) = 'SCO' then 'delivery-scorm' + else 'delivery' + end as deliverymethod + from + ims_cp_manifests cp left join (select man_id, max(scorm_type) as scorm_type from ims_cp_resources group by man_id ) as cpr using (man_id) , + lorsm_course_presentation_formats pf + where + cp.man_id = :man_id + and cp.parent_man_id = 0 + and cp.course_presentation_format = pf.format_id "]} { + # Course Name + if {[empty_string_p $course_name]} { + set course_name "No Course Name" + } + } else { + set course_name "No Course Name" + } + + set lesson_status "N/A" + + if { [string equal $deliverymethod "delivery-scorm"] } { + set icon "" + if { ! [ db_0or1row isanysuspendedsession "select lorsm.track_id as track_id, + cmi.lesson_status as lesson_status from + lorsm_student_track lorsm, lorsm_cmi_core cmi + where + lorsm.user_id = $user_id + and + lorsm.community_id = $community_id + and + lorsm.course_id = $man_id + and + lorsm.track_id = cmi.track_id + and + cmi.man_id = $man_id + and + cmi.item_id = $man_id + order by + lorsm.track_id desc + limit 1" ] } { + #item has no track for the user + #the icon should be the same as per "not yet visited" + append icon "\"Not" + } else { + switch -regexp $lesson_status { + null { append icon "\"Not" } + incomplete { append icon "\"Incomplete\"" } + complete { append icon "\"Completed\"" } + failed { append icon "\"Failed\"" } + "not attempted" { append icon "\"Not" } + passed { append icon "\"Passed\"" } + default { append icon " $lesson_status ** \"$lesson_status\""} + } + } + set lesson_status $icon + } + # DEDS: these are expensive # and for demo purposes only + db_0or1row get_last_viewed { } set all_items [db_list get_total_items { }] set total_item_count [llength $all_items] Index: openacs-4/packages/lorsm/sql/postgresql/lorsm-cmi-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/sql/postgresql/lorsm-cmi-create.sql,v diff -u -r1.1 -r1.2 --- openacs-4/packages/lorsm/sql/postgresql/lorsm-cmi-create.sql 26 May 2005 18:14:59 -0000 1.1 +++ openacs-4/packages/lorsm/sql/postgresql/lorsm-cmi-create.sql 13 Aug 2007 09:20:14 -0000 1.2 @@ -59,7 +59,7 @@ constraint lorsm_cmi_core_man_id_fk foreign key (man_id) references ims_cp_manifests (man_id), constraint lorsm_cmi_core_item_id_fk foreign key - (item_id) references ims_cp_items(ims_item_id) + (item_id) references acs_objects (object_id) ); create index lorsm_cmi_core__stud_id_idx on lorsm_cmi_core (student_id); @@ -212,7 +212,7 @@ on delete cascade, student_id varchar(100), mastery_score varchar(10), -- not mandatory, gettable, not settable - max_time_allowed character varying(12), -- mandatory, not gettable, settable + max_time_allowed character varying(14), -- mandatory, not gettable, settable time_limit_action varchar(100) -- not mandatory, gettable, not settable ); Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/sql/postgresql/upgrade/upgrade-0.8d-0.8d2.sql'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/src/java/.classpath'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/src/java/.project'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/src/java/descriptionforjar.jardesc'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/src/java/java.policy.applet'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/src/java/org/adl/datamodels/DataModelInterface.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/src/java/org/adl/datamodels/DataModelValidator.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/src/java/org/adl/datamodels/Element.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/src/java/org/adl/datamodels/SCODataManager.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/src/java/org/adl/datamodels/cmi/CMICategory.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/src/java/org/adl/datamodels/cmi/CMIComments.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/src/java/org/adl/datamodels/cmi/CMICommentsFromLms.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/src/java/org/adl/datamodels/cmi/CMICore.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/src/java/org/adl/datamodels/cmi/CMIInteractionData.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/src/java/org/adl/datamodels/cmi/CMIInteractionDataUtil.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/src/java/org/adl/datamodels/cmi/CMIInteractions.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/src/java/org/adl/datamodels/cmi/CMIInteractionsUtil.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/src/java/org/adl/datamodels/cmi/CMILaunchData.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/src/java/org/adl/datamodels/cmi/CMIObjectiveData.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/src/java/org/adl/datamodels/cmi/CMIObjectives.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/src/java/org/adl/datamodels/cmi/CMIObjectivesUtil.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/src/java/org/adl/datamodels/cmi/CMIRequest.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/src/java/org/adl/datamodels/cmi/CMIResponse.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/src/java/org/adl/datamodels/cmi/CMIScore.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/src/java/org/adl/datamodels/cmi/CMIStudentData.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/src/java/org/adl/datamodels/cmi/CMIStudentPreference.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/src/java/org/adl/datamodels/cmi/CMISuspendData.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/src/java/org/adl/datamodels/cmi/CMITime.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/src/java/org/adl/datamodels/cmi/DMErrorManager.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/src/java/org/adl/samplerte/client/APIAdapterApplet.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/src/java/org/adl/samplerte/client/LMSErrorManager.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/src/java/org/adl/samplerte/client/ServletProxy.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/src/java/org/adl/samplerte/client/ServletWriter.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/src/java/org/adl/util/debug/DebugIndicator.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/tcl/lorsm-delivery-scorm-procs.tcl'. Fisheye: No comparison available. Pass `N' to diff? Index: openacs-4/packages/lorsm/tcl/lorsm-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/tcl/lorsm-procs.tcl,v diff -u -r1.16 -r1.17 --- openacs-4/packages/lorsm/tcl/lorsm-procs.tcl 6 Apr 2007 19:30:20 -0000 1.16 +++ openacs-4/packages/lorsm/tcl/lorsm-procs.tcl 13 Aug 2007 09:20:15 -0000 1.17 @@ -622,13 +622,13 @@ # that could be expensive if the tree is long or deep. array set visited_items [list] while { $count < $items_count } { - ns_log notice "loop [incr i]" + ns_log debug "lorsm::get_items_indent loop [incr i]" if {$i > 2} {break} foreach item $items_list { set item_id [lindex $item 0] - ns_log notice "item_id $item_id [info exists visited_items($item_id)]" + ns_log debug "lorsm::get_items_indent item_id $item_id [info exists visited_items($item_id)]" if {![info exists visited_items($item_id)]} { - ns_log notice "adding to array item_id $item_id" + ns_log debug "lorsm::get_items_indent adding to array item_id $item_id" set visited_items($item_id) $item_id set indent [expr [lindex $item 1] + 1] foreach ims_item_id [db_list get_items "select ims_item_id from ims_cp_items where parent_item = :item_id and org_id = :org_id $exclude_where"] { Index: openacs-4/packages/lorsm/templates/lorsm-default.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/templates/lorsm-default.adp,v diff -u -r1.5 -r1.6 --- openacs-4/packages/lorsm/templates/lorsm-default.adp 22 Dec 2006 18:16:10 -0000 1.5 +++ openacs-4/packages/lorsm/templates/lorsm-default.adp 13 Aug 2007 09:20:16 -0000 1.6 @@ -19,7 +19,7 @@ - image + image Index: openacs-4/packages/lorsm/templates/lorsm-default.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/templates/lorsm-default.tcl,v diff -u -r1.9 -r1.10 --- openacs-4/packages/lorsm/templates/lorsm-default.tcl 22 Dec 2006 18:16:10 -0000 1.9 +++ openacs-4/packages/lorsm/templates/lorsm-default.tcl 13 Aug 2007 09:20:16 -0000 1.10 @@ -14,6 +14,7 @@ # There are pages that are not necesarily part of one ims_item_id # but are part of a particular resource. + if { [info exists content(item_id)] } { set write_p [fs::item_editable_p -item_id $content(item_id)] } else { @@ -22,11 +23,18 @@ } if {![empty_string_p $imsitem_id]} { - set imsitem_id [content::item::get_live_revision -item_id $imsitem_id] + set live_imsitem_id [content::item::get_live_revision -item_id $imsitem_id] + if {![empty_string_p $live_imsitem_id]} { + set imsitem_id $live_imsitem_id + } else { + ns_log warning "no live revision for item $imsitem_id" + } # See if they have write and the object is browser editable to offer an edit link. + if { [info exists content(item_id)] } { set write_p [permission::write_permission_p -object_id $imsitem_id] - if { $write_p && [info exists content(item_id)] } { + if { $write_p } { set write_p [fs::item_editable_p -item_id $content(item_id)] + } } else { # No content to edit set write_p 0 Index: openacs-4/packages/lorsm/www/admin/course-add-2.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/www/admin/course-add-2.tcl,v diff -u -r1.1 -r1.2 --- openacs-4/packages/lorsm/www/admin/course-add-2.tcl 31 Dec 2006 00:36:04 -0000 1.1 +++ openacs-4/packages/lorsm/www/admin/course-add-2.tcl 13 Aug 2007 09:20:16 -0000 1.2 @@ -31,6 +31,9 @@ # Permissions set user_id [ad_conn user_id] +# checl Permissions on target folder +ad_require_permission $folder_id admin + # unzips the file if { ![empty_string_p $upload_file] && [ catch {set tmp_dir [lors::imscp::expand_file $upload_file ${upload_file.tmpfile} lors-imscp-$course_id] } errMsg] } { @@ -41,24 +44,22 @@ # if it is not blank... if {![empty_string_p $upload_file]} { ns_log Debug "LORS Package: made directory $tmp_dir to extract from ${upload_file.tmpfile} ($upload_file)\n" + #checks for nested imsmanifest.xml and sets root there + while { [llength [glob -nocomplain [file join $tmp_dir *]]] == 1 } { + set tmp_dir [lindex [glob -nocomplain [file join $tmp_dir *]] 0] set allfiles [lors::imscp::dir_walk $tmp_dir] - + } } else { set allfiles [lors::imscp::dir_walk $directory] - } - -# Permissions on target folder -ad_require_permission $folder_id admin - - +#unusefully duplicates, leaving unzips around # unzips the file -if { ![empty_string_p $upload_file] && - [ catch {set tmp_dir [lors::imscp::expand_file $upload_file ${upload_file.tmpfile} lors-imscp-$course_id] } errMsg] } { - ad_return_complaint 1 "[_ lorsm.lt_The_uploaded_file_doe]" - ad_script_abort -} +#if { ![empty_string_p $upload_file] && +# [ catch {set tmp_dir [lors::imscp::expand_file $upload_file ${upload_file.tmpfile} lors-imscp-$course_id] } errMsg] } { +# ad_return_complaint 1 "[_ lorsm.lt_The_uploaded_file_doe]" +# ad_script_abort +#} # search for manifest file set file imsmanifest.xml Index: openacs-4/packages/lorsm/www/admin/course-add-3.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/www/admin/course-add-3.tcl,v diff -u -r1.3 -r1.4 --- openacs-4/packages/lorsm/www/admin/course-add-3.tcl 24 Jan 2007 02:36:30 -0000 1.3 +++ openacs-4/packages/lorsm/www/admin/course-add-3.tcl 13 Aug 2007 09:20:16 -0000 1.4 @@ -90,7 +90,12 @@ # We need to separate folders (since now all are cr_items) one for the files (content) and the other # one for the created cr_items - set new_parent_id [lors::cr::add_folder -parent_id $parent_id -folder_name $cr_dir] + + if { [ catch {set new_parent_id [lors::cr::add_folder -parent_id $parent_id -folder_name $cr_dir]} errMsg] } { + ns_write "

Unfortunately the same context contains a course with same exact name. hit back and change name.

" + ad_script_abort + } + set new_items_parent_id [lors::cr::add_folder -parent_id $parent_id -folder_name "${cr_dir}_items"] # PERMISSIONS FOR FILE-STORAGE Index: openacs-4/packages/lorsm/www/admin/tracking-rte/drill-student-2.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/www/admin/tracking-rte/drill-student-2.tcl,v diff -u -r1.1 -r1.2 --- openacs-4/packages/lorsm/www/admin/tracking-rte/drill-student-2.tcl 31 Dec 2006 00:36:09 -0000 1.1 +++ openacs-4/packages/lorsm/www/admin/tracking-rte/drill-student-2.tcl 13 Aug 2007 09:20:16 -0000 1.2 @@ -82,13 +82,17 @@ # { title "" "no_sort" "Item: $item_id $indent [if {![empty_string_p $identifierref]} {set href \"$item_title\"} else {set href \"AAA $item_title\"}]" } # } + regsub -all {[\{\}]} $org_title "" org_title + append orgs_list "
" - append orgs_list "" + append orgs_list "" + set indent_items [lorsm::get_items_indent -org_id $org_id] + db_foreach organization_item { SELECT o.object_id, - repeat(' ', (tree_level(tree_sortkey) - :indent)* 2) as indent, + --repeat(' ', (tree_level(tree_sortkey) - :indent)* 2) as indent, i.ims_item_id, i.item_title as item_title, i.hasmetadata, @@ -101,32 +105,46 @@ FROM acs_objects o, ims_cp_items i, ims_cp_manifests m WHERE - o.object_type = 'ims_item' + o.object_type like 'ims_item_object' AND i.org_id = :org_id AND o.object_id = i.ims_item_id AND m.man_id = :man_id ORDER BY - object_id, tree_sortkey + object_id + --, tree_sortkey } { + foreach indent_item $indent_items { + set indent_item_id [lindex $indent_item 0] + set indent_indent [lindex $indent_item 1] + if { [string equal $indent_item_id $ims_item_id] } { + set indent $indent_indent + } + } + + set table_item "" + + for {set x 0} {$x<$indent} {incr x} { + append table_item "" + } + append table_item "" } + append orgs_list "
Organization: $org_title ($org_id)
$org_title (id: $org_id)
" + + if { [empty_string_p $identifierref] } { - set table_item "" } else { #set table_item "" + append orgs_list " : No RTE scorm data " append orgs_list "" } else { append orgs_list "" + append orgs_list "
Item: $item_id $indent AAA $item_title" - #set table_item "Item: $item_id $indent AAA $item_title" + append table_item "Item: $ims_item_id $indent $item_title" + #set table_item "Item: $item_id $indent AAA $item_titleItem: $item_id $indent [string trim $item_title]" - set table_item "$indent $indent [string trim $item_title]" + append table_item "[string trim $item_title], (id: $ims_item_id)" } # set table_item [concat $table_item [ad_table -Tmissing_text $missing_text -Textra_vars {fs_local_package_id track_id} -Ttable_extra_html $table_extra_html $table_def]] #set table_item [concat $table_item [ad_table -Tmissing_text $missing_text -Textra_vars {fs_local_package_id track_id} -Ttable_extra_html $table_extra_html $table_def]] append orgs_list [string trim $table_item] - - - set item_table "" db_foreach student_activity { @@ -148,7 +166,7 @@ and user_id=:user_id and - imsitems.item_id=cmi.item_id + imsitems.ims_item_id=cmi.item_id order by cmi.track_id asc } { @@ -167,17 +185,22 @@ } if { [empty_string_p $item_table] } { - append orgs_list ": No scorm data
" append orgs_list "" append orgs_list "" append orgs_list $item_table - append orgs_list "
scorestatustotal timefirst visitdetail sessions
" + append orgs_list "
" + append orgs_list "" } + +append orgs_list "" append orgs_list "" } Index: openacs-4/packages/lorsm/www/delivery/applet.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/www/delivery/applet.adp,v diff -u -r1.2 -r1.3 --- openacs-4/packages/lorsm/www/delivery/applet.adp 7 Jun 2006 14:05:44 -0000 1.2 +++ openacs-4/packages/lorsm/www/delivery/applet.adp 13 Aug 2007 09:20:16 -0000 1.3 @@ -1,425 +1,51 @@ - -this.releasemenu=null; -this.APIFinder=null; -this.initialized=false; -this.finished=false; -this.tries=0; -this.megatries=0; -this.bored=0; -this.finishing=false; -this.withinfinish=false; -this.withininitialize=false; - -function EndingNow() { - //UNLOADING APPLET - //alert("APPLET UNLOADING"); - //this.parent.location.href="blank.html"; - //this.parent.location.replace("blank.html"); - //this.parent.location.reload(true); - self.document.location.href="blank.html"; - self.document.location.replace("blank.html"); - self.document.src="blank.html"; - self.document.write("TERMINATING"); - //self.document.location.reload(true); - //APIFinder.stop(); - //APIFinder.destroy(); - parent.API=null; - APIFinder=null; - APIHolder=null; - API=null; - return(true); -} - -function KeepAlive() { - //number of seconds * 1000 - reloadtime=@ses_renew@*1000; - myTimer=setTimeout("ReLoad()",reloadtime); - debug("scheduling keepalive every "+reloadtime/1000+" seconds"); -} - -function ReLoad() { - //keepalive will always be there: no more just initialized if( ! initialized ) { debug("deactivating keepalive");return; } - debug("within reload()"); - var rnumb = Math.floor(Math.random()*999); - temp = "keepalive?Rand="+rnumb; - parent.frames['keepalive'].location.href="blank.html"; - parent.frames['keepalive'].document.location.replace("blank.html"); - parent.frames['keepalive'].document.location.reload(true); - parent.frames['keepalive'].document.location.href=temp; - parent.frames['keepalive'].document.location.replace(temp); - parent.frames['keepalive'].document.location.reload(true); - parent.frames['keepalive'].document.src ="keepalive?Rand="+rnumb; - isalive=APIFinder.KeepAlive(); - if(!(isalive=='true')) { - - message="Server failure: Error in communication to server:
"+APIFinder.LastServerError; - parent.frames['menu'].writit(message,'usermessage'); -
- - debug("server error in keepalive"); - - APIFinder.LastServerError=""; - } else { - - message="Server online"; - parent.frames['menu'].writit(message,'usermessage'); - - - debug("server OK in keepalive"); - - } - KeepAlive(); -} - - -function APIHolder() { - //this is just a placeholder -} - -function LMSInitialize(placeholder) { - debug("sco called LMSInitialize ("+placeholder+")"); - initialized=APIFinder.LMSInitialize(placeholder); - debug("returning from LMSInitialize =("+initialized+")"); - if(initialized=='true') { - - parent.frames['menu'].toggleBox('menudiv',0); - parent.frames['menu'].writit('Course initialized.
The menu returns when you exit the module.

','usermessage'); - parent.frames['menu'].writit('Abort Course
(clicking this will not record tracking information)
','abort'); -
- APIFinder.LastServerError=""; - } else { - - message="LMSInitialize: Error in communication to server:
"+APIFinder.LastServerError+""; - parent.frames['menu'].writit(message,'usermessage'); -
- - debug("server error in LMSInitialize"); - - } - return initialized; -} - -function BackToBody() { - try { - debug("doing backtobody"); - - parent.frames['menu'].writit('','abort'); - parent.frames['menu'].writit('','usermessage'); - - messaging("Unloading course"); - parent.frames['content'].document.location.href = "body?man_id=@man_id@"; - } catch (err) { - debug("FAILURE calling backtobody FAILED"); - } - debug("ending backtobody"); - finishing=false; -} - -function LMSFinish(placeholder) { - if(!(initialized=='true')) { - debug("SCO called LMSFinish when NOT INITIALIZED!"); - } - finishing=true; - - parent.frames['menu'].writit('Sending tracking to server....','usermessage'); - - debug("sco called LMSFinish("+placeholder+")"); - debug("calling LMSfinish =("+finished+")"); - finished=APIFinder.LMSFinish(placeholder); - debug("returning from LMSfinish =("+finished+")"); - //now we schedule a page unload AFTER the course has received the LMSFINISH ok - if(finished=='true') { - //we set initialized to false ONLY when finished has been processed - //it could be some courses try finish more than once following an error - initialized=false; - myTimer=setTimeout("BackToBody()",1000) - APIFinder.LastserverError=""; - - parent.frames['menu'].writit('','abort'); - parent.frames['menu'].toggleBox('menudiv',1); - parent.frames['menu'].writit('Tracking is OK','usermessage'); - - } else { - //Some error occourred. not clear at this stage if SERVER SIDE or what - finishing=false; - - //better be conservative. don't give'em menu back - //parent.frames['menu'].writit('','abort'); - //parent.frames['menu'].toggleBox('menudiv',1); - message="LMSFinish: Error in communication to server:
"+APIFinder.LastServerError+""; - parent.frames['menu'].writit(message,'usermessage'); -
- - debug("ERROR during LMSFinish CALL !!!"); - - } - return finished; -} - -function LMSGetValue(name) { - debug("sco called LMSGetValue("+name+")"); - getvalue=APIFinder.LMSGetValue(name); - debug("LMSGetValue("+name+") returns ("+getvalue+")"); - return(getvalue); -} - -function LMSCommit(placeholder) { - debug("sco called LMSCommit("+placeholder+")"); - committed=APIFinder.LMSCommit(placeholder); - if(!(committed=='true')) { - - message="Commit: Error in communication to server:
"+APIFinder.LastServerError+""; - parent.frames['menu'].writit(message,'usermessage'); -
- - debug("ERROR during LMSCommit CALL !!!"); - - } else { - - parent.frames['menu'].writit('Committed OK','usermessage'); - - APIFinder.LastServerError=""; - } - return committed; -} - -function LMSSetValue(name,value) { - debug("sco called LMSSetValue("+name+","+value+")"); - setvalue=APIFinder.LMSSetValue(name,value); - debug("LMSsetvalue returning "+setvalue+" "); - return (setvalue); -} - -function LMSGetLastError() {debug ("sco called LMSGetLastError ("+")"); return APIFinder.LMSGetLastError()} -function LMSGetErrorString(number) {debug ("sco called LMSGetErrorString ("+number+")"); return APIFinder.LMSGetErrorString(number)} -function LMSGetDiagnostic(placeholder) {debug ("sco called LMSGetDiagnostic ("+placeholder+")"); return APIFinder.LMSGetDiagnostic(placeholder)} - - -APIHolder.prototype.LMSInitialize=LMSInitialize; -APIHolder.prototype.LMSFinish=LMSFinish; -APIHolder.prototype.LMSGetValue=LMSGetValue; -APIHolder.prototype.LMSCommit=LMSCommit; -APIHolder.prototype.LMSSetValue=LMSSetValue; -APIHolder.prototype.LMSGetLastError=LMSGetLastError; -APIHolder.prototype.LMSGetErrorString=LMSGetErrorString; -APIHolder.prototype.LMSGetDiagnostic=LMSGetDiagnostic; - - -function waitforapplet() { - debug("in waitforapplet"); - - if (megatries>5) { - debug("giving up"); - if(bored==0) { - bored=1; - alert("Your browser seems not to let me communicate with the applet. Please check:\n1) Java support is installed and active in the browser\n2)That your browser supports java-javascript connectivity (most versions of IE and Mozilla-compatible would be ok)\n3) If you are currentely installing Java support, please try again accesing the course after installation completion\n"); - } - this.releasemenu=-1; - return; - } - tries++; - if (tries>3) { - debug("bored with loading applet - trying something else"); - var temp=this.document.location.href; - debug(temp); - this.document.location.href="blank.html"; - this.document.location.replace("blank.html"); - this.document.location.reload(true); - this.document.location.href=temp; - this.document.location.replace(temp); - this.document.location.reload(true); - debug("waiting again"); - tries=0; megatries++; - setTimeout("waitforapplet();",1000) - } - - try { - var active=this.document.applets[0].isActive(); //mozilla error on this, IE just gives out (doesnt' go in the catch ???) - } catch (err) { - try { - var active=this.document.applets[0].isActive; //this is mozilla specific, IE is just allergic (we have enough wars not to think of browsers'.... - } catch (err2) { - debug("applet not loaded within old explorer") - debug("seems java is not installed") - } - } + - if (active) + - + + ses_renew: @ses_renew@ ses_timeout: @ses_timeout@ first_cookie: @cookie@ - - - - - - + @@ -438,32 +64,7 @@ - - - Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/www/delivery/applet.js'. Fisheye: No comparison available. Pass `N' to diff? Index: openacs-4/packages/lorsm/www/delivery/applet.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/www/delivery/applet.tcl,v diff -u -r1.2 -r1.3 --- openacs-4/packages/lorsm/www/delivery/applet.tcl 7 Jun 2006 14:05:44 -0000 1.2 +++ openacs-4/packages/lorsm/www/delivery/applet.tcl 13 Aug 2007 09:20:16 -0000 1.3 @@ -13,6 +13,7 @@ } -errors { } +set menu_type [ad_get_client_property lorsm menu_type] set debuglevel [ad_get_client_property lorsm debuglevel] if {$debuglevel > 0} { set app_width 150 Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/www/delivery/blank-no-javascript.html'. Fisheye: No comparison available. Pass `N' to diff? Index: openacs-4/packages/lorsm/www/delivery/body.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/www/delivery/body.tcl,v diff -u -r1.6 -r1.7 --- openacs-4/packages/lorsm/www/delivery/body.tcl 7 Jun 2006 14:05:44 -0000 1.6 +++ openacs-4/packages/lorsm/www/delivery/body.tcl 13 Aug 2007 09:20:16 -0000 1.7 @@ -10,13 +10,39 @@ @cvs-id $Id$ } { man_id:notnull + lmsfinish:optional } -properties { } -validate { } -errors { } set user_id [ad_conn user_id] set community_id [dotlrn_community::get_community_id] + +if { ! [info exists lmsfinish] } { + set lmsfinish 0 +} + +#SCORM for finish +set initedonpage [ad_get_client_property lorsm initedonpage] + +if { $initedonpage!=0 && $initedonpage!="" } { + if { $lmsfinish > 0 } { + ns_log warning "SCORM : back to record view after lms finish, but it hasn't worked!" + ns_log warning "SCORM : resetting all visiting parameters." + ad_set_client_property lorsm studenttrack 0 + ad_set_client_property lorsm studenttrack "" + ad_set_client_property lorsm currenttrackid "" + ad_set_client_property lorsm initedonpage "" + } else { + ad_set_client_property lorsm studenttrack 0 + ns_log warning "SCORM : new content item with still open course ???" + ns_log warning "SCORM : we call for LMSFinish in place of the content!!!!!!???" + ad_returnredirect [export_vars -base lmsfinish {man_id initedonpage} ] + } +} + + db_0or1row get_last_viewed { select ims_item_id as imsitem_id, coalesce(acs_object__name(object_id),'Item '||object_id) as last_page_viewed from views v, Index: openacs-4/packages/lorsm/www/delivery/bottom.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/www/delivery/bottom.tcl,v diff -u -r1.2 -r1.3 --- openacs-4/packages/lorsm/www/delivery/bottom.tcl 7 Jun 2006 14:05:44 -0000 1.2 +++ openacs-4/packages/lorsm/www/delivery/bottom.tcl 13 Aug 2007 09:20:16 -0000 1.3 @@ -44,7 +44,7 @@ } -default "no_item"] set first_item_id [lindex $item_list 0] -set first_item_url "" +set first_item_url "" set curr_index [expr [lsearch -exact $item_list $last_item_viewed]] set prev_item_id [lindex $item_list [expr $curr_index - 1]] Index: openacs-4/packages/lorsm/www/delivery/delivery-scorm.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/www/delivery/delivery-scorm.adp,v diff -u -r1.5 -r1.6 --- openacs-4/packages/lorsm/www/delivery/delivery-scorm.adp 15 May 2007 20:14:46 -0000 1.5 +++ openacs-4/packages/lorsm/www/delivery/delivery-scorm.adp 13 Aug 2007 09:20:16 -0000 1.6 @@ -2,262 +2,43 @@ -@course_name@ - + +@course_name@ + - + - + - + - + - + - + - + - + - + Index: openacs-4/packages/lorsm/www/delivery/delivery.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/www/delivery/delivery.adp,v diff -u -r1.3 -r1.4 --- openacs-4/packages/lorsm/www/delivery/delivery.adp 15 May 2007 20:14:46 -0000 1.3 +++ openacs-4/packages/lorsm/www/delivery/delivery.adp 13 Aug 2007 09:20:16 -0000 1.4 @@ -4,7 +4,7 @@ @course_name@ - + Index: openacs-4/packages/lorsm/www/delivery/exit.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/www/delivery/exit.tcl,v diff -u -r1.3 -r1.4 --- openacs-4/packages/lorsm/www/delivery/exit.tcl 7 Jun 2006 14:05:44 -0000 1.3 +++ openacs-4/packages/lorsm/www/delivery/exit.tcl 13 Aug 2007 09:20:16 -0000 1.4 @@ -17,7 +17,7 @@ } #set the following accordingly -set level "Notice" +set level "debug" set track_id [ad_get_client_property lorsm currenttrackid] set lorsmstudenttrack [ad_get_client_property lorsm studenttrack] @@ -40,17 +40,16 @@ ad_set_client_property lorsm currenttrackid "" ad_set_client_property lorsm studenttrack "" if { $track_id == 0 || $track_id == "" } { - ns_log $level "SCORM leaving non rte-inited (or better a rte-finished) course" + ns_log $level "delivery/exit leaving non rte-inited (or better a rte-finished) course" } else { - ns_log $level "SCORM leaving course which had been rte-inited but NOT FINISHED (user forcing exit before time) (lorsm_cmi_core.track_id=$track_id)" + ns_log $level "delivery/exit leaving course which had been rte-inited but NOT FINISHED (user forcing exit before time) (lorsm_cmi_core.track_id=$track_id)" } if { $lorsmstudenttrack == 0 || $lorsmstudenttrack == "" } { - ns_log $level "SCORM leaving non istrackable course" + ns_log $level "delivery/exit leaving non istrackable course" } else { - ns_log $level "SCORM leaving course which was either istrackable or rte-inited (lorsm_student_track.track_id=$lorsmstudenttrack" + ns_log $level "delivery/exit leaving course which was either istrackable or rte-inited (lorsm_student_track.track_id=$lorsmstudenttrack" } # redirects -ns_log Warning "RETURN $return_url" - +ns_log $level "delivery/exit $return_url" ad_returnredirect $return_url Index: openacs-4/packages/lorsm/www/delivery/index.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/www/delivery/index.adp,v diff -u -r1.5 -r1.6 --- openacs-4/packages/lorsm/www/delivery/index.adp 15 May 2007 20:14:46 -0000 1.5 +++ openacs-4/packages/lorsm/www/delivery/index.adp 13 Aug 2007 09:20:16 -0000 1.6 @@ -1,3 +1,3 @@ - Index: openacs-4/packages/lorsm/www/delivery/index.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/www/delivery/index.tcl,v diff -u -r1.10 -r1.11 --- openacs-4/packages/lorsm/www/delivery/index.tcl 17 May 2007 20:37:01 -0000 1.10 +++ openacs-4/packages/lorsm/www/delivery/index.tcl 13 Aug 2007 09:20:16 -0000 1.11 @@ -9,32 +9,46 @@ @arch-tag: 64f3397b-4558-4298-a995-fc63e472f2a1 @cvs-id $Id$ } { - menu_off:integer,notnull,optional man_id:integer,notnull + menu_off:integer,notnull,optional item_id:integer,notnull,optional ims_id:integer,notnull,optional } -properties { } -validate { } -errors { } + set debuglevel 0 +set menu_type "menu-mk" ad_set_client_property lorsm debuglevel $debuglevel +ad_set_client_property lorsm menu_type $menu_type set ses_renew [ad_parameter -package_id [ad_acs_kernel_id] SessionRenew security 300] + if { ! [info exists menu_off] } { set menu_off 0 } +set user_id [ad_conn user_id] + if { [info exists item_id] } { ad_set_client_property lorsm ims_id $item_id if { ! [info exists ims_id] } { set ims_id $item_id } } else { + if { $menu_off == 0 } { ad_set_client_property lorsm ims_id "" -# ns_log notice "UNSETTING LORSM IMS_ID '[ad_conn url]'" + ns_log notice "UNSETTING LORSM IMS_ID '[ad_conn url]'" + } else { + #given menu_off without ims_id, i have to provide a default one! + #since an ims_item_id wasn't provided, we just pick up the first one + set item_list [lorsm::get_item_list $man_id $user_id] + set ims_id [lindex $item_list 0] + ad_set_client_property lorsm ims_id $ims_id + } } if { [info exists ims_id] } { @@ -44,16 +58,22 @@ set body_url [export_vars -base "record-view" -url {item_id man_id}] } + + # Get the course name if {[db_0or1row manifest " select cp.course_name, cp.fs_package_id, isscorm, pf.folder_name, - pf.format_name + pf.format_name, + case + when upper(scorm_type) = 'SCO' then 'delivery-scorm' + else 'delivery' + end as deliverymethod from - ims_cp_manifests cp, + ims_cp_manifests cp left join (select man_id, max(scorm_type) as scorm_type from ims_cp_resources group by man_id ) as cpr using (man_id) , lorsm_course_presentation_formats pf where cp.man_id = :man_id @@ -67,16 +87,24 @@ } else { set course_name "No Course Name" } + +ns_log warning "\$isscorm=$isscorm while delivery method has to be = $deliverymethod" + if {$isscorm} { set folder_name "delivery-scorm" +} else { + # workaround for when isscorm is set to inconsisten value + # (who sets it ?) + if {$deliverymethod=="delivery-scorm"} { + set folder_name delivery-scorm + } } + set return_url [dotlrn_community::get_community_url [dotlrn_community::get_community_id]] - # Student tracking set package_id [ad_conn package_id] set community_id [dotlrn_community::get_community_id] -set user_id [ad_conn user_id] ad_set_client_property lorsm currentcourse $man_id @@ -112,7 +140,11 @@ ## FIXME -db_1row get_format "select folder_name, isscorm from lorsm_course_presentation_formats f, ims_cp_manifests m where f.format_id=m.course_presentation_format and m.man_id=:man_id" -if {$isscorm} { - set folder_name delivery-scorm -} +#db_1row get_format "select folder_name, isscorm from lorsm_course_presentation_formats f, ims_cp_manifests m where f.format_id=m.course_presentation_format and m.man_id=:man_id" +#if {$isscorm} { +# set folder_name delivery-scorm +#} + +ad_set_client_property lorsm deliverymethod $folder_name + +ns_log debug "delivery/index.tcl returning with folder_name $folder_name" Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/www/delivery/lmsfinish.adp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/www/delivery/lmsfinish.tcl'. Fisheye: No comparison available. Pass `N' to diff? Index: openacs-4/packages/lorsm/www/delivery/menu-mk.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/www/delivery/menu-mk.adp,v diff -u -r1.2 -r1.3 --- openacs-4/packages/lorsm/www/delivery/menu-mk.adp 15 May 2007 20:14:46 -0000 1.2 +++ openacs-4/packages/lorsm/www/delivery/menu-mk.adp 13 Aug 2007 09:20:16 -0000 1.3 @@ -2,80 +2,82 @@ - - - - - #lorsm.Exit_Course#
#lorsm.return_to_LRN#
-  - + +
+


+
+ +

+
    +
  • @tree_items.icon;noquote@ + @tree_items.label@ + +
  • -
- - + + + + + +Menu not available. + +
+ \ No newline at end of file Index: openacs-4/packages/lorsm/www/delivery/menu-mk.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/www/delivery/menu-mk.tcl,v diff -u -r1.2 -r1.3 --- openacs-4/packages/lorsm/www/delivery/menu-mk.tcl 7 Jun 2006 14:05:44 -0000 1.2 +++ openacs-4/packages/lorsm/www/delivery/menu-mk.tcl 13 Aug 2007 09:20:16 -0000 1.3 @@ -1,4 +1,4 @@ -# packages/lorsm/www/delivery/index.tcl +# packages/lorsm/www/delivery/menu-mk.tcl ad_page_contract { @@ -11,48 +11,76 @@ } { man_id:integer,notnull ims_id:integer,notnull,optional - track_id:integer,notnull + menu_off:integer,notnull,optional + track_id:integer,notnull,optional } -properties { } -validate { } -errors { } +if { ![info exists track_id] } { + set track_id 0 } +if { ![info exists menu_off] } { + set menu_off 0 } + +set debuglevel [ad_get_client_property lorsm debuglevel] +set deliverymethod [ad_get_client_property lorsm deliverymethod] + +if { [string equal $deliverymethod "delivery-scorm"] } { + set rte true +} else { + set rte false +} + + set items_list [list] set control_list [list] +set target "content" -set org_id [db_string get_org_id { select org_id from ims_cp_organizations where man_id = :man_id} ] -# We need all the count of all items (just live revisions) -set items_count [db_string get_items_count { select count(ims_item_id) - from ims_cp_items where ims_item_id in ( select live_revision - from cr_items where content_type = 'ims_item_object') and - org_id = :org_id -}] +#set org_id [db_string get_org_id { select org_id from ims_cp_organizations where man_id = :man_id} ] -# Get the root items -set count 0 -db_foreach get_root_item { select ims_item_id from ims_cp_items where parent_item = :org_id and org_id = :org_id } { - lappend items_list [list $ims_item_id 1] - lappend control_list $ims_item_id - incr count -} -template::multirow create tree_items link label indent last_indent target - -while { $count < $items_count } { - foreach item $items_list { - set item_id [lindex $item 0] - set indent [expr [lindex $item 1] + 1] - db_foreach get_items { select ims_item_id from ims_cp_items where parent_item = :item_id and org_id = :org_id } { - if { [string equal [lsearch -exact $control_list $ims_item_id] "-1"] } { - lappend items_list [list $ims_item_id $indent] - lappend control_list $ims_item_id - incr count - } +#we handle multiple orgs +foreach org_id [db_list get_org_id { } ] { + set count 0 + lappend items_list [list $org_id 0] + foreach item [lorsm::get_items_indent -org_id $org_id] { + #we shift everything to the right to get the orgs inserted there + set indent [expr [lindex $item 1] +1 ] + set item_id [lindex $item 0] + set item [list $item_id $indent] + lappend items_list $item } - } + # We need all the count of all items (just live revisions) + set items_count [db_string get_items_count { select count(ims_item_id) + from ims_cp_items where ims_item_id in ( select live_revision + from cr_items where content_type = 'ims_item_object') and + org_id = :org_id + }] + # Get the root items + db_foreach get_root_item { select ims_item_id from ims_cp_items where parent_item = :org_id and org_id = :org_id } { + #lappend items_list [list $ims_item_id 1] + #lappend control_list $ims_item_id + incr count + } + while { $count < $items_count } { + foreach item $items_list { + set item_id [lindex $item 0] + set indent [expr [lindex $item 1] + 1] + db_foreach get_items { select ims_item_id from ims_cp_items where parent_item = :item_id and org_id = :org_id } { + if { [string equal [lsearch -exact $control_list $ims_item_id] "-1"] } { + #this duplicates ITEMS lappend items_list [list $ims_item_id $indent] + #lappend control_list $ims_item_id + incr count + } + } + } + } } +template::multirow create tree_items icon link label indent last_indent target + set community_id [dotlrn_community::get_community_id] set counter 1 set user_id [ad_conn user_id] @@ -97,15 +125,15 @@ # Another item in the same level, just add to the list lappend TREE_HASH "TREE_HASH\[\"ims_id.$item_id\"\] = $counter;" lappend levelitems "\['$title', $url\]" - template::multirow append tree_items $url $title $level + template::multirow append tree_items "SAMELEVEL" $url $title $level incr counter } elseif { $level < $nextlevel } { # Next item is a sub-item set ocounter $counter incr counter set submenu "[generate_tree_menu $items $index [expr $rlevel + 1]]" lappend TREE_HASH "TREE_HASH\[\"ims_id.$item_id\"\] = $ocounter;" - template::multirow append tree_items $url $title $level + template::multirow append tree_items "NEXTLEVEL" $url $title $level if { [llength $submenu] } { # There's a submenu lappend levelitems \ @@ -143,7 +171,7 @@ return [list] } else { lappend TREE_HASH "TREE_HASH\[\"ims_id.$item_id\"\] = $counter;" - template::multirow append tree_items $url $title $level + template::multirow append tree_items "LEAF" $url $title $level incr counter return [join \ [lappend levelitems \ @@ -187,31 +215,32 @@ order by org_id } { - + #trying to visualize organizations + lappend js [list 0 $org_id $org_title $man_id "ims/organization" ""] + db_foreach sql { - SELECT - -- (tree_level(ci.tree_sortkey) - :indent) as indent, - i.parent_item, - i.ims_item_id, - i.item_title as item_title, - cr.mime_type - FROM - acs_objects o, ims_cp_items i, cr_items ci, cr_revisions cr, - ims_cp_items_map im - WHERE - o.object_type = 'ims_item_object' - AND - i.org_id = :org_id - AND - o.object_id = i.ims_item_id - AND - i.ims_item_id = im.ims_item_id - and im.man_id=:man_id - and im.org_id=:org_id - and im.hide_p='f' - and im.community_id=:community_id - and ci.item_id=cr.item_id - and cr.revision_id=i.ims_item_id + SELECT + -- (tree_level(ci.tree_sortkey) - :indent ) as indent, + i.parent_item, + i.ims_item_id, + i.item_title as item_title, + i.prerequisites_s as prerequisites, + cr.mime_type + FROM + acs_objects o, ims_cp_items i, cr_items ci, cr_revisions cr, + ims_cp_manifest_class im + WHERE + o.object_type = 'ims_item_object' + AND + i.org_id = :org_id + AND + o.object_id = i.ims_item_id + AND + im.man_id=:man_id + and im.isenabled='t' + and im.community_id=:community_id + and ci.item_id=cr.item_id + and cr.revision_id=i.ims_item_id AND EXISTS @@ -228,7 +257,7 @@ set item_id [lindex $item 0] set indent [lindex $item 1] if { [string equal $item_id $ims_item_id] } { - lappend js [list $indent $ims_item_id $item_title $man_id $mime_type] + lappend js [list $indent $ims_item_id $item_title $man_id $mime_type $prerequisites] } } } @@ -237,11 +266,187 @@ if { [info exists js] } { set last_indent 1 foreach l $js { - foreach {indent item_id title man_id mime_type} $l {break} - template::multirow append tree_items [export_vars -base "record-view" \ - -url {item_id man_id}] "$title $mime_type" $indent $last_indent + foreach {indent item_id title man_id mime_type prerequisites} $l {break} + + #analyzing LESSON STATUS for the ITEM + #this could as well become a lorsm:scorm:function + + ns_log debug "MENU-MK tree : $indent $item_id $title " + + if { ! [string equal $mime_type "ims/organization"] } { + + if { [ db_0or1row isnotanemptyitem "select res_id + from ims_cp_items_to_resources + where ims_item_id= $item_id + limit 1" ] } { + set icon "" + } else { + #since the item has no elements it's a placeholder, we assume it's a folder. + #time will tell if the assumption is correct. + set icon "\"Folder\"" + } + + if { ! [ db_0or1row isanysuspendedsession "select lorsm.track_id as track_id, + cmi.lesson_status as lesson_status from + lorsm_student_track lorsm, lorsm_cmi_core cmi + where + lorsm.user_id = $user_id + and + lorsm.community_id = $community_id + and + lorsm.course_id = $man_id + and + lorsm.track_id = cmi.track_id + and + cmi.man_id = $man_id + and + cmi.item_id = $item_id + order by + lorsm.track_id desc + limit 1" ] } { + #item has no track for the user + #the icon should be the same as per "not yet visited" + append icon "\"Not" + } else { + switch -regexp $lesson_status { + null { append icon "\"Not" } + incomplete { append icon "\"Incomplete\"" } + complete { append icon "\"Completed\"" } + failed { append icon "\"Failed\"" } + "not attempted" { append icon "\"Not" } + passed { append icon "\"Passed\"" } + default { append icon " $lesson_status ** \"$lesson_status\""} + } + } + + + #we analize now prerequisites. + + #regsub -all {&} $prerequisites " " prerequisites + regsub -all {[\{\}]} $prerequisites "" prerequisites + regsub -all { & } $prerequisites " " prerequisites + set prerequisites_list [split $prerequisites] + + foreach prer $prerequisites_list { + if { ! [empty_string_p $prer] } { + ns_log debug "MENU prerequisites for $item_id are $prer " + #in the following query we disregard the organization + if { ! [ db_0or1row givemeid "select i.ims_item_id as id_from_ref + from + ims_cp_items i, + ims_cp_manifest_class im, + ims_cp_organizations o + WHERE + i.identifier=:prer + + AND + o.org_id = i.org_id + AND + o.man_id = :man_id + AND + im.man_id= :man_id + AND + im.isenabled='t' + AND + im.community_id=:community_id" + ] } { + ns_log warning "MENU-MK: prerequisites not found comm: $community_id, man: $man_id, org: $org_id, item: $item_id" + continue + } else { + ns_log debug "THE REQUIRED ITEM IS $id_from_ref "; + } + } + if { ! [empty_string_p $id_from_ref] } { + ns_log debug "MENU prerequisites for $item_id are $id_from_ref" + if { ! [ db_0or1row isanysuspendedsession " + select lorsm.track_id as track_id, cmi.lesson_status as lex_status + from lorsm_student_track lorsm, lorsm_cmi_core cmi + where + lorsm.user_id = $user_id + and + lorsm.community_id = $community_id + and + lorsm.course_id = $man_id + and + lorsm.track_id = cmi.track_id + and + cmi.man_id = $man_id + and + cmi.item_id = $id_from_ref + order by + lorsm.track_id desc + " ] } { + ns_log debug "NOT FOUND TRACK" + append icon "\"Missing" + } else { + ns_log debug "ITEM ID $id_from_ref HAS A TRACK WITH $lex_status" + switch -regexp $lex_status { + null { append icon "\"Missing" } + incomplete { append icon "\"Missing" } + failed { append icon "\"Missing" } + "not attempted" { append icon "\"Missing" } + passed { append icon "\"Prerequisite" } + complete { append icon "\"Prerequisite" } + default { append icon " $lesson_status ** \"$lesson_status\""} + } + } + #if found session for id_from_ref + } + #if found id_from_ref + } + #foreach close + + template::multirow append tree_items $icon [export_vars -base "record-view" \ + -url {item_id man_id}] "$title $mime_type" $indent $last_indent $target set last_indent $indent + + } else { + + regsub -all {[\{\}]} $title "" title + + set icon "\"Content" + + if { ! [ db_0or1row isanysuspendedsession " + select lorsm.track_id as track_id, cmi.lesson_status as lesson_status + from lorsm_student_track lorsm, lorsm_cmi_core cmi + where + lorsm.user_id = $user_id + and + lorsm.community_id = $community_id + and + lorsm.course_id = $man_id + and + lorsm.track_id = cmi.track_id + and + cmi.man_id = $man_id + and + cmi.item_id = $item_id + order by + lorsm.track_id desc + " ] } { + ns_log debug "Menu-mk: no org tracking found" + + append icon "\"Not" + } else { + switch -regexp $lesson_status { + null { append icon "\"Not" } + incomplete { append icon "\"Incomplete\"" } + complete { append icon "\"Completed\"" } + failed { append icon "\"Failed\"" } + "not attempted" { append icon "\"Not" } + passed { append icon "\"Passed\"" } + default { append icon " $lesson_status ** \"$lesson_status\""} + } + } + + set last_indent $indent + template::multirow append tree_items $icon "" $title $indent $last_indent "" + + set last_indent $indent + + } } } # return_url set return_url [dotlrn_community::get_community_url [dotlrn_community::get_community_id]] + Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/www/delivery/menu-mk.xql'. Fisheye: No comparison available. Pass `N' to diff? Index: openacs-4/packages/lorsm/www/delivery/menu.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/www/delivery/menu.adp,v diff -u -r1.5 -r1.6 --- openacs-4/packages/lorsm/www/delivery/menu.adp 7 Jun 2006 14:05:44 -0000 1.5 +++ openacs-4/packages/lorsm/www/delivery/menu.adp 13 Aug 2007 09:20:16 -0000 1.6 @@ -1,323 +1,75 @@ - - - - - - - - - - - - - - - -
-
- -
-
- - - - -
- -debug is: ON - - - - + + + + + + + + + + + + + + + + + +
+ + debug is: ON
+ delivery is: @deliverymethod@ +
+
+ +
+
+ +
+
+ + + + + + Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/www/delivery/menu.js'. Fisheye: No comparison available. Pass `N' to diff? Index: openacs-4/packages/lorsm/www/delivery/menu.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/www/delivery/menu.tcl,v diff -u -r1.8 -r1.9 --- openacs-4/packages/lorsm/www/delivery/menu.tcl 15 May 2007 20:14:46 -0000 1.8 +++ openacs-4/packages/lorsm/www/delivery/menu.tcl 13 Aug 2007 09:20:16 -0000 1.9 @@ -1,4 +1,4 @@ -# packages/lorsm/www/delivery/index.tcl +# packages/lorsm/www/delivery/menu.tcl ad_page_contract { @@ -12,14 +12,29 @@ man_id:integer,notnull ims_id:integer,notnull,optional menu_off:integer,notnull,optional - track_id:integer,notnull + track_id:integer,notnull,optional } -properties { } -validate { } -errors { } +if { ![info exists track_id] } { + set track_id 0 } + +if { ![info exists menu_off] } { + set menu_off 0 } + set debuglevel [ad_get_client_property lorsm debuglevel] +set deliverymethod [ad_get_client_property lorsm deliverymethod] + +if { [string equal $deliverymethod "delivery-scorm"] } { + set rte true +} else { + set rte false +} + set items_list [list] + foreach org_id [db_list get_org_id { } ] { foreach item [lorsm::get_items_indent -org_id $org_id] {lappend items_list $item} } @@ -29,10 +44,8 @@ set community_id [dotlrn_community::get_community_id] set counter 1 set user_id [ad_conn user_id] -if { ![info exists menu_off] } { - set menu_off 0 -} + proc generate_tree_menu { items index rlevel } { # This function is recursive @@ -163,15 +176,14 @@ } db_foreach sql { SELECT - i.parent_item, - i.ims_item_id, - i.item_title as item_title + i.ims_item_id, + i.item_title as item_title FROM - ims_cp_items i, cr_items ci, cr_revisions cr - WHERE - i.org_id = :org_id - AND ci.item_id=cr.item_id + ims_cp_items i, cr_items ci, cr_revisions cr + WHERE + i.org_id = :org_id + AND ci.item_id=cr.item_id AND cr.revision_id=i.ims_item_id AND EXISTS (select 1 from acs_object_party_privilege_map p @@ -187,8 +199,6 @@ } } - - if { [info exists js] } { set index 0 set TREE_ITEMS [generate_tree_menu $js $index 1] Index: openacs-4/packages/lorsm/www/delivery/popup.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/www/delivery/popup.adp,v diff -u -r1.2 -r1.3 --- openacs-4/packages/lorsm/www/delivery/popup.adp 7 Jun 2006 14:05:44 -0000 1.2 +++ openacs-4/packages/lorsm/www/delivery/popup.adp 13 Aug 2007 09:20:16 -0000 1.3 @@ -252,7 +252,7 @@ } function init() { - this.childwindow=popit('popup','popup2?man_id=@man_id@&ims_id=@ims_id@&track_id=@track_id@&menu_off=@menu_off@ ',810,540,20,20); + this.childwindow=popit('popup','popup2?man_id=@man_id@&ims_id=@ims_item_id@&track_id=@track_id@&menu_off=@menu_off@ ',810,540,20,20); this.debugwindow=popit('debuggerwindow','blank.html',210,640,10,10); @@ -343,7 +343,7 @@ //chiamata quando trovato adapter childwindow.frames['content'].window.location.href = "blank.html"; -childwindow.frames['content'].window.location.href = "@body_url;noquote@body?man_id=@man_id@"; +childwindow.frames['content'].window.location.href = "@body_url;noquote@body?man_id=@man_id@"; //not ready yet to show menu //debug(typeof(this.childwindow)); @@ -372,9 +372,9 @@ KeepAlive(); childwindow.frames['content'].document.location.href = "blank.html"; - childwindow.frames['content'].document.location.href = "@body_url;noquote@body?man_id=@man_id@"; + childwindow.frames['content'].document.location.href = "@body_url;noquote@body?man_id=@man_id@"; //let's show menu now - childwindow.frames['menu'].document.location.href = "menu?man_id=@man_id@&ims_id=@ims_id@&track_id=@track_id@&menu_off=@menu_off@"; + childwindow.frames['menu'].document.location.href = "menu?man_id=@man_id@&ims_id=@ims_item_id@&track_id=@track_id@&menu_off=@menu_off@"; //obviously no menu if menu is off... @@ -387,10 +387,10 @@ myTimer=setTimeout("refreshFrame()",2500); return(0); } - childwindow.frames['content'].document.location.href = "record-view?man_id=@man_id@&item_id=@item_id@"; + childwindow.frames['content'].document.location.href = "record-view?man_id=@man_id@&item_id=@ims_item_id@"; childwindow.caller=self; childwindow.focus(); - debug("calling @man_id@ with @item_id@"); + debug("calling @man_id@ with @ims_item_id@"); if (findgetAppletInfo> 7) { debug("I cannot talk to APIAdapter: try reloading me. Please notify support of your sw configuration ;) "); @@ -441,7 +441,6 @@ - name="APIAdapter"> - + Index: openacs-4/packages/lorsm/www/delivery/popup.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/www/delivery/popup.tcl,v diff -u -r1.2 -r1.3 --- openacs-4/packages/lorsm/www/delivery/popup.tcl 7 Jun 2006 14:05:44 -0000 1.2 +++ openacs-4/packages/lorsm/www/delivery/popup.tcl 13 Aug 2007 09:20:16 -0000 1.3 @@ -4,10 +4,9 @@ @arch-tag: 64f3397b-4558-4298-a995-fc63e472f2a1 @cvs-id $Id$ } { - item_id:integer,notnull,optional + ims_item_id:integer,notnull,optional menu_off:integer,notnull,optional man_id:integer,notnull - ims_id:integer,notnull,optional } -properties { } -validate { } -errors { @@ -16,6 +15,8 @@ set debuglevel 0 ad_set_client_property lorsm debuglevel $debuglevel +#we are in a popup aren't we ? +set menu_off 1 #keepalive and debug would require this set random [clock seconds] @@ -25,24 +26,20 @@ set cookie [ad_get_cookie ad_session_id] set track_id [ad_get_client_property lorsm studenttrack] -set menu_off 1 - # Student tracking set package_id [ad_conn package_id] set community_id [dotlrn_community::get_community_id] set user_id [ad_conn user_id] -if { [info exists ims_id] } { - ns_log Notice "APPLET.TCL: ims_id is $ims_id" - set body_url [export_vars -base "record-view" -url {item_id man_id}] -} else { - if { ! [empty_string_p $item_id] } { - ns_log Notice "APPLET.TCL: item_id is $item_id" - set ims_id $item_id - set body_url [export_vars -base "record-view" -url {item_id man_id}] - } +if { ! [info exists ims_item_id] } { + #since an ims_item_id wasn't provided, we just pick up the first one + set item_list [lorsm::get_item_list $man_id $user_id] + set ims_item_id [lindex $item_list 0] } +ns_log Notice "POPUP.TCL: ims_id is $ims_item_id" +set body_url [export_vars -base "record-view" -url {ims_item_id man_id}] + # return_url set return_url [dotlrn_community::get_community_url [dotlrn_community::get_community_id]] Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/www/delivery/popup2.adp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/www/delivery/popup2.tcl'. Fisheye: No comparison available. Pass `N' to diff? Index: openacs-4/packages/lorsm/www/delivery/record-view.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/www/delivery/record-view.tcl,v diff -u -r1.13 -r1.14 --- openacs-4/packages/lorsm/www/delivery/record-view.tcl 15 May 2007 20:14:46 -0000 1.13 +++ openacs-4/packages/lorsm/www/delivery/record-view.tcl 13 Aug 2007 09:20:16 -0000 1.14 @@ -1,4 +1,5 @@ # packages/lorsm/www/delivery4/record-view.tcl + ad_page_contract { records a view for this ims_cp_item and redirects to its url @@ -9,74 +10,64 @@ @arch-tag: a7aba567-c4c1-4f1c-b5f3-ebc1ab277515 @cvs-id $Id$ } { - item_id:notnull - man_id:notnull + item_id:integer,notnull + man_id:integer,notnull + lmsfinish:integer,optional } -properties { } -validate { } -errors { } +if { ! [info exists lmsfinish] } { + set lmsfinish 0 +} set viewer_id [ad_conn user_id] - set views [views::record_view -object_id $item_id -viewer_id $viewer_id] - set ns_item_id $item_id set revision_id $item_id +#we check for those "escaping" sessions without doing LMSFINISH +set currenttrackid [ad_get_client_property lorsm currenttrackid] +set lorsmstudenttrack [ad_get_client_property lorsm studenttrack] +set initedonpage [ad_get_client_property lorsm initedonpage] -ad_set_client_property lorsm ims_id $item_id -ad_set_client_property lorsm man_id $man_id -set item_id [lorsm::delivery::get_item_id -revision_id $revision_id] +if { $initedonpage!=0 && $initedonpage!="" } { + if { $lmsfinish > 0 } { + ns_log warning "SCORM : back to record view after lms finish, but it hasn't worked!" + ns_log warning "SCORM : resetting all visiting parameters." + ad_set_client_property lorsm studenttrack 0 + ad_set_client_property lorsm studenttrack "" + ad_set_client_property lorsm currenttrackid "" + ad_set_client_property lorsm initedonpage "" + } else { + ad_set_client_property lorsm studenttrack 0 + ns_log warning "SCORM : new content item with still open course ???" + ns_log warning "SCORM : we call for LMSFinish in place of the content!!!!!!???" + ad_returnredirect [export_vars -base lmsfinish {item_id man_id initedonpage} ] + } +} +#set item_id [lorsm::delivery::get_item_id -revision_id $revision_id] + set folder_id [lorsm::delivery::get_folder_id_from_man_id -man_id $man_id] set lors_root [lorsm::get_root_folder_id] set folder_name [lorsm::delivery::get_folder_name -folder_id $folder_id] set content_root [lorsm::delivery::get_item_id_from_name_parent -name $folder_name -parent_id $lors_root] -#ns_log notice "record-view folder_id='${folder_id}' lors_root='${lors_root}' folder_name='${folder_name}' content_root='${content_root}'" + if {[empty_string_p $content_root]} { # This was uploaded with lorsm so we use the folder_id from the table set content_root [lorsm::delivery::get_folder_id_from_man_id -man_id $man_id] } -#ns_log notice "record-view content_root='${content_root}'" set url2 $folder_name # Get the href of the item set href [lorsm::delivery::get_href -ims_item_id $revision_id] -# handle regular acs_object here since it's not stored in the CR -set type [db_string get_type "select type from ims_cp_resources r, ims_cp_items_to_resources i2r where i2r.ims_item_id=:revision_id and i2r.res_id=r.res_id" -default webcontent] - # Get the item title set item_title [lorsm::delivery::get_ims_item_title -ims_item_id $revision_id] -ns_log notice "lorsm record-viw.tcl type='${type}'" -switch -glob -- $type { - as_sections { - # FIXME stupidly assume that a section can only be in one assessment - set section_item_id [string trimleft $href "/o/"] - db_1row get_assessment_id "select ci.item_id as assessment_id, m.section_id from as_assessment_section_map m, cr_items ci, cr_items ci2 where ci.latest_revision = m.assessment_id and m.section_id=ci2.latest_revision and ci2.item_id=:section_item_id" -# rp_form_put assessment_id $assessment_id -# ad_return_complaint 1 "assessment_id = '${assessment_id}' section_id='${section_id}'" - ad_returnredirect [export_vars -base ../../assessment/assessment {assessment_id {single_section_id $section_id}}] - ad_script_abort - } - ::xowiki::* { - set form [rp_getform] - ns_set delkey $form item_id - rp_form_put template_file view-plain - rp_form_put __include_vars [list item_id [string trimleft $href "/o/"] css ""] - rp_form_put __include /packages/xowiki/lib/view - db_1row get_format "select folder_name as delivery_folder_name, isscorm from lorsm_course_presentation_formats f, ims_cp_manifests m where f.format_id=m.course_presentation_format and m.man_id=:man_id" - if {$isscorm} { - set delivery_folder_name delivery-scorm - } - rp_internal_redirect "/packages/lorsm/www/delivery/${delivery_folder_name}" - } - default { set cr_item_id [lors::cr::get_item_id -folder_id $content_root -name $href] - - if { [empty_string_p $cr_item_id] } { set res_id [lorsm::delivery::get_res_id -ims_item_id $revision_id] if { ![empty_string_p $res_id] } { @@ -101,54 +92,181 @@ # Else deliver the page if { ![empty_string_p $cr_item_id] } { + # we check if the user has access right to the item + #we analize now prerequisites. - the logic is identical to menu. + set community_id [dotlrn_community::get_community_id] + set user_id [ad_conn user_id] + + db_1row getitemattributes "select i.parent_item, + i.ims_item_id, + i.item_title as item_title, + i.prerequisites_s as prerequisites, + cr.mime_type + FROM + acs_objects o, ims_cp_items i, cr_items ci, cr_revisions cr, + ims_cp_manifest_class im, ims_cp_organizations org + WHERE + o.object_type = 'ims_item_object' + AND + i.org_id = org.org_id + AND + o.object_id = i.ims_item_id + AND + im.man_id=:man_id + and + i.ims_item_id=:revision_id + and im.isenabled='t' + and im.community_id=:community_id + and ci.item_id=cr.item_id + and cr.revision_id=i.ims_item_id + " + + #regsub -all {&} $prerequisites " " prerequisites + regsub -all {[\{\}]} $prerequisites "" prerequisites + regsub -all { & } $prerequisites " " prerequisites + set prerequisites_list [split $prerequisites] + + foreach prer $prerequisites_list { + if { ! [empty_string_p $prer] } { + ns_log warning "MENU prerequisites for $item_id are $prer " + #in the following query we disregard the organization + if { ! [ db_0or1row givemeid "select i.ims_item_id as id_from_ref, i.item_title as id_from_ref_title + from + ims_cp_items i, + ims_cp_manifest_class im, + ims_cp_organizations o + WHERE + i.identifier=:prer + AND + o.org_id = i.org_id + AND + o.man_id = :man_id + AND + im.man_id= :man_id + AND + im.isenabled='t' + AND + im.community_id=:community_id" + ] } { + ns_log warning "RECORD_VIEW: prerequisites not found comm: $community_id, man: $man_id, item: $item_id" + continue + } else { + ns_log debug "RECORD_VIEW: THE REQUIRED ITEM IS $id_from_ref " + } + } + if { ! [empty_string_p $id_from_ref] } { + ns_log warning "RECORD_VIEW: prerequisites for $item_id are $id_from_ref" + if { ! [ db_0or1row isanysuspendedsession " + select lorsm.track_id as track_id, cmi.lesson_status as lex_status + from lorsm_student_track lorsm, lorsm_cmi_core cmi + where + lorsm.user_id = $user_id + and + lorsm.community_id = $community_id + and + lorsm.course_id = $man_id + and + lorsm.track_id = cmi.track_id + and + cmi.man_id = $man_id + and + cmi.item_id = $id_from_ref + order by + lorsm.track_id desc + " ] } { + ns_log warning "RECORD_VIEW: NOT FOUND TRACK" + append errormessage "Not attempted : $id_from_ref_title ($id_from_ref)" + append errormessage "
" + ns_log warning $errormessage + } else { + switch -regexp $lex_status { + "^passed$" { ns_log warning "ITEM ID $id_from_ref HAS A TRACK WITH $lex_status"} + "^completed$" { ns_log warning "ITEM ID $id_from_ref HAS A TRACK WITH $lex_status" } + default { + ns_log warning "ITEM ID $id_from_ref HAS A TRACK WITH $lex_status" + append errormessage "$lex_status : $id_from_ref_title ($id_from_ref)" + append errormessage "
" + ns_log warning $errormessage + } + } + } + #if found session for id_from_ref + } + #if found id_from_ref + } + #foreach close + + if { [info exists errormessage] } { + ns_log warning $errormessage + append message " + + + + + +

$item_title :


+
Please first complete following items :


+" $errormessage + ns_return 200 text/html $message + ad_script_abort + } + # This is the revision of the file (html, jpg, etc) set cr_revision_id [item::get_best_revision $cr_item_id] set cr_item_mime [item::get_mime_info $cr_revision_id mime_info] - if { ![string equal -length 4 "text" $mime_info(mime_type)] } { - # It's a file. + if { ![string equal -length 4 "text" $mime_info(mime_type)] || [string equal "text/xml" $mime_info(mime_type)]} { + # It's a binary or XML file. + ns_log debug "BINARY/XML FILE FROM RECORD VIEW" + ns_log debug "lorsm - (SCORM) record-view - TEXT - it's a file. should we get an error?" cr_write_content -revision_id $cr_revision_id ad_script_abort } else { + # It's a textual/xml file. set href "$url2/$href" regsub -all {//} $href {/} href set ims_item_id $cr_revision_id # lorsm::set_content_root content_root lorsm::set_ims_item_id $item_id + ns_log debug "SCORM record-view : TEXT - $href cr_item_id $cr_item_id item_id $item_id ims_item_id $ims_item_id revision_id $revision_id " + + ad_set_client_property lorsm ims_id $item_id + #ad_set_client_property lorsm ims_id $revision_id + # we use nsv variables to set the delivery environment this is a # temporary solution until we find something a bit better if {[nsv_exists delivery_vars [ad_conn session_id]]} { nsv_unset delivery_vars [ad_conn session_id] } - nsv_set delivery_vars [ad_conn session_id] [list] + #the delivery environment is passed to view/index.vuh which fetches + #everything from content repository + nsv_set delivery_vars [ad_conn session_id] [list] nsv_lappend delivery_vars [ad_conn session_id] $content_root - ad_returnredirect [export_vars -base view/$href {ims_item_id man_id} ] + nsv_lappend delivery_vars [ad_conn session_id] $item_id + + ad_returnredirect [export_vars -base view/$href {ims_item_id} ] ad_script_abort } } else { lorsm::set_ims_item_id $item_id + ns_log debug "lorsm - (SCORM) record-view - EMPTY CR_ITEM_ID - cr_item_id $cr_item_id item_id $item_id" + ad_set_client_property lorsm ims_id $item_id + # We have no content, so wipe item_id from the lorsm namespace # This fixes a strange bug if you click a 'no content' menu item # repeatedly and different content appears! + if { [info exists lorsm::item_id] } { set lorsm::item_id "" } - set delivery_format [db_string get_format "select folder_name from lorsm_course_presentation_formats f, ims_cp_manifests m where f.format_id=m.course_presentation_format and m.man_id=:man_id"] - if {$delivery_format eq "delivery-progress-bar"} { - rp_form_put __include /packages/lorsm/lib/default - rp_internal_redirect /packages/lorsm/www/delivery/delivery-progress-bar - ad_script_abort - } rp_internal_redirect -absolute_path [acs_root_dir]/templates/lorsm-default - } - } } \ No newline at end of file Index: openacs-4/packages/lorsm/www/delivery/scorm.css =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/www/delivery/scorm.css,v diff -u -r1.2 -r1.3 --- openacs-4/packages/lorsm/www/delivery/scorm.css 7 Jun 2006 14:05:44 -0000 1.2 +++ openacs-4/packages/lorsm/www/delivery/scorm.css 13 Aug 2007 09:20:16 -0000 1.3 @@ -1,19 +1,19 @@ /* body {background: url(/dotlrn/resources/00_sfondo.gif) repeat-x top;} */ body {background-color: #000; } - a { font-family: Helvetica,Arial; +a { font-family: Helvetica,Arial; font-weight: bold; font-size: 0.7em; color: #FFFFFF; - white-space:normal; - } + white-space:normal; +} - a.current a:active { font-family: Helvetica,Arial; +a.current a:active { font-family: Helvetica,Arial; font-weight: bold; font-size: 0.7em; color: #FFFF00; white-space:normal; - } +} a.two { color: #6A6; } a.one { color: #fff; } @@ -39,8 +39,29 @@ border: 3px inset #00b; } +h1, h2, h3, h4, h5, h6 { + font-family: Helvetica,Arial; + font-weight: bold; + color: #fff; + white-space:normal; +} +.organization_class { + font-family: Helvetica,Arial; + font-weight: bold; + font-size: 12px; + color: #fff; + white-space:normal; +} +.usermessage_class { + font-family: Helvetica,Arial; + font-weight: bold; + font-size: 0.7em; + white-space:normal; + color: red; +} + /* a.button { font: 65% arial; border: solid 1px black; Index: openacs-4/packages/lorsm/www/delivery/servlet.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/www/delivery/servlet.tcl,v diff -u -r1.3 -r1.4 --- openacs-4/packages/lorsm/www/delivery/servlet.tcl 15 May 2007 20:14:46 -0000 1.3 +++ openacs-4/packages/lorsm/www/delivery/servlet.tcl 13 Aug 2007 09:20:16 -0000 1.4 @@ -13,8 +13,12 @@ } -errors { } -#set the following accordingly to Debug, Warning or Notice -set level "Debug" +#set the following accordingly to debug or Notice +set basiclevel "debug" +set tracelevel "debug" +#tracelevel debug will show messages only at debug level +#tracelevel Notice will show all messages. same goes for basiclevel +#see index.tcl for setting java/javascript debugging by setting debuglevel #try to circumvent browsers caching strategies set s [ns_set new] @@ -27,58 +31,100 @@ set user_id [ad_conn user_id] acs_user::get -user_id $user_id -array user set username $user(username) +ns_log $tracelevel "---------------------------------------" +ns_log $basiclevel " LMS Rte server START" +ns_log $tracelevel "---------------------------------------" +ns_log $tracelevel "username: $username" set currentcourse [ad_get_client_property lorsm currentcourse] +ns_log $tracelevel "man_id: $currentcourse" #this is not used in this proc, so far set currentpage [ad_get_client_property lorsm ims_id] -# currentcourse is the package, currentpage is the item -# this is not working consistently set whichpage [lorsm::get_ims_item_id] -ns_log Notice "delivery-scorm::servlet username $username , currentcourse $currentcourse , currentpage $currentpage" +set initedonpage [ad_get_client_property lorsm initedonpage] +ns_log $basiclevel "lorsm ims_item_id $currentpage" +ns_log $basiclevel "lorsm initedonpage $initedonpage" + if { ! ($currentpage>0) } { - ns_log warning "lorsm - ERROR SESSION lorsm ims_id returned is $currentpage" - set currentpage 0 + ns_log $basiclevel "SCORM missing ims_item_id : $currentpage" } -ns_log $level "lorsm - currentpage $currentpage " -ns_log $level "lorsm - beginning transaction for user: $user_id course: $currentcourse page (ims_item_id): $currentpage" +set community_id [dotlrn_community::get_community_id] +ns_log $basiclevel "SCORM user: $user_id course: $currentcourse ims_item_id: $currentpage community_id: $community_id" + if { $user_id == 0 } { - #_return 303 text/plain "101" - ns_return 504 text/plain "Error=101,ErrorDescription=\"Not logged in\"" + #http 401 is unauthorized + ns_return 401 text/plain "Error=101,ErrorDescription=\"Not logged in\"" } if { $currentcourse == "" } { - ns_return 504 text/plain "Error=102,ErrorDescription=\"No current course (how did you get here?)\"" + #http 303 is error: but the answer should be found elsewhere + ns_return 303 text/plain "Error=102,ErrorDescription=\"No current course (how did you get here?)\"" } if { ! [info exists functionCalled] } { - ns_return 504 text/plain "Error=104,ErrorDescription=\"No function specified\"" + #http 400 BAD request: returned as well as when functionCalled is nonsense (see end of switch) + ns_return 400 text/plain "Error=104,ErrorDescription=\"No function specified\"" } set currenttrackid [ad_get_client_property lorsm currenttrackid] set lorsmstudenttrack [ad_get_client_property lorsm studenttrack] -set community_id [dotlrn_community::get_community_id] set package_id [ad_conn package_id] -ns_log $level "Applet beginning with parameters current: $currenttrackid lorsm - $lorsmstudenttrack community: $community_id" +ns_log $basiclevel "SCORM $functionCalled " +ns_log $basiclevel "SCORM tracking (client properties): currenttrackid: $currenttrackid lorsmtrack: $lorsmstudenttrack " ad_get_user_info set name $last_name #seems ADL wants a comma between lastname and christian append name ", " append name $first_names +if { $initedonpage != $currentpage } { + if { $functionCalled != "cmigetcat" } { + if { $functionCalled != "keepalive" } { + ns_log warning "SCORM jumping to different courses WITHOUT init!!!" + } else { + ns_log warning "SCORM keepalive still alive after LMSFinish" + } + #c'e' stato un cambiamento di item + set lorsmstudenttrack "" + ad_set_client_property lorsm initedonpage $currentpage + } +} + switch -regexp $functionCalled { null - + keepalive + { + ns_return 200 text/plain "OK" + ns_log warning "SCORM Keepalive" + } cmigetcat { - ns_log $level "lorsm - serving LMSInitialize from applet" + ns_log $tracelevel "---------------------------------------" + ns_log $basiclevel " LMSInitialise " + ns_log $tracelevel "---------------------------------------" + + if { $initedonpage != $currentpage } { + #c'e' stato un cambiamento di item + set lorsmstudenttrack "" + ad_set_client_property lorsm initedonpage $currentpage + } + if { $lorsmstudenttrack == 0 || $lorsmstudenttrack == "" } { - ns_log $level "lorsm - called with no track id for current session (istrackable is off): try to fetch one" + ns_log $basiclevel "SCORM : lorsm student new track " #here track id was not set (course is not lors-trackable) #we should first try to see if we find an already open track in lorsm.track + set lorsmstudenttrack [lorsm::track::new \ + -user_id $user_id \ + -community_id $community_id \ + -course_id $currentcourse] + ad_set_client_property lorsm studenttrack $lorsmstudenttrack + ns_log $basiclevel "SCORM tracking has in any case created a lorsm_student_tracking track_id: $lorsmstudenttrack" if { ! [ db_0or1row isanysuspendedsession " - select lorsm.track_id as track_id from lorsm_student_track lorsm, lorsm_cmi_core cmi + select lorsm.track_id as track_id from + lorsm_student_track lorsm, lorsm_cmi_core cmi where lorsm.user_id = $user_id and @@ -88,41 +134,32 @@ and lorsm.track_id = cmi.track_id and - not ( - cmi.lesson_status = 'completed' - or - cmi.lesson_status = 'passed' - ) - and cmi.man_id = $currentcourse and cmi.item_id = $currentpage order by lorsm.track_id desc limit 1 " ] } { #faccio un nuovo trackid + #and + # not ( + # cmi.lesson_status = 'completed' + # or + # cmi.lesson_status = 'passed' + # ) #we create a new track which is going to be the new 'master track' for this cmi data set - set currenttrackid [lorsm::track::new \ - -user_id $user_id \ - -community_id $community_id \ - -course_id $currentcourse] - ad_set_client_property lorsm studenttrack $currenttrackid - ns_log $level "lorsm - Tracking has generated a lorsm_student_track new track id: $currenttrackid" + set currenttrackid $lorsmstudenttrack + ns_log $basiclevel "SCORM new track id: $currenttrackid" } else { - ns_log $level "lorsm - Tracking has not found a lorsm_cmi_core track with a non completed nor passed session." set currenttrackid $track_id - set lorsmstudenttrack [lorsm::track::new \ - -user_id $user_id \ - -community_id $community_id \ - -course_id $currentcourse] - ns_log $level "lorsm - Tracking has in any case created a lorsm_student_tracking track_id: $lorsmstudenttrack" - ad_set_client_property lorsm studenttrack $lorsmstudenttrack + ns_log $basiclevel "SCORM found a lorsm_cmi_core track with a non completed nor passed session." } } else { - ns_log $level "lorsm - called with track id for current session (=$lorsmstudenttrack) (istrackable is on): going to check whether to create a lorsm_cmi_core new track" + ns_log $basiclevel "SCORM already has current session (=$lorsmstudenttrack) (istrackable is on): going to check if the session is ok for current item" #now we look for the existance of a lorsm.cmi.core track id for this user / course / class which is still not completed if { ! [ db_0or1row isanysuspendedsession " - select lorsm.track_id as track_id from lorsm_student_track lorsm, lorsm_cmi_core cmi + select lorsm.track_id as track_id + from lorsm_student_track lorsm, lorsm_cmi_core cmi where lorsm.user_id = $user_id and @@ -132,69 +169,92 @@ and lorsm.track_id = cmi.track_id and - not ( - cmi.lesson_status = 'completed' - or - cmi.lesson_status = 'passed' - ) - and cmi.man_id = $currentcourse and cmi.item_id = $currentpage order by lorsm.track_id desc limit 1 " ] } { + #and + # not ( + # cmi.lesson_status = 'completed' + # or + # cmi.lesson_status = 'passed' + # ) + #the reasoning here is as follows: i had a $lorsmstudenttrack + #but not track for the course in lorsm_cmi_core. therefore i need to change the + #"student" track + set lorsmstudenttrack [lorsm::track::new \ + -user_id $user_id \ + -community_id $community_id \ + -course_id $currentcourse] + ad_set_client_property lorsm studenttrack $lorsmstudenttrack set currenttrackid $lorsmstudenttrack } else { set currenttrackid $track_id } } - #in any case at this stage track_id is currentely set to the value it should have in lorsm_cmi_core (disregarding if we have still to create it) + #at this stage currenttrackid is the value it should have in lorsm_cmi_core if { ! [ db_0or1row istherealready "select * from lorsm_cmi_core where track_id = :currenttrackid "]} { - ns_log $level "lorsm - Inserting track id in lorsm_cmi_core: value will be $currenttrackid" - ns_log $level "lorsm - I now have a track_id=$currenttrackid but i cannot find no corresponding record in lorsm_cmi_core " + ns_log $basiclevel "SCORM new RTE lorsm_cmi_core: id $currenttrackid" #get initialization data from manifest data already imported - if { [ db_0or1row get_adlcp_student_data { select datafromlms,maxtimeallowed,timelimitaction,masteryscore from ims_cp_items where ims_item_id=:currentpage; } ] } { - ns_log $level "lorsm - data for lorsm_cmi_student_data is $datafromlms, $maxtimeallowed, $timelimitaction, $masteryscore" - } else { - ns_log warning "lorsm - COULD NOT RETRIEVE DATA FROM LORSM_CMI_STUDENT_DATA from IMS_CP_ITEMS possibily ims_item_id should be $currentpage" - } - + db_0or1row get_adlcp_student_data { select datafromlms,maxtimeallowed,timelimitaction,masteryscore from ims_cp_items where ims_item_id=:currentpage; } + ns_log $basiclevel "SCORM data for lorsm_cmi_student_data is $datafromlms, $maxtimeallowed, $timelimitaction, $masteryscore" + # + # lesson_location is the bookmark. + # lesson_status is initialized to 'not attempted' # - db_dml lmsinitialize { insert into lorsm_cmi_core(track_id,man_id,item_id,student_id,student_name,lesson_location, + db_dml lmsinitialize { insert into lorsm_cmi_core(track_id,man_id,item_id,student_id,student_name, + lesson_location, lesson_status, launch_data, comments,comments_from_lms, session_time, total_time, time_stamp) - values(:currenttrackid,:currentcourse,:currentpage,:username,:name,:currentcourse, + values(:currenttrackid,:currentcourse,:currentpage,:username,:name, + '', 'not attempted', :datafromlms, - '','commenti da lors',0,0,CURRENT_TIMESTAMP) } + '','',0,0,CURRENT_TIMESTAMP) } + ns_log $basiclevel "SCORM Data inserting into lorsm_student_data $currenttrackid $username $maxtimeallowed" db_dml lmsinitialize { insert into lorsm_cmi_student_data(track_id,student_id,max_time_allowed,time_limit_action,mastery_score) values(:currenttrackid,:username,:maxtimeallowed,:timelimitaction,:masteryscore) } ad_set_client_property lorsm currenttrackid $currenttrackid - db_1row istherealready "select * from lorsm_cmi_core where track_id = :currenttrackid" + db_0or1row istherealready "select * from lorsm_cmi_core where track_id = :currenttrackid" #AURALOG HACK #adjust on a per-server basis - if { $currentcourse == 11287 } { - set student_id "testscorm711" - } +#if { $currentcourse == 6280 } { +#set student_id "testscorm727" +#} set returndata "cmi.core.student_id=$student_id,cmi.core.student_name=$name," append returndata "cmi.core.lesson_status=$lesson_status,cmi.core.credit=credit,cmi.core.entry=ab-initio," append returndata "cmi.core.lesson_mode=normal," append returndata "cmi.student_preference.language=italian,cmi.comments=$comments,cmi.comments_from_lms=$comments_from_lms" append returndata ",cmi.suspend_data=$suspend_data,cmi.launch_data=$launch_data" - append returndata ",cmi.student_data.max_time_allowed=$maxtimeallowed,cmi.student_data.time_limit_action=$timelimitaction" + append returndata ",cmi.student_data.max_time_allowed=$maxtimeallowed,cmi.student_data.timelimitaction=$timelimitaction" append returndata ",cmi.student_data.mastery_score=$masteryscore" } else { + ns_log $basiclevel "SCORM found RTE lorsm_cmi_core: id $currenttrackid" ad_set_client_property lorsm currenttrackid $currenttrackid #retrieve data other than core - db_0or1row get_adlcp_student_data { select max_time_allowed,time_limit_action,mastery_score from lorsm_cmi_student_data where track_id=:currenttrackid; } - # - ns_log $level "lorsm - retrieved track id in lorsm_cmi_core: $currenttrackid" + if { ! [db_0or1row get_adlcp_student_data " select max_time_allowed ,time_limit_action ,mastery_score from lorsm_cmi_student_data where track_id=:currenttrackid "] } { + ns_log Error "SCORM recoverying of student data: not successfull on $currenttrackid -> please check" + set max_time_allowed "" + set time_limit_action "" + set mastery_score "" + } else { + ns_log debug "SCORM recoverying of student data: successfull" + } + # THIS CHECK is somehow just a previous bug catcher, shouldn't actually be needed + # if { [db_resultrows] == 1 } { + # ns_log debug "SCORM recoverying of student data: successfull" + # } else { + # ns_log Error "SCORM recoverying of student data: not successfull on $currenttrackid -> please check" + # } + + ns_log $basiclevel "SCORM retrieved track id in lorsm_cmi_core: $currenttrackid" # summing up session time to total_time set total_time [expr $total_time + $session_time] set total_time_ms [expr $total_time_ms + $session_time_ms] @@ -206,27 +266,30 @@ # erasing session time from server and updating current total time set todo "UPDATE lorsm_cmi_core SET total_time = '$total_time" append todo "', total_time_ms ='$total_time_ms' " - append todo " WHERE track_id=:currenttrackid" + #append todo " WHERE track_id=:currenttrackid" + append todo " WHERE track_id=$currenttrackid" db_dml todo $todo if { [db_resultrows] == 1 } { - #ns_log $level "lorsm - time processing UPDATE: '$todo' successfull" + ns_log debug "SCORM time processing UPDATE: '$todo' successfull" } else { - ns_log Warning "lorsm - time processing UPDATE: '$todo' not successfull -> please check" + ns_log Warning "SCORM time processing UPDATE: '$todo' not successfull -> please check" } set todo "UPDATE lorsm_cmi_core SET session_time = '0" append todo "', session_time_ms ='0' " - append todo " WHERE track_id=:currenttrackid" + #append todo " WHERE track_id=:currenttrackid" + append todo " WHERE track_id=$currenttrackid" db_dml todo $todo if { [db_resultrows] == 1 } { - #ns_log $level "lorsm - data processing UPDATE: '$todo' successfull" + ns_log debug "SCORM data processing UPDATE: '$todo' successfull" } else { - ns_log Warning "lorsm - time processing UPDATE: '$todo' not successfull -> please check" + ns_log Warning "SCORM time processing UPDATE: '$todo' not successfull -> please check" } #AURALOG HACK #adjust on a per-server basis - if { $currentcourse == 11287 } { - set student_id "testscorm711" - } + #if { $currentcourse == 6280 } { + # set student_id "testscorm727" + #} + set returndata "cmi.core.student_id=$student_id,cmi.core.student_name=$name," append returndata "cmi.core.credit=$credit,cmi.core.lesson_status=$lesson_status,cmi.core.entry=$entry," append returndata "cmi.core.lesson_mode=normal,cmi.core.lesson_location=$lesson_location," @@ -235,40 +298,47 @@ append returndata ",cmi.student_data.max_time_allowed=$max_time_allowed,cmi.student_data.time_limit_action=$time_limit_action" append returndata ",cmi.student_data.mastery_score=$mastery_score" } - # AURALOG HACK - #treating time from table back to system (lorsm.cmi.time fields are showing just seconds) set prefix "0" set hours [expr int ($session_time/3600) ] set minutes [expr int (($session_time - (3600*$hours)) / 60) ] set seconds [expr int (($session_time - (3600*$hours)-$minutes*60)) ] + if { [ string length $session_time_ms] == 1 } { set session_time_ms "$prefix$session_time_ms" } if { [ string length $hours ] == 1 } { set hours "$prefix$hours" } if { [ string length $minutes] == 1 } { set minutes 0$minutes } if { [ string length $seconds] == 1 } { set seconds 0$seconds} - #set session_time "$hours:$minutes:$seconds.00" - set session_time "$hours:$minutes:$seconds" - if { ! [empty_string_p $session_time_ms] } { append session_time ".$session_time_ms" } + set session_time "$hours:$minutes:$seconds.$session_time_ms" + #if { ! [empty_string_p $session_time_ms] } { append session_time ".$session_time_ms" } set hours [expr int ($total_time/3600) ] set minutes [expr int (($total_time - (3600*$hours)) / 60) ] set seconds [expr int (($total_time - (3600*$hours)-$minutes*60)) ] + if { [ string length $total_time_ms] == 1 } { set total_time_ms "$prefix$total_time_ms" } if { [ string length $hours ] == 1 } { set hours "$prefix$hours" } if { [ string length $minutes] == 1 } { set minutes 0$minutes } if { [ string length $seconds] == 1 } { set seconds 0$seconds} - #set total_time "$hours:$minutes:$seconds.00" - set total_time "$hours:$minutes:$seconds" - if { ! [empty_string_p $total_time_ms] } { append total_time ".$total_time_ms" } + set total_time "$hours:$minutes:$seconds.$total_time_ms" + #if { ! [empty_string_p $total_time_ms] } { append total_time ".$total_time_ms" } #appending time fields to return string append returndata ",cmi.core.session_time=$session_time,cmi.core.total_time=$total_time" - ns_log $level "lorsm - passing data back to applet : $returndata" + ns_log $basiclevel "SCORM initialised, sending data to applet" + ns_log $tracelevel "$returndata" ns_return 200 text/plain "$returndata" } cmiputcat* { - ns_log $level "lorsm - serving LMSCOMMIT or LMSFINISH from applet" - ns_log $level "lorsm - received data $data from applet: processing. Reference cmi track is $currenttrackid, while lorsmstudenttrack is: $lorsmstudenttrack" + ns_log $tracelevel "---------------------------------------" + switch $functionCalled { + cmiputcat { + ns_log $basiclevel " LMSCommit" } + cmiputcatONFINISH { + ns_log $basiclevel " LMSFinish" } + } + ns_log $tracelevel "---------------------------------------" + ns_log $tracelevel "received data $data from applet: processing. " + ns_log $tracelevel "Reference cmi track is $currenttrackid, while lorsmstudenttrack is: $lorsmstudenttrack" set preparselist [lrange [ split $data "," ] 1 end] set lista [list] set value "" @@ -277,50 +347,45 @@ if { [ regexp ^cmi\.* $couple ] } { if { ! [empty_string_p $value] } { set value [concat [lindex $lista end],$value] - ns_log $level "lorsm - PARSER ending recomposing $value " + ns_log debug "SCORM PARSER ending recomposing $value " set lista [lreplace $lista end end $value] set value "" } else { - ns_log $level "lorsm - PARSER full couple $couple " + ns_log debug "SCORM PARSER full couple $couple " lappend lista $couple } } else { - ns_log $level "lorsm - PARSER partial couple $couple " + ns_log debug "SCORM PARSER partial couple $couple " set value [concat $value,$couple] - ns_log $level "lorsm - PARSER partial couple $couple " + ns_log debug "SCORM PARSER partial couple $couple " } } if { ! [empty_string_p $value] } { set value [concat [lindex $lista end],$value] - ns_log $level "lorsm - PARSER ending recomposing $value " + ns_log debug "SCORM PARSER ending recomposing $value " set lista [lreplace $lista end end $value] set value "" } - #end splitting + #end splitting list from applet foreach couple $lista { set all "" set request "" set value "" #create list named item to contain request and value regexp \(\[^=\]+\)=\(\.*\)$ $couple all request value - #set request "cmi.$request" - ns_log $level "lorsm - request from applet is $all that is $request to $value" - #set request [lindex $item 0] - #set value [lindex $item 1] + ns_log debug "SCORM request from applet is $all that is $request to $value" if { [ string length $value ] == 0 } { - ns_log Warning "lorsm - EMPTY settings : '$request' received and empty -> treating this applet anyway" + ns_log debug "SCORM EMPTY settings : '$request' received and empty -> won't skip" } - #else { set table [lindex [split $request .] 1] set column [string trim [lindex [split $request .] 2]] switch $table { null - - "" { - ns_log Warning "lorsm - EMPTY TABLENAME : '$table', '$column' not implemented -> not treating this applet request" - } + "" { ns_log debug "SCORM EMPTY TABLENAME : '$table', '$column' not implemented -> not treating this applet request" } core { if { [ string compare "total_time" $column ] } { - # time fields get a separate treatment + # string compare returns 0 for equal, -1 or +1 in other cases + # time fields preprocessing if { [ string first "time" $column ] >0 } { # conversion of HHHH:MM:SS.SS # removing leading zeros: @@ -329,40 +394,57 @@ regsub {^0} [lindex [split $value :] 1] "" minutes regsub {^0} [lindex [split $value :] 2] "" seconds regsub {^0} [lindex [split $value .] 1] "" msecs - if { [empty_string_p $msecs] } { - set msecs 0 - } + if { [empty_string_p $hours] } { set hours 0 } + if { [empty_string_p $minutes] } { set minutes 0 } + if { [empty_string_p $seconds] } { set seconds 0 } + if { [empty_string_p $msecs] } { set msecs 0 } set column_ms $column append column_ms "_ms" set todo "UPDATE lorsm_cmi_$table SET $column_ms = '" append todo $msecs - append todo "' WHERE track_id=:currenttrackid" + append todo "' WHERE track_id=$currenttrackid" + #append todo "' WHERE track_id=:currenttrackid" db_dml todo $todo if { [db_resultrows] == 1 } { - ns_log $level "lorsm - data msecs processing UPDATE: '$todo' successfull" + ns_log debug "SCORM data msecs processing UPDATE: '$todo' successfull" } else { - ns_log Warning "lorsm - data msecs processing UPDATE: '$todo' not successfull -> please check" + ns_log Warning "SCORM data msecs processing UPDATE: '$todo' not successfull -> please check" } #set minutes [string trim [lindex [split $value :] 1]] #set seconds [string trim [lindex [split $value :] 2]] set value [expr int (( $hours*60 + $minutes ) * 60 + $seconds) ] } + set todo "UPDATE lorsm_cmi_$table SET $column = '" append todo $value - append todo "' WHERE track_id=:currenttrackid" + append todo "' WHERE track_id=$currenttrackid" + #append todo "' WHERE track_id=:currenttrackid" db_dml todo $todo if { [db_resultrows] == 1 } { - ns_log $level "lorsm - data processing UPDATE: '$todo' successfull" + ns_log debug "SCORM data processing UPDATE: '$todo' successfull" } else { - ns_log Warning "lorsm - data processing UPDATE: '$todo' not successfull -> please check" + ns_log Warning "SCORM data processing UPDATE: '$todo' not successfull -> please check" + } + + #lesson_status postprocessing + if { ! [ string compare "lesson_status" $column ] } { + ns_log notice "LESSON STATUS set to $value, cascading down the tree" + #lesson status can be: + #Passed + #Completed + #Browsed + #Failed + #Not attempted + #Incomplete + ns_log debug "SCORM servlet: lesson_status postprocessing" + lorsm::delivery::scorm::check_parents -ims_item_id $currentpage } } } default { - ns_log Warning "lorsm - table: '$table', '$column' not implemented -> not treating this applet request" + ns_log Warning "SCORM table: '$table', '$column' not implemented -> not treating this applet request" } } - #} this was the if for empty value setting requests } switch $functionCalled { cmiputcat { @@ -372,25 +454,29 @@ lorsm::track::exit -track_id $currenttrackid } else { #speficic for courses for which istrackable is on lorsm::track::exit -track_id $lorsmstudenttrack } - ns_log $level "lorsm - post LMSCommit (trackid=$currenttrackid)" ns_return 200 text/plain "OK" + ns_log $basiclevel "SCORM post LMSCommit (trackid=$currenttrackid)" } cmiputcatONFINISH { set lorsmstudenttrack [ad_get_client_property lorsm studenttrack] ad_set_client_property lorsm studenttrack "" ad_set_client_property lorsm currenttrackid "" + ad_set_client_property lorsm initedonpage "" if { $lorsmstudenttrack == "" || $lorsmstudenttrack == 0 } { lorsm::track::exit -track_id $currenttrackid } else { #speficic for courses for which istrackable is on lorsm::track::exit -track_id $lorsmstudenttrack } ns_return 200 text/plain "OK" - ns_log $level "lorsm - post LMSFinish (trackid=$currenttrackid) sent ok to applet" + ns_log $basiclevel "SCORM post LMSFinish (trackid=$currenttrackid) sent ok to applet" } } } default { - ns_return 504 text/plain "Error=103,ErrorDescription=\"No functionCalled meaningful value provided\"" + #returning a BAD REQUEST and not a GATEWAY ERROR !!! + ns_return 400 text/plain "Error=103,ErrorDescription=\"No functionCalled meaningful value provided\"" } } -ns_log $level "lorsm - RTE process ending" +ns_log $tracelevel "---------------------------------------" +ns_log $basiclevel " LMS Rte server END" +ns_log $tracelevel "---------------------------------------" Index: openacs-4/packages/lorsm/www/delivery/stuff.jar =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/www/delivery/stuff.jar,v diff -u -r1.2 -r1.3 Binary files differ Index: openacs-4/packages/lorsm/www/delivery/view/index.vuh =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/www/delivery/view/index.vuh,v diff -u -r1.3 -r1.4 --- openacs-4/packages/lorsm/www/delivery/view/index.vuh 7 Jun 2006 14:05:45 -0000 1.3 +++ openacs-4/packages/lorsm/www/delivery/view/index.vuh 13 Aug 2007 09:20:16 -0000 1.4 @@ -40,6 +40,8 @@ set template_root [db_string template_root ""] +ns_log debug "view/index.vuh serving the url : $the_url with template root: $template_root" + # Serve the page # DRB: Note that content::init modifies the local variable the_root, which is treated # as though it's been passed by reference. This requires that the redirect treat the @@ -71,10 +73,12 @@ cr_write_content -revision_id $revision_id } else { # Write the ims_item_id that we recieve on the page since this is the one that holds the content - cr_write_content -revision_id $ims_item_id + ns_log warning "We have no CONTENT for this url: $the_url " + #cr_write_content -revision_id $ims_item_id } -ad_script_abort +#ad_script_abort + if { [lorsm::init the_url the_root $content_root $template_root public "" $content_type] } { # we introduced our own template rp_internal_redirect -absolute_path [acs_root_dir]/templates/lorsm-default Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/lorsm/www/resources/lorsm-portlet.js'. Fisheye: No comparison available. Pass `N' to diff? Index: openacs-4/packages/lorsm/www/resources/icons/flag_blue.gif =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/www/resources/icons/flag_blue.gif,v diff -u -r1.1 -r1.2 Binary files differ Index: openacs-4/packages/lorsm/www/resources/icons/flag_green.gif =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/www/resources/icons/flag_green.gif,v diff -u -r1.1 -r1.2 Binary files differ Index: openacs-4/packages/lorsm/www/resources/icons/flag_orange.gif =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/www/resources/icons/flag_orange.gif,v diff -u -r1.1 -r1.2 Binary files differ Index: openacs-4/packages/lorsm/www/resources/icons/flag_red.gif =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/www/resources/icons/flag_red.gif,v diff -u -r1.1 -r1.2 Binary files differ Index: openacs-4/packages/lorsm/www/resources/icons/flag_white.gif =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/www/resources/icons/flag_white.gif,v diff -u -r1.1 -r1.2 Binary files differ Index: openacs-4/packages/lorsm/www/resources/icons/folder.gif =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/www/resources/icons/folder.gif,v diff -u -r1.1 -r1.2 Binary files differ Index: openacs-4/packages/lorsm/www/resources/icons/folder_page.gif =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/www/resources/icons/folder_page.gif,v diff -u -r1.1 -r1.2 Binary files differ Index: openacs-4/packages/lorsm/www/resources/icons/icon_accept.gif =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/www/resources/icons/icon_accept.gif,v diff -u -r1.1 -r1.2 Binary files differ Index: openacs-4/packages/lorsm/www/resources/icons/page_lock.gif =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/www/resources/icons/page_lock.gif,v diff -u -r1.1 -r1.2 Binary files differ Index: openacs-4/packages/lorsm/www/resources/icons/page_tick.gif =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lorsm/www/resources/icons/page_tick.gif,v diff -u -r1.1 -r1.2 Binary files differ