Index: openacs-4/packages/lors/lib/course-new.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lors/lib/course-new.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/lors/lib/course-new.adp 7 Jun 2006 13:54:46 -0000 1.1 @@ -0,0 +1 @@ +<formtemplate id="course-new"></formtemplate> \ No newline at end of file Index: openacs-4/packages/lors/lib/course-new.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lors/lib/course-new.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/lors/lib/course-new.tcl 7 Jun 2006 13:54:46 -0000 1.1 @@ -0,0 +1,52 @@ +ad_page_contract { + Includable form to create a new empty LORS course + + @param package_id (optional) optional package to create the course under, probably lorsm or lors-central + @param folder_id root folder to store stuff in + @param return_url (defaults to ad_return_url) +} + +if {![info exists community_id]} { + set community_id [dotlrn_community::get_community_id] +} + +if {![info exists package_id]} { + set package_id [ad_conn package_id] +} +ad_form -name course-new -export {return_url package_id folder_id} -form { + man_id:key + {name:text(text) {label "Course Name"} {size 50}} +} -new_data { + + # FIXME only works with dotlrn, lame, should just create a lors + # folder as a child of the package_id of the manifest object + + set new_parent_id [lors::cr::add_folder \ + -parent_id $folder_id \ + -folder_name $name] + set new_items_parent_id [lors::cr::add_folder \ + -parent_id $folder_id \ + -folder_name "${name}_items"] + + lors::imscp::manifest_add \ + -man_id $man_id \ + -course_name $name \ + -identifier [util_text_to_url -text $name] \ + -hasmetadata f \ + -isscorm f \ + -package_id $package_id \ + -community_id $community_id \ + -folder_id $new_items_parent_id \ + -content_folder_id $new_parent_id + + lors::imscp::organization_add \ + -man_id $man_id \ + -identifier [util_text_to_url -text $name] \ + -org_folder_id $new_items_parent_id + + if {![info exists return_url] || $return_url eq ""} { + set return_url [export_vars -base course-structure {man_id}] + } + ad_returnredirect -message "[_ lors Course_created]" $return_url + +} Index: openacs-4/packages/lors/lib/course-structure.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lors/lib/course-structure.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/lors/lib/course-structure.adp 7 Jun 2006 13:54:46 -0000 1.1 @@ -0,0 +1,184 @@ + +<table class="list" cellpadding="3" cellspacing="1" width="70%"> + <tr class="list-header"> + <th class="list" valign="top" style="background-color: #e0e0e0; font-weight: bold;" colspan="2"> + #lorsm.Course_Information# + </th> + </tr> + <tr class="list-odd"> + <td class="list" valign="top" style="background-color: #e0e0e0; font-weight: bold;" width="20%"> + #lorsm.Course_Name# + </td> + <td class="list" valign="top" style="background-color: #f0f0f0; font-weight: bold;"> + <a href="@folder@">@course_name;noquote@</a> + </td> + </tr> + <tr class="list-even"> + <td class="list" valign="top" style="background-color: #e0e0e0; font-weight: bold;" width="20%"> + #lorsm.Version# + </td> + <td class="list" valign="top" style="background-color: #f0f0f0"> + <if @version@ eq "0"> + @version_msg;noquote@ + </if> + <else> + @version;noquote@ Course Versions + </else> + </td> + </tr> + <tr class="list-odd"> + <td class="list" valign="top" style="background-color: #e0e0e0; font-weight: bold;" width="20%"> + #lorsm.Metadata# + </td> + <td class="list" valign="top" style="background-color: #f0f0f0"> + <if @man_metadata@ eq "Yes"> + <if @lorsm_p@> + <a href="md/?ims_md_id=@man_id@">#lorsm.Yes#</a> + </if> + <else> + #lorsm.Yes# + </else> + </if> + <else> + #lorsm.No# + </else> + </td> + </tr> + <tr class="list-even"> + <td class="list" valign="top" style="background-color: #e0e0e0; font-weight: bold;" width="20%"> + #lorsm.Identifier# + </td> + <td class="list" valign="top" style="background-color: #f0f0f0" width="80%"> + @identifier@ + </td> + </tr> + <tr class="list-odd"> + <td class="list" valign="top" style="background-color: #e0e0e0; font-weight: bold;" width="20%"> + #lorsm.Is_SCORM# + </td> + <td + <if @isscorm@ eq "Yes"> + #lorsm.lt_classlist_stylefont-w# + </if> + <else> + class="list" + </else> + valign="top" align="left">@isscorm;noquote@ + </td> + </tr> + <tr class="list-even"> + <td class="list" valign="top" style="background-color: #e0e0e0; font-weight: bold;" width="20%"> + #lorsm.Storage_Folder# + </td> + <td class="list" valign="top" style="background-color: #f0f0f0" width="80%"> + <a href="@folder@">@instance@</a> + </td> + </tr> + <tr class="list-odd"> + <td class="list" valign="top" style="background-color: #e0e0e0; font-weight: bold;" width="20%"> + #lorsm.Created_By# + </td> + <td class="list" valign="top" style="background-color: #f0f0f0" width="80%"> + @created_by@ + </td> + </tr> + <tr class="list-even"> + <td class="list" valign="top" style="background-color: #e0e0e0; font-weight: bold;" width="20%"> + #lorsm.Date# + </td> + <td class="list" valign="top" style="background-color: #f0f0f0" width="80%"> + @creation_date;noquote@ + </td> + </tr> + <tr class="list-odd"> + <td class="list" valign="top" style="background-color: #e0e0e0; font-weight: bold;" width="20%"> + #lorsm.Submanifests# + </td> + <td class="list" valign="top" style="background-color: #f0f0f0" width="80%"> + @submanifests@ + </td> + </tr> + </tr> + <tr class="list-even"> + <td class="list" valign="top" style="background-color: #e0e0e0; font-weight: bold;" width="20%"> + #lorsm.Status# + </td> + <td class="list" valign="top" style="background-color: #f0f0f0" width="80%"> + <if @isenabled@ eq t> + <b>#lorsm.Enabled#</b> + </if> + <else> + <font color="red"><b>#lorsm.Disabled#</b></font> + </else> + <div style="float: right;"> + <a href="@enabler_url@" class="button">#lorsm.Change#</a> + </div> + </td> + </tr> + </tr> + <tr class="list-odd"> + <td class="list" valign="top" style="background-color: #e0e0e0; font-weight: bold;"> + #lorsm.Trackable# + </td> + <td class="list" valign="top" style="background-color: #f0f0f0"> + <if @istrackable@ eq t> + <b>#lorsm.Yes#</b> + </if> + <else> + <b>#lorsm.No#</b> + </else> + <div style="float: right;"> + <a href="@tracker_url@" class="button">#lorsm.Change#</a> + </div> + </td> + </tr> + </tr> + <tr class="list-even"> + <td class="list" valign="top" style="background-color: #e0e0e0; font-weight: bold;" width="20%"> + #lorsm.Is_shared# + </td> + <td class="list" valign="top" style="background-color: #f0f0f0" width="80%"> + <if @isshared@ eq t> + <font color="green"><b>#lorsm.Shared#</b></font> + </if> + <else> + <font color="red"><b>#lorsm.Not_Shared#</b></font> + </else> + <div style="float: right;"> + <a href="@sharer_url@" class="button">#lorsm.Change#</a> + </div> + </td> + </tr> + <tr class="list-odd last"> + <td class="list" valign="top" style="background-color: #e0e0e0; font-weight: bold;"> + #lorsm.Course# + </td> + <td class="list" valign="top" style="background-color: #f0f0f0"> + <b>@format_pretty_name@</b> + <div style="float: right;"> + <a href="@formater_url@" class="button">#lorsm.Change#</a> + </div> + </td> + </tr> + <tr class="list-header"> + <th class="list" valign="top" style="background-color: #e0e0e0; font-weight: bold;" colspan="2"> + #lorsm.Organizations# + </th> + </tr> + <tr class="list-odd"> + <td valign="top" style="background-color: #f0f0f0; font-weight: bold;" colspan="2"> + + </td> + </tr> + <tr class="list-odd"> + <td valign="top" style="background-color: #f0f0f0; + font-weight: bold;" colspan="2"> + <formtemplate style="inline" id="add-new"></formtemplate> + @orgs_list;noquote@ + </td> + </tr> +</table> + + + + Index: openacs-4/packages/lors/lib/course-structure.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lors/lib/course-structure.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/lors/lib/course-structure.tcl 7 Jun 2006 13:54:46 -0000 1.1 @@ -0,0 +1,142 @@ +# packages/lorsm/www/course_structure.tcl + +ad_page_contract { + + View Manifest Course Structure + + @author Ernie Ghiglione (ErnieG@mm.st) + @creation-date 2004-03-31 + @arch-tag 208f2801-d110-45d3-9401-d5eae1f72c93 + @cvs-id $Id: course-structure.tcl,v 1.1 2006/06/07 13:54:46 daveb Exp $ + + @param man_id manifest id of course +} +set package_id [ad_conn package_id] +set community_id [dotlrn_community::get_community_id] + +ad_proc -public getFolderKey { + {-object_id:required} +} { + Gets the Folderkey for a file-storage folder_id + + @option object_id Folder_id for file-storage folder + @author Ernie Ghiglione (ErnieG@mm.st) + +} { + return [db_string select_folder_key "select key from fs_folders where object_id = :object_id"] +} + +# set context & title +set context [list "[_ lorsm.Course_Structure]"] +set title "[_ lorsm.Course_Structure]" + + +if {[db_0or1row manifest { }]} { + + # Sets the variable for display. + set display 1 + + # Course Name + if {[empty_string_p $course_name]} { + set course_name "[_ lorsm.No_course_Name]" + } + + # Version + set version [db_string get_versions { } -default 0] + + if {[string equal $version "0"]} { + set version_msg "[_ lorsm.No_version_Available]" + } + + if { ![empty_string_p $fs_package_id] } { + # Folder + set folder [apm_package_url_from_id $fs_package_id]?[export_vars folder_id] + # Instance + set instance [apm_package_key_from_id $fs_package_id] + } else { + 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"] + # Instance + set instance [lorsm::get_course_name -manifest_id $man_id] + # Folder +# set root_folder [lorsm::get_root_folder_id] + +# set folder_id [db_string get_folder_id { }] + set folder [apm_package_url_from_id $fs_package_id]?[export_vars folder_id] + } + + # Created By + set created_by [person::name -person_id $creation_user] + + # Creation Date + set creation_date [lc_time_fmt $creation_date "%x %X"] + + # Check for submanifests + if {[db_0or1row submans { }]} { + } else { + set submanifests 0 + } + + +} else { + + set display 0 + +} + + +append orgs_list "<table class=\"list\" cellpadding=\"3\" cellspacing=\"1\" width=\"100%\">" +append orgs_list "<tr class=\"list-header\"> + <th colspan=\"3\" class=\"list\" valign=\"top\" style=\"background-color: #e0e0e0; font-weight: bold;\">[_ lorsm.Items]</th> + </tr> +" +db_foreach organizations { } { + + + set total_items [db_string items_count {select count(*) from ims_cp_items where org_id=:org_id} -default 0] + # We get the indent of the items in this org_id + set indent_list [lorsm::get_items_indent -org_id $org_id] + template::util::list_of_lists_to_array $indent_list indent_array + + append orgs_list "<tr class=\"list-even\">" + #"<td valign=\"top\" width=\"20%\">$org_title</td><td valign=\"top\" align=\"center\" width=\"5%\">$hasmetadata</td><td>" + + set indent [expr $indent +1] + set missing_text "[_ lorsm.Nothing_here]" + set return_url [export_vars -base [ns_conn url] man_id] + set table_extra_html { width="100%" } + set table_extra_vars {return_url indent_array lorsm_p} + set table_def { + { title "\#lorsm.Item_Name\#" "no_sort" "<td> + [set indent \"\" + for { set i 0 } { $i < [expr $indent_array($item_id)-1]} { incr i } { + append indent \" \" + } + if {$type eq \"webcontent\" && ![string equal $identifierref {}]} {set href \"$indent<a href='[apm_package_url_from_id_mem $fs_package_id]view/[db_string select_folder_key {select key from fs_folders where folder_id = :folder_id}]/[lorsm::fix_url -url $identifierref]'>$item_title</a>\"} else {set href \"<a href='[lors::object_url -url admin -object_id $res_identifier]'>$item_title</a>\"}]</td>" } + { type "\#lorsm.Type\#" "no_sort" "<td align=\"center\">$type</td>" } + } + + set table_item [ad_table -Tmissing_text $missing_text -Textra_vars $table_extra_vars -Theader_row_extra "style=\"background-color: #e0e0e0; font-weight: bold;\" class=\"list-header\"" -Ttable_extra_html $table_extra_html blah { } $table_def] + + append orgs_list "$table_item" + + + append orgs_list "</td></tr>" + +} if_no_rows { + append orgs_list "<tr class=\"list-odd\"><td></td></tr>" +} + +append orgs_list "</table>" + +set enabler_url [export_vars -base enabler {man_id}] +set tracker_url [export_vars -base tracker {man_id}] +set sharer_url [export_vars -base sharer {man_id folder_id return_url}] +set formater_url [export_vars -base formater {man_id return_url}] + +set add_type_options [list [list Assessment assessment] [list Wiki wiki]] +ad_form -name add-new -action object-new -export {man_id} -form { + {add_type:text(select) {label ""} {options $add_type_options}} + {add_new:text(submit) {label "#acs-kernel.common_Add#"}} +} \ No newline at end of file Index: openacs-4/packages/lors/lib/course-structure.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lors/lib/course-structure.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/lors/lib/course-structure.xql 7 Jun 2006 13:54:46 -0000 1.1 @@ -0,0 +1,171 @@ +<?xml version="1.0"?> +<queryset> + +<fullquery name="manifest"> + <querytext> + select + cp.man_id, + cp.course_name, + cp.identifier, + text 'Yes' as hello, + case + when hasmetadata = 't' then 'Yes' + else 'No' + end as man_metadata, + case + when isscorm = 't' then 'Yes' + else 'No' + end as isscorm, + cp.fs_package_id, + case + when fs_package_id is null then 'f' + else 't' + end as lorsm_p, + cp.folder_id, + cp.isshared, + acs.creation_user, + acs.creation_date, + acs.context_id, + cpmc.isenabled, + pf.format_pretty_name, + cpmc.istrackable + from + ims_cp_manifests cp, acs_objects acs, ims_cp_manifest_class cpmc, lorsm_course_presentation_formats pf + where + cp.man_id = acs.object_id + and cp.man_id = :man_id + and cp.man_id = cpmc.man_id + and cpmc.lorsm_instance_id = :package_id + and cp.parent_man_id = 0 + and cp.course_presentation_format = pf.format_id + </querytext> +</fullquery> + +<fullquery name="get_versions"> + <querytext> + select + count(revision_id) + from + cr_revisions + where + item_id = ( + select + item_id + from + cr_revisions + where + revision_id = :man_id + ) + </querytext> +</fullquery> + +<fullquery name="get_folder_id"> + <querytext> + select + item_id + from + cr_items + where + name = :instance and + parent_id = :root_folder + </querytext> +</fullquery> + +<fullquery name="submans"> + <querytext> + select + count(*) as submanifests + from + ims_cp_manifests + where + man_id = :man_id + and + parent_man_id = :man_id + </querytext> +</fullquery> + + +<fullquery name="organizations"> + <querytext> + select + org.org_id, + org.org_title as org_title, + org.hasmetadata, + tree_level(o.tree_sortkey) as indent + from + ims_cp_organizations org, acs_objects o + where + org.org_id = o.object_id + and + man_id = :man_id + order by + org_id + </querytext> +</fullquery> + +<fullquery name="blah"> + <querytext> + SELECT + o.object_id, + repeat(' ', (tree_level(o.tree_sortkey) - :indent)* 3) as indent, + i.ims_item_id as item_id, + i.item_title as item_title, + i.hasmetadata, + i.org_id, + case + when i.isshared = 'f' then ( + 'false' + ) + else 'true' + end as isshared, + r.href, + r.identifier as res_identifier, + case + when i.identifierref <> '' then r.href + else '' + end as identifierref, + case + when i.identifierref <> '' + then coalesce(ot.pretty_name,r.type) + else '' + end as type, + m.fs_package_id, + m.folder_id, + m.course_name + FROM + acs_objects o, ims_cp_items i, ims_cp_manifests m, + ims_cp_items_to_resources i2r,ims_cp_resources r left + join acs_object_types ot on r.type=ot.object_type + WHERE + o.object_type = 'ims_item_object' + AND + i.org_id = :org_id + AND + o.object_id = i.ims_item_id + AND r.res_id=i2r.res_id + AND i2r.ims_item_id=i.ims_item_id + AND + i.ims_item_id = ( + select + live_revision + from + cr_items + where + item_id = ( + select + item_id + from + cr_revisions + where + revision_id = i.ims_item_id + ) + ) + AND + m.man_id = :man_id + ORDER BY + o.tree_sortkey, o.object_id + + </querytext> +</fullquery> + +</queryset> \ No newline at end of file Index: openacs-4/packages/lors/lib/object-new.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lors/lib/object-new.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/lors/lib/object-new.adp 7 Jun 2006 13:54:46 -0000 1.1 @@ -0,0 +1,4 @@ +<h2>Add an existing @add_type@</h2> +<formtemplate id="choose"></formtemplate> +<h2>or create a new @add_type@</h2> +<formtemplate id="new"></formtemplate> \ No newline at end of file Index: openacs-4/packages/lors/lib/object-new.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/lors/lib/object-new.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/lors/lib/object-new.tcl 7 Jun 2006 13:54:46 -0000 1.1 @@ -0,0 +1,149 @@ +ad_page_contract { + create a new lors object + @param man_id +} + + +switch $add_type { + assessment { + # get a list of assessment + set options [db_list_of_lists get_assessments "select o.title,a.assessment_id from as_assessments a, cr_items i, acs_objects o where o.object_id=a.assessment_id and i.latest_revision=a.assessment_id"] + } + wiki { + # get a list of all the wiki pages + # find xowiki package + array set xowiki_node [site_node::get_from_url -url /wiki] + + # get the folder_id + set folder_id [::xowiki::Page require_folder -package_id $xowiki_node(object_id) -name xowiki] + set options [list] + set order_clause "order by ci.name" + + db_foreach instance_select \ + [::xowiki::Page instance_select_query \ + -folder_id $folder_id \ + -with_subtypes t \ + -select_attributes [list title last_modified] \ + -order_clause $order_clause \ + ] { + lappend options [list $title $item_id] + } + } + +} + +set search_p 0 + +if {[llength options] > 10} { + set search_p 1 +} + +set return_url [export_vars -base course_structure {man_id}] + +# show available objects +set options [concat [list [list "-- Choose --" ""]] $options] + +ad_form -name choose -export {man_id add_type} -form { + {existing_object:text(select) {label "[_ acs-kernel.common_Add]"} {options $options}} +} -on_submit { + # FIXME pretend we can only have one organization per course + # this is fine since we are not supporting a user interface to + # create more than one way to organize the items in one manifest + set org_id [db_string get_org_id "select org_id from ims_cp_organizations where man_id=:man_id"] + set item_folder_id [db_string get_folder_id "select parent_id from cr_items where latest_revision=:org_id"] + switch $add_type { + assessment { + # we want one lors item per section + + + set sections [db_list_of_lists get_sections "select a.section_id,a.name,a.title from as_sectionsx a, as_assessment_section_map m where m.assessment_id=:existing_object and a.section_id=m.section_id"] + + foreach {section} $sections { + foreach {section_id section_name section_title} [lrange $section 0 2] {break} + + # make sure this section isn't already associated with this course + # we'll just let an admin add the assessment as many times + # as they like, if there a new sections they will get added + + if {![db_0or1row section_exists "select res_id from ims_cp_resources where identifier=:section_id and man_id=:man_id"]} { + set item_id [lors::imscp::item_add_from_object \ + -object_id $section_id \ + -org_id $org_id \ + -folder_id $item_folder_id \ + -title $section_title] + + # FIXME see if anyone is using this resource + # already. objects should be # able to be resources + # without being tied to one manifest, # since you can use + # a resource in more than one course and # it doesn't make + # sense to have a seperate row every time # we reuse an + # object + + set res_id [lors::imscp::resource_add_from_object \ + -man_id $man_id \ + -object_id $section_id \ + -folder_id $item_folder_id] + + lors::imscp::item_to_resource_add \ + -item_id $item_id \ + -res_id $res_id + } else { + # FIXME update the title of the ims_cp_item for display + # from the section title + } + } + } + wiki { + + set page [::Generic::CrItem instantiate \ + -item_id $existing_object] + $page instvar {title page_title} {name page_name} + if {![db_0or1row section_exists "select res_id from ims_cp_resources where identifier=:existing_object and man_id=:man_id"]} { + set item_id [lors::imscp::item_add_from_object \ + -object_id $existing_object \ + -org_id $org_id \ + -folder_id $item_folder_id \ + -title $page_title] + + # FIXME see if anyone is using this resource + # already. objects should be # able to be resources + # without being tied to one manifest, # since you can use + # a resource in more than one course and # it doesn't make + # sense to have a seperate row every time # we reuse an + # object + + set res_id [lors::imscp::resource_add_from_object \ + -man_id $man_id \ + -object_id $existing_object \ + -folder_id $item_folder_id] + + lors::imscp::item_to_resource_add \ + -item_id $item_id \ + -res_id $res_id + } else { + # FIXME update the title of the ims_cp_item for display + # from the section title + } + } + } +} + + +ad_form -name new -export {man_id add_type} -form { + {name:text(text) {label "Name"}} +} -on_submit { + switch $add_type { + wiki { + set url [export_vars -base /wiki/edit {name return_url}] + } + assessment { + set url [export_vars -base ../assessment/asm-admin/assessment-form { name return_url}] + } + } + ad_returnredirect $url + ad_script_abort +} + + + +