Diff for /loncom/interface/loncreateuser.pm between versions 1.268 and 1.268.4.2

version 1.268, 2008/12/14 14:36:18 version 1.268.4.2, 2009/09/14 21:50:04
Line 68  use Apache::loncommon; Line 68  use Apache::loncommon;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::longroup;  use Apache::longroup;
 use Apache::lonuserutils;  use Apache::lonuserutils;
   use Apache::selfenroll();
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
   
 my $loginscript; # piece of javascript used in two separate instances  my $loginscript; # piece of javascript used in two separate instances
Line 213  END_SCRIPT Line 214  END_SCRIPT
                     $tool_on = '';                      $tool_on = '';
                 }                  }
             }              }
             $curr_access = &Apache::lonnet::usertools_access($ccuname,$ccdomain,$item);  
             $output .= '  <tr class="LC_info_row">'."\n".              $output .= '  <tr class="LC_info_row">'."\n".
                        '   <td>'.$lt{$item}.'</td>'."\n".                         '   <td>'.$lt{$item}.'</td>'."\n".
                        '  </tr>'."\n".                         '  </tr>'."\n".
Line 770  $lt{'hs'}: $home_server_pick Line 770  $lt{'hs'}: $home_server_pick
                     my $authtype = $rules->{$matchedrule}{'authtype'};                      my $authtype = $rules->{$matchedrule}{'authtype'};
                     if ($authtype !~ /^(krb4|krb5|int|fsys|loc)$/) {                      if ($authtype !~ /^(krb4|krb5|int|fsys|loc)$/) {
                         $r->print(&Apache::lonuserutils::set_login($ccdomain,$authformkrb,$authformint,$authformloc));                          $r->print(&Apache::lonuserutils::set_login($ccdomain,$authformkrb,$authformint,$authformloc));
                     } else {                       } else {
                         my $authparm = $rules->{$matchedrule}{'authparm'};                          my $authparm = $rules->{$matchedrule}{'authparm'};
                           $authmsg = $rules->{$matchedrule}{'authmsg'};
                         if ($authtype =~ /^krb(4|5)$/) {                          if ($authtype =~ /^krb(4|5)$/) {
                             my $ver = $1;                              my $ver = $1;
                             if ($authparm ne '') {                              if ($authparm ne '') {
Line 780  $lt{'hs'}: $home_server_pick Line 781  $lt{'hs'}: $home_server_pick
 <input type="hidden" name="krbver" value="$ver" />  <input type="hidden" name="krbver" value="$ver" />
 <input type="hidden" name="krbarg" value="$authparm" />  <input type="hidden" name="krbarg" value="$authparm" />
 KERB  KERB
                                 $authmsg = $rules->{$matchedrule}{'authmsg'};      
                             }                              }
                         } else {                          } else {
                             $fixedauth =                               $fixedauth = 
Line 789  KERB Line 789  KERB
                                 $fixedauth .=                                      $fixedauth .=    
 '<input type="hidden" name="'.$authtype.'arg" value="'.$authparm.'" />'."\n";  '<input type="hidden" name="'.$authtype.'arg" value="'.$authparm.'" />'."\n";
                             } else {                              } else {
                                 $varauth =                                    if ($authtype eq 'int') {
                                       $varauth = '<br />'.
   &mt('[_1] Internally authenticated (with initial password [_2])','','<input type="password" size="10" name="intarg" value="" />')."<label><input type=\"checkbox\" name=\"visible\" onClick='if (this.checked) { this.form.intarg.type=\"text\" } else { this.form.intarg.type=\"password\" }' />".&mt('Visible input').'</label>';
                                   } elsif ($authtype eq 'loc') {
                                       $varauth = '<br />'.
   &mt('[_1] Local Authentication with argument [_2]','','<input type="text" name="'.$authtype.'arg" value="" />')."\n";
                                   } else {
                                       $varauth =
 '<input type="text" name="'.$authtype.'arg" value="" />'."\n";  '<input type="text" name="'.$authtype.'arg" value="" />'."\n";
                                   }
                             }                              }
                         }                          }
                     }                      }
