--- loncom/interface/lonmodifycourse.pm 2007/12/30 23:22:41 1.37 +++ loncom/interface/lonmodifycourse.pm 2008/06/30 01:28:56 1.38 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # handler for DC-only modifiable course settings # -# $Id: lonmodifycourse.pm,v 1.37 2007/12/30 23:22:41 raeburn Exp $ +# $Id: lonmodifycourse.pm,v 1.38 2008/06/30 01:28:56 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -43,6 +43,22 @@ sub get_dc_settable { return ('courseowner','coursecode','authtype','autharg'); } +sub catalog_settable { + my ($confhash) = @_; + my @settable; + if (ref($confhash) eq 'HASH') { + if ($confhash->{'togglecats'} ne 'crs') { + push(@settable,'togglecats'); + } + if ($confhash->{'categorize'} ne 'crs') { + push(@settable,'categorize'); + } + } else { + push(@settable,('togglecats','categorize')); + } + return @settable; +} + sub get_enrollment_settings { my ($cdom,$cnum) = @_; my %settings = &Apache::lonnet::dump('environment',$cdom,$cnum); @@ -145,7 +161,7 @@ sub print_course_selection_page { } sub print_modification_menu { - my ($r,$cdesc,$domdesc) = @_; + my ($r,$cdesc,$domdesc,$dom) = @_; &print_header($r,$cdesc); my $type = 'Course'; my $action = '/adm/modifycourse'; @@ -165,14 +181,29 @@ sub print_modification_menu { }, { text => 'Modify institutional code, course owner and/or default authentication', phase => 'setparms', - } + }, ); + my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$dom); + my @additional_params = &catalog_settable($domconf{'coursecategories'}); + if (@additional_params > 0) { + push (@menu, { text => 'Modify course catalog settings for course', + phase => 'catsettings', + }); + } my $menu_html = '

'.&mt('View/Modify settings for: ').$cdesc.'

