Index: openacs-4/packages/scorm-core/sql/postgresql/scorm-datamodel-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/scorm-core/sql/postgresql/scorm-datamodel-create.sql,v diff -u -N -r1.5 -r1.6 --- openacs-4/packages/scorm-core/sql/postgresql/scorm-datamodel-create.sql 23 May 2010 20:27:51 -0000 1.5 +++ openacs-4/packages/scorm-core/sql/postgresql/scorm-datamodel-create.sql 8 Jul 2010 01:14:22 -0000 1.6 @@ -361,10 +361,10 @@ c_raw real, scaled real, scaled_passing_score real, - session_time text, + session_time interval, success_status text, suspend_data text, - total_time text, + total_time interval, user_id integer constraint cp_node_user_id_fk references users @@ -450,6 +450,7 @@ scope_id integer, status text, objective_id text, + c_timestamp timestamptz, constraint cmi_gobjective_pk primary key (user_id, objective_id, scope_id) ); Index: openacs-4/packages/scorm-core/tcl/scorm-core-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/scorm-core/tcl/scorm-core-procs.tcl,v diff -u -N -r1.3 -r1.4 --- openacs-4/packages/scorm-core/tcl/scorm-core-procs.tcl 28 May 2010 21:23:04 -0000 1.3 +++ openacs-4/packages/scorm-core/tcl/scorm-core-procs.tcl 8 Jul 2010 01:14:22 -0000 1.4 @@ -123,6 +123,16 @@ -manifest $manifest } +ad_proc scorm_core::delete_course { + -course_id:required +} { + Delete a course and associated tracking data. +} { + db_1row get_folder_id {} + content::folder::delete -folder_id $folder_id -cascade_p t + package_exec_plsql -var_list [subst {{scorm_course_id $course_id}}] scorm_course delete +} + ad_proc scorm_core::update_rte_data { -scorm_course_id:required -manifest:required Index: openacs-4/packages/scorm-core/tcl/scorm-core-procs.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/scorm-core/tcl/scorm-core-procs.xql,v diff -u -N -r1.3 -r1.4 --- openacs-4/packages/scorm-core/tcl/scorm-core-procs.xql 28 May 2010 21:23:04 -0000 1.3 +++ openacs-4/packages/scorm-core/tcl/scorm-core-procs.xql 8 Jul 2010 01:14:22 -0000 1.4 @@ -38,6 +38,14 @@ + + + select folder_id + from scorm_courses + where scorm_course_id = :course_id + + + update cp_package Index: openacs-4/packages/scorm-player/embed/player.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/scorm-player/embed/player.adp,v diff -u -N -r1.3 -r1.4 --- openacs-4/packages/scorm-player/embed/player.adp 14 May 2010 16:57:54 -0000 1.3 +++ openacs-4/packages/scorm-player/embed/player.adp 8 Jul 2010 01:14:22 -0000 1.4 @@ -4,15 +4,15 @@ Index: openacs-4/packages/scorm-player/tcl/rte-api-init.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/scorm-player/tcl/rte-api-init.tcl,v diff -u -N -r1.1 -r1.2 --- openacs-4/packages/scorm-player/tcl/rte-api-init.tcl 13 May 2010 01:17:53 -0000 1.1 +++ openacs-4/packages/scorm-player/tcl/rte-api-init.tcl 8 Jul 2010 01:14:22 -0000 1.2 @@ -77,8 +77,9 @@ {completion_status W} {completion_threshold W} {cp_node_id CPNODEREF} {created W} {credit W} {delivery_speed W} {entry W} {exit W} {language W} {launch_data W} {learner_name LEARNERNAMEREF} {location W} {max W} {min W} {mode W} {modified W} - {progress_measure W} {raw W} {scaled W} {scaled_passing_score W} {session_time W} - {success_status W} {suspend_data W} {total_time W} {user_id USERREF} {timestamp TIMESTAMP}} + {progress_measure W} {raw W} {scaled W} {scaled_passing_score W} {session_time INTERVAL} + {success_status W} {suspend_data W} {total_time INTERVAL} {user_id USERREF} + {timestamp TIMESTAMP}} nsv_set scorm_schema comment_table \ {{cmi_comment_id KEY} {cmi_node_id KEYREF} {comment W} {timestamp TIMESTAMP} {location W} Index: openacs-4/packages/scorm-player/tcl/rte-api-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/scorm-player/tcl/rte-api-procs.tcl,v diff -u -N -r1.2 -r1.3 --- openacs-4/packages/scorm-player/tcl/rte-api-procs.tcl 19 May 2010 01:34:17 -0000 1.2 +++ openacs-4/packages/scorm-player/tcl/rte-api-procs.tcl 8 Jul 2010 01:14:22 -0000 1.3 @@ -300,6 +300,11 @@ TIMESTAMP { set data_row [lreplace $data_row $i $i [db_string now {}]] } + INTERVAL { + set data_row [lreplace $data_row $i $i \ + "[scorm_player::interval_to_seconds \ + -timestamp [lindex $data_row $i]] seconds"] + } CPNODEREF { set cp_node_id [lindex $data_row $i] if { ![db_0or1row check_cp_node_id {}] } { Index: openacs-4/packages/scorm-player/tcl/rte-api-procs.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/scorm-player/tcl/rte-api-procs.xql,v diff -u -N -r1.1 -r1.2 --- openacs-4/packages/scorm-player/tcl/rte-api-procs.xql 13 May 2010 01:17:53 -0000 1.1 +++ openacs-4/packages/scorm-player/tcl/rte-api-procs.xql 8 Jul 2010 01:14:22 -0000 1.2 @@ -60,7 +60,8 @@ update cmi_gobjective - set satisfied = :value + set satisfied = :value, + c_timestamp = current_timestamp where objective_id = :objective_id and user_id = :user_id and scope_id = :scope_id @@ -70,7 +71,8 @@ update cmi_gobjective - set measure = :value + set measure = :value, + c_timestamp = current_timestamp where objective_id = :objective_id and user_id = :user_id and scope_id = :scope_id @@ -82,7 +84,8 @@ update cmi_gobjective set measure = :measure, satisfied = :satisfied, - status = :completed + status = :completed, + c_timestamp = current_timestamp where objective_id = :objective_id and user_id = :user_id and scope_id = :scope_id @@ -92,18 +95,18 @@ insert into cmi_gobjective - (objective_id, user_id, satisfied, scope_id) + (objective_id, user_id, satisfied, scope_id, c_timestamp) values - (:objective_id, :user_id, :value, :scope_id) + (:objective_id, :user_id, :value, :scope_id, current_timestamp) insert into cmi_gobjective - (objective_id, user_id, measure, scope_id) + (objective_id, user_id, measure, scope_id, c_timestamp) values - (:objective_id, :user_id, :value, :scope_id) + (:objective_id, :user_id, :value, :scope_id, current_timestamp) Index: openacs-4/packages/scorm-player/tcl/scorm-player-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/scorm-player/tcl/scorm-player-procs.tcl,v diff -u -N -r1.2 -r1.3 --- openacs-4/packages/scorm-player/tcl/scorm-player-procs.tcl 21 May 2010 20:47:19 -0000 1.2 +++ openacs-4/packages/scorm-player/tcl/scorm-player-procs.tcl 8 Jul 2010 01:14:22 -0000 1.3 @@ -146,3 +146,46 @@ return [util::json::gen $init_object] } + +ad_proc scorm_player::interval_to_seconds { + -timestamp:required +} { + Convert a SCORM 2004 ISO 8601 interval to seconds. The particular format used in + SCORM 2004 is not direclty supported by Tcl, Tcllib, or PostgreSQL so we gotta convert + it ourselves. +} { + if { $timestamp eq "" } { + return -code error "timestamp can not be an empty string" + } + set multipliers {31557600 2629800 86400 3600 60} + set seconds 0 + set index 1 + if { [string first P $timestamp] == 0 } { + foreach delimiter {Y M D} { + if { [regexp "(\[\\d\]+)$delimiter" [string range $timestamp $index end] match digits] } { + incr seconds [expr {[lindex $multipliers 0] * $digits}] + incr index [string length $match] + } + set multipliers [lrange $multipliers 1 end] + } + if { [string range $timestamp $index $index] eq "T" } { + incr index + foreach delimiter {H M} { + if { [regexp "(\[\\d\]+)$delimiter" [string range $timestamp $index end] match digits] } { + incr seconds [expr {[lindex $multipliers 0] * $digits}] + incr index [string length $match] + } + set multipliers [lrange $multipliers 1 end] + } + if { [regexp {([\d]+[\.]?[\d]*)S} [string range $timestamp $index end] match digits] } { + incr seconds [expr {round($digits)}] + incr index [string length $match] + } + } + } + if { $index != [string length $timestamp]} { + return -code error "timestamp \"$timestamp\" is poorly formed" + } + return $seconds +} + Index: openacs-4/packages/scorm-simple-lms/catalog/scorm-simple-lms.en_US.ISO-8859-1.xml =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/scorm-simple-lms/catalog/scorm-simple-lms.en_US.ISO-8859-1.xml,v diff -u -N -r1.1 -r1.2 --- openacs-4/packages/scorm-simple-lms/catalog/scorm-simple-lms.en_US.ISO-8859-1.xml 10 Jun 2010 00:38:08 -0000 1.1 +++ openacs-4/packages/scorm-simple-lms/catalog/scorm-simple-lms.en_US.ISO-8859-1.xml 8 Jul 2010 01:14:22 -0000 1.2 @@ -8,13 +8,19 @@ Courses Course Name Creation Date +delete course +Delete Course edit properties Edit Properties For Course Mode +No normal offline online +Really Delete Course "%course_title%"? Status Upload New Course +upload new version +Yes Index: openacs-4/packages/scorm-simple-lms/www/admin/confirm-delete.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/scorm-simple-lms/www/admin/confirm-delete.adp,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/scorm-simple-lms/www/admin/confirm-delete.adp 8 Jul 2010 01:14:22 -0000 1.1 @@ -0,0 +1,7 @@ + +@title;noquote@ +@context;noquote@ + +

#scorm-simple-lms.Really_Delete_Course#

+ + Index: openacs-4/packages/scorm-simple-lms/www/admin/confirm-delete.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/scorm-simple-lms/www/admin/confirm-delete.tcl,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/scorm-simple-lms/www/admin/confirm-delete.tcl 8 Jul 2010 01:14:22 -0000 1.1 @@ -0,0 +1,19 @@ +ad_page_contract { + + Delete a course confirmation page. + + @author Don Baccus + @creation-date 2010-05-12 + @cvs-id $Id: confirm-delete.tcl,v 1.1 2010/07/08 01:14:22 donb Exp $ + +} { + id:naturalnum,notnull + course_title:notnull +} + +set title "[_ scorm-simple-lms.Delete_Course] \"$course_title\"" +set context [list $title] + +ad_return_template + + Index: openacs-4/packages/scorm-simple-lms/www/admin/delete-course.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/scorm-simple-lms/www/admin/delete-course.adp,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/scorm-simple-lms/www/admin/delete-course.adp 8 Jul 2010 01:14:22 -0000 1.1 @@ -0,0 +1,12 @@ + +@title;noquote@ +@context;noquote@ + +

#scorm-simple-lms.Really_Delete_Course#

+ + Index: openacs-4/packages/scorm-simple-lms/www/admin/delete-course.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/scorm-simple-lms/www/admin/delete-course.tcl,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/scorm-simple-lms/www/admin/delete-course.tcl 8 Jul 2010 01:14:22 -0000 1.1 @@ -0,0 +1,28 @@ +ad_page_contract { + + Delete a course. + + @author Don Baccus + @creation-date 2010-05-12 + @cvs-id $Id: delete-course.tcl,v 1.1 2010/07/08 01:14:22 donb Exp $ + +} { + id:naturalnum,notnull + {confirmed_p 0} +} + +# Confirmed? +if {$confirmed_p} { + scorm_core::delete_course -course_id $id + ad_returnredirect . + ad_script_abort +} + +db_1row get_course_properties {} +set title "[_ scorm-simple-lms.Delete_Course] \"$course_title\"" +set context [list $title] +set confirm_url [export_vars -base delete-course {id {confirmed_p 1}}] + +ad_return_template + + Index: openacs-4/packages/scorm-simple-lms/www/admin/delete-course.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/scorm-simple-lms/www/admin/delete-course.xql,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/scorm-simple-lms/www/admin/delete-course.xql 8 Jul 2010 01:14:22 -0000 1.1 @@ -0,0 +1,14 @@ + + + + + + + select o.title as course_title + from acs_objects o + where o.object_id = :id + + + + + Index: openacs-4/packages/scorm-simple-lms/www/admin/edit-properties.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/scorm-simple-lms/www/admin/edit-properties.xql,v diff -u -N -r1.1 -r1.2 --- openacs-4/packages/scorm-simple-lms/www/admin/edit-properties.xql 10 Jun 2010 00:38:08 -0000 1.1 +++ openacs-4/packages/scorm-simple-lms/www/admin/edit-properties.xql 8 Jul 2010 01:14:22 -0000 1.2 @@ -4,11 +4,10 @@ - select cf.label as title, sc.online, sc.default_lesson_mode - from scorm_courses sc, cr_folders cf, cr_items ci + select o.title, sc.online, sc.default_lesson_mode + from scorm_courses sc, acs_objects o where sc.scorm_course_id = :id - and sc.folder_id = cf.folder_id - and cf.folder_id = ci.item_id + and o.object_id = sc.scorm_course_id Index: openacs-4/packages/scorm-simple-lms/www/admin/index.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/scorm-simple-lms/www/admin/index.tcl,v diff -u -N -r1.1 -r1.2 --- openacs-4/packages/scorm-simple-lms/www/admin/index.tcl 10 Jun 2010 00:38:08 -0000 1.1 +++ openacs-4/packages/scorm-simple-lms/www/admin/index.tcl 8 Jul 2010 01:14:22 -0000 1.2 @@ -39,6 +39,12 @@ #scorm-simple-lms.edit_properties# + + #scorm-simple-lms.upload_new_version# + + + #scorm-simple-lms.delete_course# + } } } -orderby { @@ -60,10 +66,13 @@ } } -db_multirow -extend {url edit_properties_url mode status toggle_online_url toggle_status} \ +db_multirow -extend {url edit_properties_url delete_url upload_new_version_url + mode status toggle_online_url toggle_status} \ courses get_courses {} { set url [export_vars -base [ad_conn package_url]scorm-player/player id] set edit_properties_url [export_vars -base edit-properties id] + set delete_url [export_vars -base delete-course id] + set upload_new_version_url [export_vars -base upload-new-version id] set mode \ [expr {$default_lesson_mode eq "browse" ? [_ scorm-simple-lms.browse] : [_ scorm-simple-lms.normal]}] set status \
-