[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').'&nbsp;<label><input name="hidefromcat" type="radio" value="yes" '.$excludeon.' />'.&mt('Yes').'</label>&nbsp;&nbsp;&nbsp;<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--