[LON-CAPA-cvs] cvs: loncom /interface lonmodifycourse.pm
raeburn
lon-capa-cvs-allow@mail.lon-capa.org
Mon, 30 Jun 2008 01:28:57 -0000
This is a MIME encoded message
--raeburn1214789337
Content-Type: text/plain
raeburn Sun Jun 29 21:28:57 2008 EDT
Modified files:
/loncom/interface lonmodifycourse.pm
Log:
- Ability to exclude a course from the course catalog.
- Ability to categorize a course from categories defined for the course's domain.
--raeburn1214789337
Content-Type: text/plain
Content-Disposition: attachment; filename="raeburn-20080629212857.txt"
Index: loncom/interface/lonmodifycourse.pm
diff -u loncom/interface/lonmodifycourse.pm:1.37 loncom/interface/lonmodifycourse.pm:1.38
--- loncom/interface/lonmodifycourse.pm:1.37 Sun Dec 30 18:22:41 2007
+++ loncom/interface/lonmodifycourse.pm Sun Jun 29 21:28:56 2008
@@ -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 @@
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_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 @@
},
{ 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 = '<h3>'.&mt('View/Modify settings for: ').$cdesc.'</h3>'."\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).'
<ul>
<li>'.$lt{'some'}.'</li>
- <li>'.$lt{'crqo'}.'</li>
-</ul>
+ <li>'.$lt{'crqo'}.'</li>'."\n";
+ foreach my $item (@additional_params) {
+ if ($item eq 'togglecats') {
+ $menu_html .= ' <li>'.&mt('Hiding a course from the course catalog (can be [_1]configured[_2] to be modifiable 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 (can be [_1]configured[_2] to be modifiable 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();
@@ -289,6 +320,59 @@
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('<form action="/adm/modifycourse" method="post" name="catsettings">'.
+ '<h3>'.&mt('Catalog Settings for Course').'</h3>');
+ 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('<h4>'.&mt('Visibility in Course Catalog').'</h4>'.
+ &mt("Unless excluded, a course is listed in this domain's publicly accessible course catalog if at least of one the following applies").':<ul>'.
+ '<li>'.&mt('Auto-cataloging is enabled and the course is assigned an institutional code').'</li>'.
+ '<li>'.&mt('The course has been categorized into at least one of the course categories defined for the domain.').'</li></ul>'.
+ '<br />'.&mt('Exclude from course catalog').' <label><input name="hidefromcat" type="radio" value="yes" '.$excludeon.' />'.&mt('Yes').'</label> <label><input name="hidefromcat" type="radio" value="" '.$excludeoff.' />'.&mt('No').'</label><br />');
+ }
+ if (grep(/^categorize$/,@cat_params)) {
+ $r->print('<h4>'.&mt('Categorize Course').'</h4>');
+ 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.').'<br /><br />'.
+ &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('<p>'.&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).').'</p>');
+ }
+ $r->print('<input type="button" name="chgcatsettings" value="'.
+ &mt('Save').'" onclick="javascript:changePage(document.catsettings,'."'processcat'".');" />');
+ } else {
+ $r->print('<span class="LC_warning">'.&mt('Catalog settings in this domain are set in course context via "Set Course Environment".').'</span><br /><br />'."\n".
+ '<a href="javascript:changePage(document.catsettings,'."'menu'".');">'.
+ $lt{'back'}.'</a>');
+ }
+ $r->print(&hidden_form_elements().'</form>'."\n");
+ return;
+}
+
sub print_course_modification_page {
my ($r,$cdom,$cnum,$cdesc,$domdesc) = @_;
my %longtype = &course_settings_descrip();
@@ -508,8 +592,9 @@
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 @@
}
my $description = $settings{'description'};
- my %cenv = ();
if ($env{'form.login'} eq 'krb') {
$newattr{'authtype'} = $env{'form.login'};
@@ -559,28 +643,25 @@
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 @@
$nochgresponse .= "<li>$longtype{$attr} ".&mt("still set to \"").$currattr{$attr}."\".</li>";
}
}
- 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.<br/>");
} 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 @@
$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.<br/>");
}
}
- } elsif ($changeowner) {
+ } elsif ($changed{'owner'}) {
foreach my $sec (@sections) {
if ($sec =~ m/^(.+):/) {
my $inst_course_id = $newattr{'coursecode'}.$1;
@@ -647,7 +728,7 @@
} 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'}."<br/>";
}
- 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 @@
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('
+<form action="/adm/modifycourse" method="post" name="processcat">
+<h3>'.&mt('Category settings').'</h3>');
+ 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'} = '<ul>';
+ foreach my $item (@newcategories) {
+ $showitem{'categories'} .= '<li>'.$trails[$allitems{$item}].'</li>';
+ }
+ $showitem{'categories'} .= '</ul>';
+ }
+ 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').'<ul>');
+ foreach my $item (@changes) {
+ $r->print('<li>'.&mt('[_1] now set to [_2]',$desc{$item},$showitem{$item}).'</li>');
+ }
+ $r->print('</ul><br />');
+ }
+ }
+ if (@nochanges > 0) {
+ $r->print(&mt('The following were unchanged').'<ul>');
+ foreach my $item (@nochanges) {
+ $r->print('<li>'.&mt('[_1] still set to [_2]',$desc{$item},$showitem{$item}).'</li>');
+ }
+ $r->print('</ul>');
+ }
+ }
+ } else {
+ $r->print(&mt('Category settings for courses in this domain should be modified in course context (via "Set Course Environment").').'<br />');
+ }
+ $r->print('<br />'."\n".
+ '<a href="javascript:changePage(document.processcat,'."'menu'".')">'.
+ $lt{'back'}.'</a>');
+ $r->print(&hidden_form_elements().'</form>');
+ return;
+}
+
sub print_header {
my ($r,$cdesc,$javascript_validations) = @_;
my $phase = "start";
@@ -833,7 +1034,7 @@
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 @@
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".
'<input type="hidden" name="prevphase" value="'.$env{'form.phase'}.'" />';
return $hidden_elements;
}
@@ -927,7 +1128,7 @@
&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 @@
&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 @@
({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 {
--raeburn1214789337--