--- loncom/interface/courseprefs.pm 2010/01/07 18:43:32 1.17
+++ loncom/interface/courseprefs.pm 2010/02/21 00:47:02 1.23
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Handler to set configuration settings for a course
#
-# $Id: courseprefs.pm,v 1.17 2010/01/07 18:43:32 faziophi Exp $
+# $Id: courseprefs.pm,v 1.23 2010/02/21 00:47:02 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -28,6 +28,185 @@
###############################################################
##############################################################
+=pod
+
+=head1 NAME
+
+courseprefs- Handler to set/modify course configuration
+
+=head1 SYNOPSIS
+
+courseprefs provides an interface for setting general course configuration
+
+=head1 DESCRIPTION
+
+This module is used for configuration of a course
+
+=head1 INTERNAL SUBROUTINES
+
+=over
+
+=item get_allitems()
+
+=item print_config_box()
+
+=item process_changes()
+
+=item get_sec_str()
+
+=item check_clone()
+
+=item store_changes()
+
+=item update_env()
+
+=item display_disallowed()
+
+=item get_course()
+
+=item get_jscript()
+
+=item cloners_javascript()
+
+=item print_courseinfo()
+
+=item new_cloners_dom_row()
+
+=item can_modify_catsettings()
+
+=item assign_course_categories()
+
+=item print_localization()
+
+=item get_lang_choices()
+
+=item print_feedback()
+
+=item user_table()
+
+=item select_recipient()
+
+=item select_sections()
+
+=item print_discussion()
+
+=item role_checkboxes()
+
+=item print_classlists()
+
+=item print_appearance()
+
+=item print_grading()
+
+=item print_printouts()
+
+=item print_spreadsheet()
+
+=item print_bridgetasks()
+
+=item print_other()
+
+=item get_other_items()
+
+=item item_table_row_start()
+
+=item item_table_row_end()
+
+=item yes_no_radio()
+
+=item select_from_options()
+
+=item make_item_rows()
+
+Creates table used to display and set course configuration items.
+
+Inputs: $cdom,$items,$ordered,$settings,$rowtotal,$crstype
+where $cdom is course's domain, $items is HASH ref for current config
+item, $ordered is ARRAY ref of items to include in row in
+display order, $settings is HASH ref of current values forrow,
+$rowtotal is SCALAR ref used to accumulate row count, $crstype is
+course type.
+
+Returns: $datatable
+HTML mark-up of data table which accumulates individual rows.
+
+=item nothidepriv_row()
+
+Creates row containing form elements used to display and set
+whether Domain coordinators who are currently included in
+advanced course user .db file for a course are to be hidden (e.g.,
+in syllabus, or from course user lists).
+
+Inputs: $cdom,$item,$settings,$crstype
+where $cdom is course domain, item is nothideprivileged, $settings is
+HASH ref of the current values for nothideprivileged, $crstype is
+course type (Course or Community).
+
+Return: $datatable
+HTML mark-up for Privileged users (Domain Coordinators) in staff listing.
+
+=item print_hdrfmt_row()
+
+Creates row containing form elements used to display and set
+substitution items and text to be used in the header included
+on printouts.
+
+Inputs: $item,$settings
+where $item is print_header_format, and $settings is a HASH ref
+of the current values stored for print_header_format.
+
+Returns: $output
+HTML mark-up containing Javascript functions: reOrder() and getIndexByName()
+used to dynamically update position selectboxes, and HTML table elements
+for the "Print header format" row.
+
+=item position_selector()
+
+Creates a select box which can be used to reorder substitutions
+and text included in a printout header.
+
+Inputs: $pos,$num,$maxnum
+where $pos is current position, $num is the unique identifier,
+and $maxnum is the total number of items (both substitutions
+and text in the printout header.
+
+Returns: $output
+HTML mark-up for the selectbox and a hidden form element containing
+the current position.
+
+=item substitution_selector()
+
+Creates a combination of select box for choosing an item
+(student name, course ID or assignment note) to substitute,
+and a corresponding size limit in the header used for printouts.
+
+Inputs: $num,$subst,$limit,$crstype
+where $num is the unique identifier, $subst is the current
+substitution (n,c or a, for name, course or note respectively,
+$limit is the current size limit (integer), and $crstype is
+course type - course or community.
+
+Returns: $output
+HTML mark-up for selectbox and textbox (separate table cells).
+
+=item change_clone()
+
+Modifies the list of courses a user can clone (stored
+in the user's environment.db file), called when a
+change is made to the list of users allowed to clone
+a course.
+
+Inputs: $action,$cloner
+where $action is add or drop, and $cloner is identity of
+user for whom cloning ability is to be changed in course.
+
+Returns: nothing
+
+=back
+
+=cut
+
+
package Apache::courseprefs;
use strict;
@@ -115,15 +294,15 @@ sub handler {
%lt = (
conf => 'Course Configuration',
edit => 'Edit Course Configuration',
- gens => 'General Settings',
- idnu => 'ID/Number',
- desc => 'Title',
+ gens => 'General course settings',
+ idnu => 'Course ID or number',
+ desc => 'Course Description',
catg => 'Categorize course',
excc => 'Exclude from course catalog',
clon => 'Users allowed to clone course',
rept => 'Replacement titles for standard course roles',
- time => 'Timezone',
- date => 'Calendar Locale',
+ time => 'Timezone in which the course takes place',
+ date => 'Locale used for course calendar',
coco => 'Course Content',
copo => 'Course Policy',
priv => 'Domain Coordinators in course',
@@ -161,18 +340,16 @@ sub handler {
'courseinfo' =>
{ text => $lt{'gens'},
help => 'Course_Environment',
- header => [{col1 => 'Setting',
- col2 => 'Value'}],
ordered => ['description','courseid','categories',
'hidefromcat','externalsyllabus',
- 'url','rolenames','cloners'],
+ 'cloners','url','rolenames'],
itemtext => {
description => $lt{'desc'},
courseid => $lt{'idnu'},
categories => $lt{'catg'},
hidefromcat => $lt{'excc'},
cloners => $lt{'clon'},
- externalsyllabus => 'External Syllabus URL',
+ externalsyllabus => 'URL of Syllabus',
url => 'Top Level Map',
rolenames => $lt{'rept'},
},
@@ -180,22 +357,18 @@ sub handler {
'localization' =>
{ text => 'Language & Time Localization',
help => 'Course_Environment',
- header => [{col1 => 'Setting',
- col2 => 'Value',}],
ordered => ['languages','timezone','datelocale'],
itemtext => {
- languages => 'Language(s)',
+ languages => 'Languages used',
timezone => $lt{'time'},
datelocale => $lt{'date'},
},
},
'feedback' =>
- { text => 'Feedback Messages',
+ { text => 'Feedback messages',
help => 'Course_Environment',
header => [{col1 => 'Questions about:',
- col2 => 'Recipients'},
- {col1 => 'Questions about:',
- col2 => 'Custom Text'}],
+ col2 => 'Recipients'}],
ordered => ['question.email','comment.email','policy.email'],
itemtext => {
'question.email' => 'Resource Content',
@@ -206,19 +379,17 @@ sub handler {
'discussion' =>
{ text => 'Discussion and Chat',
help => 'Course_Environment',
- header => [{col1 => 'Setting',
- col2 => 'Value',}],
ordered => ['plc.roles.denied','plc.users.denied',
'pch.roles.denied','pch.users.denied',
'allow_limited_html_in_feedback',
'allow_discussion_post_editing'],
itemtext => {
- 'plc.roles.denied' => 'Disable resource discussion',
- 'plc.users.denied' => 'Disable resource discussion',
- 'pch.roles.denied' => 'Disable chat room',
- 'pch.users.denied' => 'Disable chat room',
- allow_limited_html_in_feedback => 'HTML in discussion',
- allow_discussion_post_editing => 'Allow users to edit/delete own discussion posts',
+ 'plc.roles.denied' => 'No Resource Discussion',
+ 'plc.users.denied' => 'No Resource Discussion',
+ 'pch.roles.denied' => 'No Chat room use',
+ 'pch.users.denied' => 'No Chat room use',
+ allow_limited_html_in_feedback => 'Allow limited HTML in discussion',
+ allow_discussion_post_editing => 'Users can edit/delete own discussion posts',
},
},
'classlists' =>
@@ -244,41 +415,35 @@ sub handler {
},
},
'appearance' =>
- { text => 'Display of Resources ',
+ { text => 'Display of resources ',
help => 'Course_Environment',
- header => [{col1 => 'Setting',
- col2 => 'Value'}],
ordered => ['default_xml_style','pageseparators',
'disable_receipt_display','texengine',
'tthoptions'],
itemtext => {
default_xml_style => 'Default XML style file',
- pageseparators => 'Separate items on composite pages',
- disable_receipt_display => 'Disable problem receipts display',
- texengine => 'Force specific math rendering engine',
+ pageseparators => 'Visibly Separate Items on Pages',
+ disable_receipt_display => 'Disable display of problem receipts',
+ texengine => 'Force use of a specific math rendering engine',
tthoptions => 'Default set of options to pass to tth/m when converting TeX',
},
},
'grading' =>
{ text => 'Grading',
help => 'Course_Environment',
- header => [{col1 => 'Setting',
- col2 => 'Value',}],
ordered => ['grading','rndseed',
'receiptalg','disablesigfigs'],
itemtext => {
- grading => 'Grading Type',
- rndseed => 'Randomization algorithm',
- receiptalg => 'Receipt algorithm',
- disablesigfigs => 'Disable significant figure checks',
+ grading => 'Grading',
+ rndseed => 'Randomization algorithm used',
+ receiptalg => 'Receipt algorithm used',
+ disablesigfigs => 'Disable checking of Significant Figures',
},
},
'printouts' =>
- { text => 'Printouts',
+ { text => 'Printout generation',
help => 'Course_Environment',
- header => [{col1 => 'Setting',
- col2 => 'Value',}],
ordered => ['problem_stream_switch','suppress_tries',
'default_paper_size','print_header_format',
'disableexampointprint','canuse_pdfforms'],
@@ -294,8 +459,6 @@ sub handler {
'spreadsheet' =>
{ text => 'Spreadsheets',
help => 'Course_Environment',
- header => [{col1 => 'Setting',
- col2 => 'Value'}],
ordered => ['spreadsheet_default_classcalc',
'spreadsheet_default_studentcalc',
'spreadsheet_default_assesscalc','hideemptyrows'],
@@ -309,8 +472,6 @@ sub handler {
'bridgetasks' =>
{ text => 'Bridge tasks',
help => 'Course_Environment',
- header => [{col1 => 'Setting',
- col2 => 'Value'}],
ordered => ['task_messages','task_grading',
'suppress_embed_prompt'],
itemtext => {
@@ -371,11 +532,15 @@ sub print_config_box {
&Apache::loncommon::help_open_topic($item->{'help'}).'';
if (($action eq 'feedback') || ($action eq 'classlists')) {
$output .= '
-
-
+ ';
+ if (exists $item->{'header'}->[0]->{'col1'} ||
+ exists $item->{'header'}->[0]->{'col2'}) {
+ $output .= '
+
'.&mt($item->{'header'}->[0]->{'col1'}).' |
'.&mt($item->{'header'}->[0]->{'col2'}).' |
-
';
+ ';
+ }
$rowtotal ++;
if ($action eq 'feedback') {
$output .= &print_feedback('top',$cdom,$settings,$ordered,$itemtext,\$rowtotal);
@@ -394,19 +559,27 @@ sub print_config_box {
$output .= &print_classlists('middle',$cdom,$settings,$itemtext,\$rowtotal,$crstype).
'
-
-
- '.&mt($item->{'header'}->[2]->{'col1'}).' |
- '.&mt($item->{'header'}->[2]->{'col2'}).' |
-
';
+ ';
+ if (exists $item->{'header'}->[0]->{'col1'} ||
+ exists $item->{'header'}->[0]->{'col2'}) {
+ $output .= '
+
+ '.&mt($item->{'header'}->[0]->{'col1'}).' |
+ '.&mt($item->{'header'}->[0]->{'col2'}).' |
+
';
+ }
}
} else {
$output .= '
-
-
+ ';
+ if (exists $item->{'header'}->[0]->{'col1'} ||
+ exists $item->{'header'}->[0]->{'col2'}) {
+ $output .= '
+
'.&mt($item->{'header'}->[0]->{'col1'}).' |
'.&mt($item->{'header'}->[0]->{'col2'}).' |
-
';
+ ';
+ }
}
$rowtotal ++;
if ($action eq 'courseinfo') {
@@ -551,10 +724,14 @@ sub process_changes {
my @cloners = split(',',$env{'form.'.$entry});
my @okcloners;
foreach my $cloner (@cloners) {
- my ($uname,$udom) = split(':',$cloner);
- if (&check_clone($udom,$disallowed,$uname) eq 'ok') {
- if (!grep(/^\Q$cloner\E$/,@okcloners)) {
- push(@okcloners,$cloner);
+ $cloner =~ s/^\s+//;
+ $cloner =~ s/\s+$//;
+ unless ($cloner eq '') {
+ my ($uname,$udom) = split(':',$cloner);
+ if (&check_clone($udom,$disallowed,$uname) eq 'ok') {
+ if (!grep(/^\Q$cloner\E$/,@okcloners)) {
+ push(@okcloners,$cloner);
+ }
}
}
}
@@ -844,7 +1021,7 @@ sub check_clone {
sub store_changes {
my ($cdom,$cnum,$prefs_order,$actions,$prefs,$values,$changes,$crstype) = @_;
my ($chome,$output);
- my (%storehash,@delkeys,@need_env_update);
+ my (%storehash,@delkeys,@need_env_update,@oldcloner);
if ((ref($values) eq 'HASH') && (ref($changes) eq 'HASH')) {
%storehash = %{$values};
} else {
@@ -868,16 +1045,16 @@ sub store_changes {
$output .= ''.&mt($prefs->{$item}{'text'}).'
';
if (ref($changes->{$item}) eq 'HASH') {
if (keys(%{$changes->{$item}}) > 0) {
- $output .= &mt('Changes made:').'';
+ $output .= &mt('Changes made:').'