'."\n". &mt('Although almost all course settings can be modified by a [_1], a number of settings exist which only a [_2] may change:',$cctitle,$dctitle).' +
  • '.$lt{'crqo'}.'
  • '."\n"; + foreach my $item (@additional_params) { + if ($item eq 'togglecats') { + $menu_html .= '
  • '.&mt('Hiding a course from the course catalog (can be [_1]configured[_2] to be modifiable in course context)','','').'
  • '."\n"; + } elsif ($item eq 'categorize') { + $menu_html .= '
  • '.&mt('Manual cataloging of a course (can be [_1]configured[_2] to be modifiable in course context)','','').'
  • '."\n"; + + } + } + $menu_html .= '
    '."\n". &hidden_form_elements(); @@ -289,6 +320,59 @@ ENDDOCUMENT return; } +sub print_catsettings { + my ($r,$cdom,$cnum,$cdesc) = @_; + &print_header($r,$cdesc); + my %lt = &Apache::lonlocal::texthash( + 'back' => 'Back to options page', + ); + $r->print(''. + '

    '.&mt('Catalog Settings for Course').'

    '); + my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$cdom); + my @cat_params = &catalog_settable($domconf{'coursecategories'}); + if (@cat_params > 0) { + my %currsettings = + &Apache::lonnet::get('environment',['hidefromcat','categories'],$cdom,$cnum); + if (grep(/^togglecats$/,@cat_params)) { + my $excludeon = ''; + my $excludeoff = ' checked="checked" '; + if ($currsettings{'hidefromcat'} eq 'yes') { + $excludeon = $excludeoff; + $excludeoff = ''; + } + $r->print('

    '.&mt('Visibility in Course Catalog').'

    '. + &mt("Unless excluded, a course is listed in this domain's publicly accessible course catalog if at least of one the following applies").':'. + '
    '.&mt('Exclude from course catalog').'    
    '); + } + if (grep(/^categorize$/,@cat_params)) { + $r->print('

    '.&mt('Categorize Course').'

    '); + if (ref($domconf{'coursecategories'}) eq 'HASH') { + my $cathash = $domconf{'coursecategories'}{'cats'}; + if (ref($cathash) eq 'HASH') { + $r->print(&mt('Assign one or more categories to this course.').'

    '. + &Apache::loncommon::assign_categories_table($cathash, + $currsettings{'categories'})); + } else { + $r->print(&mt('No categories defined for this domain')); + } + } else { + $r->print(&mt('No categories defined for this domain')); + } + $r->print('

    '.&mt('If auto-cataloging based on institutional code is enabled in the domain, a course will continue to be listed in the catalog of official courses, in addition to receiving a listing under any manually assigned categor(ies).').'

    '); + } + $r->print(''); + } else { + $r->print(''.&mt('Catalog settings in this domain are set in course context via "Set Course Environment".').'

    '."\n". + ''. + $lt{'back'}.''); + } + $r->print(&hidden_form_elements().'
    '."\n"); + return; +} + sub print_course_modification_page { my ($r,$cdom,$cnum,$cdesc,$domdesc) = @_; my %longtype = &course_settings_descrip(); @@ -508,8 +592,9 @@ sub modify_course { my @nochanges = (); my @sections = (); my @xlists = (); - my $changecode = 0; - my $changeowner = 0; + my %changed = ( code => 0, + owner => 0, + ); unless ($settings{'internal.sectionnums'} eq '') { if ($settings{'internal.sectionnums'} =~ m/,/) { @sections = split/,/,$settings{'internal.sectionnums'}; @@ -532,7 +617,6 @@ sub modify_course { } my $description = $settings{'description'}; - my %cenv = (); if ($env{'form.login'} eq 'krb') { $newattr{'authtype'} = $env{'form.login'}; @@ -559,28 +643,25 @@ sub modify_course { if ( exists($env{'form.courseowner'}) ) { $newattr{'courseowner'}=$env{'form.courseowner'}; unless ( $newattr{'courseowner'} eq $currattr{'courseowner'} ) { - $changeowner = 1; + $changed{'owner'} = 1; } } if ( exists($env{'form.coursecode'}) ) { $newattr{'coursecode'}=$env{'form.coursecode'}; unless ( $newattr{'coursecode'} eq $currattr{'coursecode'} ) { - $changecode = 1; + $changed{'code'} = 1; } } - if ($changeowner == 1 || $changecode == 1) { - my $courseid_entry = &escape($cdom.'_'.$cnum).'='.&escape($description).':'.&escape($env{'form.coursecode'}).':'.&escape($env{'form.courseowner'}).':'.&escape($type); - my %courseid_entry = ( - $cdom.'_'.$cnum => { - description => $description, - inst_code => $env{'form.coursecode'}, - owner => $env{'form.courseowner'}, - type => $type, - }, - ); - &Apache::lonnet::courseidput($cdom,\%courseid_entry, - &Apache::lonnet::homeserver($cnum,$cdom),'notime'); + if ($changed{'owner'} || $changed{'code'}) { + my %crsinfo = &Apache::lonnet::courseiddump($cdom,'.',1,'.','.',$cnum, + undef,undef,'.'); + if (ref($crsinfo{$env{'form.pickedcourse'}}) eq 'HASH') { + $crsinfo{$env{'form.pickedcourse'}}{'inst_code'} = $env{'form.coursecode'}; + $crsinfo{$env{'form.pickedcourse'}}{'owner'} = $env{'form.courseowner'}; + my $chome = &Apache::lonnet::homeserver($cnum,$cdom); + my $putres = &Apache::lonnet::courseidput($cdom,\%crsinfo,$chome,'notime'); + } } foreach my $param (@modifiable_params) { if ($currattr{$param} eq $newattr{$param}) { @@ -609,12 +690,12 @@ sub modify_course { $nochgresponse .= "
  • $longtype{$attr} ".&mt("still set to \"").$currattr{$attr}."\".
  • "; } } - if ($changecode || $changeowner) { + if ($changed{'code'} || $changed{'owner'}) { if ( $newattr{'courseowner'} eq '') { $warning .= &mt("There is no owner associated with this LON-CAPA course. If automated enrollment in LON-CAPA courses at your institution requires validation of course owners, automated enrollment will fail for this course.
    "); } else { if (@sections > 0) { - if ($changecode) { + if ($changed{'code'}) { foreach my $sec (@sections) { if ($sec =~ m/^(.+):/) { my $inst_course_id = $newattr{'coursecode'}.$1; @@ -631,7 +712,7 @@ sub modify_course { $warning .= &mt("If automatic enrollment is enabled for LON-CAPA course: ").$description.&mt(", automated enrollment may fail for ").$newattr{'coursecode'}.&mt(" - section $sec because this is not a valid section entry.
    "); } } - } elsif ($changeowner) { + } elsif ($changed{'owner'}) { foreach my $sec (@sections) { if ($sec =~ m/^(.+):/) { my $inst_course_id = $newattr{'coursecode'}.$1; @@ -647,7 +728,7 @@ sub modify_course { } else { $warning .= &mt("As no section numbers are currently listed for LON-CAPA course: ").$description.&mt(", automated enrollment will not occur for any sections of coursecode: ").$newattr{'coursecode'}."
    "; } - if ( (@xlists > 0) && ($changeowner) ) { + if ( (@xlists > 0) && ($changed{'owner'}) ) { foreach my $xlist (@xlists) { if ($xlist =~ m/^(.+):/) { my $outcome = &Apache::lonnet::auto_new_course($cnum,$cdom,$1,$newattr{'courseowner'}); @@ -750,6 +831,126 @@ sub modify_quota { return; } +sub modify_catsettings { + my ($r,$cdom,$cnum,$cdesc,$domdesc) = @_; + &print_header($r,$cdesc); + my %lt = &Apache::lonlocal::texthash( + 'back' => 'Back to options page', + ); + my %desc = &Apache::lonlocal::texthash( + 'hidefromcat' => 'Excluded from course catalog', + 'categories' => 'Assigned categories for this course', + ); + $r->print(' +
    +

    '.&mt('Category settings').'

    '); + my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$cdom); + my @cat_params = &catalog_settable($domconf{'coursecategories'}); + if (@cat_params > 0) { + my (%cenv,@changes,@nochanges); + my %currsettings = + &Apache::lonnet::get('environment',['hidefromcat','categories'],$cdom,$cnum); + my (@newcategories,%showitem); + if (grep(/^togglecats$/,@cat_params)) { + if ($currsettings{'hidefromcat'} ne $env{'form.hidefromcat'}) { + push(@changes,'hidefromcat'); + $cenv{'hidefromcat'} = $env{'form.hidefromcat'}; + } else { + push(@nochanges,'hidefromcat'); + } + if ($env{'form.hidefromcat'} eq 'yes') { + $showitem{'hidefromcat'} = '"'.&mt('Yes')."'"; + } else { + $showitem{'hidefromcat'} = '"'.&mt('No').'"'; + } + } + if (grep(/^categorize$/,@cat_params)) { + my (@cats,@trails,%allitems,%idx,@jsarray); + if (ref($domconf{'coursecategories'}) eq 'HASH') { + my $cathash = $domconf{'coursecategories'}{'cats'}; + if (ref($cathash) eq 'HASH') { + &Apache::loncommon::extract_categories($cathash,\@cats,\@trails, + \%allitems,\%idx,\@jsarray); + } + } + @newcategories = &Apache::loncommon::get_env_multiple('form.usecategory'); + if (@newcategories == 0) { + $showitem{'categories'} = '"'.&mt('None').'"'; + } else { + $showitem{'categories'} = ''; + } + my $catchg = 0; + if ($currsettings{'categories'} ne '') { + my @currcategories = split('&',$currsettings{'categories'}); + foreach my $cat (@currcategories) { + if (!grep(/^\Q$cat\E$/,@newcategories)) { + $catchg = 1; + last; + } + } + if (!$catchg) { + foreach my $cat (@newcategories) { + if (!grep(/^\Q$cat\E$/,@currcategories)) { + $catchg = 1; + last; + } + } + } + } else { + if (@newcategories > 0) { + $catchg = 1; + } + } + if ($catchg) { + $cenv{'categories'} = join('&',@newcategories); + push(@changes,'categories'); + } else { + push(@nochanges,'categories'); + } + if (@changes > 0) { + my $putreply = &Apache::lonnet::put('environment',\%cenv,$cdom,$cnum); + if ($putreply eq 'ok') { + my %crsinfo = &Apache::lonnet::courseiddump($cdom,'.',1,'.','.', + $cnum,undef,undef,'.'); + if (ref($crsinfo{$env{'form.pickedcourse'}}) eq 'HASH') { + if (grep(/^hidefromcat$/,@changes)) { + $crsinfo{$env{'form.pickedcourse'}}{'hidefromcat'} = $env{'form.hidefromcat'}; + } + if (grep(/^categories$/,@changes)) { + $crsinfo{$env{'form.pickedcourse'}}{'categories'} = $cenv{'categories'}; + } + my $chome = &Apache::lonnet::homeserver($cnum,$cdom); + my $putres = &Apache::lonnet::courseidput($cdom,\%crsinfo,$chome,'notime'); + } + $r->print(&mt('The following changes occurred').'
    '); + } + } + if (@nochanges > 0) { + $r->print(&mt('The following were unchanged').''); + } + } + } else { + $r->print(&mt('Category settings for courses in this domain should be modified in course context (via "Set Course Environment").').'
    '); + } + $r->print('
    '."\n". + ''. + $lt{'back'}.''); + $r->print(&hidden_form_elements().'
    '); + return; +} + sub print_header { my ($r,$cdesc,$javascript_validations) = @_; my $phase = "start"; @@ -833,7 +1034,7 @@ sub check_course { if ($cdom eq $dom) { my $description; my %courseIDs = &Apache::lonnet::courseiddump($cdom,'.',1,'.','.', - $cnum,undef,undef,'.'); + $cnum,undef,undef,'.'); if (keys(%courseIDs) > 0) { $ok_course = 'ok'; my ($instcode,$owner); @@ -878,7 +1079,7 @@ sub hidden_form_elements { my $hidden_elements = &Apache::lonhtmlcommon::echo_form_input(['gosearch','coursecode', 'prevphase','numlocalcc','courseowner','login','coursequota','intarg', - 'locarg','krbarg','krbver','counter'])."\n". + 'locarg','krbarg','krbver','counter','hidefromcat','usecategory'])."\n". ''; return $hidden_elements; } @@ -927,7 +1128,7 @@ sub handler { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:changePage(document.$phase,'menu')", text=>"Pick action"}); - &print_modification_menu($r,$cdesc,$domdesc); + &print_modification_menu($r,$cdesc,$domdesc,$dom); } elsif ($phase eq 'ccrole') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:changePage(document.$phase,'ccrole')", @@ -942,7 +1143,7 @@ sub handler { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:changePage(document.$phase,'$phase')", text=>"Set quota"}); - &print_setquota($r,$cdom,$cnum,$cdesc,$type) + &print_setquota($r,$cdom,$cnum,$cdesc,$type); } elsif ($phase eq 'processquota') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:changePage(document.$phase,'setquota')", @@ -969,6 +1170,19 @@ sub handler { ({href=>"javascript:changePage(document.$phase,'$phase')", text=>"Result"}); &modify_course($r,$cdom,$cnum,$cdesc,$domdesc,$type); + } elsif ($phase eq 'catsettings') { + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"javascript:changePage(document.$phase,'$phase')", + text=>"Catalog settings"}); + &print_catsettings($r,$cdom,$cnum,$cdesc,$type); + } elsif ($phase eq 'processcat') { + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"javascript:changePage(document.$phase,'catsettings')", + text=>"Catalog settings"}); + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"javascript:changePage(document.$phase,'$phase')", + text=>"Result"}); + &modify_catsettings($r,$cdom,$cnum,$cdesc,$domdesc); } } } else {