[LON-CAPA-cvs] cvs: loncom /interface createaccount.pm domainprefs.pm loncoursequeueadmin.pm loncreateuser.pm

raeburn raeburn at source.lon-capa.org
Mon Mar 3 12:11:42 EST 2014


raeburn		Mon Mar  3 17:11:42 2014 EDT

  Modified files:              
    /loncom/interface	createaccount.pm loncoursequeueadmin.pm 
                     	loncreateuser.pm domainprefs.pm 
  Log:
  - Bug 6646
    - Status types (e.g., faculty, staff, student etc.) can apply to users
      creating their own accounts with an e-mail address as username.
    - Different user information can be required depending on self-reported
       status type.
    - User information to be provided when requesting an account can be 
      designated as 'required' or 'optional', with client-side javascript
      prompt for missing required fields. 
  
  
-------------- next part --------------
Index: loncom/interface/createaccount.pm
diff -u loncom/interface/createaccount.pm:1.60 loncom/interface/createaccount.pm:1.61
--- loncom/interface/createaccount.pm:1.60	Thu Feb 20 01:00:33 2014
+++ loncom/interface/createaccount.pm	Mon Mar  3 17:11:41 2014
@@ -4,7 +4,7 @@
 # kerberos, or SSO) or an e-mail address. Requests to use an e-mail address as
 # username may be processed automatically, or may be queued for approval.
 #
-# $Id: createaccount.pm,v 1.60 2014/02/20 01:00:33 raeburn Exp $
+# $Id: createaccount.pm,v 1.61 2014/03/03 17:11:41 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -59,7 +59,7 @@
     my $sso_domain = $r->subprocess_env->get('SSOUserDomain');
 
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
-                                            ['token','courseid','domain']);
+                                            ['token','courseid','domain','type']);
     &Apache::lonacc::get_posted_cgi($r);
     &Apache::lonlocal::get_language_handle($r);
 
@@ -240,10 +240,11 @@
         }
     } elsif ($env{'form.create_with_email'}) {
         &print_header($r,$start_page,$courseid);
+        my $usertype = &get_usertype($domain);
         $output = &process_email_request($env{'form.uname'},$domain,$domdesc,
                                          $contact_name,$contact_email,$cancreate,
                                          $lonhost,$domconfig{'usercreation'},
-                                         $emailusername,$courseid);
+                                         $emailusername,$courseid,$usertype);
     } elsif (!$token) {
         &print_header($r,$start_page,$courseid);
         my $now=time;
@@ -261,8 +262,10 @@
         if (grep(/^email(|approval)$/,@{$cancreate})) {
             $r->print(&javascript_validmail());
         }
+        my $usertype = &get_usertype($domain);
         $output = &print_username_form($r,$domain,$domdesc,$cancreate,$now,$lonhost,
-                                       $include,$courseid,$gotlondes,$emailusername);
+                                       $include,$courseid,$gotlondes,$emailusername,
+                                       $usertype);
     }
     $r->print($output);
     &print_footer($r);
@@ -298,6 +301,21 @@
     $r->print(&Apache::loncommon::end_page());
 }
 
