--- loncom/interface/courseprefs.pm 2012/04/11 13:02:39 1.28.2.12
+++ loncom/interface/courseprefs.pm 2012/12/21 18:51:49 1.51
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Handler to set configuration settings for a course
#
-# $Id: courseprefs.pm,v 1.28.2.12 2012/04/11 13:02:39 raeburn Exp $
+# $Id: courseprefs.pm,v 1.51 2012/12/21 18:51:49 bisitz Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -215,6 +215,7 @@ use Apache::lonnet;
use Apache::loncommon();
use Apache::lonhtmlcommon();
use Apache::lonconfigsettings;
+use Apache::lonparmset;
use Apache::lonlocal;
use LONCAPA qw(:DEFAULT :match);
@@ -267,8 +268,8 @@ sub handler {
my %lt;
if ($crstype eq 'Community') {
%lt = (
- conf => 'Community Configuration',
- edit => 'Edit Community Configuration',
+ conf => 'Community Settings',
+ edit => 'Edit Community Settings',
gens => 'General community settings',
idnu => 'Community ID or number',
desc => 'Community Description',
@@ -286,7 +287,7 @@ sub handler {
defd => 'Default dates for member access',
stuv => 'Member-viewable membership list options',
stul => 'Member agreement needed to be listed',
- clas => 'Membership and Facilitator Listing',
+ clas => 'Membership and facilitator listing',
priv => 'Privileged users (Domain Coordinators) in facilitator listing',
defc => 'Default Community Spreadsheet',
defs => 'Default User Spreadsheet',
@@ -294,8 +295,8 @@ sub handler {
);
} else {
%lt = (
- conf => 'Course Configuration',
- edit => 'Edit Course Configuration',
+ conf => 'Course Settings',
+ edit => 'Edit Course Settings',
gens => 'General course settings',
idnu => 'Course ID or number',
desc => 'Course Description',
@@ -313,7 +314,7 @@ sub handler {
defd => 'Default dates for student access',
stuv => 'Student-viewable classlist options',
stul => 'Student agreement needed to be listed',
- clas => 'Classlists and Staff Listing',
+ clas => 'Classlists and staff listing',
priv => 'Privileged users (Domain Coordinators) in staff listing',
defc => 'Default Course Spreadsheet',
defs => 'Default Student Spreadsheet',
@@ -338,7 +339,7 @@ sub handler {
if ($phase eq 'releaseinfo') {
my $loncaparev = $env{'course.'.$cid.'.internal.releaserequired'};
- if ($loncaparev) {
+ if ($loncaparev) {
&display_loncaparev_constraints($r,$navmap,$loncaparev,$crstype);
return OK;
}
@@ -352,9 +353,7 @@ sub handler {
my %prefs = (
'courseinfo' =>
{ text => $lt{'gens'},
- help => 'Course_Environment',
- header => [{col1 => 'Setting',
- col2 => 'Value'}],
+ help => 'Course_Prefs_General',
ordered => ['owner','co-owners','loncaparev','description',
'courseid','categories','hidefromcat',
'externalsyllabus','cloners','url','rolenames'],
@@ -373,10 +372,8 @@ sub handler {
},
},
'localization' =>
- { text => 'Language and Time Localization',
- help => 'Course_Environment',
- header => [{col1 => 'Setting',
- col2 => 'Value',}],
+ { text => 'Language and time localization',
+ help => 'Course_Prefs_Language',
ordered => ['languages','timezone','datelocale'],
itemtext => {
languages => 'Languages used',
@@ -386,11 +383,9 @@ sub handler {
},
'feedback' =>
{ text => 'Feedback messages',
- help => 'Course_Environment',
+ help => 'Course_Prefs_Feedback',
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',
@@ -400,11 +395,12 @@ sub handler {
},
'discussion' =>
{ text => 'Discussion and Chat',
- help => 'Course_Environment',
+ help => 'Course_Prefs_Discussions',
ordered => ['pch.roles.denied','pch.users.denied',
'plc.roles.denied','plc.users.denied',
'allow_limited_html_in_feedback',
- 'allow_discussion_post_editing'],
+ 'allow_discussion_post_editing',
+ 'discussion_post_fonts'],
itemtext => {
'pch.roles.denied' => 'No Resource Discussion',
'pch.users.denied' => 'No Resource Discussion',
@@ -412,11 +408,12 @@ sub handler {
'plc.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',
+ discussion_post_fonts => 'Discussion post fonts based on likes/unlikes',
},
},
'classlists' =>
{ text => $lt{'clas'},
- help => 'Course_Environment',
+ help => 'Course_Prefs_Classlists',
header => [{col1 => 'Type',
col2 => $lt{'defd'}},
{col1 => 'Setting',
@@ -438,9 +435,7 @@ sub handler {
},
'appearance' =>
{ text => 'Display of resources ',
- help => 'Course_Environment',
- header => [{col1 => 'Setting',
- col2 => 'Value',}],
+ help => 'Course_Prefs_Display',
ordered => ['default_xml_style','pageseparators',
'disable_receipt_display','texengine',
'tthoptions'],
@@ -454,9 +449,7 @@ sub handler {
},
'grading' =>
{ text => 'Grading',
- help => 'Course_Environment',
- header => [{col1 => 'Setting',
- col2 => 'Value',}],
+ help => 'Course_Prefs_Grading',
ordered => ['grading','rndseed',
'receiptalg','disablesigfigs'],
itemtext => {
@@ -469,26 +462,22 @@ sub handler {
},
'printouts' =>
{ text => 'Printout generation',
- help => 'Course_Environment',
- header => [{col1 => 'Setting',
- col2 => 'Value',}],
+ help => 'Course_Prefs_Printouts',
ordered => ['problem_stream_switch','suppress_tries',
'default_paper_size','print_header_format',
- 'disableexampointprint'],
+ 'disableexampointprint','canuse_pdfforms'],
itemtext => {
problem_stream_switch => 'Allow problems to be split over pages',
suppress_tries => 'Suppress number of tries in printing',
default_paper_size => 'Default paper type',
print_header_format => 'Print header format',
- disableexampointprint => 'Disable automatically printing point values on exams',
+ disableexampointprint => 'Disable automatically printing point values on bubblesheet exams',
canuse_pdfforms => 'Users can print problems as PDF forms and upload later for grading',
},
},
'spreadsheet' =>
{ text => 'Spreadsheets',
- help => 'Course_Environment',
- header => [{col1 => 'Setting',
- col2 => 'Value'}],
+ help => 'Course_Prefs_Spreadsheet',
ordered => ['spreadsheet_default_classcalc',
'spreadsheet_default_studentcalc',
'spreadsheet_default_assesscalc','hideemptyrows'],
@@ -501,9 +490,7 @@ sub handler {
},
'bridgetasks' =>
{ text => 'Bridge tasks',
- help => 'Course_Environment',
- header => [{col1 => 'Setting',
- col2 => 'Value'}],
+ help => 'Course_Prefs_Bridgetasks',
ordered => ['task_messages','task_grading',
'suppress_embed_prompt'],
itemtext => {
@@ -514,7 +501,7 @@ sub handler {
},
'other' =>
{ text => 'Other settings',
- help => 'Course_Environment',
+ help => 'Course_Prefs_Other',
header => [ {col1 => 'Item',
col2 => 'Value',
}],
@@ -524,15 +511,15 @@ sub handler {
my @allitems = &get_allitems(%prefs);
&Apache::lonconfigsettings::make_changes($r,$cdom,$phase,$context,
\@prefs_order,\%prefs,\%values,
- $cnum,undef,\@allitems);
+ $cnum,undef,\@allitems,'coursepref');
} elsif ($phase eq 'display') {
my $jscript = &get_jscript($cid,$cdom,$phase,$crstype);
my @allitems = &get_allitems(%prefs);
&Apache::lonconfigsettings::display_settings($r,$cdom,$phase,$context,
- \@prefs_order,\%prefs,\%values,undef,$jscript,\@allitems,$crstype);
+ \@prefs_order,\%prefs,\%values,undef,$jscript,\@allitems,$crstype,'coursepref');
} else {
&Apache::lonconfigsettings::display_choices($r,$phase,$context,
- \@prefs_order,\%prefs);
+ \@prefs_order,\%prefs,'coursepref');
}
return OK;
}
@@ -569,7 +556,7 @@ sub print_config_box {
$output .= '
- ';
+ ';
if (exists $item->{'header'}->[0]->{'col1'} ||
exists $item->{'header'}->[0]->{'col2'}) {
$output .= '
@@ -589,7 +576,7 @@ sub print_config_box {
-
+ |
'.&mt($item->{'header'}->[1]->{'col1'}).' | ';
@@ -605,14 +592,14 @@ sub print_config_box {
';
- if (exists $item->{'header'}->[0]->{'col1'} ||
- exists $item->{'header'}->[0]->{'col2'}) {
+ if (exists $item->{'header'}->[2]->{'col1'} ||
+ exists $item->{'header'}->[2]->{'col2'}) {
$output .= '
- '.&mt($item->{'header'}->[0]->{'col1'}).' |
- '.&mt($item->{'header'}->[0]->{'col2'}).' |
+ '.&mt($item->{'header'}->[2]->{'col1'}).' |
+ '.&mt($item->{'header'}->[2]->{'col2'}).' |
';
- }
+ }
}
} else {
$output .= '
@@ -688,7 +675,7 @@ sub process_changes {
(!$can_toggle_cat));
next if (($entry eq 'categories') &&
(!$can_categorize));
- next if (($entry eq 'loncaparev') ||
+ next if (($entry eq 'loncaparev') ||
($entry eq 'owner'));
push(@ordered,$entry);
}
@@ -1002,6 +989,35 @@ sub process_changes {
}
}
$newvalues{$entry} =~ s/,$//;
+ } elsif ($entry eq 'discussion_post_fonts') {
+ my ($classorder,$classtitles) = &discussion_vote_classes();
+ my $fontchange = 0;
+ foreach my $class (@{$classorder}) {
+ my $ext_entry = $entry.'_'.$class;
+ my $size = $env{'form.'.$ext_entry.'_size'};
+ my $unit = $env{'form.'.$ext_entry.'_unit'};
+ my $weight = $env{'form.'.$ext_entry.'_weight'};
+ my $style = $env{'form.'.$ext_entry.'_style'};
+ my $other = $env{'form.'.$ext_entry.'_other'};
+ $size =~ s/,//g;
+ $unit =~ s/,//g;
+ $weight =~ s/,//g;
+ $style =~ s/,//g;
+ $other =~ s/[^\w;:\s\-\%.]//g;
+ $other =~ s/(^\s+|\s+$)//g;
+ $newvalues{$ext_entry} = join(',',($size.$unit,$weight,$style,$other));
+ my $current = $values->{$ext_entry};
+ if ($values->{$ext_entry} eq '') {
+ $current = ',,,';
+ }
+ if ($newvalues{$ext_entry} ne $current) {
+ $changes->{$ext_entry} = $newvalues{$ext_entry};
+ $fontchange ++;
+ }
+ }
+ if ($fontchange) {
+ $changes->{$entry} = 1;
+ }
} elsif ($entry eq 'nothideprivileged') {
my @curr_nothide;
my @new_nothide;
@@ -1105,7 +1121,7 @@ sub process_changes {
} else {
$newvalues{$entry} = $env{'form.'.$entry};
}
- unless ($entry eq 'co-owners') {
+ unless (($entry eq 'co-owners') || ($entry eq 'discussion_post_fonts')) {
if ($newvalues{$entry} ne $values->{$entry}) {
$changes->{$entry} = $newvalues{$entry};
}
@@ -1232,7 +1248,7 @@ sub store_changes {
my ($displayname,$text);
$text = $prefs->{$item}->{'itemtext'}{$key};
my $displayval;
- unless ($key eq 'co-owners') {
+ unless (($key eq 'co-owners') || ($key eq 'discussion_post_fonts')) {
$displayval = $changes->{$item}{$key};
}
if ($item eq 'feedback') {
@@ -1268,6 +1284,36 @@ sub store_changes {
}
$displayval = join(', ',@longroles);
}
+ } elsif ($key eq 'discussion_post_fonts') {
+ my ($classorder,$classtitles)=&discussion_vote_classes();
+ my ($styleorder,$styleitems)=&discussion_vote_styles();
+ my $count = 1;
+ my $total = scalar(keys(%{$changes->{$item}}));
+ foreach my $class (@{$classorder}) {
+ $count ++;
+ next unless ($changes->{$item}{$key.'_'.$class});
+ my @vals = split(/,/,$changes->{$item}{$key.'_'.$class});
+ my $showval = '';
+ for (my $i=0; $i<@{$styleorder}; $i++) {
+ if ($vals[$i] ne '') {
+ $showval .= 'font-'.$styleorder->[$i].': '.$vals[$i].'; ';
+ }
+ }
+ if ($vals[3] ne '') {
+ $showval .= $vals[3];
+ }
+ if ($showval ne '') {
+ $displayval .= $classtitles->{$class}.':{ '.
+ $showval.'}';
+ $storehash{$key.'_'.$class} = $changes->{$item}{$key.'_'.$class};
+ } else {
+ $displayval .= $classtitles->{$class}.': '.&mt('None');
+ push(@delkeys,$key.'_'.$class);
+ }
+ unless ($count == $total) {
+ $displayval .= (' 'x2);
+ }
+ }
}
$displayname = &mt($text);
}
@@ -1367,7 +1413,9 @@ sub store_changes {
}
}
} else {
- $storehash{$key} = $changes->{$item}{$key};
+ unless ($key eq 'discussion_post_fonts') {
+ $storehash{$key} = $changes->{$item}{$key};
+ }
}
}
if ($key eq 'cloners') {
@@ -1730,6 +1778,7 @@ sub print_courseinfo {
'',
input => 'textbox',
size => '40',
+ advanced => 1
},
'description' => {
text => ''.&mt($itemtext->{'description'}).'',
@@ -1752,13 +1801,14 @@ sub print_courseinfo {
text => ''.&mt($itemtext->{'cloners'}).' '.
&mt('Owner and Coordinators included automatically'),
input => 'textbox',
- size => '40',
+ size => '40'
},
'rolenames' => {
text => ''.&mt($itemtext->{'rolenames'}).' '.
'('.$replace.')',
input => 'textbox',
size => '20',
+ advanced => 1
},
'externalsyllabus' => {
text => ''.&mt($itemtext->{'externalsyllabus'}).' ('.
@@ -1790,7 +1840,11 @@ sub print_courseinfo {
next if (!$can_categorize);
}
$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') {
$datatable .= &yesno_radio($item,$settings);
} elsif ($item eq 'cloners') {
@@ -2139,7 +2193,7 @@ sub display_loncaparev_constraints {
if ($key =~ /^\Q$start\E(\[useropt\:($match_username\:$match_domain)\]\.)/) {
$middle = $1;
$which = $2;
- $scope = 'user';
+ $scope = 'user';
} elsif ($key =~ /^\Q$start\E(\[(\w+)\]\.)/) {
$middle = $1;
$which = $2;
@@ -2334,7 +2388,7 @@ sub display_loncaparev_constraints {
my $mapres_header = ''.
&mt('Requirements for specific folders or resources').
'';
- if ((keys(%toshow) > 0) || (keys(%byresource) > 0) ||
+ if ((keys(%toshow) > 0) || (keys(%byresource) > 0) ||
(keys(%bysubmission) > 0) || (keys(%byresponsetype))) {
$output .= $mapres_header;
}
@@ -2349,11 +2403,11 @@ sub display_loncaparev_constraints {
&show_contents_view($r,$navmap,$cid,\%toshow,\%bymap,\%byresource,\%bysubmission,
\%byresponsetype,\@scopeorder,\%lt);
}
- $r->print('
');
+ $r->print('
');
} else {
$r->print(''.
&mt('No version requirements from resource content or settings.').
- ' ');
+ '');
}
$r->print(&Apache::loncommon::end_page());
return;
@@ -2362,7 +2416,7 @@ sub display_loncaparev_constraints {
sub show_contents_view {
my ($r,$navmap,$cid,$toshow,$bymap,$byresource,$bysubmission,$byresponsetype,
$scopeorder,$lt) = @_;
- if ((keys(%{$toshow}) > 0) || (keys(%{$byresource}) > 0) ||
+ if ((keys(%{$toshow}) > 0) || (keys(%{$byresource}) > 0) ||
(keys(%{$bysubmission}) > 0) || (keys(%{$byresponsetype}) > 0)) {
my $location=&Apache::loncommon::lonhttpdurl("/adm/lonIcons");
my $whitespace = ' ';
@@ -2806,14 +2860,18 @@ sub print_feedback {
foreach my $item (@{$ordered}) {
$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}." (Custom text)",$count, "advanced");
+ }
if ($position eq 'top') {
my $includeempty = 0;
$datatable .= &user_table($cdom,$item,\@sections,
$settings->{$item},\%lt);
} else {
$datatable .= &Apache::lonhtmlcommon::textbox($item.'.text',
- $settings->{$item.'.text'},$items{$item}{size});
+ $settings->{$item.'.text'},$items{$item}{size});
}
$datatable .= &item_table_row_end();
}
@@ -2975,6 +3033,11 @@ sub print_discussion {
text => ''.&mt($itemtext->{'allow_discussion_post_editing'}).'',
input => 'checkbox',
},
+ 'discussion_post_fonts' => {
+ text => ''.&mt($itemtext->{'discussion_post_fonts'}).'',
+ input => 'textbox',
+ size => '20',
+ },
);
my $datatable;
my $count;
@@ -3014,6 +3077,17 @@ sub print_discussion {
&Apache::loncommon::end_data_table_row().
&role_checkboxes($cdom,$cnum,$item,$settings,1).
&Apache::loncommon::end_data_table();
+ } elsif ($item eq 'discussion_post_fonts') {
+ $datatable .= &Apache::loncommon::start_data_table().
+ &Apache::loncommon::start_data_table_row().
+ ''.&mt('Sum of likes/dislikes').' | '.
+ ''.&mt('font-size').' | '.
+ ''.&mt('font-weight').' | '.
+ ''.&mt('font-style').' | '.
+ ''.&mt('Other css').' | '.
+ &Apache::loncommon::end_data_table_row().
+ &set_discussion_fonts($cdom,$cnum,$item,$settings).
+ &Apache::loncommon::end_data_table();
}
$datatable .= &item_table_row_end();
}
@@ -3135,6 +3209,75 @@ sub role_checkboxes {
return $output;
}
+sub set_discussion_fonts {
+ my ($cdom,$cnum,$item,$settings) = @_;
+ my ($classorder,$classtitles) = &discussion_vote_classes();
+ my ($styleorder,$styleitems) = &discussion_vote_styles();
+ my $output;
+ if (ref($classorder) eq 'ARRAY') {
+ foreach my $cat (@{$classorder}) {
+ my %curr = ();
+ ($curr{'size'},$curr{'weight'},$curr{'style'},$curr{'other'}) =
+ split(/,/,$settings->{'discussion_post_fonts_'.$cat});
+ $output .= &Apache::loncommon::start_data_table_row().
+ ''.$classtitles->{$cat}.' | ';
+ if (ref($styleorder) eq 'ARRAY') {
+ foreach my $item (@{$styleorder}) {
+ $output .= '';
+ my $selitem = $item;
+ if ($item eq 'size') {
+ my ($currsize,$currunit);
+ if ($curr{'size'} =~ /^(\d+)(px|%)$/) {
+ ($currsize,$currunit) = ($1,$2);
+ $curr{'size'} = $currunit;
+ }
+ $output .= ''.
+ ' ';
+ $selitem = 'unit';
+ }
+ if ((ref($styleitems) eq 'HASH') && (ref($styleitems->{$item}) eq 'ARRAY')) {
+ $output .= ' | | ';
+ }
+ $output .= &Apache::loncommon::end_data_table_row();
+ }
+ return $output;
+}
+
+sub discussion_vote_classes {
+ my $classorder = ['twoplus','oneplus','zero','oneminus','twominus'];
+ my %classtitles = &Apache::lonlocal::texthash(
+ 'twoplus' => 'Two sigma above mean',
+ 'oneplus' => 'One sigma above mean',
+ 'zero' => 'Within one sigma of mean',
+ 'oneminus' => 'One sigma below mean',
+ 'twominus' => 'Two sigma below mean',
+ );
+ return ($classorder,\%classtitles);
+}
+
+sub discussion_vote_styles {
+ my $styleorder = ['size','weight','style'];
+ my $styleitems = {
+ size => ['','px','%','xx-small','x-small','small','medium','large',
+ 'x-large','xx-large','smaller','larger'],
+ weight => ['','normal','bold','bolder','lighter','100','200','300','400',
+ '500','600','700','800','900'],
+ style => ['','normal','italic','oblique'],
+ };
+ return ($styleorder,$styleitems);
+}
+
sub print_classlists {
my ($position,$cdom,$settings,$itemtext,$rowtotal,$crstype) = @_;
my @ordered;
@@ -3263,11 +3406,12 @@ sub print_grading {
input => 'selectbox',
options => {
standard => &mt('Standard: shows points'),
+ categories => &mt('Categories: shows points according to categories'),
external => &mt('External: shows number of completed parts and totals'),
externalnototals => &mt('External: shows only number of completed parts'),
spreadsheet => &mt('Spreadsheet: (with link to detailed scores)'),
},
- order => ['standard','external','externalnototals','spreadsheet'],
+ order => ['standard','categories','external','externalnototals','spreadsheet'],
},
'rndseed' => {
text => ''.&mt($itemtext->{'rndseed'}).''.
@@ -3284,6 +3428,7 @@ sub print_grading {
'64bit5' => '64bit5',
},
order => ['32bit','64bit','64bit2','64bit3','64bit4','64bit5'],
+ advanced => 1
},
'receiptalg' => {
text => ''.&mt($itemtext->{'receiptalg'}).' '.
@@ -3295,6 +3440,7 @@ sub print_grading {
receipt3 => 'receipt3',
},
order => ['receipt','receipt2','receipt3'],
+ advanced => 1
},
'disablesigfigs' => {
text => ''.&mt($itemtext->{'disablesigfigs'}).'',
@@ -3474,7 +3620,8 @@ sub get_other_items {
unless (($parameter =~ m/^internal\./)||($parameter =~ m/^metadata\./) ||
($parameter =~ m/^selfenroll_/) || ($parameter =~ /_selfenroll$/)
|| ($parameter eq 'type') ||
- ($parameter =~ m/^(cc|co|in|ta|ep|ad|st)\.plaintext$/)) {
+ ($parameter =~ m/^(cc|co|in|ta|ep|ad|st)\.plaintext$/)
+ || ($parameter =~ m/^discussion_post_fonts/)) {
push(@ordered,$parameter);
}
}
@@ -3566,7 +3713,11 @@ sub make_item_rows {
my $count = 0;
foreach my $item (@{$ordered}) {
$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 ($item eq 'nothideprivileged') {
$datatable .= ¬hidepriv_row($cdom,$item,$settings,$crstype);
} elsif ($item eq 'print_header_format') {
| | |