Line 1554  sub personal_data_display { Line 1562  sub personal_data_display {
                 }                  }
             } else {              } else {
                 if ($context eq 'selfcreate') {                  if ($context eq 'selfcreate') {
                     if ($canmodify{$item}) {                      if (($item eq 'permanentemail') && ($newuser eq 'email')) {
                         $row .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="" />';                          $row .= $ccuname;
                         $editable ++;  
                     } else {                      } else {
                         $hiderow = 1;                          if ($canmodify{$item}) {
                               $row .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="" />';
                               $editable ++;
                           } else {
                               $hiderow = 1;
                           }
                     }                      }
                 } else {                  } else {
                     $row .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="" />';                      $row .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="" />';
Line 1680  sub update_user_data { Line 1692  sub update_user_data {
     }      }
     if (  $env{'form.ccuname'} ne       if (  $env{'form.ccuname'} ne 
   &LONCAPA::clean_username($env{'form.ccuname'}) ) {    &LONCAPA::clean_username($env{'form.ccuname'}) ) {
  $r->print($error.&mt('Invalid login name').'.  '.   $r->print($error.&mt('Invalid login name.').'  '.
   &mt('Only letters, numbers, periods, dashes, @, and underscores are valid').'.'.    &mt('Only letters, numbers, periods, dashes, @, and underscores are valid.').
   $end.$rtnlink);    $end.$rtnlink);
  return;   return;
     }      }
Line 1691  sub update_user_data { Line 1703  sub update_user_data {
     }      }
     if (  $env{'form.ccdomain'} ne      if (  $env{'form.ccdomain'} ne
   &LONCAPA::clean_domain($env{'form.ccdomain'}) ) {    &LONCAPA::clean_domain($env{'form.ccdomain'}) ) {
  $r->print($error.&mt ('Invalid domain name').'.  '.   $r->print($error.&mt ('Invalid domain name.').'  '.
   &mt('Only letters, numbers, periods, dashes, and underscores are valid').'.'.    &mt('Only letters, numbers, periods, dashes, and underscores are valid.').
   $end.$rtnlink);    $end.$rtnlink);
  return;   return;
     }      }
Line 2071  sub update_user_data { Line 2083  sub update_user_data {
                     }                      }
                 } else {                  } else {
                     $changed{$tool} = &tool_admin($tool,'',\%changeHash);                      $changed{$tool} = &tool_admin($tool,'',\%changeHash);
                     print STDERR "for $tool - changed is $changed{$tool}\n";  
                     if ($changed{$tool}) {                      if ($changed{$tool}) {
                         $newaccess{$tool} = &mt('default');                          $newaccess{$tool} = &mt('default');
                     } else {                      } else {
Line 2125  sub update_user_data { Line 2136  sub update_user_data {
                     &Apache::lonnet::put('environment',\%changeHash,                      &Apache::lonnet::put('environment',\%changeHash,
                                   $env{'form.ccdomain'},$env{'form.ccuname'});                                    $env{'form.ccdomain'},$env{'form.ccuname'});
                 if ($chgresult eq 'ok') {                  if ($chgresult eq 'ok') {
                     my %newenvhash;  
                     my $hashid="$env{'form.ccuname'}:$env{'form.ccdomain'}";  
                     foreach my $key (keys(%changed)) {  
                         if ($key ne 'quota') {  
                             &Apache::lonnet::devalidate_cache_new('usertools.'.$key,$hashid);  
                             $newenvhash{'environment.tools.'.$key} =   
                                 $changeHash{'tools.'.$key};  
                         }  
                     }  
                     if (($env{'user.name'} eq $env{'form.ccuname'}) &&                      if (($env{'user.name'} eq $env{'form.ccuname'}) &&
                         ($env{'user.domain'} eq $env{'form.ccdomain'})) {                          ($env{'user.domain'} eq $env{'form.ccdomain'})) {
                         &Apache::lonnet::appenv(\%newenvhash);                          my %newenvhash;
                           foreach my $key (keys(%changed)) {
                               if ($key ne 'quota') {
                                   $newenvhash{'environment.tools.'.$key} = 
                                       $changeHash{'tools.'.$key};
                                   $newenvhash{'environment.availabletools.'.$key} =
                                       $changeHash{'tools.'.$key};
                               }
                           }
                           if (keys(%newenvhash)) {
                               &Apache::lonnet::appenv(\%newenvhash);
                           }
                     }                      }
                 }                  }
             }              }
Line 2928  sub make_script_template { Line 2941  sub make_script_template {
         my ($priv_item, $dummy) = split(/\&/,$priv);          my ($priv_item, $dummy) = split(/\&/,$priv);
         $role_c{$priv_item} = 1;          $role_c{$priv_item} = 1;
     }      }
       my %role_d;
       @temp = split(/:/,$Apache::lonnet::pr{$role.':d'});
       foreach my $priv(@temp) {
           my ($priv_item, $dummy) = split(/\&/,$priv);
           $role_d{$priv_item} = 1;
       }
       my %role_s;
       @temp = split(/:/,$Apache::lonnet::pr{$role.':s'});
       foreach my $priv(@temp) {
           my ($priv_item, $dummy) = split(/\&/,$priv);
           $role_s{$priv_item} = 1;
       }
     foreach my $priv_item (keys(%full_c)) {      foreach my $priv_item (keys(%full_c)) {
         my ($priv, $dummy) = split(/\&/,$priv_item);          my ($priv, $dummy) = split(/\&/,$priv_item);
         if (exists($role_c{$priv})) {          if ((exists($role_c{$priv})) || (exists($role_d{$priv})) || 
               (exists($role_s{$priv}))) {
             $return_script .= "document.form1.$priv"."_c.checked = true;\n";              $return_script .= "document.form1.$priv"."_c.checked = true;\n";
         } else {          } else {
             $return_script .= "document.form1.$priv"."_c.checked = false;\n";              $return_script .= "document.form1.$priv"."_c.checked = false;\n";
         }          }
     }      }
     my %role_d;  
     @temp = split(/:/,$Apache::lonnet::pr{$role.':d'});  
     foreach my $priv(@temp) {  
         my ($priv_item, $dummy) = split(/\&/,$priv);  
         $role_d{$priv_item} = 1;  
     }  
     foreach my $priv_item (keys(%full_d)) {      foreach my $priv_item (keys(%full_d)) {
         my ($priv, $dummy) = split(/\&/,$priv_item);          my ($priv, $dummy) = split(/\&/,$priv_item);
         if (exists($role_d{$priv})) {          if ((exists($role_d{$priv})) || (exists($role_s{$priv}))) {
             $return_script .= "document.form1.$priv"."_d.checked = true;\n";              $return_script .= "document.form1.$priv"."_d.checked = true;\n";
         } else {          } else {
             $return_script .= "document.form1.$priv"."_d.checked = false;\n";              $return_script .= "document.form1.$priv"."_d.checked = false;\n";
         }          }
     }      }
     my %role_s;  
     @temp = split(/:/,$Apache::lonnet::pr{$role.':s'});  
     foreach my $priv(@temp) {  
         my ($priv_item, $dummy) = split(/\&/,$priv);  
         $role_s{$priv_item} = 1;  
     }  
     foreach my $priv_item (keys(%full_s)) {      foreach my $priv_item (keys(%full_s)) {
         my ($priv, $dummy) = split(/\&/,$priv_item);          my ($priv, $dummy) = split(/\&/,$priv_item);
         if (exists($role_s{$priv})) {          if (exists($role_s{$priv})) {
Line 3299  sub handler { Line 3313  sub handler {
             &update_selfenroll_config($r,$context,$permission);              &update_selfenroll_config($r,$context,$permission);
         }          }
         $r->print(&Apache::loncommon::end_page());          $r->print(&Apache::loncommon::end_page());
       } elsif ($env{'form.action'} eq 'selfenrollqueue') {
           $r->print(&header());
           &Apache::lonhtmlcommon::add_breadcrumb
               ({href=>'/adm/createuser?action=selfenrollqueue',
                 text=>"Enrollment requests"});
           my $cid = $env{'request.course.id'};
           my $cdom = $env{'course.'.$cid.'.domain'};
           my $cnum = $env{'course.'.$cid.'.num'};
           if (!exists($env{'form.state'})) {
               $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enrollment requests',
                                                             'Course_SelfEnrollment_Approval'));
               $r->print('<h3>'.&mt('Pending enrollment requests').'</h3>'."\n");
               &display_selfenroll_queue($r,$context,$permission,$cnum,$cdom);
           } elsif ($env{'form.state'} eq 'done') {
               &Apache::lonhtmlcommon::add_breadcrumb
               ({href=>'/adm/createuser?action=selfenrollqueue',
                 text=>"Result"});
               $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enrollment result',
                                                             'Course_Self_Enrollment'));
               $r->print('<h3>'.&mt('Enrollment request processing').'</h3>'."\n");
               &update_selfenroll_queue($r,$context,$permission,$cid,$cnum,$cdom);
           }
           $r->print(&Apache::loncommon::end_page());
     } elsif ($env{'form.action'} eq 'changelogs') {      } elsif ($env{'form.action'} eq 'changelogs') {
         $r->print(&header());          $r->print(&header());
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
Line 3364  sub print_main_menu { Line 3401  sub print_main_menu {
                                    listusers => 'Display Co-authors and Manage Multiple Users',                                     listusers => 'Display Co-authors and Manage Multiple Users',
                                  },                                   },
                        course => {                         course => {
                                    upload => 'File of Course Users',                                     upload => 'Upload a File of Course Users',
                                    singleuser => 'Single Course User',                                     singleuser => 'Add/Modify a Single Course User',
                                    listusers => 'Course User Lists',                                     listusers => 'Display Class Lists and Manage Multiple Users',
                                  },                                   },
                      );                       );
   my @menu = ( {categorytitle => 'Add Users',      my @menu =
      items =>          (
      [{            { text => $links{$context}{'upload'},
          linktext => $links{$context}{'upload'},              help => 'Course_Create_Class_List',
          icon => 'sctr.png',              action => 'upload',
          #help => 'Course_Create_Class_List',              permission => $permission->{'cusr'},
          url => '/adm/createuser?action=upload',              },
          permission => $permission->{'cusr'},            { text => $links{$context}{'singleuser'},
          linktitle => 'Upload a CSV or a text file containing users.',              help => 'Course_Change_Privileges',
      },              action => 'singleuser',
      {              permission => $permission->{'cusr'},
          linktext => $links{$context}{'singleuser'},              },
          icon => 'edit-redo.png',            { text => $links{$context}{'listusers'},
          #help => 'Course_Change_Privileges',              help => 'Course_View_Class_List',
          url => '/adm/createuser?action=singleuser',              action => 'listusers',
          permission => $permission->{'cusr'},              permission => ($permission->{'view'} || $permission->{'cusr'}),
          linktitle => 'Add a user with a certain role to this course.',            },
      }]},          );
      {categorytitle => 'Administration',      if ($context eq 'domain' || $context eq 'course') {
      items =>          my $customlink =  { text => 'Edit Custom Roles',
      [{                              help => 'Course_Editing_Custom_Roles',
          linktext => $links{$context}{'listusers'},                              action => 'custom',
                  icon => 'edit-find.png',                              permission => $permission->{'custom'},
                  #help => 'Course_View_Class_List',                            };
                  url => '/adm/createuser?action=listusers',          push(@menu,$customlink);
          permission => ($permission->{'view'} || $permission->{'cusr'}),      }
          linktitle => 'Show and manage users of this course.',      if ($context eq 'course') {
      }]},          my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();
      {categorytitle => 'Configuration',          my @courselinks =
      items =>              (
      [                { text => 'Enroll a Single Student',
      ]},                   help => 'Course_Add_Student',
    );                   action => 'singlestudent',
                    permission => $permission->{'cusr'},
     if ($context eq 'domain'){                   },
                 { text => 'Drop Students',
  push(@{ $menu[1]->{items} },                  help => 'Course_Drop_Student',
  { linktext => 'Custom Roles',                  action => 'drop',
  icon => 'emblem-photos.png',                  permission => $permission->{'cusr'},
  #help => 'Course_Editing_Custom_Roles',                });
  url => '/adm/createuser?action=custom',          if (!exists($permission->{'cusr_section'})) {
  permission => $permission->{'custom'},              push(@courselinks,
  linktitle => 'Configure a custom role.',                 { text => 'Automated Enrollment Manager',
  });                   help => 'Course_Automated_Enrollment',
                    permission => (&Apache::lonnet::auto_run($cnum,$cdom)
     }elsif ($context eq 'course'){                                  && $permission->{'cusr'}),
     my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();                   url  => '/adm/populate',
                    },
         push(@{ $menu[0]->{items} },                 { text => 'Configure User Self-enrollment',
  { linktext => 'Single Student',                   help => 'Course_Self_Enrollment',
             #help => 'Course_Add_Student',                   action => 'selfenroll',
  icon => 'list-add.png',                   permission => $permission->{'cusr'},
             url => '/adm/createuser?action=singlestudent',                 });
  permission => $permission->{'cusr'},              if ($env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_approval'}) {
             linktitle => 'Add a user with the role student to this course.',                 push(@courselinks,
         });                      {text => 'Enrollment Requests',
                        action => 'selfenrollqueue',
         push(@{ $menu[1]->{items} },                         permission => $permission->{'cusr'},
  { linktext => 'Drop Students',                      });
  icon => 'edit-undo.png',              }
             #help => 'Course_Drop_Student',          }
             url => '/adm/createuser?action=drop',          push(@courselinks,
  permission => $permission->{'cusr'},                 { text => 'Manage Course Groups',
             linktitle =>'Remove a student from this course.',                   help => 'Course_Manage_Group',
         },                   permission => $permission->{'grp_manage'},
  { linktext => 'Custom Roles',                   url => '/adm/coursegroups?refpage=cusr',
  icon => 'emblem-photos.png',                 },
             #help => 'Course_Editing_Custom_Roles',                 { text => 'View Change Logs',
             url => '/adm/createuser?action=custom',                   help => 'Course_User_Logs',
  permission => $permission->{'custom'},                   action => 'changelogs',
  linktitle => 'Configure a custom role.',                   permission => $permission->{'cusr'},
         });                 },);
   
         if (!exists($permission->{'cusr_section'})){  
          
  push(@{ $menu[2]->{items} },  
  { linktext => 'Automated Enrollment',  
  icon => 'roles.png',  
           #help => 'Course_Automated_Enrollment',  
         permission => (&Apache::lonnet::auto_run($cnum,$cdom)  
                                 && $permission->{'cusr'}),  
  url  => '/adm/populate',  
  linktitle => 'Automated enrollment manager.',  
  },  
  { linktext => 'User Self-Enrollment',  
  icon => 'cstr.png',  
        #help => 'Course_Self_Enrollment',  
  url => '/adm/createuser?action=selfenroll',  
  permission => $permission->{'cusr'},  
  linktitle => 'Configure user self enrollment.',  
         });  
   
  }  
   
  push(@{ $menu[2]->{items} },  
  { linktext => 'Course Groups',  
  icon => 'conf.png',  
         #help => 'Course_Manage_Group',  
             url => '/adm/coursegroups?refpage=cusr',  
  permission => $permission->{'grp_manage'},  
  linktitle => 'Manage course groups.',  
         },  
         { linktext => 'Change Logs',  
  icon => 'document-properties.png',  
         #help => 'Course_User_Logs',  
         url => '/adm/createuser?action=changelogs',  
  permission => $permission->{'cusr'},  
  linktitle => 'View change log.',  
         });  
     };  
 return Apache::lonhtmlcommon::generate_menu(@menu);  
 #               { text => 'View Log-in History',  #               { text => 'View Log-in History',
 #                 help => 'Course_User_Logins',  #                 help => 'Course_User_Logins',
 #                 action => 'logins',  #                 action => 'logins',
 #                 permission => $permission->{'cusr'},  #                 permission => $permission->{'cusr'},
 #               });  #               });
           push(@menu,@courselinks);
       }
       my $menu_html = '';
       foreach my $menu_item (@menu) {
           next if (! $menu_item->{'permission'});
           $menu_html.='<p>';
           if (exists($menu_item->{'help'})) {
               $menu_html.=
                   &Apache::loncommon::help_open_topic($menu_item->{'help'});
           }
           $menu_html.='<font size="+1">';
           if (exists($menu_item->{'url'})) {
               $menu_html.=qq{<a href="$menu_item->{'url'}">};
           } else {
               $menu_html.=
                   qq{<a href="/adm/createuser?action=$menu_item->{'action'}">};        }
           $menu_html.= &mt($menu_item->{'text'}).'</a></font>';
           $menu_html.='</p>';
       }
       return $menu_html;
 }  }
   
 sub restore_prev_selections {  sub restore_prev_selections {
Line 3687  ENDSCRIPT Line 3705  ENDSCRIPT
     my ($visible,$cansetvis,$vismsgs,$visactions) = &visible_in_cat($cdom,$cnum);      my ($visible,$cansetvis,$vismsgs,$visactions) = &visible_in_cat($cdom,$cnum);
     if (ref($visactions) eq 'HASH') {      if (ref($visactions) eq 'HASH') {
         if ($visible) {          if ($visible) {
             $output .= '<p>'.$visactions->{'vis'}.'</p>';              $output .= '<p class="LC_info">'.$visactions->{'vis'}.'</p>';
         } else {          } else {
             $output .= $visactions->{'miss'}.'<br />'.$visactions->{'yous'}.              $output .= '<p class="LC_warning">'.$visactions->{'miss'}.'</p>'
                          .$visactions->{'yous'}.
                        '<p>'.$visactions->{'gen'}.'<br />'.$visactions->{'coca'};                         '<p>'.$visactions->{'gen'}.'<br />'.$visactions->{'coca'};
             if (ref($vismsgs) eq 'ARRAY') {              if (ref($vismsgs) eq 'ARRAY') {
                 $output .= '<br />'.$visactions->{'make'}.'<ul>';                  $output .= '<br />'.$visactions->{'make'}.'<ul>';
Line 3842  ENDSCRIPT Line 3861  ENDSCRIPT
                            '<input type="hidden" name="sections" value="" />'."\n".                             '<input type="hidden" name="sections" value="" />'."\n".
                            '<input type="hidden" name="state" value="done" />'."\n".                             '<input type="hidden" name="state" value="done" />'."\n".
                            '</td></tr></table>'."\n";                             '</td></tr></table>'."\n";
               } elsif ($item eq 'approval') {
                   my ($appon,$appoff);
                   my $cid = $env{'request.course.id'};
                   my $currnotified = $env{'course.'.$cid.'.internal.selfenroll_notifylist'};
                   if ($env{'course.'.$cid.'.internal.selfenroll_approval'}) {
                       $appon = ' checked="checked" ';
                       $appoff = ' ';
                   } else {
                       $appon = ' ';
                       $appoff = ' checked="checked" ';
                   }
                   $output .= '<label>'.
                              '<input type="radio" name="selfenroll_approval" value="1"'.$appon.'/>'.
                              &mt('Yes').'</label>&nbsp;&nbsp;<label>'.
                              '<input type="radio" name="selfenroll_approval" value="0"'.$appoff.'/>'.
                              &mt('No').'</label>';
                   my %advhash = &Apache::lonnet::get_course_adv_roles($cid,1);
                   my (@ccs,%notified);
                   if ($advhash{'cc'}) {
                       @ccs = split(/,/,$advhash{'cc'});
                   }
                   if ($currnotified) {
                       foreach my $current (split(/,/,$currnotified)) {
                           $notified{$current} = 1;
                           if (!grep(/^\Q$current\E$/,@ccs)) {
                               push(@ccs,$current);
                           }
                       }
                   }
                   if (@ccs) {
                       $output .= '<br />'.&mt('Personnel to be notified when an enrollment request needs approval, or has been approved:').'&nbsp;'.&Apache::loncommon::start_data_table().
                       &Apache::loncommon::start_data_table_row();
                       my $count = 0;
                       my $numcols = 4;
                       foreach my $cc (sort(@ccs)) {
                           my $notifyon;
                           my ($ccuname,$ccudom) = split(/:/,$cc);
                           if ($notified{$cc}) {
                               $notifyon = ' checked="checked" ';
                           }
                           if ($count && !$count%$numcols) {
                               $output .= &Apache::loncommon::end_data_table_row().
                                          &Apache::loncommon::start_data_table_row()
                           }
                           $output .= '<td><span class="LC_nobreak"><label>'.
                                      '<input type="checkbox" name="selfenroll_notify"'.$notifyon.' value="'.$cc.'" />'.
                                      &Apache::loncommon::plainname($ccuname,$ccudom).
                                      '</label></span></td>';
                           $count;
                       }
                       my $rem = $count%$numcols;
                       if ($rem) {
                           my $emptycols = $numcols - $rem;
                           for (my $i=0; $i<$emptycols; $i++) {
                               $output .= '<td>&nbsp;</td>';
                           }
                       }
                       $output .= &Apache::loncommon::end_data_table_row().
                                  &Apache::loncommon::end_data_table();
                   }
               } elsif ($item eq 'limit') {
                   my ($crslimit,$selflimit,$nolimit);
                   my $cid = $env{'request.course.id'};
                   my $currlim = $env{'course.'.$cid.'.internal.selfenroll_limit'};
                   my $currcap = $env{'course.'.$cid.'.internal.selfenroll_cap'};
                   my $nolimit = ' checked="checked" ';
                   if ($currlim eq 'allstudents') {
                       $crslimit = ' checked="checked" ';
                       $selflimit = ' ';
                       $nolimit = ' ';
                   } elsif ($currlim eq 'selfenrolled') {
                       $crslimit = ' ';
                       $selflimit = ' checked="checked" ';
                       $nolimit = ' ';
                   } else {
                       $crslimit = ' ';
                       $selflimit = ' ';
                   }
                   $output .= '<table><tr><td><label>'.
                              '<input type="radio" name="selfenroll_limit" value="none"'.$nolimit.'/>'.
                              &mt('No limit').'</label></td><td><label>'.
                              '<input type="radio" name="selfenroll_limit" value="allstudents"'.$crslimit.'/>'.
                              &mt('Limit by total students').'</label></td><td><label>'.
                              '<input type="radio" name="selfenroll_limit" value="selfenrolled"'.$selflimit.'/>'.
                              &mt('Limit by total self-enrolled students').
                              '</td></tr><tr>'.
                              '<td>&nbsp;</td><td colspan="2"><span class="LC_nobreak">'.
                              ('&nbsp;'x3).&mt('Maximum number allowed: ').
                              '<input type="text" name="selfenroll_cap" size = "5" value="'.$currcap.'" /></td></tr></table>';
             }              }
             $output .= &Apache::lonhtmlcommon::row_closure(1);              $output .= &Apache::lonhtmlcommon::row_closure(1);
         }          }
Line 3854  ENDSCRIPT Line 3962  ENDSCRIPT
     return;      return;
 }  }
   
   sub display_selfenroll_queue {
       my ($r,$context,$permission,$cnum,$cdom) = @_;
       my $namespace = 'selfenrollrequests';
       my ($output,%queue_by_date);
       my %requesthash = &Apache::lonnet::dump($namespace,$cdom,$cnum);
       if (keys(%requesthash) > 0) {
           $r->print('<form method="post" name="changequeue" action="/adm/createuser" />'.
                     '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'.
                     '<input type="hidden" name="state" value="done" />'.
                     &Apache::loncommon::start_data_table().
                     &Apache::loncommon::start_data_table_header_row().
                     '<th>'.&mt('Action').'</th>'.
                     '<th>'.&mt('Requestor').'</th>'.
                     '<th>'.&mt('Section').'</th>'.
                     '<th>'.&mt('Date requested').'</th>'.
                     &Apache::loncommon::end_data_table_header_row());
           foreach my $item (keys(%requesthash)) {
               my ($timestamp,$usec) = split(/:/,$requesthash{$item});
               if (exists($queue_by_date{$timestamp})) {
                   if (ref($queue_by_date{$timestamp}) eq 'ARRAY') {
                       push(@{$queue_by_date{$timestamp}},$item.':'.$usec);
                   }
               } else {
                   @{$queue_by_date{$timestamp}} = ($item.':'.$usec);
               }
           }
           my @sortedtimes = sort {$a <=> $b} (keys(%queue_by_date));
           my $count = 0;
           foreach my $item (@sortedtimes) {
               if (ref($queue_by_date{$item}) eq 'ARRAY') {
                   foreach my $request (sort(@{$queue_by_date{$item}})) {
                       my ($puname,$pudom,$pusec) = split(/:/,$request);
                       my $showsec = $pusec;
                       if ($showsec eq '') {
                           $showsec = &mt('none');
                       }
                       my $namelink = &Apache::loncommon::aboutmewrapper(
                                        &Apache::loncommon::plainname($puname,$pudom),
                                        $puname,$pudom);
                       $r->print(&Apache::loncommon::start_data_table_row().
                                 '<td><span class="LC_nobreak"><label>'.
                                 '<input type="checkbox" value="'.$count.':'.$puname.':'.$pudom.':'.$pusec.'" name="approvereq" />'.&mt('Approve').'</label></span><br />'.
                                 '<span class="LC_nobreak"><label>'.
                                 '<input type="checkbox" value="'.$puname.':'.$pudom.'" name="rejectreq" />'.&mt('Reject').'</label></span><br /></td>'.
                                 '<td>'.$namelink.'</td>'.
                                 '<td>'.$showsec.'</td>'.
                                 '<td>'.&Apache::lonlocal::locallocaltime($item).'</td>'.
                                 &Apache::loncommon::end_data_table_row());
                       $count ++;
                   }
               }
           }
           $r->print(&Apache::loncommon::end_data_table().
                     '<input type="submit" name="processqueue" value="'.&mt('Save').'" /></form>');
       } else {
           $r->print(&mt('There are currently no enrollment requests.'));
       }
       return;
   }
   
   sub update_selfenroll_queue {
       my ($r,$context,$permission,$cid,$cnum,$cdom) = @_;
       my @approvals = &Apache::loncommon::get_env_multiple('form.approvereq');
       my @rejections = &Apache::loncommon::get_env_multiple('form.rejectreq');
       my $access_start =  $env{'course.'.$cid.'.internal.selfenroll_start_access'};
       my $access_end =  $env{'course.'.$cid.'.internal.selfenroll_end_access'};
       my $limit = $env{'course.'.$cid.'.internal.selfenroll_limit'};
       my $cap = $env{'course.'.$cid.'.internal.selfenroll_cap'};
       my $notifylist = $env{'course.'.$cid.'.internal.selfenroll_notifylist'};
       my $namespace = 'selfenrollrequests';
       my ($stucounts,$idx,$classlist) = &get_student_counts($cdom,$cnum);
       my %requesthash = &Apache::lonnet::dump($namespace,$cdom,$cnum);
       my $coursedesc = $env{'course.'.$cid.'.description'};
       my $chome = &Apache::lonnet::homeserver($cnum,$cdom);
       my $hostname = &Apache::lonnet::hostname($chome);
       my $protocol = $Apache::lonnet::protocol{$chome};
       $protocol = 'http' if ($protocol ne 'https');
       my (@existing,@missingreq,@invalidusers,@limitexceeded,@enrolled,
           @enrollerrors,@warn_approves,@warn_rejects);
       my $now = time;
       my $sender = $env{'user.name'}.':'.$env{'user.domain'};
       my $approvedmsg = [{
                           mt => 'Your request for enrollment has been approved.',
                         },
                         {
                           mt => 'Visit [_1], to log-in and access the course',
                           args => [$protocol.'://'.$hostname],
                         }];
   
       my $rejectedmsg =  [{
                            mt => 'Your request for enrollment has not been approved.',
                          }];
       foreach my $item (sort {$a <=> $b} @approvals) {
           my ($num,$uname,$udom,$usec) = split(/:/,$item);
           my $uhome = &Apache::lonnet::homeserver($uname,$udom);
           if ($uhome ne 'no_host') {
               if (exists($requesthash{$uname.':'.$udom})) {
   
                   if (exists($classlist->{$uname.':'.$udom})) {
                       if (ref($classlist->{$uname.':'.$udom}) eq 'ARRAY') {
                           if (($classlist->{$uname.':'.$udom}->[$idx->{'status'}] eq 'Active') ||
                               ($classlist->{$uname.':'.$udom}->[$idx->{'status'}] eq 'Future')) {
                               push(@existing,$uname.':'.$udom);
                               next;
                           }
                       }
                   }
               } else {
                   push(@missingreq,$uname.':'.$udom);
                   next;
               }
               if (!grep(/^\Q$item\E$/,@rejections)) {
                   if ($limit eq 'allstudents') {
                       if ($stucounts->{$limit} >= $cap) {
                           push(@limitexceeded,$uname.':'.$udom);
                           last;
                       }
                   } elsif ($limit eq 'selfenrolled') {
                       if ($stucounts->{$limit} >= $cap) {
                           push(@limitexceeded,$uname.':'.$udom);
                           last;
                       }
                   }
                   my $result =
                       &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$usec,$access_end,$access_start,'selfenroll',undef,$cdom.'_'.$cnum,1);
                   if ($result eq 'ok') {
                       push(@enrolled,$uname.':'.$udom);
                       $stucounts->{'allstudents'} ++;
                       $stucounts->{'selfenrolled'} ++;
                       &Apache::selfenroll::send_notification($uname.':'.$udom,$approvedmsg,$cid,
                                                  $coursedesc,$now,'enroller',$sender);
                       my %userrequest = (
                           $cdom.'_'.$cnum => {
                              timestamp   => $now,
                              section     => $usec,
                              adjudicator => $env{'user.name'}.':'.$env{'user.domain'},
                              status      => 'approved',
                          }
                       );
                       my $userresult =
                           &Apache::lonnet::put($namespace,\%userrequest,$udom,$uname);
                       if ($userresult ne 'ok') {
                           push(@warn_approves,$uname.':'.$udom);
                       }
                   } else {
                       push(@enrollerrors,$uname.':'.$udom);
                   }
               }
           } else {
               push(@invalidusers,$uname.':'.$udom);
           }
       }
       my @changes = (@enrolled,@rejections);
       if (@rejections) {
           foreach my $user (@rejections) {
               &Apache::selfenroll::send_notification($user,$rejectedmsg,$cid,
                                                      $coursedesc,$now,'enroller',$sender);
               my ($uname,$udom) = split(/:/,$user);
               my %userrequest = (
                   $cdom.'_'.$cnum => {
                       timestamp   => $now,
                       adjudicator => $env{'user.name'}.':'.$env{'user.domain'},
                       status      => 'rejected',
                   }
               );
               my $userresult =
                   &Apache::lonnet::put($namespace,\%userrequest,$udom,$uname);
               if ($userresult ne 'ok') {
                   push(@warn_rejects,$user);
               }
           }
       }
       if (@changes) {
           my $delresult = &Apache::lonnet::del($namespace,\@changes,$cdom,$cnum);
           if ($delresult eq 'ok') {
               my $namelink =
                   &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'}).' ('.$env{'user.name'}.':'.$env{'user.domain'}.')';
               my $chgmsg = "'Action was taken on the following enrollment requests by [_1].',$namelink";
               my ($approvedlist,$rejectedlist);
               if (@enrolled) {
                   $approvedlist = join("\n",@enrolled);
                   $r->print('<p>'.&mt('The following were enrolled in the course:').'<ul>');
                   foreach my $user (@enrolled) {
                       my ($uname,$udom) = split(/:/,$user);
                       my $userlink =
                           &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$udom),$uname,$udom);
                       $r->print('<li>'.$userlink.'</li>');
                   }
                   $r->print('</ul></p>');
               }
               if (@rejections) {
                   $rejectedlist = join("\n",@rejections);
                   $r->print('<p>'.&mt('The following enrollment requests were rejected:').'<ul>');
                   foreach my $user (@rejections) {
                       $r->print('<li>'.$user.'</li>');
                   }
                   $r->print('</ul></p>');
               }
               &Apache::selfenroll::send_notification($notifylist,$chgmsg,$cid,
                                                      $coursedesc,$now,'managers',
                                                      $sender,$approvedlist,$rejectedlist);
           }
       }
       if (@existing) {
           $r->print('<p>'.&mt('The following enrollment requests were deleted because the user is already enrolled in the course:').'<ul>');
           foreach my $user (@existing) {
               $r->print('<li>'.$user.'</li>');
           }
           $r->print('</ul></p>');
       }
       if (@missingreq) {
           $r->print('<p>'.&mt('The following enrollment requests were ignored because the request is no longer in the enrollment queue:').'<ul>');
           foreach my $user (@missingreq) {
               $r->print('<li>'.$user.'</li>');
           }
           $r->print('</ul></p>');
       }
       if (@invalidusers) {
           $r->print('<p>'.&mt('The following enrollment requests were deleted because the requestor does not have a LON-CAPA account:').'<ul>');
           foreach my $user (@invalidusers) {
               $r->print('<li>'.$user.'</li>');
           }
           $r->print('</ul></p>');
       }
       if (@limitexceeded) {
           $r->print('<p>'.&mt('The following enrollment requests were skipped because the enrollment limit has been reached for the course:').'<ul>');
           foreach my $user (@limitexceeded) {
               $r->print('<li>'.$user.'</li>');
           }
           $r->print('</ul></p>');
       }
       if (@enrollerrors) {
           $r->print('<p>'.&mt('The following enrollment requests could not be processed because an error occurred:').'<ul>');
           foreach my $user (@enrollerrors) {
               $r->print('<li>'.$user.'</li>');
           }
           $r->print('</ul></p>');
       }
       if (@warn_approves) {
           $r->print('<p>'.&mt("For the following users, an error occurred when updating the user's own self-enroll requests record:").'<ul>');
           foreach my $user (@warn_approves) {
               $r->print('<li>'.$user.'</li>');
           }
           $r->print('</ul></p>');
       }
       if (@warn_rejects) {
           $r->print('<p>'.&mt("For the following users, an error occurred when updating the user's own self-enroll requests record:").'<ul>');
           foreach my $user (@warn_rejects) {
               $r->print('<li>'.$user.'</li>');
           }
           $r->print('</ul></p>');
       }
       return;
   }
   
   sub get_student_counts {
       my ($cdom,$cnum) = @_;
       my (%idx,%stucounts);
       my $classlist = &Apache::loncoursedata::get_classlist($cdom,$cnum);
       $idx{'type'} = &Apache::loncoursedata::CL_TYPE();
       $idx{'status'} = &Apache::loncoursedata::CL_STATUS();
       while (my ($student,$data) = each(%$classlist)) {
           if (($data->[$idx{'status'}] eq 'Active') ||
               ($data->[$idx{'status'}] eq 'Future')) {
               if ($data->[$idx{'type'}] eq 'selfenroll') {
                   $stucounts{'selfenroll'} ++;
               }
               $stucounts{'allstudents'} ++;
           }
       }
       return (\%stucounts,\%idx,$classlist);
   }
   
 sub visible_in_cat {  sub visible_in_cat {
     my ($cdom,$cnum) = @_;      my ($cdom,$cnum) = @_;
     my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$cdom);      my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$cdom);
Line 5049  sub update_selfenroll_config { Line 5430  sub update_selfenroll_config {
                         $changes{'internal.selfenroll_types'} = $selfenroll_types;                          $changes{'internal.selfenroll_types'} = $selfenroll_types;
                     }                      }
                 }                  }
               } elsif ($item eq 'limit') {
                   my $newlimit = $env{'form.selfenroll_limit'};
                   my $newcap = $env{'form.selfenroll_cap'};
                   $newcap =~s/\s+//g;
                   my $currlimit =  $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_limit'};
                   $currlimit = 'none' if ($currlimit eq '');
                   my $currcap = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_cap'};
                   if ($newlimit ne $currlimit) {
                       if ($newlimit ne 'none') {
                           if ($newcap =~ /^\d+$/) {
                               if ($newcap ne $currcap) {
                                   $changes{'internal.selfenroll_cap'} = $newcap;
                               }
                               $changes{'internal.selfenroll_limit'} = $newlimit;
                           } else {
                               $warning{$item} = &mt('Maximum enrollment setting unchanged.').'<br />'.&mt('The value provided was invalid - it must be a positive integer if enrollment is being limited.');
                           }
                       } elsif ($currcap ne '') {
                           $changes{'internal.selfenroll_cap'} = '';
                           $changes{'internal.selfenroll_limit'} = $newlimit;
                       }
                   } elsif ($currlimit ne 'none') {
                       if ($newcap =~ /^\d+$/) {
                           if ($newcap ne $currcap) {
                               $changes{'internal.selfenroll_cap'} = $newcap;
                           }
                       } else {
                           $warning{$item} = &mt('Maximum enrollment setting unchanged.').'<br />'.&mt('The value provided was invalid - it must be a positive integer if enrollment is being limited.');
                       }
                   }
               } elsif ($item eq 'approval') {
                   my (@currnotified,@newnotified);
                   my $currapproval = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_approval'};
                   my $currnotifylist = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_notifylist'};
                   if ($currnotifylist ne '') {
                       @currnotified = split(/,/,$currnotifylist);
                       @currnotified = sort(@currnotified);
                   }
                   my $newapproval = $env{'form.selfenroll_approval'};
                   @newnotified = &Apache::loncommon::get_env_multiple('form.selfenroll_notify');
                   @newnotified = sort(@newnotified);
                   if ($newapproval ne $currapproval) {
                       $changes{'internal.selfenroll_approval'} = $newapproval;
                       if (!$newapproval) {
                           if ($currnotifylist ne '') {
                               $changes{'internal.selfenroll_notifylist'} = '';
                           }
                       } else {
                           my @differences =
                               &compare_arrays(\@currnotified,\@newnotified);
                           if (@differences > 0) {
                               if (@newnotified > 0) {
                                   $changes{'internal.selfenroll_notifylist'} = join(',',@newnotified);
                               } else {
                                   $changes{'internal.selfenroll_notifylist'} = join(',',@newnotified);
                               }
                           }
                       }
                   } else {
                       my @differences = &compare_arrays(\@currnotified,\@newnotified);
                       if (@differences > 0) {
                           if (@newnotified > 0) {
                               $changes{'internal.selfenroll_notifylist'} = join(',',@newnotified);
                           } else {
                               $changes{'internal.selfenroll_notifylist'} = '';
                           }
                       }
                   }
             } else {              } else {
                 my $curr_val =                   my $curr_val = 
                     $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_'.$item};                      $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_'.$item};