+sub get_usertype {
+    my ($domain) = @_;
+    my $usertype = 'default';
+    my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($domain);
+    if (ref($types) eq 'ARRAY') {
+        push(@{$types},'default');
+        my $posstype = $env{'form.type'};
+        $posstype =~ s/^\s+|\s$//g;
+        if (grep(/^\Q$posstype\E$/,@{$types})) {
+            $usertype = $posstype;
+        }
+    }
+    return $usertype;
+}
+
 sub selfenroll_crumbs {
     my ($r,$courseid,$desc) = @_;
     &Apache::lonhtmlcommon::add_breadcrumb
@@ -322,20 +340,51 @@
 }
 
 sub javascript_setforms {
-    my ($now,$emailusername,$captcha) =  @_;
-    my $setuserinfo; 
+    my ($now,$emailusername,$captcha,$usertype) =  @_;
+    my ($setuserinfo, at required,$requiredchk);
     if (ref($emailusername) eq 'HASH') {
-        foreach my $key (sort(keys(%{$emailusername}))) {
-            $setuserinfo .= '      server.elements.'.$key.'.value=client.elements.'.$key.'.value;'."\n";
+        if (ref($emailusername->{$usertype}) eq 'HASH') {  
+            foreach my $key (sort(keys(%{$emailusername->{$usertype}}))) {
+                if ($emailusername->{$usertype}{$key} eq 'required') {
+                    push(@required,$key); 
+                }
+                $setuserinfo .= '                    server.elements.'.$key.'.value=client.elements.'.$key.'.value;'."\n";
+            }
+            $setuserinfo .= '                    server.elements.type.value=client.elements.type.value;'."\n"; 
         }
         if ($captcha eq 'original') {
-            $setuserinfo .= '      server.elements.code.value=client.elements.code.value;'."\n".
-                            '      server.elements.crypt.value=client.elements.crypt.value;'."\n";
+            $setuserinfo .= '                    server.elements.code.value=client.elements.code.value;'."\n".
+                            '                    server.elements.crypt.value=client.elements.crypt.value;'."\n";
         } elsif ($captcha eq 'recaptcha') {
-            $setuserinfo .= '      server.elements.recaptcha_challenge_field.value=client.elements.recaptcha_challenge_field.value;'."\n".
-                            '      server.elements.recaptcha_response_field.value=client.elements.recaptcha_response_field.value;'."\n";
+            $setuserinfo .= 
+                '                    server.elements.recaptcha_challenge_field.value=client.elements.recaptcha_challenge_field.value;'."\n".
+                '                    server.elements.recaptcha_response_field.value=client.elements.recaptcha_response_field.value;'."\n";
         }
     }
+    if (@required) {
+        my $missprompt = &mt('One or more required fields are currently blank.');
+        my $reqstr = join("','", at required);
+        $requiredchk = <<"ENDCHK";
+                var requiredfields = new Array('$reqstr');
+                missing = 0; 
+                for (var i=0; i<requiredfields.length; i++) {
+                    try {
+                        eval("client.elements."+requiredfields[i]+".value");
+                    }
+                    catch(err) {
+                        continue;
+                    }
+                    if (eval("client.elements."+requiredfields[i]+".value") == '') {
+                        missing ++;
+                    }
+                }
+                if (missing > 0) {
+                    alert("$missprompt");
+                    return false;
+                }
+
+ENDCHK
+    }
     my $js = <<ENDSCRIPT;
 <script type="text/javascript">
 // <![CDATA[
@@ -346,6 +395,7 @@
             server = document.forms[one];
             if (document.forms[two]) {
                 client = document.forms[two];
+$requiredchk
                 server.elements.uname.value = client.elements.uname.value;
                 server.elements.udom.value = client.elements.udom.value;
 
@@ -359,7 +409,7 @@
                 client.elements.uname.value='';
                 client.elements.upass$now.value='';
                 if (context == 'email') {
-                    $setuserinfo
+$setuserinfo
                     client.elements.upasscheck$now.value='';
                 }
                 server.submit();
@@ -433,7 +483,8 @@
 }
 
 sub print_username_form {
-    my ($r,$domain,$domdesc,$cancreate,$now,$lonhost,$include,$courseid,$gotlondes,$emailusername) = @_;
+    my ($r,$domain,$domdesc,$cancreate,$now,$lonhost,$include,$courseid,$gotlondes,$emailusername,
+        $usertype) = @_;
     my %lt = &Apache::lonlocal::texthash (
                                          unam => 'username',
                                          udom => 'domain',
@@ -481,10 +532,9 @@
                 } else {
                     my $prompt = $lt{'plse'};
                     if (ref($emailusername) eq 'HASH') {
-                        foreach my $key (keys(%{$emailusername})) {
-                            if ($emailusername->{$key}) {
+                        if (ref($emailusername->{$usertype}) eq 'HASH') {
+                            if (keys(%{$emailusername->{$usertype}}) > 0) {
                                 $prompt = $lt{'info'};
-                                last;
                             }
                         }
                     }
@@ -492,7 +542,8 @@
                                $lt{'yopw'}.'<br />';
                 }
                 $output .= &print_dataentry_form($r,$domain,$lonhost,$include,$now,$captchaform,
-                                                 $courseid,$gotlondes,$emailusername,$captcha);
+                                                 $courseid,$gotlondes,$emailusername,$captcha,
+                                                 $usertype);
             }
             $output .= '</div>';
         }
@@ -558,7 +609,7 @@
 
 sub process_email_request {
     my ($useremail,$domain,$domdesc,$contact_name,$contact_email,$cancreate,
-        $server,$settings,$emailusername,$courseid) = @_;
+        $server,$settings,$emailusername,$courseid,$usertype) = @_;
     my $output;
     if (ref($cancreate) eq 'ARRAY') {
         if (!grep(/^email(|approval)$/,@{$cancreate})) {
@@ -612,7 +663,7 @@
             }
         }
         $output = &send_token($domain,$useremail,$server,$domdesc,$contact_name,
-                              $contact_email,$courseid,$emailusername);
+                              $contact_email,$courseid,$emailusername,$usertype);
     }
     return $output;
 }
@@ -632,7 +683,8 @@
 }
 
 sub send_token {
-    my ($domain,$email,$server,$domdesc,$contact_name,$contact_email,$courseid,$emailusername) = @_;
+    my ($domain,$email,$server,$domdesc,$contact_name,$contact_email,$courseid,$emailusername,
+        $usertype) = @_;
     my $msg = '<h3>'.&mt('Account creation status').'</h3>'.
               &mt('Thank you for your request to create a new LON-CAPA account.').
               '<br /><br />';
@@ -660,9 +712,14 @@
                     'tmpinfo'    => $tmpinfo);
 
         if (ref($emailusername) eq 'HASH') {
-            foreach my $item (keys(%{$emailusername})) {
-                $info{$item} = $env{'form.'.$item};
-                $info{$item} =~ s/(`)//g;
+            if (ref($emailusername->{$usertype}) eq 'HASH') {
+                foreach my $item (keys(%{$emailusername->{$usertype}})) {
+                    $info{$item} = $env{'form.'.$item};
+                    $info{$item} =~ s/(`)//g;
+                }
+                unless ($usertype eq 'default') {
+                    $info{'inststatus'} = $usertype;
+                }
             }
         }
         my $token = &Apache::lonnet::tmpput(\%info,$server,'createaccount');
