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

version 1.268.4.2, 2009/09/14 21:50:04 version 1.269, 2008/12/15 00:12:38
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 214  END_SCRIPT Line 213  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 781  $lt{'hs'}: $home_server_pick Line 780  $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 {
                                 if ($authtype eq 'int') {                                  $varauth =  
                                     $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 1562  sub personal_data_display { Line 1554  sub personal_data_display {
                 }                  }
             } else {              } else {
                 if ($context eq 'selfcreate') {                  if ($context eq 'selfcreate') {
                     if (($item eq 'permanentemail') && ($newuser eq 'email')) {                      if ($canmodify{$item}) {
                         $row .= $ccuname;                          $row .= '<input type="text" name="c'.$item.'" size="'.$textboxsize{$item}.'" value="" />';
                           $editable ++;
                     } else {                      } else {
                         if ($canmodify{$item}) {                          $hiderow = 1;
                             $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 1692  sub update_user_data { Line 1680  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 1703  sub update_user_data { Line 1691  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 2083  sub update_user_data { Line 2071  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 2136  sub update_user_data { Line 2125  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'})) {
                         my %newenvhash;                          &Apache::lonnet::appenv(\%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 3313  sub handler { Line 3300  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 3401  sub print_main_menu { Line 3365  sub print_main_menu {
                                    listusers => 'Display Co-authors and Manage Multiple Users',                                     listusers => 'Display Co-authors and Manage Multiple Users',
                                  },                                   },
                        course => {                         course => {
                                    upload => 'Upload a File of Course Users',                                     upload => 'File of Course Users',
                                    singleuser => 'Add/Modify a Single Course User',                                     singleuser => 'Single Course User',
                                    listusers => 'Display Class Lists and Manage Multiple Users',                                     listusers => 'Course User Lists',
                                  },                                   },
                      );                       );
     my @menu =    my @menu = ( {categorytitle => 'Add Users',
         (       items =>
           { text => $links{$context}{'upload'},       [{
             help => 'Course_Create_Class_List',           linktext => $links{$context}{'upload'},
             action => 'upload',           icon => 'sctr.png',
             permission => $permission->{'cusr'},           #help => 'Course_Create_Class_List',
             },           url => '/adm/createuser?action=upload',
           { text => $links{$context}{'singleuser'},           permission => $permission->{'cusr'},
             help => 'Course_Change_Privileges',           linktitle => 'Upload a CSV or a text file containing users.',
             action => 'singleuser',       },
             permission => $permission->{'cusr'},       {
             },           linktext => $links{$context}{'singleuser'},
           { text => $links{$context}{'listusers'},           icon => 'edit-redo.png',
             help => 'Course_View_Class_List',           #help => 'Course_Change_Privileges',
             action => 'listusers',           url => '/adm/createuser?action=singleuser',
             permission => ($permission->{'view'} || $permission->{'cusr'}),           permission => $permission->{'cusr'},
           },           linktitle => 'Add a user with a certain role to this course.',
         );       }]},
     if ($context eq 'domain' || $context eq 'course') {       {categorytitle => 'Administration',
         my $customlink =  { text => 'Edit Custom Roles',       items =>
                             help => 'Course_Editing_Custom_Roles',       [{
                             action => 'custom',           linktext => $links{$context}{'listusers'},
                             permission => $permission->{'custom'},                   icon => 'edit-find.png',
                           };                   #help => 'Course_View_Class_List',
         push(@menu,$customlink);                   url => '/adm/createuser?action=listusers',
     }           permission => ($permission->{'view'} || $permission->{'cusr'}),
     if ($context eq 'course') {           linktitle => 'Show and manage users of this course.',
         my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();       }]},
         my @courselinks =       {categorytitle => 'Configuration',
             (       items =>
               { text => 'Enroll a Single Student',       [
                  help => 'Course_Add_Student',       ]},
                  action => 'singlestudent',     );
                  permission => $permission->{'cusr'},  
                  },      if ($context eq 'domain'){
               { text => 'Drop Students',  
                 help => 'Course_Drop_Student',   push(@{ $menu[1]->{items} },
                 action => 'drop',   { linktext => 'Custom Roles',
                 permission => $permission->{'cusr'},   icon => 'emblem-photos.png',
               });   #help => 'Course_Editing_Custom_Roles',
         if (!exists($permission->{'cusr_section'})) {   url => '/adm/createuser?action=custom',
             push(@courselinks,   permission => $permission->{'custom'},
                { text => 'Automated Enrollment Manager',   linktitle => 'Configure a custom role.',
                  help => 'Course_Automated_Enrollment',   });
                  permission => (&Apache::lonnet::auto_run($cnum,$cdom)  
                                 && $permission->{'cusr'}),      }elsif ($context eq 'course'){
                  url  => '/adm/populate',      my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();
                  },  
                { text => 'Configure User Self-enrollment',          push(@{ $menu[0]->{items} },
                  help => 'Course_Self_Enrollment',   { linktext => 'Single Student',
                  action => 'selfenroll',              #help => 'Course_Add_Student',
                  permission => $permission->{'cusr'},   icon => 'list-add.png',
                });              url => '/adm/createuser?action=singlestudent',
             if ($env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_approval'}) {   permission => $permission->{'cusr'},
                push(@courselinks,              linktitle => 'Add a user with the role student to this course.',
                     {text => 'Enrollment Requests',          });
                      action => 'selfenrollqueue',  
                      permission => $permission->{'cusr'},          push(@{ $menu[1]->{items} },  
                     });   { linktext => 'Drop Students',
             }   icon => 'edit-undo.png',
         }              #help => 'Course_Drop_Student',
         push(@courselinks,              url => '/adm/createuser?action=drop',
                { text => 'Manage Course Groups',   permission => $permission->{'cusr'},
                  help => 'Course_Manage_Group',              linktitle =>'Remove a student from this course.',
                  permission => $permission->{'grp_manage'},          },
                  url => '/adm/coursegroups?refpage=cusr',   { linktext => 'Custom Roles',
                },   icon => 'emblem-photos.png',
                { text => 'View Change Logs',              #help => 'Course_Editing_Custom_Roles',
                  help => 'Course_User_Logs',              url => '/adm/createuser?action=custom',
                  action => 'changelogs',   permission => $permission->{'custom'},
                  permission => $permission->{'cusr'},   linktitle => 'Configure a custom role.',
                },);          });
   
           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 3705  ENDSCRIPT Line 3688  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 class="LC_info">'.$visactions->{'vis'}.'</p>';              $output .= '<p>'.$visactions->{'vis'}.'</p>';
         } else {          } else {
             $output .= '<p class="LC_warning">'.$visactions->{'miss'}.'</p>'              $output .= $visactions->{'miss'}.'<br />'.$visactions->{'yous'}.
                        .$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 3861  ENDSCRIPT Line 3843  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 3962  ENDSCRIPT Line 3855  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 5430  sub update_selfenroll_config { Line 5050  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 5570  sub update_selfenroll_config { Line 5122  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 5679  sub update_selfenroll_config { Line 5175  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.4.2  
changed lines
  Added in v.1.269


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