--- loncom/interface/lonmodifycourse.pm 2016/11/10 21:57:10 1.79.2.4 +++ loncom/interface/lonmodifycourse.pm 2019/07/25 20:23:52 1.95 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # handler for DC-only modifiable course settings # -# $Id: lonmodifycourse.pm,v 1.79.2.4 2016/11/10 21:57:10 raeburn Exp $ +# $Id: lonmodifycourse.pm,v 1.95 2019/07/25 20:23:52 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -39,6 +39,9 @@ use Apache::lonpickcourse; use lib '/home/httpd/lib/perl'; use LONCAPA qw(:DEFAULT :match); +my $registered_cleanup; +my $modified_dom; + sub get_dc_settable { my ($type,$cdom) = @_; if ($type eq 'Community') { @@ -49,6 +52,10 @@ sub get_dc_settable { if (&showcredits($cdom)) { push(@items,'defaultcredits'); } + my %passwdconf = &Apache::lonnet::get_passwdconf($cdom); + if (($passwdconf{'crsownerchg'}) && ($type ne 'Placement')) { + push(@items,'nopasswdchg'); + } return @items; } } @@ -72,6 +79,13 @@ sub catalog_settable { if ($confhash->{'categorizecomm'} ne 'comm') { push(@settable,'categorize'); } + } elsif ($type eq 'Placement') { + if ($confhash->{'togglecatsplace'} ne 'place') { + push(@settable,'togglecats'); + } + if ($confhash->{'categorizeplace'} ne 'place') { + push(@settable,'categorize'); + } } else { if ($confhash->{'togglecats'} ne 'crs') { push(@settable,'togglecats'); @@ -94,6 +108,7 @@ sub get_enrollment_settings { @items = map { 'internal.'.$_; } (@{$internals}); push(@items,@{$accessdates}); } + push(@items,'internal.nopasswdchg'); my %settings = &Apache::lonnet::get('environment',\@items,$cdom,$cnum); my %enrollvar; $enrollvar{'autharg'} = ''; @@ -119,7 +134,7 @@ sub get_enrollment_settings { } elsif ($type eq "authtype" || $type eq "autharg" || $type eq "coursecode" || $type eq "crosslistings" || $type eq "selfenrollmgr" - || $type eq "autodropfailsafe") { + || $type eq "autodropfailsafe" || $type eq 'nopasswdchg') { $enrollvar{$type} = $settings{$item}; } elsif ($type eq 'defaultcredits') { if (&showcredits($cdom)) { @@ -167,6 +182,8 @@ sub print_course_search_page { $r->print(&Apache::loncommon::js_changer()); if ($type eq 'Community') { $r->print('

'.&mt('Search for a community in the [_1] domain',$domdesc).'

'); + } elsif ($type eq 'Placement') { + $r->print('

'.&mt('Search for a placement test in the [_1] domain',$domdesc).'

'); } else { $r->print('

'.&mt('Search for a course in the [_1] domain',$domdesc).'