@@ -789,7 +846,8 @@
 # Stores token to store DES-key and stage during creation session
 #
 sub print_dataentry_form {
-    my ($r,$domain,$lonhost,$include,$now,$captchaform,$courseid,$gotlondes,$emailusername,$captcha) = @_;
+    my ($r,$domain,$lonhost,$include,$now,$captchaform,$courseid,$gotlondes,$emailusername,$captcha,
+        $usertype) = @_;
     my ($error,$output);
     unless ($gotlondes) {
         if (open(my $jsh,"<$include/londes.js")) {
@@ -797,7 +855,7 @@
                 $r->print($line);
             }
             close($jsh);
-            $output = &javascript_setforms($now,$emailusername,$captcha)."\n";
+            $output = &javascript_setforms($now,$emailusername,$captcha,$usertype)."\n";
             $gotlondes = 1;
         }
     }
@@ -813,8 +871,11 @@
             $output .= '<input type="hidden" name="courseid" value="'.$courseid.'"/>'."\n";
         }
         if (ref($emailusername) eq 'HASH') {
-            foreach my $field (sort(keys(%{$emailusername}))) {
-                $output .= '<input type="hidden" name="'.$field.'" value="" />'."\n";
+            if (ref($emailusername->{$usertype}) eq 'HASH') {
+                foreach my $field (sort(keys(%{$emailusername->{$usertype}}))) {
+                    $output .= '<input type="hidden" name="'.$field.'" value="" />'."\n";
+                }
+                $output .= '<input type="hidden" name="type" value="" />'."\n";
             }
         }
         if ($captcha eq 'original') {
@@ -843,11 +904,12 @@
         my $endclientform = '<input type="hidden" name="udom" value="'.$domain.'" />'."\n".
                             '<input type="hidden" name="lextkey" value="'.$lextkey.'" />'."\n".
                             '<input type="hidden" name="uextkey" value="'.$uextkey.'" />'."\n".
-                            '</form>';
+                            '</form>'."\n".
+                            '<p class="LC_info">'.&mt('Fields marked [_1]*[_2] are required.','<b>','</b>').'</p>';
         my ($datatable,$rowcount) =
             &Apache::loncreateuser::personal_data_display('',$domain,'email','selfcreate',
                                                           '','',$now,$captchaform,
-                                                          $emailusername);
+                                                          $emailusername,$usertype);
         if ($rowcount) {
             $output .= '<div class="LC_left_float">'.$beginclientform.$datatable.$endclientform;
         } else {
@@ -919,7 +981,7 @@
     my $output;
     if (ref($dataref) eq 'HASH') {
         my ($username,$encpass,$serverid,$courseid,$id,$firstname,$middlename,$lastname,
-            $generation);
+            $generation,$inststatus);
         $username   = $dataref->{'username'};
         $encpass    = $dataref->{'upass'};
         $serverid   = $dataref->{'serverid'};
@@ -929,6 +991,7 @@
         $middlename = $dataref->{'middlename'};
         $lastname   = $dataref->{'lastname'};
         $generation = $dataref->{'generation'};
+        $inststatus = $dataref->{'usertype'};
        
         my $currhome = &Apache::lonnet::homeserver($username,$domain);
         unless ($currhome eq 'no_host') {
@@ -967,6 +1030,9 @@
 # Now that the user account exists, retrieve the homeserver, and include it in the output.
 
             my $uhome = &Apache::lonnet::homeserver($username,$domain);
+            unless (($inststatus eq 'default') || ($inststatus eq '')) {
+                &Apache::lonnet::put('environment',{inststatus => $inststatus},$domain,$username);
+            }
             $output .= '<br />'.&mt('Home server: [_1]',$uhome).' '.
                        &Apache::lonnet::hostname($uhome).'<br /><br />';
             return ('ok',$output,$uhome);
Index: loncom/interface/loncoursequeueadmin.pm
diff -u loncom/interface/loncoursequeueadmin.pm:1.43 loncom/interface/loncoursequeueadmin.pm:1.44
--- loncom/interface/loncoursequeueadmin.pm:1.43	Wed Feb 12 20:47:40 2014
+++ loncom/interface/loncoursequeueadmin.pm	Mon Mar  3 17:11:41 2014
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Utilities to administer domain course requests and course self-enroll requests
 #
-# $Id: loncoursequeueadmin.pm,v 1.43 2014/02/12 20:47:40 raeburn Exp $
+# $Id: loncoursequeueadmin.pm,v 1.44 2014/03/03 17:11:41 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -876,7 +876,7 @@
             
             if (ref($curr{$uname}) eq 'HASH') {
                 my ($username,$logtoken,$serverid,$encpass,$courseid,$id,$firstname,
-                    $middlename,$lastname,$generation);
+                    $middlename,$lastname,$generation,$inststatus);
                 $curr{$uname}{'timestamp'} = $now;
                 $curr{$uname}{'adjudicator'} = $env{'user.name'}.':'.$env{'user.domain'};
                 $courseid   = $curr{$uname}{'courseid'};
@@ -885,6 +885,7 @@
                 $middlename = $curr{$uname}{'middlename'};
                 $lastname   = $curr{$uname}{'lastname'};
                 $generation = $curr{$uname}{'generation'};
+                $inststatus = $curr{$uname}{'usertype'};
 
                 my ($key,$caller)=split(/&/,$curr{$uname}{'tmpinfo'});
                 if ($caller eq 'createaccount') {
@@ -901,6 +902,9 @@
                         if ($uhome eq 'no_host') {
                             push(@warn_approves,$uname);
                         } else {
+                            unless (($inststatus eq 'default') || ($inststatus eq '')) {
+                                &Apache::lonnet::put('environment',{inststatus => $inststatus},$cdom,$uname);
+                            }
                             &send_selfserve_notification($uname.':'.$cdom,
                                                          $approvedmsg,undef,undef,$now,
                                                          $beneficiary,$sender);
Index: loncom/interface/loncreateuser.pm
diff -u loncom/interface/loncreateuser.pm:1.395 loncom/interface/loncreateuser.pm:1.396
--- loncom/interface/loncreateuser.pm:1.395	Fri Feb 28 19:20:06 2014
+++ loncom/interface/loncreateuser.pm	Mon Mar  3 17:11:41 2014
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Create a user
 #
-# $Id: loncreateuser.pm,v 1.395 2014/02/28 19:20:06 bisitz Exp $
+# $Id: loncreateuser.pm,v 1.396 2014/03/03 17:11:41 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -2164,7 +2164,7 @@
 
 sub personal_data_display {
     my ($ccuname,$ccdomain,$newuser,$context,$inst_results,$rolesarray,
-        $now,$captchaform,$emailusername) = @_;
+        $now,$captchaform,$emailusername,$usertype) = @_;
     my ($output,%userenv,%canmodify,%canmodify_status);
     my @userinfo = ('firstname','middlename','lastname','generation',
                     'permanentemail','id');
@@ -2206,19 +2206,24 @@
                                                        \@userinfo,$rolesarray);
     } elsif ($context eq 'selfcreate') {
         if ($newuser eq 'email') {
-            if (ref($emailusername) eq 'HASH') { 
-                my ($infofields,$infotitles) = &Apache::loncommon::emailusername_info();
-                @userinfo = ();          
-                if ((ref($infofields) eq 'ARRAY') && (ref($infotitles) eq 'HASH')) {
-                    foreach my $field (@{$infofields}) { 
-                        if ($emailusername->{$field}) {
-                            push(@userinfo,$field);
-                            $canmodify{$field} = 1;
-                            unless ($textboxsize{$field}) {
-                                $textboxsize{$field} = 25;
-                            }
-                            unless ($lt{$field}) {
-                                $lt{$field} = $infotitles->{$field};
+            if (ref($emailusername) eq 'HASH') {
+                if (ref($emailusername->{$usertype}) eq 'HASH') {
+                    my ($infofields,$infotitles) = &Apache::loncommon::emailusername_info();
+                    @userinfo = ();          
+                    if ((ref($infofields) eq 'ARRAY') && (ref($infotitles) eq 'HASH')) {
+                        foreach my $field (@{$infofields}) { 
+                            if ($emailusername->{$usertype}->{$field}) {
+                                push(@userinfo,$field);
+                                $canmodify{$field} = 1;
+                                unless ($textboxsize{$field}) {
+                                    $textboxsize{$field} = 25;
+                                }
+                                unless ($lt{$field}) {
+                                    $lt{$field} = $infotitles->{$field};
+                                }
+                                if ($emailusername->{$usertype}->{$field} eq 'required') {
+                                    $lt{$field} .= '<b>*</b>';
+                                }
                             }
                         }
                     }
@@ -2234,19 +2239,19 @@
     $output = '<h3>'.$lt{'pd'}.'</h3>'.
               &Apache::lonhtmlcommon::start_pick_box();
     if (($context eq 'selfcreate') && ($newuser eq 'email')) {
-        $output .= &Apache::lonhtmlcommon::row_title($lt{'email'},undef,
+        $output .= &Apache::lonhtmlcommon::row_title($lt{'email'}.'<b>*</b>',undef,
                                                      'LC_oddrow_value')."\n".
                    '<input type="text" name="uname" size="25" value="" autocomplete="off" />';
         $rowcount ++;
         $output .= &Apache::lonhtmlcommon::row_closure(1);
         my $upassone = '<input type="password" name="upass'.$now.'" size="10" autocomplete="off" />';
         my $upasstwo = '<input type="password" name="upasscheck'.$now.'" size="10" autocomplete="off" />';
-        $output .= &Apache::lonhtmlcommon::row_title(&mt('Password'),
+        $output .= &Apache::lonhtmlcommon::row_title(&mt('Password').'<b>*</b>',
                                                     'LC_pick_box_title',
                                                     'LC_oddrow_value')."\n".
                    $upassone."\n".
                    &Apache::lonhtmlcommon::row_closure(1)."\n".
-                   &Apache::lonhtmlcommon::row_title(&mt('Confirm password'),
+                   &Apache::lonhtmlcommon::row_title(&mt('Confirm password').'<b>*</b>',
                                                      'LC_pick_box_title',
                                                      'LC_oddrow_value')."\n".
                    $upasstwo.
@@ -2360,6 +2365,7 @@
         $output .= &Apache::lonhtmlcommon::row_title()."\n".
                    '<br /><input type="submit" name="createaccount" value="'.
                    $submit_text.'" />'.
+                   '<input type="hidden" name="type" value="'.$usertype.'" />'.
                    &Apache::lonhtmlcommon::row_closure(1);
     }
     $output .= &Apache::lonhtmlcommon::end_pick_box();
@@ -4816,26 +4822,47 @@
             if (ref($domconfig{'usercreation'}) eq 'HASH') {
                 if (ref($domconfig{'usercreation'}{'cancreate'}) eq 'HASH') {
                     if (ref($domconfig{'usercreation'}{'cancreate'}{'emailusername'}) eq 'HASH') {
-                        my $count = scalar(keys(%{$domconfig{'usercreation'}{'cancreate'}{'emailusername'}}));
                         my %info =
                             &Apache::lonnet::get('nohist_requestedusernames',[$uname],$dom,$domconfiguser);
                         if (ref($info{$uname}) eq 'HASH') {
-                            if ((ref($infofields) eq 'ARRAY') && (ref($infotitles) eq 'HASH')) {
-                                $r->print('<div>'.&Apache::lonhtmlcommon::start_pick_box());
-                                my $num;
-                                foreach my $field (@{$infofields}) {
-                                    next unless ($domconfig{'usercreation'}{'cancreate'}{'emailusername'}{$field});
-                                    next unless ($infotitles->{$field});
-                                    $r->print(&Apache::lonhtmlcommon::row_title($infotitles->{$field}).
-                                              $info{$uname}{$field});
-                                    $num ++;
-                                    if ($count == $num) {
-                                        $r->print(&Apache::lonhtmlcommon::row_closure(1));
-                                    } else {
-                                        $r->print(&Apache::lonhtmlcommon::row_closure());
+                            my $usertype = $info{$uname}{'inststatus'};
+                            unless ($usertype) {
+                                $usertype = 'default';
+                            }
+                            if (ref($domconfig{'usercreation'}{'cancreate'}{'emailusername'}{$usertype}) eq 'HASH') {
+                                if ((ref($infofields) eq 'ARRAY') && (ref($infotitles) eq 'HASH')) {
+                                    $r->print('<div>'.&Apache::lonhtmlcommon::start_pick_box());
+                                    my ($num,$count,$showstatus);
+                                    $count = scalar(keys(%{$domconfig{'usercreation'}{'cancreate'}{'emailusername'}{$usertype}}));
+                                    unless ($usertype eq 'default') {
+                                        my ($othertitle,$usertypes,$types) = 
+                                            &Apache::loncommon::sorted_inst_types($dom);
+                                        if (ref($usertypes) eq 'HASH') {
+                                            if ($usertypes->{$usertype}) {
+                                                $showstatus = $usertypes->{$usertype};
+                                                $count ++;
+                                            }
+                                        }
+                                    }
+                                    foreach my $field (@{$infofields}) {
+                                        next unless ($domconfig{'usercreation'}{'cancreate'}{'emailusername'}{$usertype}{$field});
+                                        next unless ($infotitles->{$field});
+                                        $r->print(&Apache::lonhtmlcommon::row_title($infotitles->{$field}).
+                                                  $info{$uname}{$field});
+                                        $num ++;
+                                        if ($count == $num) {
+                                            $r->print(&Apache::lonhtmlcommon::row_closure(1));
+                                        } else {
+                                            $r->print(&Apache::lonhtmlcommon::row_closure());
+                                        }
+                                    }
+                                    if ($showstatus) {
+                                        $r->print(&Apache::lonhtmlcommon::row_title(&mt('Status type (self-reported)')).
+                                                  $showstatus.
+                                                  &Apache::lonhtmlcommon::row_closure(1));
                                     }
+                                    $r->print(&Apache::lonhtmlcommon::end_pick_box().'</div>');
                                 }
-                                $r->print(&Apache::lonhtmlcommon::end_pick_box().'</div>');
                             }
                         }
                     }
Index: loncom/interface/domainprefs.pm
diff -u loncom/interface/domainprefs.pm:1.227 loncom/interface/domainprefs.pm:1.228
--- loncom/interface/domainprefs.pm:1.227	Fri Feb 28 19:20:05 2014
+++ loncom/interface/domainprefs.pm	Mon Mar  3 17:11:42 2014
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Handler to set domain-wide configuration settings
 #
-# $Id: domainprefs.pm,v 1.227 2014/02/28 19:20:05 bisitz Exp $
+# $Id: domainprefs.pm,v 1.228 2014/03/03 17:11:42 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -3796,7 +3796,6 @@
         }
     }
     my %radiohash;
-    my $rownum = 0;
     my $numinrow = 4;
     map { $radiohash{'cancreate_'.$_} = 1; } @selfcreate;
     if ($position eq 'top') {
@@ -3809,18 +3808,18 @@
                                'cancreate_login' => 'off',
                                'cancreate_sso'   => 'off',
                              );
-        my $itemcount = 1;
-        my $onclick;
+        my ($onclick,$itemcount);
         ($datatable,$itemcount) = &radiobutton_prefs(\%radiohash,\@toggles,\%defaultchecked,
                                                      \%choices,$itemcount,$onclick);
+        $$rowtotal += $itemcount;
+        
         my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
 
         if (ref($usertypes) eq 'HASH') {
             if (keys(%{$usertypes}) > 0) {
                 $datatable .= &insttypes_row($createsettings,$types,$usertypes,
                                              $dom,$numinrow,$othertitle,
-                                             'statustocreate',$rownum);
-                $rownum ++;
+                                             'statustocreate',$$rowtotal);
                 $$rowtotal ++;
             }
         }
@@ -3832,14 +3831,13 @@
             push(@{$types},'default');
             $usertypes->{'default'} = $othertitle;
             foreach my $status (@{$types}) {
-                $rownum ++;
                 $datatable .= &modifiable_userdata_row('selfcreate',$status,$domconf{'usermodification'},
-                                                       $numinrow,$rownum,$usertypes);
+                                                       $numinrow,$$rowtotal,$usertypes);
                 $$rowtotal ++;
             }
         }
     } else {
-        my $css_class = $rownum%2?' class="LC_odd_row"':'';
+        my $css_class = $$rowtotal%2?' class="LC_odd_row"':'';
         my %choices =
             &Apache::lonlocal::texthash(
                                           email         => 'Approved automatically',
@@ -3871,27 +3869,32 @@
                           $choices{$option}.'</label> ';
         }
         $$rowtotal ++;
-        $rownum ++;
         $datatable .= '</span></td></tr>'.
                       &print_requestmail($dom,'selfcreation',$createsettings,$rowtotal);
-        $rownum ++;
-        my ($infofields,$infotitles) = &Apache::loncommon::emailusername_info();
-        $numinrow = 2;
-        $datatable .= &modifiable_userdata_row('cancreate','emailusername',$settings,
-                                               $numinrow,$rownum,undef,$infofields,$infotitles);
         $$rowtotal ++;
-        $rownum ++;
+        my ($infofields,$infotitles) = &Apache::loncommon::emailusername_info();
+        $numinrow = 1;
+        my ($othertitle,$usertypes,$types) =  &Apache::loncommon::sorted_inst_types($dom);
+        $usertypes->{'default'} = $othertitle;
+        if (ref($types) eq 'ARRAY') {
+            push(@{$types},'default');
+            $usertypes->{'default'} = $othertitle;
+            foreach my $status (@{$types}) {
+                $datatable .= &modifiable_userdata_row('cancreate','emailusername_'.$status,$settings,
+                                                       $numinrow,$$rowtotal,$usertypes,$infofields,$infotitles);
+                $$rowtotal ++;
+            }
+        }
         my ($emailrules,$emailruleorder) =
             &Apache::lonnet::inst_userrules($dom,'email');
         if (ref($emailrules) eq 'HASH') {
             if (keys(%{$emailrules}) > 0) {
                 $datatable .= &user_formats_row('email',$settings,$emailrules,
-                                                $emailruleorder,$numinrow,$rownum);
-                $rownum ++;
+                                                $emailruleorder,$numinrow,$$rowtotal);
                 $$rowtotal ++;
             }
         }
-        $datatable .= &captcha_choice('cancreate',$createsettings,$rownum);
+        $datatable .= &captcha_choice('cancreate',$createsettings,$$rowtotal);
     }
     return $datatable;
 }
@@ -4857,11 +4860,20 @@
 }
 
 sub modifiable_userdata_row {
-    my ($context,$role,$settings,$numinrow,$rowcount,$usertypes,$fieldsref,$titlesref) = @_;
-    my $rolename;
+    my ($context,$item,$settings,$numinrow,$rowcount,$usertypes,$fieldsref,$titlesref) = @_;
+    my ($role,$rolename,$statustype);
+    $role = $item;
     if ($context eq 'cancreate') {
-        if ($role eq 'emailusername') {
-            $rolename = &mt('Data user provides');
+        if ($item =~ /^emailusername_(.+)$/) {
+            $statustype = $1;
+            $role = 'emailusername';
+            if (ref($usertypes) eq 'HASH') {
+                if ($usertypes->{$statustype}) {
+                    $rolename = &mt('Data provided by [_1]',$usertypes->{$statustype});
+                } else {
+                    $rolename = &mt('Data provided by user');
+                }
+            }
         }
     } elsif ($context eq 'selfcreate') {
         if (ref($usertypes) eq 'HASH') {
@@ -4898,14 +4910,33 @@
     if (ref($settings) eq 'HASH') {
         if (ref($settings->{$context}) eq 'HASH') {
             if (ref($settings->{$context}->{$role}) eq 'HASH') {
-                foreach my $field (@fields) {
-                    if ($settings->{$context}->{$role}->{$field}) {
-                        $checks{$field} = ' checked="checked" ';
+                my $hashref = $settings->{$context}->{$role};
+                if ($role eq 'emailusername') {
+                    if ($statustype) {
+                        if (ref($settings->{$context}->{$role}->{$statustype}) eq 'HASH') {
+                            $hashref = $settings->{$context}->{$role}->{$statustype};
+                            if (ref($hashref) eq 'HASH') { 
+                                foreach my $field (@fields) {
+                                    if ($hashref->{$field}) {
+                                        $checks{$field} = $hashref->{$field};
+                                    }
+                                }
+                            }
+                        }
+                    }
+                } else {
+                    if (ref($hashref) eq 'HASH') {
+                        foreach my $field (@fields) {
+                            if ($hashref->{$field}) {
+                                $checks{$field} = ' checked="checked" ';
+                            }
+                        }
                     }
                 }
             }
         }
     }
+     
     for (my $i=0; $i<@fields; $i++) {
         my $rem = $i%($numinrow);
         if ($rem == 0) {
@@ -4915,20 +4946,40 @@
             $output .= '<tr>';
         }
         my $check = ' ';
-        if (exists($checks{$fields[$i]})) {
-            $check = $checks{$fields[$i]}
-        } else {
-            if ($role eq 'st') {
-                if (ref($settings) ne 'HASH') {
-                    $check = ' checked="checked" '; 
+        unless ($role eq 'emailusername') {
+            if (exists($checks{$fields[$i]})) {
+                $check = $checks{$fields[$i]}
+            } else {
+                if ($role eq 'st') {
+                    if (ref($settings) ne 'HASH') {
+                        $check = ' checked="checked" '; 
+                    }
                 }
             }
         }
         $output .= '<td class="LC_left_item">'.
-                   '<span class="LC_nobreak"><label>'.
-                   '<input type="checkbox" name="canmodify_'.$role.'" '.
-                   'value="'.$fields[$i].'"'.$check.'/>'.$fieldtitles{$fields[$i]}.
-                   '</label></span></td>';
+                   '<span class="LC_nobreak">';
+        if ($role eq 'emailusername') {
+            unless ($checks{$fields[$i]} =~ /^(required|optional)$/) {
+                $checks{$fields[$i]} = 'omit';
+            }
+            foreach my $option ('required','optional','omit') {
+                my $checked='';
+                if ($checks{$fields[$i]} eq $option) {
+                    $checked='checked="checked" ';
+                }
+                $output .= '<label>'.
+                           '<input type="radio" name="canmodify_'.$item.'_'.$fields[$i].'" value="'.$option.'" '.$checked.'/>'.
+                           &mt($option).'</label>'.(' ' x2);
+            }
+            $output .= '<i>'.$fieldtitles{$fields[$i]}.'</i>';
+        } else {
+            $output .= '<label>'.
+                       '<input type="checkbox" name="canmodify_'.$role.'" '.
+                       'value="'.$fields[$i].'"'.$check.'/>'.$fieldtitles{$fields[$i]}.
+                       '</label>';
+        }
+        $output .= '</span></td>';
         $rem = @fields%($numinrow);
     }
     my $colsleft = $numinrow - $rem;
@@ -7661,6 +7712,11 @@
     my ($dom,%domconfig) = @_;
     my ($resulttext,$warningmsg,%curr_usercreation,%curr_usermodify,%changes,%cancreate);
     my (%save_usercreate,%save_usermodify);
+    my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
+    if (ref($types) eq 'ARRAY') {
+        $usertypes->{'default'} = $othertitle;
+        push(@{$types},'default');
+    }
 #
 # Retrieve current domain configuration for self-creation of usernames from $domconfig{'usercreation'}.
 #
@@ -7712,7 +7768,7 @@
 # Populate $cancreate{'selfcreate'} array reference with types of user, for which self-creation of user accounts
 # is permitted.
 #
-    foreach my $item ('login','sso','email') { 
+    foreach my $item ('login','sso','email') {
         if ($item eq 'email') {
             if ($env{'form.cancreate_email'} eq 'email') {
                 push(@{$cancreate{'selfcreate'}},'email');
@@ -7728,20 +7784,22 @@
     my (@email_rule,%userinfo,%savecaptcha);
     my ($infofields,$infotitles) = &Apache::loncommon::emailusername_info();
 #
-# Populate $cancreate{'emailusername'} hash ref with information types (if new user will provide data
-# value set to one), if self-creation with e-mail address permitted.
+# Populate $cancreate{'emailusername'}{$type} hash ref with information fields (if new user will provide data
+# value set to one), if self-creation with e-mail address permitted, where $type is user type: faculty, staff, student etc.
 #
     if (($env{'form.cancreate_email'} eq 'email') || ($env{'form.cancreate_email'} eq 'emailapproval')) {
-        push(@contexts,'emailusername'); 
-        map { $userinfo{$_} = 1; } &Apache::loncommon::get_env_multiple('form.canmodify_emailusername');
-        if (ref($infofields) eq 'ARRAY') {
-            foreach my $field (@{$infofields}) {
-                if ($userinfo{$field}) {
-                    $cancreate{'emailusername'}{$field} = 1;
+        push(@contexts,'emailusername');
+        if (ref($types) eq 'ARRAY') {
+            foreach my $type (@{$types}) {
+                if (ref($infofields) eq 'ARRAY') {
+                    foreach my $field (@{$infofields}) {
+                        if ($env{'form.canmodify_emailusername_'.$type.'_'.$field} =~ /^(required|optional)$/) {
+                            $cancreate{'emailusername'}{$type}{$field} = $1;
+                        }
+                    }
                 }
             }
         }
-
 #
 # Populate $cancreate{'notify'} hash ref with names of Domain Coordinators who are to be notified of
 # queued requests for self-creation of account using e-mail address as username
@@ -7800,7 +7858,6 @@
                           &mt('You need to set the default authentication type to Kerberos 4 or 5 (with a Kerberos domain specified), or to Local authentication, if the localauth module has been customized in your domain to authenticate institutional logins.');
         }
     }
-    my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
     my @fields = ('lastname','firstname','middlename','generation',
                   'permanentemail','id');
     my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles();
@@ -7813,14 +7870,12 @@
 #
     if (($env{'form.cancreate_login'}) || ($env{'form.cancreate_sso'})) {
         if (ref($types) eq 'ARRAY') {
-            if (@{$types} > 0) {
+            if (@{$types} > 1) {
                 @{$cancreate{'statustocreate'}} = &Apache::loncommon::get_env_multiple('form.statustocreate');
                 push(@contexts,'statustocreate');
             } else {
                 undef($cancreate{'statustocreate'});
             } 
-            push(@{$types},'default');
-            $usertypes->{'default'} = $othertitle;
             foreach my $type (@{$types}) {
                 my @modifiable =  &Apache::loncommon::get_env_multiple('form.canmodify_'.$type);
                 foreach my $field (@fields) {
@@ -7873,16 +7928,42 @@
         } elsif (ref($curr_usercreation{'cancreate'}{$item}) eq 'HASH') {
             if (ref($cancreate{$item}) eq 'HASH') {
                 foreach my $curr (keys(%{$curr_usercreation{'cancreate'}{$item}})) {
-                    if (!$cancreate{$item}{$curr}) {
-                        if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
-                            push(@{$changes{'cancreate'}},$item);
+                    if (ref($curr_usercreation{'cancreate'}{$item}{$curr}) eq 'HASH') {
+                        foreach my $field (keys(%{$curr_usercreation{'cancreate'}{$item}{$curr}})) {
+                            unless ($curr_usercreation{'cancreate'}{$item}{$curr}{$field} eq $cancreate{$item}{$curr}{$field}) {
+                                if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
+                                    push(@{$changes{'cancreate'}},$item);
+                                }
+                            }
+                        }
+                    } else {
+                        if (!$cancreate{$item}{$curr}) {
+                            if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
+                                push(@{$changes{'cancreate'}},$item);
+                            }
                         }
                     }
                 }
                 foreach my $field (keys(%{$cancreate{$item}})) {
-                    if (!$curr_usercreation{'cancreate'}{$item}{$field}) {
-                        if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
-                            push(@{$changes{'cancreate'}},$item);
+                    if (ref($cancreate{$item}{$field}) eq 'HASH') {
+                        foreach my $inner (keys(%{$cancreate{$item}{$field}})) {
+                            if (ref($curr_usercreation{'cancreate'}{$item}{$field}) eq 'HASH') {
+                                unless ($curr_usercreation{'cancreate'}{$item}{$field}{$inner} eq $cancreate{$item}{$field}{$inner}) {
+                                    if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
+                                        push(@{$changes{'cancreate'}},$item);
+                                    }
+                                }
+                            } else {
+                                if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
+                                    push(@{$changes{'cancreate'}},$item);
+                                }
+                            }
+                        }
+                    } else {
+                        if (!$curr_usercreation{'cancreate'}{$item}{$field}) {
+                            if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
+                                push(@{$changes{'cancreate'}},$item);
+                            }
                         }
                     }
                 }
@@ -7902,8 +7983,19 @@
                 }
             }
         } elsif ($item eq 'emailusername') {
-            if (keys(%userinfo) > 0) {
-                push(@{$changes{'cancreate'}},$item);
+            if (ref($cancreate{$item}) eq 'HASH') {
+                foreach my $type (keys(%{$cancreate{$item}})) {
+                    if (ref($cancreate{$item}{$type}) eq 'HASH') {
+                        foreach my $field (keys(%{$cancreate{$item}{$type}})) {
+                            if ($cancreate{$item}{$type}{$field}) {
+                                if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
+                                    push(@{$changes{'cancreate'}},$item);
+                                }
+                                last;
+                            }
+                        }
+                    }
+                }
             }
         }
     }
@@ -8033,17 +8125,23 @@
                         $chgtext .= '</ul>';
                     } elsif ($type eq 'emailusername') {
                         if (ref($cancreate{'emailusername'}) eq 'HASH') {
-                            if (keys(%{$cancreate{'emailusername'}}) > 0) {
-                                $chgtext .= &mt('When self-creating account with e-mail as username, user will provide the following information:').
-                                            '<ul>';
-                                foreach my $field (@{$infofields}) {
-                                    if ($cancreate{'emailusername'}{$field}) {
-                                        $chgtext .= '<li>'.$infotitles->{$field}.'</li>';
+                            if (ref($types) eq 'ARRAY') {
+                                foreach my $type (@{$types}) {
+                                    if (ref($cancreate{'emailusername'}{$type}) eq 'HASH') {
+                                        if (keys(%{$cancreate{'emailusername'}{$type}}) > 0) {
+                                            $chgtext .= &mt('When self-creating account with e-mail as username, the following information will be provided by [_1]:',$usertypes->{$type}).
+                                                    '<ul>';
+                                            foreach my $field (@{$infofields}) {
+                                                if ($cancreate{'emailusername'}{$type}{$field}) {
+                                                    $chgtext .= '<li>'.$infotitles->{$field}.'</li>';
+                                                }
+                                            }
+                                        }
+                                        $chgtext .= '</ul>';
+                                    } else {
+                                        $chgtext .= &mt('When self creating account with e-mail as username, no information besides e-mail address will be provided by [_1].',$usertypes->{$type}).'<br />';
                                     }
                                 }
-                                $chgtext .= '</ul>';
-                            } else {
-                                $chgtext .= &mt('When self creating account with e-mail as username, user will not provide any information besides e-mail address');
                             }
                         }
                     } elsif ($type eq 'notify') {


More information about the LON-CAPA-cvs mailing list