version 1.17, 2010/01/07 18:43:32
|
version 1.24, 2010/02/21 16:02:09
|
Line 28
|
Line 28
|
############################################################### |
############################################################### |
############################################################## |
############################################################## |
|
|
|
=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; |
package Apache::courseprefs; |
|
|
use strict; |
use strict; |
Line 93 sub handler {
|
Line 272 sub handler {
|
gens => 'General community settings', |
gens => 'General community settings', |
idnu => 'Community ID or number', |
idnu => 'Community ID or number', |
desc => 'Community Description', |
desc => 'Community Description', |
|
ownr => 'Community Owner', |
catg => 'Categorize community', |
catg => 'Categorize community', |
excc => 'Exclude from community catalog', |
excc => 'Exclude from community catalog', |
clon => 'Users allowed to clone community', |
clon => 'Users allowed to clone community', |
Line 115 sub handler {
|
Line 295 sub handler {
|
%lt = ( |
%lt = ( |
conf => 'Course Configuration', |
conf => 'Course Configuration', |
edit => 'Edit Course Configuration', |
edit => 'Edit Course Configuration', |
gens => 'General Settings', |
gens => 'General course settings', |
idnu => 'ID/Number', |
idnu => 'Course ID or number', |
desc => 'Title', |
desc => 'Course Description', |
|
ownr => 'Course Owner', |
catg => 'Categorize course', |
catg => 'Categorize course', |
excc => 'Exclude from course catalog', |
excc => 'Exclude from course catalog', |
clon => 'Users allowed to clone course', |
clon => 'Users allowed to clone course', |
rept => 'Replacement titles for standard course roles', |
rept => 'Replacement titles for standard course roles', |
time => 'Timezone', |
time => 'Timezone in which the course takes place', |
date => 'Calendar Locale', |
date => 'Locale used for course calendar', |
coco => 'Course Content', |
coco => 'Course Content', |
copo => 'Course Policy', |
copo => 'Course Policy', |
priv => 'Domain Coordinators in course', |
priv => 'Domain Coordinators in course', |
Line 161 sub handler {
|
Line 342 sub handler {
|
'courseinfo' => |
'courseinfo' => |
{ text => $lt{'gens'}, |
{ text => $lt{'gens'}, |
help => 'Course_Environment', |
help => 'Course_Environment', |
header => [{col1 => 'Setting', |
ordered => ['owner','description','courseid','categories', |
col2 => 'Value'}], |
|
ordered => ['description','courseid','categories', |
|
'hidefromcat','externalsyllabus', |
'hidefromcat','externalsyllabus', |
'url','rolenames','cloners'], |
'cloners','url','rolenames'], |
itemtext => { |
itemtext => { |
|
owner => $lt{'ownr'}, |
description => $lt{'desc'}, |
description => $lt{'desc'}, |
courseid => $lt{'idnu'}, |
courseid => $lt{'idnu'}, |
categories => $lt{'catg'}, |
categories => $lt{'catg'}, |
hidefromcat => $lt{'excc'}, |
hidefromcat => $lt{'excc'}, |
cloners => $lt{'clon'}, |
cloners => $lt{'clon'}, |
externalsyllabus => 'External Syllabus URL', |
externalsyllabus => 'URL of Syllabus', |
url => 'Top Level Map', |
url => 'Top Level Map', |
rolenames => $lt{'rept'}, |
rolenames => $lt{'rept'}, |
}, |
}, |
Line 180 sub handler {
|
Line 360 sub handler {
|
'localization' => |
'localization' => |
{ text => 'Language & Time Localization', |
{ text => 'Language & Time Localization', |
help => 'Course_Environment', |
help => 'Course_Environment', |
header => [{col1 => 'Setting', |
|
col2 => 'Value',}], |
|
ordered => ['languages','timezone','datelocale'], |
ordered => ['languages','timezone','datelocale'], |
itemtext => { |
itemtext => { |
languages => 'Language(s)', |
languages => 'Languages used', |
timezone => $lt{'time'}, |
timezone => $lt{'time'}, |
datelocale => $lt{'date'}, |
datelocale => $lt{'date'}, |
}, |
}, |
}, |
}, |
'feedback' => |
'feedback' => |
{ text => 'Feedback Messages', |
{ text => 'Feedback messages', |
help => 'Course_Environment', |
help => 'Course_Environment', |
header => [{col1 => 'Questions about:', |
header => [{col1 => 'Questions about:', |
col2 => 'Recipients'}, |
col2 => 'Recipients'}], |
{col1 => 'Questions about:', |
|
col2 => 'Custom Text'}], |
|
ordered => ['question.email','comment.email','policy.email'], |
ordered => ['question.email','comment.email','policy.email'], |
itemtext => { |
itemtext => { |
'question.email' => 'Resource Content', |
'question.email' => 'Resource Content', |
Line 206 sub handler {
|
Line 382 sub handler {
|
'discussion' => |
'discussion' => |
{ text => 'Discussion and Chat', |
{ text => 'Discussion and Chat', |
help => 'Course_Environment', |
help => 'Course_Environment', |
header => [{col1 => 'Setting', |
|
col2 => 'Value',}], |
|
ordered => ['plc.roles.denied','plc.users.denied', |
ordered => ['plc.roles.denied','plc.users.denied', |
'pch.roles.denied','pch.users.denied', |
'pch.roles.denied','pch.users.denied', |
'allow_limited_html_in_feedback', |
'allow_limited_html_in_feedback', |
'allow_discussion_post_editing'], |
'allow_discussion_post_editing'], |
itemtext => { |
itemtext => { |
'plc.roles.denied' => 'Disable resource discussion', |
'plc.roles.denied' => 'No Resource Discussion', |
'plc.users.denied' => 'Disable resource discussion', |
'plc.users.denied' => 'No Resource Discussion', |
'pch.roles.denied' => 'Disable chat room', |
'pch.roles.denied' => 'No Chat room use', |
'pch.users.denied' => 'Disable chat room', |
'pch.users.denied' => 'No Chat room use', |
allow_limited_html_in_feedback => 'HTML in discussion', |
allow_limited_html_in_feedback => 'Allow limited HTML in discussion', |
allow_discussion_post_editing => 'Allow users to edit/delete own discussion posts', |
allow_discussion_post_editing => 'Users can edit/delete own discussion posts', |
}, |
}, |
}, |
}, |
'classlists' => |
'classlists' => |
Line 244 sub handler {
|
Line 418 sub handler {
|
}, |
}, |
}, |
}, |
'appearance' => |
'appearance' => |
{ text => 'Display of Resources ', |
{ text => 'Display of resources ', |
help => 'Course_Environment', |
help => 'Course_Environment', |
header => [{col1 => 'Setting', |
|
col2 => 'Value'}], |
|
ordered => ['default_xml_style','pageseparators', |
ordered => ['default_xml_style','pageseparators', |
'disable_receipt_display','texengine', |
'disable_receipt_display','texengine', |
'tthoptions'], |
'tthoptions'], |
itemtext => { |
itemtext => { |
default_xml_style => 'Default XML style file', |
default_xml_style => 'Default XML style file', |
pageseparators => 'Separate items on composite pages', |
pageseparators => 'Visibly Separate Items on Pages', |
disable_receipt_display => 'Disable problem receipts display', |
disable_receipt_display => 'Disable display of problem receipts', |
texengine => 'Force specific math rendering engine', |
texengine => 'Force use of a specific math rendering engine', |
tthoptions => 'Default set of options to pass to tth/m when converting TeX', |
tthoptions => 'Default set of options to pass to tth/m when converting TeX', |
}, |
}, |
}, |
}, |
'grading' => |
'grading' => |
{ text => 'Grading', |
{ text => 'Grading', |
help => 'Course_Environment', |
help => 'Course_Environment', |
header => [{col1 => 'Setting', |
|
col2 => 'Value',}], |
|
ordered => ['grading','rndseed', |
ordered => ['grading','rndseed', |
'receiptalg','disablesigfigs'], |
'receiptalg','disablesigfigs'], |
itemtext => { |
itemtext => { |
grading => 'Grading Type', |
grading => 'Grading', |
rndseed => 'Randomization algorithm', |
rndseed => 'Randomization algorithm used', |
receiptalg => 'Receipt algorithm', |
receiptalg => 'Receipt algorithm used', |
disablesigfigs => 'Disable significant figure checks', |
disablesigfigs => 'Disable checking of Significant Figures', |
}, |
}, |
|
|
}, |
}, |
'printouts' => |
'printouts' => |
{ text => 'Printouts', |
{ text => 'Printout generation', |
help => 'Course_Environment', |
help => 'Course_Environment', |
header => [{col1 => 'Setting', |
|
col2 => 'Value',}], |
|
ordered => ['problem_stream_switch','suppress_tries', |
ordered => ['problem_stream_switch','suppress_tries', |
'default_paper_size','print_header_format', |
'default_paper_size','print_header_format', |
'disableexampointprint','canuse_pdfforms'], |
'disableexampointprint','canuse_pdfforms'], |
Line 294 sub handler {
|
Line 462 sub handler {
|
'spreadsheet' => |
'spreadsheet' => |
{ text => 'Spreadsheets', |
{ text => 'Spreadsheets', |
help => 'Course_Environment', |
help => 'Course_Environment', |
header => [{col1 => 'Setting', |
|
col2 => 'Value'}], |
|
ordered => ['spreadsheet_default_classcalc', |
ordered => ['spreadsheet_default_classcalc', |
'spreadsheet_default_studentcalc', |
'spreadsheet_default_studentcalc', |
'spreadsheet_default_assesscalc','hideemptyrows'], |
'spreadsheet_default_assesscalc','hideemptyrows'], |
Line 309 sub handler {
|
Line 475 sub handler {
|
'bridgetasks' => |
'bridgetasks' => |
{ text => 'Bridge tasks', |
{ text => 'Bridge tasks', |
help => 'Course_Environment', |
help => 'Course_Environment', |
header => [{col1 => 'Setting', |
|
col2 => 'Value'}], |
|
ordered => ['task_messages','task_grading', |
ordered => ['task_messages','task_grading', |
'suppress_embed_prompt'], |
'suppress_embed_prompt'], |
itemtext => { |
itemtext => { |
Line 371 sub print_config_box {
|
Line 535 sub print_config_box {
|
&Apache::loncommon::help_open_topic($item->{'help'}).'</span>'; |
&Apache::loncommon::help_open_topic($item->{'help'}).'</span>'; |
if (($action eq 'feedback') || ($action eq 'classlists')) { |
if (($action eq 'feedback') || ($action eq 'classlists')) { |
$output .= ' |
$output .= ' |
<table class="LC_nested"> |
<table class="LC_nested">'; |
<tr class="LC_info_row"> |
if (exists $item->{'header'}->[0]->{'col1'} || |
|
exists $item->{'header'}->[0]->{'col2'}) { |
|
$output .= ' |
|
<tr class="LC_info_row"> |
<td class="LC_left_item">'.&mt($item->{'header'}->[0]->{'col1'}).'</td> |
<td class="LC_left_item">'.&mt($item->{'header'}->[0]->{'col1'}).'</td> |
<td class="LC_right_item">'.&mt($item->{'header'}->[0]->{'col2'}).'</td> |
<td class="LC_right_item">'.&mt($item->{'header'}->[0]->{'col2'}).'</td> |
</tr>'; |
</tr>'; |
|
} |
$rowtotal ++; |
$rowtotal ++; |
if ($action eq 'feedback') { |
if ($action eq 'feedback') { |
$output .= &print_feedback('top',$cdom,$settings,$ordered,$itemtext,\$rowtotal); |
$output .= &print_feedback('top',$cdom,$settings,$ordered,$itemtext,\$rowtotal); |
Line 394 sub print_config_box {
|
Line 562 sub print_config_box {
|
$output .= &print_classlists('middle',$cdom,$settings,$itemtext,\$rowtotal,$crstype). |
$output .= &print_classlists('middle',$cdom,$settings,$itemtext,\$rowtotal,$crstype). |
' |
' |
</table> |
</table> |
<table class="LC_nested"> |
<table class="LC_nested">'; |
<tr class="LC_info_row"> |
if (exists $item->{'header'}->[0]->{'col1'} || |
<td class="LC_left_item" valign="top">'.&mt($item->{'header'}->[2]->{'col1'}).'</td> |
exists $item->{'header'}->[0]->{'col2'}) { |
<td class="LC_right_item" valign="top">'.&mt($item->{'header'}->[2]->{'col2'}).'</td> |
$output .= ' |
</tr>'; |
<tr class="LC_info_row"> |
|
<td class="LC_left_item">'.&mt($item->{'header'}->[0]->{'col1'}).'</td> |
|
<td class="LC_right_item">'.&mt($item->{'header'}->[0]->{'col2'}).'</td> |
|
</tr>'; |
|
} |
} |
} |
} else { |
} else { |
$output .= ' |
$output .= ' |
<table class="LC_nested"> |
<table class="LC_nested">'; |
<tr class="LC_info_row"> |
if (exists $item->{'header'}->[0]->{'col1'} || |
|
exists $item->{'header'}->[0]->{'col2'}) { |
|
$output .= ' |
|
<tr class="LC_info_row"> |
<td class="LC_left_item" valign="top">'.&mt($item->{'header'}->[0]->{'col1'}).'</td> |
<td class="LC_left_item" valign="top">'.&mt($item->{'header'}->[0]->{'col1'}).'</td> |
<td class="LC_right_item" valign="top">'.&mt($item->{'header'}->[0]->{'col2'}).'</td> |
<td class="LC_right_item" valign="top">'.&mt($item->{'header'}->[0]->{'col2'}).'</td> |
</tr>'; |
</tr>'; |
|
} |
} |
} |
$rowtotal ++; |
$rowtotal ++; |
if ($action eq 'courseinfo') { |
if ($action eq 'courseinfo') { |
Line 551 sub process_changes {
|
Line 727 sub process_changes {
|
my @cloners = split(',',$env{'form.'.$entry}); |
my @cloners = split(',',$env{'form.'.$entry}); |
my @okcloners; |
my @okcloners; |
foreach my $cloner (@cloners) { |
foreach my $cloner (@cloners) { |
my ($uname,$udom) = split(':',$cloner); |
$cloner =~ s/^\s+//; |
if (&check_clone($udom,$disallowed,$uname) eq 'ok') { |
$cloner =~ s/\s+$//; |
if (!grep(/^\Q$cloner\E$/,@okcloners)) { |
unless ($cloner eq '') { |
push(@okcloners,$cloner); |
my ($uname,$udom) = split(':',$cloner); |
|
if (&check_clone($udom,$disallowed,$uname) eq 'ok') { |
|
if (!grep(/^\Q$cloner\E$/,@okcloners)) { |
|
push(@okcloners,$cloner); |
|
} |
} |
} |
} |
} |
} |
} |
Line 844 sub check_clone {
|
Line 1024 sub check_clone {
|
sub store_changes { |
sub store_changes { |
my ($cdom,$cnum,$prefs_order,$actions,$prefs,$values,$changes,$crstype) = @_; |
my ($cdom,$cnum,$prefs_order,$actions,$prefs,$values,$changes,$crstype) = @_; |
my ($chome,$output); |
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')) { |
if ((ref($values) eq 'HASH') && (ref($changes) eq 'HASH')) { |
%storehash = %{$values}; |
%storehash = %{$values}; |
} else { |
} else { |
Line 868 sub store_changes {
|
Line 1048 sub store_changes {
|
$output .= '<h3>'.&mt($prefs->{$item}{'text'}).'</h3>'; |
$output .= '<h3>'.&mt($prefs->{$item}{'text'}).'</h3>'; |
if (ref($changes->{$item}) eq 'HASH') { |
if (ref($changes->{$item}) eq 'HASH') { |
if (keys(%{$changes->{$item}}) > 0) { |
if (keys(%{$changes->{$item}}) > 0) { |
$output .= &mt('Changes made:').'<ul>'; |
$output .= &mt('Changes made:').'<ul style="list-style:none;">'; |
if ($item eq 'other') { |
if ($item eq 'other') { |
foreach my $key (sort(keys(%{$changes->{$item}}))) { |
foreach my $key (sort(keys(%{$changes->{$item}}))) { |
$storehash{$key} = $changes->{$item}{$key}; |
$storehash{$key} = $changes->{$item}{$key}; |
if ($changes->{$item}{$key} eq '') { |
if ($changes->{$item}{$key} eq '') { |
push(@delkeys,$key); |
push(@delkeys,$key); |
$output .= '<li>'.&mt('Deleted setting for [_1]','<i>'.$key.'</i>').'</li>'; |
$output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('Deleted setting for [_1]','<i>'.$key.'</i>')).'</li>'; |
} else { |
} else { |
$output .= '<li>'.&mt('[_1] set to [_2]','<i>'.$key.'</i>', |
$output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('[_1] set to [_2]','<i>'.$key.'</i>', |
"'$storehash{$key}'").'</li>'; |
"'$storehash{$key}'")).'</li>'; |
} |
} |
} |
} |
} else { |
} else { |
Line 909 sub store_changes {
|
Line 1089 sub store_changes {
|
"'<b>".$newname."</b>'").'</li>'; |
"'<b>".$newname."</b>'").'</li>'; |
} |
} |
if ($msg ne '') { |
if ($msg ne '') { |
$output .= '<li>'.&mt($displayname).'<ul>'.$msg.'</ul></li>'; |
$output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt($displayname)).'<ul class="LC_success">'.$msg.'</ul></li>'; |
} |
} |
} else { |
} else { |
next if (!exists($changes->{$item}{$key})); |
next if (!exists($changes->{$item}{$key})); |
Line 984 sub store_changes {
|
Line 1164 sub store_changes {
|
} |
} |
if ($changes->{$item}{$key} eq '') { |
if ($changes->{$item}{$key} eq '') { |
push(@delkeys,$key); |
push(@delkeys,$key); |
$output .= '<li>'.&mt('Deleted setting for [_1]', |
$output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('Deleted setting for [_1]', |
'<i>'.$displayname.'</i>').'</li>'; |
'<i>'.$displayname.'</i>')).'</li>'; |
} else { |
} else { |
$output .= '<li>'.&mt('[_1] set to [_2]', |
$output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('[_1] set to [_2]', |
'<i>'.$displayname.'</i>', |
'<i>'.$displayname.'</i>', |
"'<b>$displayval</b>'"); |
"'<b>$displayval</b>'")); |
if ($key eq 'url') { |
if ($key eq 'url') { |
my $bkuptime=time; |
my $bkuptime=time; |
$output .= (' 'x2).&mt('(Previous URL backed up)').': '. |
$output .= (' 'x2).&mt('(Previous URL backed up)').': '. |
Line 999 sub store_changes {
|
Line 1179 sub store_changes {
|
} |
} |
$storehash{$key} = $changes->{$item}{$key}; |
$storehash{$key} = $changes->{$item}{$key}; |
} |
} |
|
if ($key eq 'cloners') { |
|
# Get existing cloners |
|
my %clonenames = |
|
&Apache::lonnet::dump('environment',$cdom,$cnum,'cloners'); |
|
if ($clonenames{'cloners'} =~ /,/) { |
|
@oldcloner = split(/\s*\,\s*/,$clonenames{'cloners'}); |
|
} else { |
|
$oldcloner[0] = $clonenames{'cloners'}; |
|
} |
|
} |
if (($key eq 'description') || ($key eq 'cloners') || |
if (($key eq 'description') || ($key eq 'cloners') || |
($key eq 'hidefromcat') || ($key eq 'categories')) { |
($key eq 'hidefromcat') || ($key eq 'categories')) { |
push(@need_env_update,$key); |
push(@need_env_update,$key); |
Line 1018 sub store_changes {
|
Line 1208 sub store_changes {
|
} |
} |
} |
} |
if (&Apache::lonnet::put('environment',\%storehash,$cdom,$cnum) eq 'ok') { |
if (&Apache::lonnet::put('environment',\%storehash,$cdom,$cnum) eq 'ok') { |
|
if (ref($changes) eq 'HASH') { |
|
if (ref($changes->{'courseinfo'}) eq 'HASH') { |
|
if (exists($changes->{'courseinfo'}{'cloners'})) { |
|
&change_clone($cdom,$cnum,$changes->{'courseinfo'}{'cloners'}, |
|
\@oldcloner); |
|
} |
|
} |
|
} |
if (@delkeys) { |
if (@delkeys) { |
if (&Apache::lonnet::del('environment',\@delkeys,$cdom,$cnum) ne 'ok') { |
if (&Apache::lonnet::del('environment',\@delkeys,$cdom,$cnum) ne 'ok') { |
$output .= '<br /><span class="LC_error">'; |
$output .= '<br /><span class="LC_error">'; |
Line 1313 sub print_courseinfo {
|
Line 1511 sub print_courseinfo {
|
'</span>', |
'</span>', |
input => 'textbox', |
input => 'textbox', |
size => '40', |
size => '40', |
|
advanced => 1 |
}, |
}, |
'description' => { |
'description' => { |
text => '<b>'.&mt($itemtext->{'description'}).'</b>', |
text => '<b>'.&mt($itemtext->{'description'}).'</b>', |
input => 'textbox', |
input => 'textbox', |
size => '25', |
size => '25', |
}, |
}, |
|
'owner' => { |
|
text => '<b>'.&mt($itemtext->{'owner'}).'</b>', |
|
}, |
'courseid' => { |
'courseid' => { |
text => '<b>'.&mt($itemtext->{'courseid'}).'</b><br />'.'('. |
text => '<b>'.&mt($itemtext->{'courseid'}).'</b><br />'.'('. |
&mt('internal, optional').')', |
&mt('internal, optional').')', |
Line 1327 sub print_courseinfo {
|
Line 1529 sub print_courseinfo {
|
}, |
}, |
'cloners' => { |
'cloners' => { |
text => '<b>'.&mt($itemtext->{'cloners'}).'</b><br />'. |
text => '<b>'.&mt($itemtext->{'cloners'}).'</b><br />'. |
&mt('Coordinators included automatically'), |
&mt('Owner and Coordinators included automatically'), |
input => 'textbox', |
input => 'textbox', |
size => '40', |
size => '40', |
|
advanced => 1 |
}, |
}, |
'rolenames' => { |
'rolenames' => { |
text => '<b>'.&mt($itemtext->{'rolenames'}).'</b><br />'. |
text => '<b>'.&mt($itemtext->{'rolenames'}).'</b><br />'. |
'('.$replace.')', |
'('.$replace.')', |
input => 'textbox', |
input => 'textbox', |
size => '20', |
size => '20', |
|
advanced => 1 |
}, |
}, |
'externalsyllabus' => { |
'externalsyllabus' => { |
text => '<b>'.&mt($itemtext->{'externalsyllabus'}).'</b><br />('. |
text => '<b>'.&mt($itemtext->{'externalsyllabus'}).'</b><br />('. |
Line 1364 sub print_courseinfo {
|
Line 1568 sub print_courseinfo {
|
next if (!$can_categorize); |
next if (!$can_categorize); |
} |
} |
$count ++; |
$count ++; |
$datatable .= &item_table_row_start($items{$item}{text},$count); |
if (exists $items{$item}{advanced} && $items{$item}{advanced} == 1) { |
|
$datatable .= &item_table_row_start($items{$item}{text},$count,"advanced"); |
|
} else { |
|
$datatable .= &item_table_row_start($items{$item}{text},$count); |
|
} |
if ($items{$item}{input} eq 'radio') { |
if ($items{$item}{input} eq 'radio') { |
$datatable .= &yesno_radio($item,$settings); |
$datatable .= &yesno_radio($item,$settings); |
} elsif ($item eq 'cloners') { |
} elsif ($item eq 'cloners') { |
Line 1399 sub print_courseinfo {
|
Line 1607 sub print_courseinfo {
|
if (@entries > 0) { |
if (@entries > 0) { |
foreach my $entry (@entries) { |
foreach my $entry (@entries) { |
my ($uname,$udom) = split(/:/,$entry); |
my ($uname,$udom) = split(/:/,$entry); |
|
if ($udom =~ /^$match_domain$/) { |
|
unless (&Apache::lonnet::domain($udom)) { |
|
next; |
|
} |
|
} else { |
|
next; |
|
} |
if ($uname eq '*') { |
if ($uname eq '*') { |
$datatable .= |
$datatable .= |
&Apache::loncommon::start_data_table_row(). |
&Apache::loncommon::start_data_table_row(). |
'<td valign="top" align="left"><span class="LC_nobreak">'. |
'<td valign="top" align="left"><span class="LC_nobreak">'. |
&mt('Domain:').'<b> '.$udom. |
&mt('Any user in domain:').'<b> '.$udom. |
'</b><input type="hidden" name="cloners_dom_'.$num. |
'</b><input type="hidden" name="cloners_dom_'.$num. |
'" value="'.$udom.'" /></span><br />'. |
'" value="'.$udom.'" /></span><br />'. |
'<span class="LC_nobreak"><label><input type="checkbox" '. |
'<span class="LC_nobreak"><label><input type="checkbox" '. |
Line 1411 sub print_courseinfo {
|
Line 1626 sub print_courseinfo {
|
&mt('Delete').'</label></span></td>'. |
&mt('Delete').'</label></span></td>'. |
&Apache::loncommon::end_data_table_row(); |
&Apache::loncommon::end_data_table_row(); |
$num ++; |
$num ++; |
} else { |
} elsif (&Apache::lonnet::homeserver($uname,$udom) ne 'no_host') { |
push(@cloners,$entry); |
unless (grep(/^\Q$entry\E$/,@cloners)) { |
|
push(@cloners,$entry); |
|
} |
} |
} |
} |
} |
} |
} |
Line 1468 sub print_courseinfo {
|
Line 1685 sub print_courseinfo {
|
$datatable .= '<input type="hidden" name="categories" value="'.$settings->{$item}.'" />'. |
$datatable .= '<input type="hidden" name="categories" value="'.$settings->{$item}.'" />'. |
&Apache::lonhtmlcommon::textbox($item.'_display',$settings->{$item}, |
&Apache::lonhtmlcommon::textbox($item.'_display',$settings->{$item}, |
$items{$item}{size},$launcher); |
$items{$item}{size},$launcher); |
|
} elsif ($item eq 'owner') { |
|
my $owner = $env{'course.'.$env{'request.course.id'}.'.internal.courseowner'}; |
|
if ($owner =~ /:/) { |
|
my ($ownername,$ownerdom) = split(':',$owner); |
|
$owner = &Apache::loncommon::plainname($ownername,$ownerdom); |
|
} elsif ($owner ne '') { |
|
$owner = &Apache::loncommon::plainname($owner,$cdom); |
|
} else { |
|
$owner = &mt('None specified'); |
|
} |
|
my $domdesc = &Apache::lonnet::domain($cdom,'description'); |
|
$datatable .= $owner; |
} else { |
} else { |
$datatable .= &Apache::lonhtmlcommon::textbox($item,$settings->{$item},$items{$item}{size}); |
$datatable .= &Apache::lonhtmlcommon::textbox($item,$settings->{$item},$items{$item}{size}); |
} |
} |
Line 1750 sub print_feedback {
|
Line 1979 sub print_feedback {
|
my %sections = &Apache::loncommon::get_sections($cdom,$cnum); |
my %sections = &Apache::loncommon::get_sections($cdom,$cnum); |
my @sections = sort( { $a <=> $b } keys(%sections)); |
my @sections = sort( { $a <=> $b } keys(%sections)); |
my %lt = &Apache::lonlocal::texthash ( |
my %lt = &Apache::lonlocal::texthash ( |
currone => 'Current recipient:', |
currone => 'Current recipient:', |
curmult => 'Current recipients:', |
currmult => 'Current recipients:', |
add => 'Additional recipient:', |
add => 'Additional recipient:', |
del => 'Delete?', |
del => 'Delete?', |
sec => 'Sections:', |
sec => 'Sections:', |
); |
); |
|
|
foreach my $item (@{$ordered}) { |
foreach my $item (@{$ordered}) { |
$count ++; |
$count ++; |
$datatable .= &item_table_row_start($items{$item}{text},$count); |
if ($position eq 'top') { |
|
$datatable .= &item_table_row_start($items{$item}{text},$count); |
|
} else { |
|
$datatable .= &item_table_row_start($items{$item}{text}."<br/>(Custom text)",$count, "advanced"); |
|
} |
if ($position eq 'top') { |
if ($position eq 'top') { |
my $includeempty = 0; |
my $includeempty = 0; |
$datatable .= &user_table($cdom,$item,\@sections, |
$datatable .= &user_table($cdom,$item,\@sections, |
Line 1815 sub user_table {
|
Line 2048 sub user_table {
|
if ($num) { |
if ($num) { |
$output .= '<tr>'. |
$output .= '<tr>'. |
'<td align="left"><i>'; |
'<td align="left"><i>'; |
if ($num > 1) { |
if ($num == 1) { |
$output .= $lt->{'currone'}; |
$output .= $lt->{'currone'}; |
} else { |
} else { |
$output .= $lt->{'currmult'}; |
$output .= $lt->{'currmult'}; |
Line 1935 sub print_discussion {
|
Line 2168 sub print_discussion {
|
my %sections = &Apache::loncommon::get_sections($cdom,$cnum); |
my %sections = &Apache::loncommon::get_sections($cdom,$cnum); |
my @sections = sort( { $a <=> $b } keys(%sections)); |
my @sections = sort( { $a <=> $b } keys(%sections)); |
my %lt = &Apache::lonlocal::texthash ( |
my %lt = &Apache::lonlocal::texthash ( |
currone => 'Disallowed:', |
currone => 'Disallowed:', |
curmult => 'Disallowed:', |
currmult => 'Disallowed:', |
add => 'Disallow more:', |
add => 'Disallow more:', |
del => 'Delete?', |
del => 'Delete?', |
sec => 'Sections:', |
sec => 'Sections:', |
); |
); |
|
|
foreach my $item (@{$ordered}) { |
foreach my $item (@{$ordered}) { |
Line 2435 sub get_other_items {
|
Line 2668 sub get_other_items {
|
} |
} |
|
|
sub item_table_row_start { |
sub item_table_row_start { |
my ($text,$count) = @_; |
my ($text,$count,$add_class) = @_; |
my $output; |
my $output; |
if ($count%2) { |
my $css_class = ($count % 2) ? 'LC_odd_row' : 'LC_even_row'; |
$output .= '<tr class="LC_odd_row">'; |
$css_class = (join(' ',$css_class,$add_class)) unless ($add_class eq ''); |
} else { |
$output .= '<tr class="'.$css_class.'">'."\n";; |
$output .= '<tr>'; |
|
} |
|
$output .= '<td class="LC_left_item">'.$text. |
$output .= '<td class="LC_left_item">'.$text. |
'</td><td class="LC_right_item" align="right">'; |
'</td><td class="LC_right_item">'; |
return $output; |
return $output; |
} |
} |
|
|
Line 2639 sub print_hdrfmt_row {
|
Line 2870 sub print_hdrfmt_row {
|
$currstr .= '<b>'.&mt('Current print header:').' <span class="LC_warning"><tt>'. |
$currstr .= '<b>'.&mt('Current print header:').' <span class="LC_warning"><tt>'. |
$settings->{$item}.'</tt></span></b><br />'; |
$settings->{$item}.'</tt></span></b><br />'; |
my @current = split(/(%\d*[nca])/,$settings->{$item}); |
my @current = split(/(%\d*[nca])/,$settings->{$item}); |
foreach my $item (@current) { |
foreach my $val (@current) { |
unless ($item eq '') { |
unless ($val eq '') { |
push(@curr,$item); |
push(@curr,$val); |
} |
} |
} |
} |
$currnum = @curr; |
$currnum = @curr; |
Line 2794 sub substitution_selector {
|
Line 3025 sub substitution_selector {
|
return $output; |
return $output; |
} |
} |
|
|
|
sub change_clone { |
|
my ($cdom,$cnum,$clonelist,$oldcloner) = @_; |
|
my $clone_crs = $cnum.':'.$cdom; |
|
if ($cnum && $cdom) { |
|
my $clone_crs = $cnum.':'.$cdom; |
|
my @allowclone; |
|
if ($clonelist =~ /,/) { |
|
@allowclone = split(',',$clonelist); |
|
} else { |
|
$allowclone[0] = $clonelist; |
|
} |
|
foreach my $currclone (@allowclone) { |
|
if (!grep(/^$currclone$/,@$oldcloner)) { |
|
if ($currclone ne '*') { |
|
my ($uname,$udom) = split(/:/,$currclone); |
|
if ($uname && $udom && $uname ne '*') { |
|
if (&Apache::lonnet::homeserver($uname,$udom) ne 'no_host') { |
|
my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable'); |
|
if ($currclonecrs{'cloneable'} !~ /\Q$clone_crs\E/) { |
|
if ($currclonecrs{'cloneable'} eq '') { |
|
$currclonecrs{'cloneable'} = $clone_crs; |
|
} else { |
|
$currclonecrs{'cloneable'} .= ','.$clone_crs; |
|
} |
|
&Apache::lonnet::put('environment',\%currclonecrs,$udom,$uname); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
foreach my $oldclone (@$oldcloner) { |
|
if (!grep(/^\Q$oldclone\E$/,@allowclone)) { |
|
if ($oldclone ne '*') { |
|
my ($uname,$udom) = split(/:/,$oldclone); |
|
if ($uname && $udom && $uname ne '*' ) { |
|
if (&Apache::lonnet::homeserver($uname,$udom) ne 'no_host') { |
|
my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable'); |
|
my %newclonecrs = (); |
|
if ($currclonecrs{'cloneable'} =~ /\Q$clone_crs\E/) { |
|
if ($currclonecrs{'cloneable'} =~ /,/) { |
|
my @currclonecrs = split/,/,$currclonecrs{'cloneable'}; |
|
foreach my $crs (@currclonecrs) { |
|
if ($crs ne $clone_crs) { |
|
$newclonecrs{'cloneable'} .= $crs.','; |
|
} |
|
} |
|
$newclonecrs{'cloneable'} =~ s/,$//; |
|
} else { |
|
$newclonecrs{'cloneable'} = ''; |
|
} |
|
&Apache::lonnet::put('environment',\%newclonecrs,$udom,$uname); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return; |
|
} |
|
|
1; |
1; |