--- loncom/interface/lonmodifycourse.pm 2010/03/15 19:10:59 1.51 +++ loncom/interface/lonmodifycourse.pm 2013/07/19 18:24:16 1.62 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # handler for DC-only modifiable course settings # -# $Id: lonmodifycourse.pm,v 1.51 2010/03/15 19:10:59 raeburn Exp $ +# $Id: lonmodifycourse.pm,v 1.62 2013/07/19 18:24:16 bisitz Exp $ # # Copyright Michigan State University Board of Trustees # @@ -39,18 +39,22 @@ use lib '/home/httpd/lib/perl'; use LONCAPA; sub get_dc_settable { - my ($type) = @_; + my ($type,$cdom) = @_; if ($type eq 'Community') { return ('courseowner'); } else { - return ('courseowner','coursecode','authtype','autharg'); + my @items = ('courseowner','coursecode','authtype','autharg'); + if (&showcredits($cdom)) { + push(@items,'defaultcredits'); + } + return @items; } } sub autoenroll_keys { - my $internals = ['coursecode','courseowner','authtype','autharg','autoadds','autodrops', - 'autostart','autoend','sectionnums','crosslistings', - 'co-owners']; + my $internals = ['coursecode','courseowner','authtype','autharg','defaultcredits', + 'autoadds','autodrops','autostart','autoend','sectionnums', + 'crosslistings','co-owners']; my $accessdates = ['default_enrollment_start_date','default_enrollment_end_date']; return ($internals,$accessdates); } @@ -114,6 +118,10 @@ sub get_enrollment_settings { || $type eq "autharg" || $type eq "coursecode" || $type eq "crosslistings") { $enrollvar{$type} = $settings{$item}; + } elsif ($type eq 'defaultcredits') { + if (&showcredits($cdom)) { + $enrollvar{$type} = $settings{$item}; + } } elsif ($type eq 'courseowner') { if ($settings{$item} =~ /^[^:]+:[^:]+$/) { $enrollvar{$type} = $settings{$item}; @@ -149,7 +157,7 @@ sub print_course_search_page { 'instcodefilter','ownerfilter', 'coursefilter']; my $filter = {}; - my ($numtitles,$cctitle,$dctitle); + my ($numtitles,$cctitle,$dctitle,@codetitles); my $ccrole = 'cc'; if ($type eq 'Community') { $ccrole = 'co'; @@ -163,7 +171,8 @@ sub print_course_search_page { $r->print('<h3>'.&mt('Search for a course in the [_1] domain',$domdesc).'</h3>'); } $r->print(&Apache::lonpickcourse::build_filters($filterlist,$type, - undef,undef,$filter,$action,\$numtitles,'modifycourse')); + undef,undef,$filter,$action,\$numtitles,'modifycourse', + undef,undef,undef,\@codetitles)); if ($type eq 'Community') { $r->print(&mt('Actions available after searching for a community:').'<ul>'. '<li>'.&mt('Enter the community with the role of [_1]',$cctitle).'</li>'."\n". @@ -192,14 +201,16 @@ sub print_course_selection_page { my %filter; my $action = '/adm/modifycourse'; my $dctitle = &Apache::lonnet::plaintext('dc'); - my $numtitles; + my ($numtitles,@codetitles); $r->print(&Apache::lonpickcourse::js_changer()); $r->print(&mt('Revise your search criteria for this domain').' ('.$domdesc.').<br />'); $r->print(&Apache::lonpickcourse::build_filters($filterlist,$type, - undef,undef,\%filter,$action,\$numtitles)); + undef,undef,\%filter,$action,\$numtitles, + undef,undef,undef,undef,\@codetitles)); $filter{'domainfilter'} = $dom; my %courses = &Apache::lonpickcourse::search_courses($r,$type,0, - \%filter,$numtitles); + \%filter,$numtitles,undef, + undef,undef,\@codetitles); &Apache::lonpickcourse::display_matched_courses($r,$type,0,$action,undef,undef,undef, %courses); return; @@ -208,87 +219,132 @@ sub print_course_selection_page { sub print_modification_menu { my ($r,$cdesc,$domdesc,$dom,$type) = @_; &print_header($r,$type); - my ($ccrole,$setquota_text,$setparams_text,$cat_text); + my ($ccrole,$categorytitle,$setquota_text,$setuploadquota_text,$setparams_text,$cat_text); if ($type eq 'Community') { $ccrole = 'co'; } else { $ccrole = 'cc'; - } - my $action = '/adm/modifycourse'; + } if ($type eq 'Community') { + $categorytitle = 'View/Modify Community Settings'; $setquota_text = &mt('Total disk space allocated for storage of portfolio files in all groups in a community.'); + $setuploadquota_text = &mt('Disk space allocated for storage of content uploaded directly to a community via Content Editor.'); $setparams_text = 'View/Modify community owner'; $cat_text = 'View/Modify catalog settings for community'; } else { + $categorytitle = 'View/Modify Course Settings'; $setquota_text = &mt('Total disk space allocated for storage of portfolio files in all groups in a course.'); - $setparams_text = 'View/Modify course owner, institutional code, and default authentication'; - $cat_text = 'View/Modify catalog settings for course'; + $setuploadquota_text = &mt('Disk space allocated for storage of content uploaded directly to a course via Content Editor.'); + if (&showcredits($dom)) { + $setparams_text = 'View/Modify course owner, institutional code, and default authentication and credits'; + } else { + $setparams_text = 'View/Modify course owner, institutional code, and default authentication'; + } + $cat_text = 'View/Modify catalog settings for course'; } - my @menu = - ( - { text => $setparams_text, - phase => 'setparms', - }, - { text => 'View/Modify quota for group portfolio files', - phase => 'setquota', - } - ); + my $anon_text = 'Responder threshold required to display anonymous survey submissions'; + my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$dom); my @additional_params = &catalog_settable($domconf{'coursecategories'},$type); - if (@additional_params > 0) { - push (@menu, { text => $cat_text, - phase => 'catsettings', - }); + + sub phaseurl { + my $phase = shift; + return "javascript:changePage(document.menu,'$phase')" } - unless ($type eq 'Community') { - push(@menu, - { text => 'Display current settings for automated enrollment', - phase => 'viewparms', - } + my @menu = + ({ categorytitle => $categorytitle, + items => [ + { + linktext => $setparams_text, + url => &phaseurl('setparms'), + permission => 1, + #help => '', + icon => 'crsconf.png', + linktitle => '' + }, + { + linktext => 'View/Modify quotas for group portfolio files, and for uploaded content.', + url => &phaseurl('setquota'), + permission => 1, + #help => '', + icon => 'groupportfolioquota.png', + linktitle => '' + }, + { + linktext => 'View/Modify responders threshold for anonymous survey submissions display', + url => &phaseurl('setanon'), + permission => 1, + #help => '', + icon => 'anonsurveythreshold.png', + linktitle => '' + }, + { + linktext => $cat_text, + url => &phaseurl('catsettings'), + permission => (@additional_params > 0), + #help => '', + icon => 'ccatconf.png', + linktitle => '' + }, + { + linktext => 'Display current settings for automated enrollment', + url => &phaseurl('viewparms'), + permission => ($type ne 'Community'), + #help => '', + icon => 'roles.png', + linktitle => '' + }, + ] + }, ); - } - my $menu_html = '<h3>'.&mt('View/Modify settings for: '). - ' <span class="LC_nobreak">'.$cdesc.'</span></h3>'."\n"; + + my $menu_html = + '<h3>' + .&mt('View/Modify settings for: [_1]', + '<span class="LC_nobreak">'.$cdesc.'</span>') + .'</h3>'."\n".'<p>'; if ($type eq 'Community') { $menu_html .= &mt('Although almost all community settings can be modified by a Coordinator, the following may only be set or modified by a Domain Coordinator:'); } else { $menu_html .= &mt('Although almost all course settings can be modified by a Course Coordinator, the following may only be set or modified by a Domain Coordinator:'); } - $menu_html .= '<ul>'; + $menu_html .= '</p>'."\n".'<ul>'; if ($type eq 'Community') { $menu_html .= '<li>'.&mt('Community owner (permitted to assign Coordinator roles in the community).').'</li>'; } else { $menu_html .= '<li>'.&mt('Course owner (permitted to assign Course Coordinator roles in the course).').'</li>'. '<li>'.&mt("Institutional code and default authentication (both required for auto-enrollment of students from institutional datafeeds).").'</li>'; + if (&showcredits($dom)) { + $menu_html .= '<li>'.&mt('Default credits earned by student on course completion.').'</li>'; + } } - $menu_html .= '<li>'.$setquota_text.'</li>'."\n"; + $menu_html .= '<li>'.$setquota_text.'</li>'. + '<li>'.$setuploadquota_text.'</li>'. + '<li>'.$anon_text.'</li>'."\n"; foreach my $item (@additional_params) { if ($type eq 'Community') { if ($item eq 'togglecats') { - $menu_html .= ' <li>'.&mt('Hiding/unhiding a community from the catalog (although can be [_1]configured[_2] to be modifiable by a Coordinator in community context).','<a href="/adm/domainprefs?actions=coursecategories&phase=display">','</a>').'</li>'."\n"; + $menu_html .= ' <li>'.&mt('Hiding/unhiding a community from the catalog (although can be [_1]configured[_2] to be modifiable by a Coordinator in community context).','<a href="/adm/domainprefs?actions=coursecategories&phase=display">','</a>').'</li>'."\n"; } elsif ($item eq 'categorize') { - $menu_html .= ' <li>'.&mt('Manual cataloging of a community (although can be [_1]configured[_2] to be modifiable by a Coordinator in community context).','<a href="/adm/domainprefs?actions=coursecategories&phase=display">','</a>').'</li>'."\n"; + $menu_html .= ' <li>'.&mt('Manual cataloging of a community (although can be [_1]configured[_2] to be modifiable by a Coordinator in community context).','<a href="/adm/domainprefs?actions=coursecategories&phase=display">','</a>').'</li>'."\n"; } } else { if ($item eq 'togglecats') { - $menu_html .= ' <li>'.&mt('Hiding/unhiding a course from the course catalog (although can be [_1]configured[_2] to be modifiable by a Course Coordinator in course context).','<a href="/adm/domainprefs?actions=coursecategories&phase=display">','</a>').'</li>'."\n"; + $menu_html .= ' <li>'.&mt('Hiding/unhiding a course from the course catalog (although can be [_1]configured[_2] to be modifiable by a Course Coordinator in course context).','<a href="/adm/domainprefs?actions=coursecategories&phase=display">','</a>').'</li>'."\n"; } elsif ($item eq 'categorize') { - $menu_html .= ' <li>'.&mt('Manual cataloging of a course (although can be [_1]configured[_2] to be modifiable by a Course Coordinator in course context).','<a href="/adm/domainprefs?actions=coursecategories&phase=display">','</a>').'</li>'."\n"; + $menu_html .= ' <li>'.&mt('Manual cataloging of a course (although can be [_1]configured[_2] to be modifiable by a Course Coordinator in course context).','<a href="/adm/domainprefs?actions=coursecategories&phase=display">','</a>').'</li>'."\n"; } } } - $menu_html .= ' </ul> -<form name="menu" method="post" action="'.$action.'" />'."\n". - &hidden_form_elements(); - foreach my $menu_item (@menu) { - $menu_html.='<h3>'; - $menu_html.= - qq|<a href="javascript:changePage(document.menu,'$menu_item->{'phase'}')">|; - $menu_html.= &mt($menu_item->{'text'}).'</a>'; - $menu_html.='</h3>'; - } + $menu_html .= + ' </ul>' + .'<form name="menu" method="post" action="/adm/modifycourse">' + ."\n" + .&hidden_form_elements(); $r->print($menu_html); + $r->print(&Apache::lonhtmlcommon::generate_menu(@menu)); + $r->print('</form>'); return; } @@ -319,7 +375,7 @@ sub print_settings_display { } my $cctitle = &Apache::lonnet::plaintext($ccrole,$type); my $dctitle = &Apache::lonnet::plaintext('dc'); - my @modifiable_params = &get_dc_settable($type); + my @modifiable_params = &get_dc_settable($type,$cdom); my ($internals,$accessdates) = &autoenroll_keys(); my @items; if ((ref($internals) eq 'ARRAY') && (ref($accessdates) eq 'ARRAY')) { @@ -351,9 +407,13 @@ sub print_settings_display { ' <span class="LC_nobreak">'.$cdesc.'</span></h3>'. '<form action="/adm/modifycourse" method="post" name="viewparms">'."\n". '<p>'.$lt{'cose'}.'<ul>'. - '<li>'.&mt('Settings modifiable by a [_1] via the [_2]Automated Enrollment Manager[_3] in a course.',$cctitle,'<a href="'.$escuri.'">','</a>').'</li>'. - '<li>'.&mt('Settings modifiable by a [_1] via [_2]View/Modify course owner, institutional code, and default authentication[_3].',$dctitle,'<a href="javascript:changePage(document.viewparms,'."'setparms'".');">','</a>')."\n". - '</li></ul></p>'. + '<li>'.&mt('Settings modifiable by a [_1] via the [_2]Automated Enrollment Manager[_3] in a course.',$cctitle,'<a href="'.$escuri.'">','</a>').'</li>'); + if (&showcredits($cdom)) { + $r->print('<li>'.&mt('Settings modifiable by a [_1] via [_2]View/Modify course owner, institutional code, and default authentication and credits[_3].',$dctitle,'<a href="javascript:changePage(document.viewparms,'."'setparms'".');">','</a>')."\n"); + } else { + $r->print('<li>'.&mt('Settings modifiable by a [_1] via [_2]View/Modify course owner, institutional code, and default authentication[_3].',$dctitle,'<a href="javascript:changePage(document.viewparms,'."'setparms'".');">','</a>')."\n"); + } + $r->print('</li></ul></p>'. '<p>'.$lt{'cour'}.'</p><p>'.$disp_table.'</p><p>'. '<a href="javascript:changePage(document.viewparms,'."'menu'".')">'.$lt{'back'}.'</a>'."\n". &hidden_form_elements(). @@ -363,29 +423,56 @@ sub print_settings_display { sub print_setquota { my ($r,$cdom,$cnum,$cdesc,$type) = @_; + my $lctype = lc($type); + my $headline = &mt("Set disk space quotas for $lctype: [_1]", + '<span class="LC_nobreak">'.$cdesc.'</span>'); my %lt = &Apache::lonlocal::texthash( - 'cquo' => 'Disk space for storage of group portfolio files for:', - 'gpqu' => 'Course portfolio files disk space', + 'gpqu' => 'Disk space for storage of group portfolio files', + 'upqu' => 'Disk space for storage of content directly uploaded to course via Content Editor', 'modi' => 'Save', 'back' => 'Pick another action', ); - if ($type eq 'Community') { - $lt{'gpqu'} = &mt('Community portfolio files disk space'); - } - my %settings = &Apache::lonnet::get('environment',['internal.coursequota'],$cdom,$cnum); + my %staticdefaults = ( + coursequota => 20, + uploadquota => 500, + ); + my %settings = &Apache::lonnet::get('environment',['internal.coursequota','internal.uploadquota','internal.instcode'], + $cdom,$cnum); my $coursequota = $settings{'internal.coursequota'}; + my $uploadquota = $settings{'internal.uploadquota'}; if ($coursequota eq '') { - $coursequota = 20; + $coursequota = $staticdefaults{'coursequota'}; + } + if ($uploadquota eq '') { + my %domdefs = &Apache::lonnet::get_domain_defaults($cdom); + if ($type eq 'Community') { + $uploadquota = $domdefs{$lctype.'quota'}; + } elsif ($settings{'internal.instcode'}) { + $uploadquota = $domdefs{'officialquota'}; + } else { + $uploadquota = $domdefs{'unofficialquota'}; + } + if ($uploadquota eq '') { + $uploadquota = $staticdefaults{'uploadquota'}; + } } &print_header($r,$type); my $hidden_elements = &hidden_form_elements(); - my $helpitem = &Apache::loncommon::help_open_topic('Modify_Course_Quota'); + my $porthelpitem = &Apache::loncommon::help_open_topic('Modify_Course_Quota'); + my $uploadhelpitem = &Apache::loncommon::help_open_topic('Modify_Course_Upload_Quota'); $r->print(<<ENDDOCUMENT); -<form action="/adm/modifycourse" method="post" name="setquota"> -<h3>$lt{'cquo'} <span class="LC_nobreak">$cdesc</span></h3> +<form action="/adm/modifycourse" method="post" name="setquota" onsubmit="return verify_quota();"> +<h3>$headline</h3> +<p><span class="LC_nobreak"> +$porthelpitem $lt{'gpqu'}: <input type="text" size="4" name="coursequota" value="$coursequota" /> MB +</span> +<br /> +<span class="LC_nobreak"> +$uploadhelpitem $lt{'upqu'}: <input type="text" size="4" name="uploadquota" value="$uploadquota" /> MB +</span> +</p> <p> -$helpitem $lt{'gpqu'}: <input type="text" size="4" name="coursequota" value="$coursequota" /> Mb -<input type="button" onClick="javascript:verify_quota(this.form)" value="$lt{'modi'}" /> +<input type="submit" value="$lt{'modi'}" /> </p> $hidden_elements <a href="javascript:changePage(document.setquota,'menu')">$lt{'back'}</a> @@ -394,6 +481,45 @@ ENDDOCUMENT return; } +sub print_set_anonsurvey_threshold { + my ($r,$cdom,$cnum,$cdesc,$type) = @_; + my %lt = &Apache::lonlocal::texthash( + 'resp' => 'Responder threshold for anonymous survey submissions display:', + 'sufa' => 'Anonymous survey submissions displayed when responders exceeds', + 'modi' => 'Save', + 'back' => 'Pick another action', + ); + my %settings = &Apache::lonnet::get('environment',['internal.anonsurvey_threshold'],$cdom,$cnum); + my $threshold = $settings{'internal.anonsurvey_threshold'}; + if ($threshold eq '') { + my %domconfig = + &Apache::lonnet::get_dom('configuration',['coursedefaults'],$cdom); + if (ref($domconfig{'coursedefaults'}) eq 'HASH') { + $threshold = $domconfig{'coursedefaults'}{'anonsurvey_threshold'}; + if ($threshold eq '') { + $threshold = 10; + } + } else { + $threshold = 10; + } + } + &print_header($r,$type); + my $hidden_elements = &hidden_form_elements(); + my $helpitem = &Apache::loncommon::help_open_topic('Modify_Anonsurvey_Threshold'); + $r->print(<<ENDDOCUMENT); +<form action="/adm/modifycourse" method="post" name="setanon" onsubmit="return verify_anon_threshold();"> +<h3>$lt{'resp'} <span class="LC_nobreak">$cdesc</span></h3> +<p> +$helpitem $lt{'sufa'}: <input type="text" size="4" name="threshold" value="$threshold" /> +<input type="submit" value="$lt{'modi'}" /> +</p> +$hidden_elements +<a href="javascript:changePage(document.setanon,'menu')">$lt{'back'}</a> +</form> +ENDDOCUMENT + return; +} + sub print_catsettings { my ($r,$cdom,$cnum,$cdesc,$type) = @_; &print_header($r,$type); @@ -562,14 +688,21 @@ sub print_course_modification_page { &Apache::loncommon::help_open_topic('Modify_Course_Instcode'). ' '.&mt('Course Code'))."\n". '<input type="text" size="10" name="coursecode" value="'.$enrollvar{'coursecode'}.'" />'. - &Apache::lonhtmlcommon::row_closure(). - &Apache::lonhtmlcommon::row_title( - &Apache::loncommon::help_open_topic('Modify_Course_Defaultauth'). - ' '.&mt('Default Authentication method'))."\n". - $authenitems."\n". - &Apache::lonhtmlcommon::row_closure(). - &Apache::lonhtmlcommon::row_title( - &Apache::loncommon::help_open_topic('Modify_Course_Owner'). + &Apache::lonhtmlcommon::row_closure()); + if (&showcredits($cdom)) { + $r->print(&Apache::lonhtmlcommon::row_title( + &Apache::loncommon::help_open_topic('Modify_Course_Credithours'). + ' '.&mt('Credits (students)'))."\n". + '<input type="text" size="3" name="defaultcredits" value="'.$enrollvar{'defaultcredits'}.'" />'. + &Apache::lonhtmlcommon::row_closure()); + } + $r->print(&Apache::lonhtmlcommon::row_title( + &Apache::loncommon::help_open_topic('Modify_Course_Defaultauth'). + ' '.&mt('Default Authentication method'))."\n". + $authenitems."\n". + &Apache::lonhtmlcommon::row_closure(). + &Apache::lonhtmlcommon::row_title( + &Apache::loncommon::help_open_topic('Modify_Course_Owner'). ' '.&mt('Course Owner'))."\n"); } $r->print($ownertable."\n".&Apache::lonhtmlcommon::row_closure(1). @@ -580,7 +713,7 @@ sub print_course_modification_page { } else { $r->print('javascript:verify_message(this.form);"'); } - $r->print('value="'.$lt{'gobt'}.'" /></p></form>'); + $r->print(' value="'.$lt{'gobt'}.'" /></p></form>'); return; } @@ -641,12 +774,15 @@ sub modify_course { unless ($type eq 'Community') { push(@items,('internal.coursecode','internal.authtype','internal.autharg', 'internal.sectionnums','internal.crosslistings')); + if (&showcredits($cdom)) { + push(@items,'internal.defaultcredits'); + } } my %settings = &Apache::lonnet::get('environment',\@items,$cdom,$cnum); my $description = $settings{'description'}; - my ($ccrole,$response,$chgresponse,$nochgresponse,$reply,%currattr,%newattr,%cenv,%changed, - @changes,@nochanges,@sections,@xlists,@warnings); - my @modifiable_params = &get_dc_settable($type); + my ($ccrole,$response,$chgresponse,$nochgresponse,$reply,%currattr,%newattr, + %cenv,%changed,@changes,@nochanges,@sections,@xlists,@warnings); + my @modifiable_params = &get_dc_settable($type,$cdom); foreach my $param (@modifiable_params) { $currattr{$param} = $settings{'internal.'.$param}; } @@ -665,7 +801,7 @@ sub modify_course { $sections[0] = $settings{'internal.sectionnums'}; } } - unless ($settings{'internal.crosslistings'} eq'') { + unless ($settings{'internal.crosslistings'} eq '') { if ($settings{'internal.crosslistings'} =~ m/,/) { @xlists = split/,/,$settings{'internal.crosslistings'}; } else { @@ -704,6 +840,12 @@ sub modify_course { $changed{'code'} = 1; } } + + if (&showcredits($cdom) && exists($env{'form.defaultcredits'})) { + $newattr{'defaultcredits'} =~ s/[^\d\.]//g; + $newattr{'defaultcredits'}=$env{'form.defaultcredits'}; + } + } if ( exists($env{'form.courseowner'}) ) { @@ -739,10 +881,10 @@ sub modify_course { } } if (@changes > 0) { - $chgresponse = &mt("The following settings have been changed:<br/><ul>"); + $chgresponse = &mt('The following settings have been changed:').'<br/><ul>'; } if (@nochanges > 0) { - $nochgresponse = &mt("The following settings remain unchanged:<br/><ul>"); + $nochgresponse = &mt('The following settings remain unchanged:').'<br/><ul>'; } if (@changes > 0) { my $putreply = &Apache::lonnet::put('environment',\%cenv,$cdom,$cnum); @@ -768,6 +910,8 @@ sub modify_course { push(@warnings,&mt('There is no owner associated with this LON-CAPA course.'). '<br />'.&mt('If automated enrollment at your institution requires validation of course owners, automated enrollment will fail.')); } else { + my %crsenv = &Apache::lonnet::get('environment',['internal.co-owners'],$cdom,$cnum); + my $coowners = $crsenv{'internal.co-owners'}; if (@sections > 0) { if ($changed{'code'}) { foreach my $sec (@sections) { @@ -776,13 +920,13 @@ sub modify_course { my $inst_course_id = $newattr{'coursecode'}.$1; my $course_check = &Apache::lonnet::auto_validate_courseID($cnum,$cdom,$inst_course_id); if ($course_check eq 'ok') { - my $outcome = &Apache::lonnet::auto_new_course($cnum,$cdom,$inst_course_id,$newattr{'courseowner'}); + my $outcome = &Apache::lonnet::auto_new_course($cnum,$cdom,$inst_course_id,$newattr{'courseowner'},$coowners); unless ($outcome eq 'ok') { - push(@warnings,&mt('If automatic enrollment is enabled for "[_1]" automated enrollment may fail for "[_2]" - section: [_3], for the following reason: "[_4]"',$description,$newattr{'coursecode'},$instsec,$outcome).'<br/>'); + push(@warnings,&mt('If automatic enrollment is enabled for "[_1]", automated enrollment may fail for "[_2]" - section: [_3] for the following reason: "[_4]".',$description,$newattr{'coursecode'},$instsec,$outcome).'<br/>'); } } else { - push(@warnings,&mt('If automatic enrollment is enabled for "[_1]" automated enrollment may fail for "[_2]" - section: [_3], for the following reason: "[_4]"',$description,$newattr{'coursecode'},$instsec,$course_check)); + push(@warnings,&mt('If automatic enrollment is enabled for "[_1]", automated enrollment may fail for "[_2]" - section: [_3] for the following reason: "[_4]".',$description,$newattr{'coursecode'},$instsec,$course_check)); } } else { push(@warnings,&mt('If automatic enrollment is enabled for "[_1]", automated enrollment may fail for "[_2]" - section: [_3], because this is not a valid section entry.',$description,$newattr{'coursecode'},$sec)); @@ -793,23 +937,23 @@ sub modify_course { if ($sec =~ m/^(.+):/) { my $instsec = $1; my $inst_course_id = $newattr{'coursecode'}.$instsec; - my $outcome = &Apache::lonnet::auto_new_course($cnum,$cdom,$inst_course_id,$newattr{'courseowner'}); + my $outcome = &Apache::lonnet::auto_new_course($cnum,$cdom,$inst_course_id,$newattr{'courseowner'},$coowners); unless ($outcome eq 'ok') { - push(@warnings,&mt('If automatic enrollment is enabled for "[_1]", automated enrollment may fail for "[_2]" - section [_3] for the following reason: "[_4]".',$description,$newattr{'coursecode'},$instsec,$outcome)); + push(@warnings,&mt('If automatic enrollment is enabled for "[_1]", automated enrollment may fail for "[_2]" - section: [_3] for the following reason: "[_4]".',$description,$newattr{'coursecode'},$instsec,$outcome)); } } else { - push(@warnings,&mt('If automatic enrollment is enabled for "[_1]", automated enrollment may fail for "[_2]" - section [_3] because this is not a valid section entry.',$description,$newattr{'coursecode'},$sec)); + push(@warnings,&mt('If automatic enrollment is enabled for "[_1]", automated enrollment may fail for "[_2]" - section: [_3], because this is not a valid section entry.',$description,$newattr{'coursecode'},$sec)); } } } } else { - push(@warnings,&mt('As no section numbers are currently listed for "[_1]" automated enrollment will not occur for any sections of institutional course code: "[_2]".',$description,$newattr{'coursecode'})); + push(@warnings,&mt('As no section numbers are currently listed for "[_1]", automated enrollment will not occur for any sections of institutional course code: "[_2]".',$description,$newattr{'coursecode'})); } if ( (@xlists > 0) && ($changed{'owner'}) ) { foreach my $xlist (@xlists) { if ($xlist =~ m/^(.+):/) { my $instxlist = $1; - my $outcome = &Apache::lonnet::auto_new_course($cnum,$cdom,$instxlist,$newattr{'courseowner'}); + my $outcome = &Apache::lonnet::auto_new_course($cnum,$cdom,$instxlist,$newattr{'courseowner'},$coowners); unless ($outcome eq 'ok') { push(@warnings,&mt('If automatic enrollment is enabled for "[_1]", automated enrollment may fail for crosslisted class "[_2]" for the following reason: "[_3]".',$description,$instxlist,$outcome)); } @@ -931,10 +1075,10 @@ sub update_coowners { my %pendinghash = ( 'internal.pendingco-owners' => $pendingcoowners, ); - my $putresult = &put('environment',\%pendinghash,$cdom,$cnum); + my $putresult = &Apache::lonnet::put('environment',\%pendinghash,$cdom,$cnum); if ($putresult eq 'ok') { if ($env{'course.'.$cid.'.num'} eq $cnum) { - &appenv({'course.'.$cid.'.internal.pendingco-owners' => $pendingcoowners}); + &Apache::lonnet::appenv({'course.'.$cid.'.internal.pendingco-owners' => $pendingcoowners}); } } } else { @@ -963,7 +1107,7 @@ sub update_coowners { if ($designhash{$cdom.'.autoassign.co-owners'}) { my @newcoowners = (); if ($settings->{'internal.co-owners'}) { - my @currcoown = split(',',$settings->{'internal.coowners'}); + my @currcoown = split(',',$settings->{'internal.co-owners'}); my ($updatecoowners,$delcoowners); foreach my $person (@currcoown) { my ($result,$desc) = &Apache::lonnet::auto_validate_instcode($cnum,$cdom,$newattr->{'coursecode'},$person); @@ -1012,62 +1156,164 @@ sub update_coowners { sub modify_quota { my ($r,$cdom,$cnum,$cdesc,$domdesc,$type) = @_; &print_header($r,$type); + my $lctype = lc($type); + my $headline = &mt("Disk space quotas for $lctype: [_1]", + '<span class="LC_nobreak">'.$cdesc.'</span>'); $r->print('<form action="/adm/modifycourse" method="post" name="processquota">'."\n". - '<h3>'.&mt('Disk space for storage of group portfolio files for:'). + '<h3>'.$headline.'</h3>'); + my %oldsettings = &Apache::lonnet::get('environment',['internal.coursequota','internal.uploadquota'],$cdom,$cnum); + my %staticdefaults = ( + coursequota => 20, + uploadquota => 500, + ); + my %default; + $default{'coursequota'} = $staticdefaults{'coursequota'}; + my %domdefs = &Apache::lonnet::get_domain_defaults($cdom); + $default{'uploadquota'} = $domdefs{'uploadquota'}; + if ($default{'uploadquota'} eq '') { + $default{'uploadquota'} = $staticdefaults{'uploadquota'}; + } + my (%cenv,%showresult); + foreach my $item ('coursequota','uploadquota') { + if ($env{'form.'.$item} ne '') { + my $newquota = $env{'form.'.$item}; + if ($newquota =~ /^\s*(\d+\.?\d*|\.\d+)\s*$/) { + $newquota = $1; + if ($oldsettings{'internal.'.$item} == $newquota) { + if ($item eq 'coursequota') { + $r->print(&mt('The disk space allocated for group portfolio files remains unchanged as [_1] MB.',$newquota).'<br />'); + } else { + $r->print(&mt('The disk space allocated for files uploaded via the Content Editor remains unchanged as [_1] MB.',$newquota).'<br />'); + } + } else { + $cenv{'internal.'.$item} = $newquota; + $showresult{$item} = 1; + } + } else { + if ($item eq 'coursequota') { + $r->print(&mt('The proposed group portfolio quota contained invalid characters, so the quota is unchanged.').'<br />'); + } else { + $r->print(&mt('The proposed quota for content uploaded via the Content Editor contained invalid characters, so the quota is unchanged.').'<br />'); + + } + } + } + } + if (keys(%cenv)) { + my $putreply = &Apache::lonnet::put('environment',\%cenv,$cdom, + $cnum); + foreach my $key (sort(keys(%showresult))) { + if (($oldsettings{'internal.'.$key} eq '') && + ($env{'form.'.$key} == $default{$key})) { + if ($key eq 'uploadquota') { + if ($type eq 'Community') { + $r->print(&mt('The disk space allocated for files uploaded to this community via the Content Editor is the default quota for this domain: [_1] MB.', + $default{$key}).'<br />'); + } else { + $r->print(&mt('The disk space allocated for files uploaded to this course via the Content Editor is the default quota for this domain: [_1] MB.', + $default{$key}).'<br />'); + } + } else { + if ($type eq 'Community') { + $r->print(&mt('The disk space allocated for group portfolio files in this community is the default quota for this domain: [_1] MB.', + $default{$key}).'<br />'); + } else { + $r->print(&mt('The disk space allocated for group portfolio files in this course is the default quota for this domain: [_1] MB.', + $default{$key}).'<br />'); + } + } + delete($showresult{$key}); + } + } + if ($putreply eq 'ok') { + my %updatedsettings = &Apache::lonnet::get('environment',['internal.coursequota','internal.uploadquota'],$cdom,$cnum); + if ($showresult{'coursequota'}) { + $r->print(&mt('The disk space allocated for group portfolio files is now: [_1] MB.', + '<b>'.$updatedsettings{'internal.coursequota'}.'</b>').'<br />'); + my $usage = &Apache::longroup::sum_quotas($cdom.'_'.$cnum); + if ($usage >= $updatedsettings{'internal.coursequota'}) { + my $newoverquota; + if ($usage < $oldsettings{'internal.coursequota'}) { + $newoverquota = 'now'; + } + $r->print('<p>'); + if ($type eq 'Community') { + $r->print(&mt('Disk usage [_1] exceeds the quota for this community.',$newoverquota).' '. + &mt('Upload of new portfolio files and assignment of a non-zero MB quota to new groups in the community will not be possible until some files have been deleted, and total usage is below community quota.')); + } else { + $r->print(&mt('Disk usage [_1] exceeds the quota for this course.',$newoverquota).' '. + &mt('Upload of new portfolio files and assignment of a non-zero MB quota to new groups in the course will not be possible until some files have been deleted, and total usage is below course quota.')); + } + $r->print('</p>'); + } + } + if ($showresult{'uploadquota'}) { + $r->print(&mt('The disk space allocated for content uploaded directly via the Content Editor is now: [_1] MB.', + '<b>'.$updatedsettings{'internal.uploadquota'}.'</b>').'<br />'); + } + } else { + $r->print(&mt('An error occurred storing the quota(s) for group portfolio files and/or uploaded content.'). + $putreply); + } + } + $r->print('<p>'. + '<a href="javascript:changePage(document.processquota,'."'menu'".')">'. + &mt('Pick another action').'</a>'); + $r->print(&hidden_form_elements().'</form>'); + return; +} + +sub modify_anonsurvey_threshold { + my ($r,$cdom,$cnum,$cdesc,$domdesc,$type) = @_; + &print_header($r,$type); + $r->print('<form action="/adm/modifycourse" method="post" name="processthreshold">'."\n". + '<h3>'.&mt('Responder threshold required for display of anonymous survey submissions:'). ' <span class="LC_nobreak">'.$cdesc.'</span></h3><br />'); - my %oldsettings = &Apache::lonnet::get('environment',['internal.coursequota'],$cdom,$cnum); - my $defaultquota = 20; - if ($env{'form.coursequota'} ne '') { - my $newquota = $env{'form.coursequota'}; - if ($newquota =~ /^\s*(\d+\.?\d*|\.\d+)\s*$/) { - $newquota = $1; - if ($oldsettings{'internal.coursequota'} eq $env{'form.coursequota'}) { - $r->print(&mt('The disk space allocated for group portfolio files remains unchanged as [_1] Mb.',$env{'form.coursequota'})); + my %oldsettings = &Apache::lonnet::get('environment',['internal.anonsurvey_threshold'],$cdom,$cnum); + my %domconfig = + &Apache::lonnet::get_dom('configuration',['coursedefaults'],$cdom); + my $defaultthreshold; + if (ref($domconfig{'coursedefaults'}) eq 'HASH') { + $defaultthreshold = $domconfig{'coursedefaults'}{'anonsurvey_threshold'}; + if ($defaultthreshold eq '') { + $defaultthreshold = 10; + } + } else { + $defaultthreshold = 10; + } + if ($env{'form.threshold'} eq '') { + $r->print(&mt('The proposed responder threshold for display of anonymous survey submissions was blank, so the threshold is unchanged.')); + } else { + my $newthreshold = $env{'form.threshold'}; + if ($newthreshold =~ /^\s*(\d+)\s*$/) { + $newthreshold = $1; + if ($oldsettings{'internal.anonsurvey_threshold'} eq $env{'form.threshold'}) { + $r->print(&mt('Responder threshold for anonymous survey submissions display remains unchanged: [_1].',$env{'form.threshold'})); } else { my %cenv = ( - 'internal.coursequota' => $env{'form.coursequota'}, + 'internal.anonsurvey_threshold' => $env{'form.threshold'}, ); my $putreply = &Apache::lonnet::put('environment',\%cenv,$cdom, $cnum); - if (($oldsettings{'internal.coursequota'} eq '') && - ($env{'form.coursequota'} == $defaultquota)) { - if ($type eq 'Community') { - $r->print(&mt('The disk space allocated for group portfolio files in this community is the default quota for this domain: [_1] Mb.',$defaultquota)); - } else { - $r->print(&mt('The disk space allocated for group portfolio files in this course is the default quota for this domain: [_1] Mb.',$defaultquota)); - } + if (($oldsettings{'internal.anonsurvey_threshold'} eq '') && + ($env{'form.threshold'} == $defaultthreshold)) { + $r->print(&mt('The responder threshold for display of anonymous survey submissions is the default for this domain: [_1].',$defaultthreshold)); } else { if ($putreply eq 'ok') { - my %updatedsettings = &Apache::lonnet::get('environment',['internal.coursequota'],$cdom,$cnum); - $r->print(&mt('The disk space allocated for group portfolio files is now: [_1] Mb.',$updatedsettings{'internal.coursequota'})); - my $usage = &Apache::longroup::sum_quotas($cdom.'_'.$cnum); - if ($usage >= $updatedsettings{'internal.coursequota'}) { - my $newoverquota; - if ($usage < $oldsettings{'internal.coursequota'}) { - $newoverquota = 'now'; - } - $r->print('<p>'); - if ($type eq 'Community') { - $r->print(&mt('Disk usage [_1] exceeds the quota for this community.',$newoverquota).' '. - &mt('Upload of new portfolio files and assignment of a non-zero Mb quota to new groups in the community will not be possible until some files have been deleted, and total usage is below community quota.')); - } else { - $r->print(&mt('Disk usage [_1] exceeds the quota for this course.',$newoverquota).' '. - &mt('Upload of new portfolio files and assignment of a non-zero Mb quota to new groups in the course will not be possible until some files have been deleted, and total usage is below course quota.')); - } - $r->print('</p>'); - } + my %updatedsettings = &Apache::lonnet::get('environment',['internal.anonsurvey_threshold'],$cdom,$cnum); + $r->print(&mt('The responder threshold for display of anonymous survey submissions is now: [_1].','<b>'.$updatedsettings{'internal.anonsurvey_threshold'}.'</b>')); } else { - $r->print(&mt('An error occurred storing the quota for group portfolio files: '). + $r->print(&mt('An error occurred storing the responder threshold for anonymous submissions display: '). $putreply); } } } } else { - $r->print(&mt('The new quota requested contained invalid characters, so the quota is unchanged.')); + $r->print(&mt('The proposed responder threshold for display of anonymous submissions contained invalid characters, so the threshold is unchanged.')); } } $r->print('<p>'. - '<a href="javascript:changePage(document.processquota,'."'menu'".')">'. + '<a href="javascript:changePage(document.processthreshold,'."'menu'".')">'. &mt('Pick another action').'</a>'); $r->print(&hidden_form_elements().'</form>'); return; @@ -1210,7 +1456,7 @@ sub print_header { $phase = $env{'form.phase'}; } my $js = qq| -<script type="text/javascript"> + function changePage(formname,newphase) { formname.phase.value = newphase; if (newphase == 'processparms') { @@ -1218,47 +1464,84 @@ function changePage(formname,newphase) { } formname.submit(); } -</script> + |; if ($phase eq 'setparms') { - $js .= qq| -<script type="text/javascript"> -$javascript_validations -</script> -|; + $js .= $javascript_validations; } elsif ($phase eq 'courselist') { $js .= qq| -<script type="text/javascript"> + function gochoose(cname,cdom,cdesc) { document.courselist.pickedcourse.value = cdom+'_'+cname; document.courselist.submit(); } -</script> + +function hide_searching() { + if (document.getElementById('searching')) { + document.getElementById('searching').style.display = 'none'; + } + return; +} + |; } elsif ($phase eq 'setquota') { - $js .= <<'ENDSCRIPT'; -<script type="text/javascript"> -function verify_quota(formname) { - var newquota = formname.coursequota.value; - var num_reg = /^\s*(\d+\.?\d*|\.\d+)\s*$/; + my $invalid = &mt('The quota you entered contained invalid characters.'); + my $alert = &mt('You must enter a number'); + my $regexp = '/^\s*(\d+\.?\d*|\.\d+)\s*$/'; + $js .= <<"ENDSCRIPT"; + +function verify_quota() { + var newquota = document.setquota.coursequota.value; + var num_reg = $regexp; if (num_reg.test(newquota)) { - changePage(formname,'processquota'); + changePage(document.setquota,'processquota'); } else { - alert("The quota you entered contained invalid characters.\nYou must enter a number"); + alert("$invalid\\n$alert"); + return false; } - return; + return true; +} + +ENDSCRIPT + } elsif ($phase eq 'setanon') { + my $invalid = &mt('The responder threshold you entered is invalid.'); + my $alert = &mt('You must enter a positive integer.'); + my $regexp = ' /^\s*\d+\s*$/'; + $js .= <<"ENDSCRIPT"; + +function verify_anon_threshold() { + var newthreshold = document.setanon.threshold.value; + var num_reg = $regexp; + if (num_reg.test(newthreshold)) { + if (newthreshold > 0) { + changePage(document.setanon,'processthreshold'); + } else { + alert("$invalid\\n$alert"); + return false; + } + } else { + alert("$invalid\\n$alert"); + return false; + } + return true; } -</script> + ENDSCRIPT } + my $starthash; if ($env{'form.phase'} eq 'ccrole') { $starthash = { add_entries => {'onload' => "javascript:document.ccrole.submit();"}, }; + } elsif ($phase eq 'courselist') { + $starthash = { + add_entries => {'onload' => "hide_searching();"}, + }; } $r->print(&Apache::loncommon::start_page('View/Modify Course/Community Settings', - $js,$starthash)); + &Apache::lonhtmlcommon::scripttag($js), + $starthash)); my $bread_text = "View/Modify Courses/Communities"; if ($type eq 'Community') { $bread_text = 'Community Settings'; @@ -1334,6 +1617,7 @@ sub course_settings_descrip { 'notifylist' => 'Course Coordinators to be notified of enrollment changes', 'sectionnums' => 'Course section number:LON-CAPA section', 'crosslistings' => 'Crosslisted class:LON-CAPA section', + 'defaultcredits' => 'Credits', ); } return %longtype; @@ -1343,11 +1627,20 @@ sub hidden_form_elements { my $hidden_elements = &Apache::lonhtmlcommon::echo_form_input(['gosearch','updater','coursecode', 'prevphase','numlocalcc','courseowner','login','coursequota','intarg', - 'locarg','krbarg','krbver','counter','hidefromcat','usecategory'])."\n". + 'locarg','krbarg','krbver','counter','hidefromcat','usecategory', + 'threshold','defaultcredits','uploadquota'])."\n". '<input type="hidden" name="prevphase" value="'.$env{'form.phase'}.'" />'; return $hidden_elements; } +sub showcredits { + my ($dom) = @_; + my %domdefaults = &Apache::lonnet::get_domain_defaults($dom); + if ($domdefaults{'officialcredits'} || $domdefaults{'unofficialcredits'}) { + return 1; + } +} + sub handler { my $r = shift; if ($r->header_only) { @@ -1431,7 +1724,21 @@ sub handler { ({href=>"javascript:changePage(document.$phase,'$phase')", text=>"Result"}); &modify_quota($r,$cdom,$cnum,$cdesc,$domdesc,$type); - } elsif ($phase eq 'viewparms') { + } elsif ($phase eq 'setanon') { + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"javascript:changePage(document.$phase,'$phase')", + text=>"Threshold for anonymous submissions display"}); + &print_set_anonsurvey_threshold($r,$cdom,$cnum,$cdesc,$type); + + } elsif ($phase eq 'processthreshold') { + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"javascript:changePage(document.$phase,'setanon')", + text=>"Threshold for anonymous submissions display"}); + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"javascript:changePage(document.$phase,'$phase')", + text=>"Result"}); + &modify_anonsurvey_threshold($r,$cdom,$cnum,$cdesc,$domdesc,$type); + } elsif ($phase eq 'viewparms') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:changePage(document.$phase,'viewparms')", text=>"Display settings"});