Index: openacs-4/packages/imsld/tcl/imsld-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/imsld/tcl/imsld-procs.tcl,v diff -u -r1.8 -r1.9 --- openacs-4/packages/imsld/tcl/imsld-procs.tcl 18 Nov 2005 08:44:50 -0000 1.8 +++ openacs-4/packages/imsld/tcl/imsld-procs.tcl 23 Nov 2005 11:06:33 -0000 1.9 @@ -255,23 +255,24 @@ ad_proc -public imsld::structure_next_activity { -activity_structure_id:required - {-environment_ul ""} + {-environment_list ""} } { @return The next learning or support activity (and the type) in the activity structure. 0 if there are none (which should never happen) } { set min_sort_order "" set next_activity_id "" set next_activity_type "" # get referenced activities - db_foreach struct_referenced_activities { + foreach referenced_activity [db_list_of_lists struct_referenced_activities { select ar.object_id_two, ar.rel_type from acs_rels ar, imsld_activity_structuresi ias where ar.object_id_one = ias.item_id and ias.structure_id = :activity_structure_id order by ar.object_id_two - } { - ns_log notice "ahorita mismo mesmamente el type es $rel_type \n" + }] { + set object_id_two [lindex $referenced_activity 0] + set rel_type [lindex $referenced_activity 1] switch $rel_type { imsld_as_la_rel { # find out if is the next one @@ -332,22 +333,26 @@ } } imsld_as_env_rel { - append environment_ul [imsld::process_environment -environment_item_id $object_id_two] + if { [llength $environment_list] } { + set environment_list [concat [list $environment_list] [list [imsld::process_environment -environment_item_id $object_id_two]]] + } else { + set environment_list [imsld::process_environment -environment_item_id $object_id_two] + } } } - } if_no_rows { - ad_return_error "<#_ No referenced activities #>" "<#_ No referenced activities for activity_structure $activity_structure_id. This should never happen." - ad_script_abort - } + } +# if { [string eq "" $next_activity_id] } { +# ad_return_error "<#_ No referenced activities #>" "<#_ No referenced activities for activity_structure $activity_structure_id. This should never happen." +# ad_script_abort +# } if { [string eq $next_activity_type structure] } { - ns_log notice "llamada recursiva a punto con env $environment_ul" - set next_activity_list [imsld::structure_next_activity -activity_structure_id $activity_id -environment_ul $environment_ul] + set next_activity_list [imsld::structure_next_activity -activity_structure_id $activity_id -environment_list $environment_list] set next_activity_id [lindex $next_activity_list 0] set next_activity_type [lindex $next_activity_list 1] - append environment_ul [lindex $next_activity_list 2] + set environment_list [concat $environment_list [lindex $next_activity_list 2]] } - return [list $next_activity_id $next_activity_type $environment_ul] + return [list $next_activity_id $next_activity_type $environment_list] } ad_proc -public imsld::role_part_finished_p { @@ -410,7 +415,7 @@ } { returns a list of the associated resources referenced from the given service. } { - set services_urls "" + set services_list [list] # get service info db_1row service_info { @@ -451,9 +456,9 @@ } { append one_service_url "[imsld::process_resource -resource_item_id $resource_item_id]" if { [string eq "" $one_service_url] } { - append services_urls "[_ imsld.lt_li_desc_no_file_assoc]" + lappend services_list "[_ imsld.lt_li_desc_no_file_assoc]" } else { - append services_urls $one_service_url + set services_list [concat [list $services_list] [list $one_service_url]] } } if_no_rows { ns_log notice "[_ imsld.lt_li_desc_no_file_assoc]" @@ -463,7 +468,7 @@ return "not_implemented_yet" } } - return "$services_urls" + return "$services_list" } ad_proc -public imsld::process_environment { @@ -479,7 +484,6 @@ set root_folder_id [fs::get_root_folder -package_id $fs_package_id] - ns_log notice "es $environment_item_id \n" # get environment info db_1row environment_info { select env.identifier as environment_title, @@ -489,8 +493,7 @@ and content_revision__is_live(env.environment_id) = 't' } - set environment_ul " \[ $environment_title" - + set environment_learning_objects_list [list] if { [db_0or1row get_learning_object_info { select item_id as learning_object_item_id, learning_object_id, @@ -502,14 +505,13 @@ # learning object item. get the files associated set linear_item_list [db_list item_linear_list { select ii.imsld_item_id - from imsld_items ii, imsld_learning_objects lo + from imsld_items ii, cr_items cr, acs_rels ar - where and ar.object_id_one = :learning_object_item_id + where ar.object_id_one = :learning_object_item_id and ar.object_id_two = cr.item_id and cr.live_revision = ii.imsld_item_id }] - foreach imsld_item_id $linear_item_list { db_foreach env_nested_associated_items { select cpr.resource_id, @@ -524,19 +526,20 @@ and tree_right((select imsld_tree_sortkey from imsld_items where imsld_item_id = :imsld_item_id)) or ii.imsld_item_id = :imsld_item_id) } { - set one_environment_ul "[imsld::process_resource -resource_item_id $resource_item_id] " - if { [string eq "" $one_environment_ul] } { - append environment_ul "[_ imsld.lt_li_desc_no_file_assoc]" + set one_learning_object_list [imsld::process_resource -resource_item_id $resource_item_id] + if { [string eq "" $one_learning_object_list] } { + lappend environment_learning_objects_list "[_ imsld.lt_li_desc_no_file_assoc]" } else { - append environment_ul $one_environment_ul + set environment_learning_objects_list [concat [list $environment_learning_objects_list] \ + [list $one_learning_object_list]] } } if_no_rows { ns_log notice "[_ imsld.lt_li_desc_no_file_assoc]" } } } - # services + set environment_services_list [list] if { [db_0or1row get_service_info { select service_id, item_id as service_item_id, @@ -546,29 +549,33 @@ where environment_id = :environment_item_id and content_revision__is_live(service_id) = 't' }] } { - append environment_ul "[imsld::process_service -service_item_id $service_item_id] " + set environment_services_list [imsld::process_service -service_item_id $service_item_id] } + set nested_environment_list [list] # environments db_foreach nested_environment { select ar.object_id_two as nested_environment_item_id from acs_rels ar where ar.object_id_one = :environment_item_id and ar.rel_type = 'imsld_env_env_rel' } { - append environment_ul [imsld::process_environment -environment_item_id $nested_environment_item_id] + set one_nested_environment_list [imsld::process_environment -environment_item_id $nested_environment_item_id] + set nested_environment_list [concat [list $nested_environment_list] \ + [list "Nested Environment: [lindex $one_nested_environment_list 0]" \ + [lindex $one_nested_environment_list 1] \ + [lindex $one_nested_environment_list 2] \ + [lindex $one_nested_environment_list 3]]] } - - append environment_ul "\]" - return "$environment_ul" + return [list $environment_title $environment_learning_objects_list $environment_services_list $nested_environment_list] } ad_proc -public imsld::process_learning_objective { {-imsld_item_id ""} {-activity_item_id ""} {-community_id ""} } { - returns a list of the associated resources, files and environments referenced from the learning objective of the given activity or ims-ld + returns a list with the objective title and the associated resources, files and environments referenced from the learning objective of the given activity or ims-ld } { set community_id [expr { [string eq "" $community_id] ? "[dotlrn_community::get_community_id]" : $community_id }] # Gets file-storage root folder_id @@ -608,10 +615,8 @@ where lo.item_id = :learning_objective_item_id and content_revision__is_live(lo.learning_objective_id) = 't' } + set objective_items_list [list] - # learning object item. get the files associated - set objective_ul "$objective_title" - # get the items associated with the learning objective set linear_item_list [db_list item_linear_list { select ii.imsld_item_id @@ -622,7 +627,7 @@ and cr.live_revision = ii.imsld_item_id }] foreach imsld_item_id $linear_item_list { - db_foreach env_nested_associated_items { + db_foreach lo_nested_associated_items { select cpr.resource_id, cpr.item_id as resource_item_id, cpr.type as resource_type @@ -637,15 +642,15 @@ } { set one_objective_urls "[imsld::process_resource -resource_item_id $resource_item_id]" if { [string eq "" $one_objective_urls] } { - append objective_ul "[_ imsld.lt_li_desc_no_file_assoc]" + lappend objective_items_list "[_ imsld.lt_li_desc_no_file_assoc]" } else { - append objective_ul "$one_objective_urls " + set objective_items_list [concat [list $objective_items_list] [list $one_objective_urls]] } } if_no_rows { ns_log notice "[_ imsld.lt_li_desc_no_file_assoc]" } } - return "$objective_ul" + return [list $objective_title $objective_items_list] } ad_proc -public imsld::process_prerequisite { @@ -694,8 +699,7 @@ and content_revision__is_live(pre.prerequisite_id) = 't' } - # prerequisite item. get the files associated - set prerequisite_ul "$prerequisite_title" + set prerequisite_items_list [list] # get the items associated with the learning objective set linear_item_list [db_list item_linear_list { @@ -707,7 +711,7 @@ and cr.live_revision = ii.imsld_item_id }] foreach imsld_item_id $linear_item_list { - db_foreach env_nested_associated_items { + db_foreach prereq_nested_associated_items { select cpr.resource_id, cpr.item_id as resource_item_id, cpr.type as resource_type @@ -722,17 +726,75 @@ } { set one_prerequisite_urls "[imsld::process_resource -resource_item_id $resource_item_id]" if { [string eq "" $one_prerequisite_urls] } { - append prerequisite_ul "[_ imsld.lt_li_desc_no_file_assoc]" + lappend prerequisite_items_list "[_ imsld.lt_li_desc_no_file_assoc]" } else { - append prerequisite_ul "$one_prerequisite_urls " + set prerequisite_items_list [concat [list $prerequisite_items_list] [list $one_prerequisite_urls]] } } if_no_rows { ns_log notice "[_ imsld.lt_li_desc_no_file_assoc]" } } - return "$prerequisite_ul" + return [list $prerequisite_title $prerequisite_items_list] } +ad_proc -public imsld::process_feedback { + {-on_completion_item_id ""} + {-community_id ""} +} { + returns a list with the feedback title and the associated resources, files and environments referenced from the on_completion element. +} { + set community_id [expr { [string eq "" $community_id] ? "[dotlrn_community::get_community_id]" : $community_id }] + # Gets file-storage root folder_id + set fs_package_id [site_node_apm_integration::get_child_package_id \ + -package_id [dotlrn_community::get_package_id $community_id] \ + -package_key "file-storage"] + set root_folder_id [fs::get_root_folder -package_id $fs_package_id] + + set feedback_item_id "" + + # get on completion info + db_1row feedback_info { + select coalesce(oc.feedback_title, oc.title) as feedback_title + from imsld_on_completioni oc + where oc.item_id = :on_completion_item_id + and content_revision__is_live(oc.on_completion_id) = 't' + } + + set feedback_items_list [list] + # get the items associated with the feedback + set linear_item_list [db_list item_linear_list { + select ii.imsld_item_id + from imsld_items ii, + cr_items cr, acs_rels ar + where ar.object_id_one = :on_completion_item_id + and ar.object_id_two = cr.item_id + and cr.live_revision = ii.imsld_item_id + }] + foreach imsld_item_id $linear_item_list { + db_foreach feedback_nested_associated_items { + select cpr.resource_id, + cpr.item_id as resource_item_id, + cpr.type as resource_type + from imsld_cp_resourcesi cpr, imsld_itemsi ii, + acs_rels ar + where ar.object_id_one = ii.item_id + and ar.object_id_two = cpr.item_id + and content_revision__is_live(cpr.resource_id) = 't' + and (imsld_tree_sortkey between tree_left((select imsld_tree_sortkey from imsld_items where imsld_item_id = :imsld_item_id)) + and tree_right((select imsld_tree_sortkey from imsld_items where imsld_item_id = :imsld_item_id)) + or ii.imsld_item_id = :imsld_item_id) + } { + set one_feedback_urls [imsld::process_resource -resource_item_id $resource_item_id] + if { [string eq "" $one_feedback_urls] } { + lappend feedback_items_list "[_ imsld.lt_li_desc_no_file_assoc]" + } else { + set feedback_items_list [concat [list $feedback_items_list] [list $one_feedback_urls]] + } + } + } + return [list $feedback_title $feedback_items_list] +} + ad_proc -public imsld::process_resource { -resource_item_id {-community_id ""} @@ -754,12 +816,29 @@ set files_lis "" switch $resource_type { forum { + # forums package call set forums_package_id [site_node_apm_integration::get_child_package_id \ -package_id [dotlrn_community::get_package_id $community_id] \ -package_key "forums"] set file_url "[apm_package_url_from_id $forums_package_id]forum-view?[ad_export_vars { { forum_id $acs_object_id } }]" - append files_lis " $identifier " + set forum_title [db_exec_plsql get_froum_title { + select acs_object__name(:acs_object_id) + }] + append files_lis " $forum_title " } + imsqti_xmlv1p0 { + # assessment package call + set assessment_package_id [site_node_apm_integration::get_child_package_id \ + -package_id [dotlrn_community::get_package_id $community_id] \ + -package_key "assessment"] + set file_url "[apm_package_url_from_id $assessment_package_id]assessment?[ad_export_vars { { assessment_id $acs_object_id } }]" + set assessment_title [db_string get_assessment_title { + select title from as_assessmentsi + where item_id = :acs_object_id + and content_revision__is_live(assessment_id) = 't' + }] + append files_lis " $assessment_title " + } webcontent - default { # Gets file-storage root folder_id @@ -790,18 +869,229 @@ where fs.live_revision = :imsld_file_id }] set file_url "[apm_package_url_from_id $fs_package_id]view/${file_url}" - append files_lis " $file_name " + append files_lis " $file_name " } } } return $files_lis } +ad_proc -public imsld::process_learning_activity { + -activity_item_id:required + {-community_id ""} +} { + @param + @option user_id default [ad_conn user_id] + + @return The list (activity_name, list of associated urls) of the next activity for the user in the IMS-LD. +} { + db_1row activity_info { + select on_completion_id as on_completion_item_id, + prerequisite_id as prerequisite_item_id, + learning_objective_id as learning_objective_item_id, + activity_id + from imsld_learning_activitiesi + where item_id = :activity_item_id + and content_revision__is_live(activity_id) = 't' + } + + # get environments + set environments_list [list] + set associated_environments_list [db_list la_associated_environments { + select ar.object_id_two as environment_item_id + from acs_rels ar + where ar.object_id_one = :activity_item_id + and ar.rel_type = 'imsld_la_env_rel' + order by ar.object_id_two + }] + foreach environment_item_id $associated_environments_list { + if { [llength $environments_list] } { + set environments_list [concat [list $environments_list] \ + [list [imsld::process_environment -environment_item_id $environment_item_id]]] + } else { + set environments_list [imsld::process_environment -environment_item_id $environment_item_id] + } + } + + # prerequisites + set prerequisites_list [list] + if { ![string eq "" $prerequisite_item_id] } { + set prerequisites_list [imsld::process_prerequisite -activity_item_id $activity_item_id] + } + + # learning objectives + set objectives_list [list] + if { ![string eq "" $learning_objective_item_id] } { + set objectives_list [imsld::process_learning_objective -activity_item_id $activity_item_id] + } + + set activity_items_list [list] + # get the items associated with the activity + set linear_item_list [db_list item_linear_list { + select ii.imsld_item_id + from imsld_items ii, imsld_activity_descs lad, imsld_learning_activitiesi la, + cr_items cr1, cr_items cr2, + acs_rels ar + where la.item_id = :activity_item_id + and la.activity_description_id = cr1.item_id + and cr1.live_revision = lad.description_id + and ar.object_id_one = la.activity_description_id + and ar.object_id_two = cr2.item_id + and cr2.live_revision = ii.imsld_item_id + }] + foreach imsld_item_id $linear_item_list { + db_foreach la_nested_associated_items { + select cpr.resource_id, + cpr.item_id as resource_item_id, + cpr.type as resource_type + from imsld_cp_resourcesi cpr, imsld_itemsi ii, + acs_rels ar + where ar.object_id_one = ii.item_id + and ar.object_id_two = cpr.item_id + and content_revision__is_live(cpr.resource_id) = 't' + and (imsld_tree_sortkey between tree_left((select imsld_tree_sortkey from imsld_items where imsld_item_id = :imsld_item_id)) + and tree_right((select imsld_tree_sortkey from imsld_items where imsld_item_id = :imsld_item_id)) + or ii.imsld_item_id = :imsld_item_id) + } { + set one_activity_urls "[imsld::process_resource -resource_item_id $resource_item_id]" + if { [string eq "" $one_activity_urls] } { + lappend activity_items_list "[_ imsld.lt_li_desc_no_file_assoc]" + } else { + set activity_items_list [concat [list $activity_items_list] [list $one_activity_urls]] + } + } if_no_rows { + ns_log notice "[_ imsld.lt_li_desc_no_file_assoc]" + } + } + + # feedback + set feedbacks_list [list] + if { ![string eq "" $on_completion_item_id] } { + set feedbacks_list [imsld::process_feedback -on_completion_item_id $on_completion_item_id] + } + return [list $prerequisites_list \ + $objectives_list \ + $environments_list \ + $activity_items_list \ + $feedbacks_list] +} + +ad_proc -public imsld::process_support_activity { + -activity_item_id:required + {-community_id ""} +} { + @param activity_item_id + + @return The list of items (resources, feedback, environments) associated with the support activity +} { + db_1row activity_info { + select on_completion_id as on_completion_item_id, + activity_id + from imsld_support_activitiesi + where item_id = :activity_item_id + and content_revision__is_live(activity_id) = 't' + } + + # get environments + set environments_list [list] + set associated_environments_list [db_list sa_associated_environments { + select ar.object_id_two as environment_item_id + from acs_rels ar + where ar.object_id_one = :activity_item_id + and ar.rel_type = 'imsld_sa_env_rel' + order by ar.object_id_two + }] + foreach environment_item_id $associated_environments_list { + if { [llength $environments_list] } { + set environments_list [concat [list $environments_list] \ + [list [imsld::process_environment -environment_item_id $environment_item_id]]] + } else { + set environments_list [imsld::process_environment -environment_item_id $environment_item_id] + } + } + + set activity_items_list [list] + # get the items associated with the activity + set linear_item_list [db_list item_linear_list { + select ii.imsld_item_id + from imsld_items ii, imsld_activity_descs sad, imsld_support_activitiesi sa, + cr_items cr1, cr_items cr2, + acs_rels ar + where sa.item_id = :activity_item_id + and sa.activity_description_id = cr1.item_id + and cr1.live_revision = sad.description_id + and ar.object_id_one = sa.activity_description_id + and ar.object_id_two = cr2.item_id + and cr2.live_revision = ii.imsld_item_id + }] + foreach imsld_item_id $linear_item_list { + db_foreach sa_nested_associated_items { + select cpr.resource_id, + cpr.item_id as resource_item_id, + cpr.type as resource_type + from imsld_cp_resourcesi cpr, imsld_itemsi ii, + acs_rels ar + where ar.object_id_one = ii.item_id + and ar.object_id_two = cpr.item_id + and content_revision__is_live(cpr.resource_id) = 't' + and (imsld_tree_sortkey between tree_left((select imsld_tree_sortkey from imsld_items where imsld_item_id = :imsld_item_id)) + and tree_right((select imsld_tree_sortkey from imsld_items where imsld_item_id = :imsld_item_id)) + or ii.imsld_item_id = :imsld_item_id) + } { + set one_activity_urls "[imsld::process_resource -resource_item_id $resource_item_id]" + if { [string eq "" $one_activity_urls] } { + lappend activity_items_list "[_ imsld.lt_li_desc_no_file_assoc]" + } else { + set activity_items_list [concat [list $activity_items_list] [list $one_activity_urls]] + } + } if_no_rows { + ns_log notice "[_ imsld.lt_li_desc_no_file_assoc]" + } + } + + # feedback + set feedbacks_list [list] + if { ![string eq "" $on_completion_item_id] } { + set feedbacks_list [imsld::process_feedback -on_completion_item_id $on_completion_item_id] + } + return [list $environments_list \ + $activity_items_list \ + $feedbacks_list] +} + +ad_proc -public imsld::process_activity_structure { + -structure_item_id:required +} { + @param structure_item_id + + @return The list of items (environments) associated with the activity structure +} { + # get environments + set environments_list [list] + set associated_environments_list [db_list sa_associated_environments { + select ar.object_id_two as environment_item_id + from acs_rels ar + where ar.object_id_one = :structure_item_id + and ar.rel_type = 'imsld_as_env_rel' + order by ar.object_id_two + }] + foreach environment_item_id $associated_environments_list { + if { [llength $environments_list] } { + set environments_list [concat [list $environments_list] \ + [list [imsld::process_environment -environment_item_id $environment_item_id]]] + } else { + set environments_list [imsld::process_environment -environment_item_id $environment_item_id] + } + } + return [list $environments_list] +} + ad_proc -public imsld::next_activity { -imsld_item_id:required {-user_id ""} {-community_id ""} -return_url + imsld_multirow } { @param imsld_item_id @option user_id default [ad_conn user_id] @@ -810,17 +1100,40 @@ @return The list (activity_name, list of associated urls) of the next activity for the user in the IMS-LD. } { + template::multirow create imsld_multirow prerequisites objectives environments activities_titles activities_files feedbacks status + # environments + set environments_titles "" + set environments_files "" + db_1row get_ismld_info { select imsld_id from imsld_imsldsi where item_id = :imsld_item_id and content_revision__is_live(imsld_id) = 't' } - set completed_activities "" - set first_p 0 - set objectives_ul "" - set prerequisites_ul "" set user_id [expr { [string eq "" $user_id] ? [ad_conn user_id] : $user_id }] + + # global prerequisites and learning objectives + set prerequisites_list [imsld::process_prerequisite -imsld_item_id $imsld_item_id] + set prerequisites "" + if { [llength $prerequisites_list] } { + set prerequisites "