'); } @@ -177,6 +194,8 @@ sub print_course_search_page { my ($actiontext,$roleoption,$settingsoption); if ($type eq 'Community') { $actiontext = &mt('Actions available after searching for a community:'); + } elsif ($type eq 'Placement') { + $actiontext = &mt('Actions available after searching for a placement test:') } else { $actiontext = &mt('Actions available after searching for a course:'); } @@ -184,33 +203,39 @@ sub print_course_search_page { if ($type eq 'Community') { $roleoption = &mt('Enter the community with the role of [_1]',$cctitle); $settingsoption = &mt('View or modify community settings which only a [_1] may modify.',$dctitle); + } elsif ($type eq 'Placement') { + $roleoption = &mt('Enter the placement test with the role of [_1]',$cctitle); + $settingsoption = &mt('View or modify placement test settings which only a [_1] may modify.',$dctitle); } else { $roleoption = &mt('Enter the course with the role of [_1]',$cctitle); $settingsoption = &mt('View or modify course settings which only a [_1] may modify.',$dctitle); } } elsif (&Apache::lonnet::allowed('rar',$dom)) { - my %adhocroles = &Apache::lonnet::userenvironment($env{'user.domain'},$env{'user.name'}, - 'adhocroles.'.$dom); - if (keys(%adhocroles)) { - my @adhoc = split(',',$adhocroles{'adhocroles.'.$dom}); - if (@adhoc > 1) { + my ($roles_by_num,$description,$accessref,$accessinfo) = &Apache::lonnet::get_all_adhocroles($dom); + if ((ref($roles_by_num) eq 'ARRAY') && (ref($description) eq 'HASH')) { + if (@{$roles_by_num} > 1) { if ($type eq 'Community') { - $roleoption = &mt('Enter the community with one of the available ad hoc roles: [_1].', - join(', ',@adhoc)); + $roleoption = &mt('Enter the community with one of the available ad hoc roles'); + } elsif ($type eq 'Placement') { + $roleoption = &mt('Enter the placement test with one of the available ad hoc roles.'); } else { - $roleoption = &mt('Enter the course with one of the available ad hoc roles: [_1].', - join(', ',@adhoc)); + $roleoption = &mt('Enter the course with one of the available ad hoc roles.'); } } else { + my $rolename = $description->{$roles_by_num->[0]}; if ($type eq 'Community') { - $roleoption = &mt('Enter the community with the ad hoc role of: [_1]',$adhoc[0]); + $roleoption = &mt('Enter the community with the ad hoc role of: [_1]',$rolename); + } elsif ($type eq 'Placement') { + $roleoption = &mt('Enter the placement test with the ad hoc role of: [_1]',$rolename); } else { - $roleoption = &mt('Enter the course with the ad hoc role of: [_1]',$adhoc[0]); + $roleoption = &mt('Enter the course with the ad hoc role of: [_1]',$rolename); } } } if ($type eq 'Community') { $settingsoption = &mt('View community settings which only a [_1] may modify.',$dctitle); + } elsif ($type eq 'Placement') { + $settingsoption = &mt('View placement test settings which only a [_1] may modify.',$dctitle); } else { $settingsoption = &mt('View course settings which only a [_1] may modify.',$dctitle); } @@ -224,14 +249,133 @@ sub print_course_search_page { } sub print_course_selection_page { - my ($r,$dom,$domdesc) = @_; + my ($r,$dom,$domdesc,$permission) = @_; my $type = $env{'form.type'}; if (!defined($type)) { $type = 'Course'; } &print_header($r,$type); -# Criteria for course search + if ($permission->{'adhocrole'} eq 'custom') { + my %lt = &Apache::lonlocal::texthash( + title => 'Ad hoc role selection', + preamble => 'Please choose an ad hoc role in the course.', + cancel => 'Click "OK" to enter the course, or "Cancel" to choose a different course.', + ); + my %jslt = &Apache::lonlocal::texthash ( + none => 'You are not eligible to use an ad hoc role for the selected course', + ok => 'OK', + exit => 'Cancel', + ); + &js_escape(\%jslt); + $r->print(<<"END"); + + + +END + } elsif ($permission->{'adhocrole'} eq 'coord') { + $r->print(<<"END"); + +END + } + +# Criteria for course search my ($filterlist,$filter) = &get_filters(); my $action = '/adm/modifycourse'; my $dctitle = &Apache::lonnet::plaintext('dc'); @@ -296,7 +440,7 @@ sub print_modification_menu { ); } if ($type eq 'Community') { - if ($permission->{'setparms'} eq 'edit') { + if ($permission->{'setparms'} eq 'edit') { $categorytitle = 'View/Modify Community Settings'; $linktext{'setparms'} = 'View/Modify community owner'; $linktext{'catsettings'} = 'View/Modify catalog settings for community'; @@ -306,7 +450,7 @@ sub print_modification_menu { $linktext{'catsettings'} = 'View catalog settings for community'; } $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.'); + $setuploadquota_text = &mt('Disk space allocated for storage of content uploaded directly to a community via Content Editor.'); } else { if ($permission->{'setparms'} eq 'edit') { $categorytitle = 'View/Modify Course Settings'; @@ -391,7 +535,7 @@ sub print_modification_menu { { linktext => $linktext{'viewparms'}, url => &phaseurl('viewparms'), - permission => ($permission->{'viewparms'} && ($type ne 'Community')), + permission => ($permission->{'viewparms'} && ($type ne 'Community') && ($type ne 'Placement')), #help => '', icon => 'roles.png', linktitle => '' @@ -433,7 +577,7 @@ sub print_modification_menu { } else { $menu_html .= '
  • '.&mt('Course owner (permitted to assign Course Coordinator roles in the course).').'
  • '."\n". '
  • '.&mt("Institutional code and default authentication (both required for auto-enrollment of students from institutional datafeeds).").'
  • '."\n"; - if (&showcredits($dom)) { + if (($type ne 'Placement') && &showcredits($dom)) { $menu_html .= '
  • '.&mt('Default credits earned by student on course completion.').'
  • '."\n"; } $menu_html .= '
  • '.&mt('Override defaults for who configures self-enrollment for this specific course.').'
  • '."\n"; @@ -476,29 +620,25 @@ sub print_modification_menu { } sub print_adhocrole_selected { - my ($r,$type) = @_; + my ($r,$type,$permission) = @_; &print_header($r,$type); my ($cdom,$cnum) = split(/_/,$env{'form.pickedcourse'}); my ($newrole,$selectrole); - if (&Apache::lonnet::allowed('ccc',$cdom)) { + if ($permission->{'adhocrole'} eq 'coord') { if ($type eq 'Community') { $newrole = "co./$cdom/$cnum"; } else { $newrole = "cc./$cdom/$cnum"; } $selectrole = 1; - } elsif (&Apache::lonnet::allowed('rar',$cdom)) { - my %adhocroles = &Apache::lonnet::userenvironment($env{'user.domain'},$env{'user.name'}, - 'adhocroles.'.$cdom); - if (keys(%adhocroles)) { - my $possrole = $env{'form.adhocrole'}; - if ($possrole ne '') { - my @adhoc = split(',',$adhocroles{'adhocroles.'.$cdom}); - if (grep(/^\Q$possrole\E$/,@adhoc)) { - my $confname = &Apache::lonnet::get_domainconfiguser($cdom); - $newrole = "cr/$cdom/$confname/$possrole./$cdom/$cnum"; - $selectrole = 1; - } + } elsif ($permission->{'adhocrole'} eq 'custom') { + my ($okroles,$description) = &Apache::lonnet::get_my_adhocroles($env{'form.pickedcourse'},1); + if (ref($okroles) eq 'ARRAY') { + my $possrole = $env{'form.adhocrole'}; + if (($possrole ne '') && (grep(/^\Q$possrole\E$/,@{$okroles}))) { + my $confname = &Apache::lonnet::get_domainconfiguser($cdom); + $newrole = "cr/$cdom/$confname/$possrole./$cdom/$cnum"; + $selectrole = 1; } } } @@ -674,7 +814,7 @@ sub print_set_anonsurvey_threshold { my $hidden_elements = &hidden_form_elements(); my ($disabled,$submit); if ($readonly) { - $disabled = ' disabled="disabled"'; + $disabled = ' disabled="disabled"'; } else { $submit = ''; } @@ -768,7 +908,7 @@ sub domain_postsubtimeout { my ($cdom,$type,$settings) = @_; return unless (ref($settings) eq 'HASH'); my $lctype = lc($type); - unless ($type eq 'Community') { + unless (($type eq 'Community') || ($type eq 'Placement')) { $lctype = 'unofficial'; if ($settings->{'internal.coursecode'}) { $lctype = 'official'; @@ -831,6 +971,8 @@ sub print_catsettings { '    

    '); if ($type eq 'Community') { $r->print(&mt("If a community has been categorized using at least one of the categories defined for communities in the domain, it will be listed in the domain's publicly accessible Course/Community Catalog, unless excluded.")); + } elsif ($type eq 'Placement') { + $r->print(&mt("If a placement test has been categorized using at least one of the categories defined for placement tests in the domain, it will be listed in the domain's publicly accessible Course/Community Catalog, unless excluded.")); } else { $r->print(&mt("Unless excluded, a course will be listed in the domain's publicly accessible Course/Community Catalog, if at least one of the following applies").':