--- loncom/interface/lonmodifycourse.pm 2013/08/30 13:22:23 1.63 +++ loncom/interface/lonmodifycourse.pm 2014/03/31 02:31:05 1.72 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # handler for DC-only modifiable course settings # -# $Id: lonmodifycourse.pm,v 1.63 2013/08/30 13:22:23 raeburn Exp $ +# $Id: lonmodifycourse.pm,v 1.72 2014/03/31 02:31:05 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -34,16 +34,17 @@ use Apache::loncommon; use Apache::lonhtmlcommon; use Apache::lonlocal; use Apache::lonuserutils; +use Apache::loncreateuser; use Apache::lonpickcourse; use lib '/home/httpd/lib/perl'; -use LONCAPA; +use LONCAPA qw(:DEFAULT :match); sub get_dc_settable { my ($type,$cdom) = @_; if ($type eq 'Community') { - return ('courseowner'); + return ('courseowner','selfenrollmgrdc','selfenrollmgrcc'); } else { - my @items = ('courseowner','coursecode','authtype','autharg'); + my @items = ('courseowner','coursecode','authtype','autharg','selfenrollmgrdc','selfenrollmgrcc'); if (&showcredits($cdom)) { push(@items,'defaultcredits'); } @@ -122,6 +123,8 @@ sub get_enrollment_settings { if (&showcredits($cdom)) { $enrollvar{$type} = $settings{$item}; } + } elsif ($type eq 'selfenrollmgr') { + $enrollvar{$type} = $settings{$item}; } elsif ($type eq 'courseowner') { if ($settings{$item} =~ /^[^:]+:[^:]+$/) { $enrollvar{$type} = $settings{$item}; @@ -153,10 +156,7 @@ sub print_course_search_page { $type = 'Course'; } &print_header($r,$type); - my $filterlist = ['descriptfilter', - 'instcodefilter','ownerfilter', - 'coursefilter']; - my $filter = {}; + my ($filterlist,$filter) = &get_filters($dom); my ($numtitles,$cctitle,$dctitle,@codetitles); my $ccrole = 'cc'; if ($type eq 'Community') { @@ -164,15 +164,15 @@ sub print_course_search_page { } $cctitle = &Apache::lonnet::plaintext($ccrole,$type); $dctitle = &Apache::lonnet::plaintext('dc'); - $r->print(&Apache::lonpickcourse::js_changer()); + $r->print(&Apache::loncommon::js_changer()); if ($type eq 'Community') { $r->print('
'.$lt{'cose'}.'
'.$lt{'cour'}.'
'.$disp_table.'
'. @@ -436,7 +476,7 @@ sub print_setquota { coursequota => 20, uploadquota => 500, ); - my %settings = &Apache::lonnet::get('environment',['internal.coursequota','internal.uploadquota','internal.instcode'], + my %settings = &Apache::lonnet::get('environment',['internal.coursequota','internal.uploadquota','internal.coursecode'], $cdom,$cnum); my $coursequota = $settings{'internal.coursequota'}; my $uploadquota = $settings{'internal.uploadquota'}; @@ -445,13 +485,8 @@ sub print_setquota { } 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'}; - } + my $quotatype = &Apache::lonuserutils::get_extended_type($cdom,$cnum,$type,\%settings); + $uploadquota = $domdefs{$quotatype.'quota'}; if ($uploadquota eq '') { $uploadquota = $staticdefaults{'uploadquota'}; } @@ -599,7 +634,7 @@ sub print_catsettings { } sub print_course_modification_page { - my ($r,$cdom,$cnum,$cdesc,$type) = @_; + my ($r,$cdom,$cnum,$cdesc,$crstype) = @_; my %lt=&Apache::lonlocal::texthash( 'actv' => "Active", 'inac' => "Inactive", @@ -609,17 +644,28 @@ sub print_course_modification_page { 'stus' => "Status", 'nocc' => 'There is currently no owner set for this course.', 'gobt' => "Save", + 'sett' => 'Setting', + 'domd' => 'Domain default', + 'whom' => 'Who configures', ); my ($ownertable,$ccrole,$javascript_validations,$authenitems,$ccname); my %enrollvar = &get_enrollment_settings($cdom,$cnum); - if ($type eq 'Community') { + my %settings = &Apache::lonnet::get('environment',['internal.coursecode','internal.textbook', + 'internal.selfenrollmgrdc','internal.selfenrollmgrcc'], + $cdom,$cnum); + my $type = &Apache::lonuserutils::get_extended_type($cdom,$cnum,$crstype,\%settings); + my @specific_managebydc = split(/,/,$settings{'internal.selfenrollmgrdc'}); + my @specific_managebycc = split(/,/,$settings{'internal.selfenrollmgrcc'}); + my %domdefaults = &Apache::lonnet::get_domain_defaults($cdom); + my @default_managebydc = split(/,/,$domdefaults{$type.'selfenrolladmdc'}); + if ($crstype eq 'Community') { $ccrole = 'co'; $lt{'nocc'} = &mt('There is currently no owner set for this community.'); } else { $ccrole ='cc'; ($javascript_validations,$authenitems) = &gather_authenitems($cdom,\%enrollvar); } - $ccname = &Apache::lonnet::plaintext($ccrole,$type); + $ccname = &Apache::lonnet::plaintext($ccrole,$crstype); my %roleshash = &Apache::lonnet::get_my_roles($cnum,$cdom,'','',[$ccrole]); my (@local_ccs,%cc_status,%pname); foreach my $item (keys(%roleshash)) { @@ -672,14 +718,14 @@ sub print_course_modification_page { } $ownertable .= &Apache::loncommon::end_data_table(); } - &print_header($r,$type,$javascript_validations); + &print_header($r,$crstype,$javascript_validations); my $dctitle = &Apache::lonnet::plaintext('dc'); - my $mainheader = &modifiable_only_title($type); + my $mainheader = &modifiable_only_title($crstype); my $hidden_elements = &hidden_form_elements(); $r->print('
'.$reply.'
'."\n". ''; + $reply .= &Apache::lonhtmlcommon::actionbox(\@actions).''; $r->print($reply); return; } +sub selfenroll_config_status { + my ($items,$selfenrolltitles) = @_; + my $shown; + if ((ref($items) eq 'ARRAY') && (ref($selfenrolltitles) eq 'HASH')) { + if (@{$items} > 0) { + $shown = ''); if ($type eq 'Community') { - $r->print(&mt('Disk usage [_1] exceeds the quota for this community.',$newoverquota).' '. + $r->print(&mt("Disk usage $newoverquota exceeds the quota for this community.").' '. &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).' '. + $r->print(&mt("Disk usage $newoverquota exceeds the quota for this course.").' '. &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('
'); @@ -1295,6 +1517,12 @@ sub modify_anonsurvey_threshold { ); my $putreply = &Apache::lonnet::put('environment',\%cenv,$cdom, $cnum); + if ($putreply eq 'ok') { + if ($env{'course.'.$cdom.'_'.$cnum.'.description'} ne '') { + &Apache::lonnet::appenv( + {'course.'.$cdom.'_'.$cnum.'.internal.anonsurvey_threshold' => $env{'form.threshold'}}); + } + } 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)); @@ -1405,6 +1633,13 @@ sub modify_catsettings { if (@changes > 0) { my $putreply = &Apache::lonnet::put('environment',\%cenv,$cdom,$cnum); if ($putreply eq 'ok') { + if ($env{'course.'.$cdom.'_'.$cnum.'.description'} ne '') { + my %newenvhash; + foreach my $item (@changes) { + $newenvhash{'course.'.$cdom.'_'.$cnum.'.'.$item} = $cenv{$item}; + } + &Apache::lonnet::appenv(\%newenvhash); + } my %crsinfo = &Apache::lonnet::courseiddump($cdom,'.',1,'.','.', $cnum,undef,undef,'.'); if (ref($crsinfo{$env{'form.pickedcourse'}}) eq 'HASH') { @@ -1559,38 +1794,35 @@ sub print_footer { } sub check_course { - my ($r,$dom,$domdesc) = @_; - my ($ok_course,$description,$instcode,$owner); - my %args = ( - one_time => 1, - ); - my %coursehash = - &Apache::lonnet::coursedescription($env{'form.pickedcourse'},\%args); - my $cnum = $coursehash{'num'}; - my $cdom = $coursehash{'domain'}; - if ($cdom eq $dom) { - my $description; - my %courseIDs = &Apache::lonnet::courseiddump($cdom,'.',1,'.','.', - $cnum,undef,undef,'.'); - if (keys(%courseIDs) > 0) { - $ok_course = 'ok'; - my ($instcode,$owner); - if (ref($courseIDs{$cdom.'_'.$cnum}) eq 'HASH') { - $description = $courseIDs{$cdom.'_'.$cnum}{'description'}; - $instcode = $courseIDs{$cdom.'_'.$cnum}{'inst_code'}; - $owner = $courseIDs{$cdom.'_'.$cnum}{'owner'}; - } else { - ($description,$instcode,$owner) = - split(/:/,$courseIDs{$cdom.'_'.$cnum}); - } - $description = &unescape($description); - $instcode = &unescape($instcode); - if ($instcode) { - $description .= " ($instcode)"; + my ($dom,$domdesc) = @_; + my ($ok_course,$description,$instcode); + my %coursehash; + if ($env{'form.pickedcourse'} =~ /^$match_domain\_$match_courseid$/) { + my %args; + unless ($env{'course.'.$env{'form.pickedcourse'}.'.description'}) { + %args = ( + 'one_time' => 1, + 'freshen_cache' => 1, + ); + } + %coursehash = + &Apache::lonnet::coursedescription($env{'form.pickedcourse'},\%args); + my $cnum = $coursehash{'num'}; + my $cdom = $coursehash{'domain'}; + $description = $coursehash{'description'}; + $instcode = $coursehash{'internal.coursecode'}; + if ($instcode) { + $description .= " ($instcode)"; + } + if (($cdom eq $dom) && ($cnum =~ /^$match_courseid$/)) { + my %courseIDs = &Apache::lonnet::courseiddump($cdom,'.',1,'.','.', + $cnum,undef,undef,'.'); + if ($courseIDs{$cdom.'_'.$cnum}) { + $ok_course = 'ok'; } - return ($ok_course,$description); } } + return ($ok_course,$description,\%coursehash); } sub course_settings_descrip { @@ -1598,8 +1830,10 @@ sub course_settings_descrip { my %longtype; if ($type eq 'Community') { %longtype = &Apache::lonlocal::texthash( - 'courseowner' => "Username:domain of community owner", - 'co-owners' => "Username:domain of each co-owner", + 'courseowner' => "Username:domain of community owner", + 'co-owners' => "Username:domain of each co-owner", + 'selfenrollmgrdc' => "Community-specific self-enrollment configuration by Domain Coordinator", + 'selfenrollmgrcc' => "Community-specific self-enrollment configuration by Community personnel", ); } else { %longtype = &Apache::lonlocal::texthash( @@ -1617,7 +1851,10 @@ 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', + 'defaultcredits' => 'Credits', + 'selfenrollmgrdc' => "Course-specific self-enrollment configuration by Domain Coordinator", + 'selfenrollmgrcc' => "Course-specific self-enrollment configuration by Course personnel", + ); } return %longtype; @@ -1628,7 +1865,8 @@ sub hidden_form_elements { &Apache::lonhtmlcommon::echo_form_input(['gosearch','updater','coursecode', 'prevphase','numlocalcc','courseowner','login','coursequota','intarg', 'locarg','krbarg','krbver','counter','hidefromcat','usecategory', - 'threshold','defaultcredits','uploadquota'])."\n". + 'threshold','defaultcredits','uploadquota','selfenrollmgrdc','selfenrollmgrcc', + 'action','state','currsec_st','sections','newsec'],['^selfenrollmgr_'])."\n". ''; return $hidden_elements; } @@ -1636,7 +1874,7 @@ sub hidden_form_elements { sub showcredits { my ($dom) = @_; my %domdefaults = &Apache::lonnet::get_domain_defaults($dom); - if ($domdefaults{'officialcredits'} || $domdefaults{'unofficialcredits'}) { + if ($domdefaults{'officialcredits'} || $domdefaults{'unofficialcredits'} || $domdefaults{'textbokcredits'}) { return 1; } } @@ -1648,8 +1886,10 @@ sub handler { $r->send_http_header; return OK; } + my $dom = $env{'request.role.domain'}; my $domdesc = &Apache::lonnet::domain($dom,'description'); + if (&Apache::lonnet::allowed('ccc',$dom)) { &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; @@ -1688,7 +1928,7 @@ sub handler { if ($phase eq 'courselist') { &print_course_selection_page($r,$dom,$domdesc); } else { - my ($checked,$cdesc) = &check_course($r,$dom,$domdesc); + my ($checked,$cdesc,$coursehash) = &check_course($dom,$domdesc); if ($checked eq 'ok') { my $enter_text; if ($type eq 'Community') { @@ -1700,7 +1940,8 @@ sub handler { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:changePage(document.$phase,'menu')", text=>"Pick action"}); - &print_modification_menu($r,$cdesc,$domdesc,$dom,$type); + &print_modification_menu($r,$cdesc,$domdesc,$dom,$type, + $env{'form.pickedcourse'},$coursehash); } elsif ($phase eq 'ccrole') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:changePage(document.$phase,'ccrole')", @@ -1769,14 +2010,26 @@ sub handler { ({href=>"javascript:changePage(document.$phase,'$phase')", text=>"Result"}); &modify_catsettings($r,$cdom,$cnum,$cdesc,$domdesc,$type); + } elsif ($phase eq 'selfenroll') { + &Apache::lonhtmlcommon::add_breadcrumb + ({href => "javascript:changePage(document.$phase,'$phase')", + text => "Self-enrollment settings"}); + if (!exists($env{'form.state'})) { + &print_selfenrollconfig($r,$type,$cdesc,$coursehash); + } elsif ($env{'form.state'} eq 'done') { + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"javascript:changePage(document.$phase,'$phase')", + text=>"Result"}); + &modify_selfenrollconfig($r,$type,$cdesc,$coursehash); + } } } } else { $r->print(''); if ($type eq 'Community') { - $r->print(&mt('The course you selected is not a valid course in this domain')); - } else { $r->print(&mt('The community you selected is not a valid community in this domain')); + } else { + $r->print(&mt('The course you selected is not a valid course in this domain')); } $r->print(" ($domdesc)"); }