Line 5121  sub update_selfenroll_config { Line 5570  sub update_selfenroll_config {
                                           $title,$type,$newdate).'</li>');                                            $title,$type,$newdate).'</li>');
                             }                              }
                         }                          }
                       } elsif ($item eq 'limit') {
                           if ((exists($changes{'internal.selfenroll_limit'})) ||
                               (exists($changes{'internal.selfenroll_cap'}))) {
                               my ($newval,$newcap);
                               if ($changes{'internal.selfenroll_cap'} ne '') {
                                   $newcap = $changes{'internal.selfenroll_cap'}
                               } else {
                                   $newcap = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_cap'};
                               }
                               if ($changes{'internal.selfenroll_limit'} eq 'none') {
                                   $newval = &mt('No limit');
                               } elsif ($changes{'internal.selfenroll_limit'} eq
                                        'allstudents') {
                                   $newval = &mt('New self-enrollment no longer allowed when total (all students) reaches [_1].',$newcap);
                               } elsif ($changes{'internal.selfenroll_limit'} eq 'selfenrolled') {
                                   $newval = &mt('New self-enrollment no longer allowed when total number of self-enrolled students reaches [_1].',$newcap);
                               } else {
                                   my $currlimit =  $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_limit'};
                                   if ($currlimit eq 'allstudents') {
                                       $newval = &mt('New self-enrollment no longer allowed when total (all students) reaches [_1].',$newcap);
                                   } elsif ($changes{'internal.selfenroll_limit'} eq 'selfenrolled') {
                                       $newval =  &mt('New self-enrollment no longer allowed when total umber of self-enrolled students reaches [_1].',$newcap);
                                   }
                               }
                               $r->print('<li>'.&mt('"[_1]" set to "[_2]".',$title,$newval).'</li>'."\n");
                           }
                       } elsif ($item eq 'approval') {
                           if ((exists($changes{'internal.selfenroll_approval'})) ||
                               (exists($changes{'internal.selfenroll_notifylist'}))) {
                               my ($newval,$newnotify);
                               if (exists($changes{'internal.selfenroll_notifylist'})) {
                                   $newnotify = $changes{'internal.selfenroll_notifylist'};
                               } else {
                                   $newnotify = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_notifylist'};
                               }
                               if ($changes{'internal.selfenroll_approval'}) {
                                   $newval = &mt('Yes');
                               } elsif ($changes{'internal.selfenroll_approval'} eq '0') {
                                   $newval = &mt('No');
                               } else {
                                   my $currapproval =
                                       $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_approval'};
                                   if ($currapproval) {
                                       $newval = &mt('Yes');
                                   } else {
                                       $newval = &mt('No');
                                   }
                               }
                               $r->print('<li>'.&mt('"[_1]" set to "[_2]".',$title,$newval));
                               if ($newnotify) {
                                   $r->print('<br />'.&mt('The following will be notified when an enrollment request needs approval, or has been approved: [_1].',$newnotify));
                               } else {
                                   $r->print('<br />'.&mt('No notifications sent when an enrollment request needs approval, or has been approved.'));
                               }
                               $r->print('</li>'."\n");
                           }
                     } else {                      } else {
                         if (exists($changes{'internal.selfenroll_'.$item})) {                          if (exists($changes{'internal.selfenroll_'.$item})) {
                             my $newval = $changes{'internal.selfenroll_'.$item};                              my $newval = $changes{'internal.selfenroll_'.$item};
Line 5174  sub update_selfenroll_config { Line 5679  sub update_selfenroll_config {
     return;      return;
 }  }
   
   sub compare_arrays {
       my ($arrayref1,$arrayref2) = @_;
       my (@difference,%count);
       @difference = ();
       %count = ();
       if ((ref($arrayref1) eq 'ARRAY') && (ref($arrayref2) eq 'ARRAY')) {
           foreach my $element (@{$arrayref1}, @{$arrayref2}) { $count{$element}++; }
           foreach my $element (keys(%count)) {
               if ($count{$element} == 1) {
                   push(@difference,$element);
               }
           }
       }
       return @difference;
   }
   
 sub get_selfenroll_titles {  sub get_selfenroll_titles {
     my @row = ('types','registered','enroll_dates','access_dates','section');      my @row = ('types','registered','enroll_dates','access_dates','section',
                  'approval','limit');
     my %lt = &Apache::lonlocal::texthash (      my %lt = &Apache::lonlocal::texthash (
                 types        => 'Users allowed to self-enroll in this course',                  types        => 'Users allowed to self-enroll in this course',
                 registered   => 'Restrict self-enrollment to students officially registered for the course',                  registered   => 'Restrict self-enrollment to students officially registered for the course',
                 enroll_dates => 'Dates self-enrollment available',                  enroll_dates => 'Dates self-enrollment available',
                 access_dates => 'Course access dates assigned to self-enrolling users',                  access_dates => 'Course access dates assigned to self-enrolling users',
                 section      => 'Section assigned to self-enrolling users',                  section      => 'Section assigned to self-enrolling users',
                   approval     => 'Self-enrollment requests need approval?',
                   limit        => 'Enrollment limit',
              );               );
     return (\@row,\%lt);      return (\@row,\%lt);
 }  }

Removed from v.1.268  
changed lines
  Added in v.1.268.4.2


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>