--- loncom/interface/loncreateuser.pm 2007/12/21 16:23:54 1.218 +++ loncom/interface/loncreateuser.pm 2007/12/21 18:16:39 1.220 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Create a user # -# $Id: loncreateuser.pm,v 1.218 2007/12/21 16:23:54 raeburn Exp $ +# $Id: loncreateuser.pm,v 1.220 2007/12/21 18:16:39 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -1397,15 +1397,17 @@ sub modify_login_block { sub personal_data_display { my ($ccuname,$ccdomain,$newuser,$context,$inst_results) = @_; - my ($output,$showforceid,%userenv,%domconfig); + my ($output,$showforceid,%userenv,%canmodify); + my @userinfo = ('firstname','middlename','lastname','generation', + 'permanentemail','id'); if (!$newuser) { # Get the users information %userenv = &Apache::lonnet::get('environment', ['firstname','middlename','lastname','generation', 'permanentemail','id'],$ccdomain,$ccuname); - %domconfig = - &Apache::lonnet::get_dom('configuration',['usermodification'], - $ccdomain); + %canmodify = + &Apache::lonuserutils::can_modify_userinfo($context,$ccdomain, + \@userinfo); } my %lt=&Apache::lonlocal::texthash( 'pd' => "Personal Data", @@ -1417,8 +1419,6 @@ sub personal_data_display { 'id' => "ID/Student Number", 'lg' => "Login Data" ); - my @userinfo = ('firstname','middlename','lastname','generation', - 'permanentemail','id'); my %textboxsize = ( firstname => '15', middlename => '15', @@ -1447,33 +1447,14 @@ sub personal_data_display { $output .= ''; } } else { - my $canmodify = 0; - if (&Apache::lonnet::allowed('mau',$ccdomain)) { - $canmodify = 1; - } else { - if (ref($domconfig{'usermodification'}) eq 'HASH') { - if (ref($domconfig{'usermodification'}{$context}) eq 'HASH') { - foreach my $key (keys(%{$domconfig{'usermodification'}{$context}})) { - if (ref($domconfig{'usermodification'}{$context}{$key}) eq 'HASH') { - if ($domconfig{'usermodification'}{$context}{$key}{$item}) { - $canmodify = 1; - last; - } - } - } - } - } elsif ($context eq 'course') { - $canmodify = 1; - } - } - if ($canmodify) { + if ($canmodify{$item}) { $output .= ''; } else { $output .= $userenv{$item}; } if ($item eq 'id') { - $showforceid = $canmodify; - } + $showforceid = $canmodify{$item}; + } } $output .= &Apache::lonhtmlcommon::row_closure(1); } @@ -1495,7 +1476,9 @@ sub update_user_data { my $end = '

'; my $rtnlink = ''. - &mt('Return to previous page').''.&Apache::loncommon::end_page(); + &mt('Return to previous page').''. + &Apache::loncommon::end_page(); + my $now = time; my $title; if (exists($env{'form.makeuser'})) { $title='Set Privileges for New User'; @@ -1520,14 +1503,12 @@ sub update_user_data { } &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:backPage(document.userupdate,'$env{'form.prevphase'}','modify')", - text=>"Set user role", + text=>$breadcrumb_text{'modify'}, faq=>282,bug=>'Instructor Interface',}, {href=>"/adm/createuser", text=>"Result", faq=>282,bug=>'Instructor Interface',}); $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management')); - - my %disallowed; $r->print(&update_result_form($uhome)); # Check Inputs if (! $env{'form.ccuname'} ) { @@ -1552,6 +1533,9 @@ sub update_user_data { $end.$rtnlink); return; } + if ($uhome eq 'no_host') { + $newuser = 1; + } if (! exists($env{'form.makeuser'})) { # Modifying an existing user, so check the validity of the name if ($uhome eq 'no_host') { @@ -1589,7 +1573,6 @@ sub update_user_data { return; } - $r->print('

'.&mt('User [_1] in domain [_2]', $env{'form.ccuname'}, $env{'form.ccdomain'}).'

'); my (%alerts,%rulematch,%inst_results,%curr_rules); @@ -1616,7 +1599,7 @@ sub update_user_data { my %checkhash; my %checks = ('id' => 1); %{$checkhash{$env{'form.ccuname'}.':'.$env{'form.ccdomain'}}} = ( - 'newuser' => 1, + 'newuser' => $newuser, 'id' => $env{'form.cid'}, ); if ($env{'form.cid'} ne '') { @@ -1650,10 +1633,10 @@ sub update_user_data { $env{'form.cgeneration'},undef,$desiredhost, $env{'form.cpermanentemail'}); $r->print(&mt('Generating user').': '.$result); - my $home = &Apache::lonnet::homeserver($env{'form.ccuname'}, + $uhome = &Apache::lonnet::homeserver($env{'form.ccuname'}, $env{'form.ccdomain'}); - $r->print('
'.&mt('Home server').': '.$home.' '. - &Apache::lonnet::hostname($home)); + $r->print('
'.&mt('Home server').': '.$uhome.' '. + &Apache::lonnet::hostname($uhome)); } elsif (($env{'form.login'} ne 'nochange') && ($env{'form.login'} ne '' )) { # Modify user privileges @@ -1697,22 +1680,12 @@ sub update_user_data { my @statuses = ('active','future'); my %roles = &Apache::lonnet::get_my_roles($env{'form.ccuname'},$env{'form.ccdomain'},'userroles',\@statuses,undef,$env{'request.role.domain'}); my ($auname,$audom); - if ($context eq 'course') { - $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; - $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - if ($cnum eq '' || $cdom eq '') { - my $cid = $env{'request.course.id'}; - my %coursehash = - &Apache::lonnet::coursedescription($cid,{'one_time' => 1}); - $cdom = $coursehash{'domain'}; - $cnum = $coursehash{'num'}; - } - } elsif ($context eq 'author') { + if ($context eq 'author') { $auname = $env{'user.name'}; $audom = $env{'user.domain'}; } foreach my $item (keys(%roles)) { - my ($rolenum,$roledom,$role) = split(/:/,$item); + my ($rolenum,$roledom,$role) = split(/:/,$item,-1); if ($context eq 'course') { if ($cnum ne '' && $cdom ne '') { if ($rolenum eq $cnum && $roledom eq $cdom) { @@ -1729,27 +1702,33 @@ sub update_user_data { } } } - # Check for course or co-author roles being activated or re-enabled - if ($context eq 'author' || $context eq 'course') { - foreach my $key (keys(%env)) { - if ($context eq 'author') { - if ($key=~/^form\.act_\Q$audom\E_\Q$auname\E_([^_]+)/) { - if (!grep(/^\Q$1\E$/,@userroles)) { - push(@userroles,$1); - } - } elsif ($key =~/^form\.ren\:\Q$audom\E\/\Q$auname\E_([^_]+)/) { - if (!grep(/^\Q$1\E$/,@userroles)) { - push(@userroles,$1); - } - } - } elsif ($context eq 'course') { - if ($key=~/^form\.act_\Q$cdom\E_\Q$cnum\E_([^_]+)/) { - if (!grep(/^\Q$1\E$/,@userroles)) { - push(@userroles,$1); + if ($env{'form.action'} eq 'singlestudent') { + if (!grep(/^st$/,@userroles)) { + push(@userroles,'st'); + } + } else { + # Check for course or co-author roles being activated or re-enabled + if ($context eq 'author' || $context eq 'course') { + foreach my $key (keys(%env)) { + if ($context eq 'author') { + if ($key=~/^form\.act_\Q$audom\E_\Q$auname\E_([^_]+)/) { + if (!grep(/^\Q$1\E$/,@userroles)) { + push(@userroles,$1); + } + } elsif ($key =~/^form\.ren\:\Q$audom\E\/\Q$auname\E_([^_]+)/) { + if (!grep(/^\Q$1\E$/,@userroles)) { + push(@userroles,$1); + } } - } elsif ($key =~/^form\.ren\:\Q$cdom\E\/\Q$cnum\E(\/?\w*)_([^_]+)/) { - if (!grep(/^\Q$1\E$/,@userroles)) { - push(@userroles,$1); + } elsif ($context eq 'course') { + if ($key=~/^form\.act_\Q$cdom\E_\Q$cnum\E_([^_]+)/) { + if (!grep(/^\Q$1\E$/,@userroles)) { + push(@userroles,$1); + } + } elsif ($key =~/^form\.ren\:\Q$cdom\E\/\Q$cnum\E(\/?\w*)_([^_]+)/) { + if (!grep(/^\Q$1\E$/,@userroles)) { + push(@userroles,$1); + } } } } @@ -1764,33 +1743,12 @@ sub update_user_data { push(@longroles,&Apache::lonnet::plaintext($role)); } } - foreach my $item ('firstname','middlename','lastname','generation','permanentemail','id') { - my $canmodify = 0; - if (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'})) { - $canmodify = 1; - } else { - if ($context eq 'course' || $context eq 'author') { - if (ref($domconfig{'usermodification'}) eq 'HASH') { - if (ref($domconfig{'usermodification'}{$context}) eq 'HASH') { - foreach my $role (@userroles) { - if (ref($domconfig{'usermodification'}{$context}{$role}) eq 'HASH') { - if ($domconfig{'usermodification'}{$context}{$role}{$item}) { - $canmodify = 1; - last; - } - } - } - } - } - } elsif ($context eq 'course') { - if (grep(/^st$/,@userroles)) { - $canmodify = 1; - } - } - } + my @userinfo = ('firstname','middlename','lastname','generation','permanentemail','id'); + my %canmodify = &Apache::lonuserutils::can_modify_userinfo($context,$env{'form.ccdomain'},\@userinfo,\@userroles); + foreach my $item (@userinfo) { # Strip leading and trailing whitespace $env{'form.c'.$item} =~ s/(\s+$|^\s+)//g; - if (!$canmodify) { + if (!$canmodify{$item}) { if (defined($env{'form.c'.$item})) { if ($env{'form.c'.$item} ne $userenv{$item}) { push(@mod_disallowed,$item); @@ -1802,7 +1760,6 @@ sub update_user_data { # Check to see if we can change the ID/student number my $forceid = $env{'form.forceid'}; my $recurseid = $env{'form.recurseid'}; - my $newuser = 0; my (%alerts,%rulematch,%idinst_results,%curr_rules,%got_rules); my %uidhash = &Apache::lonnet::idrget($env{'form.ccdomain'}, $env{'form.ccuname'}); @@ -1834,6 +1791,10 @@ sub update_user_data { $newdefquotatext); my ($defquota,$settingstatus) = &Apache::loncommon::default_quota($env{'form.ccdomain'},$inststatus); + my $showquota; + if (&Apache::lonnet::allowed('mpq',$env{'form.ccdomain'})) { + $showquota = 1; + } my %changeHash; $changeHash{'portfolioquota'} = $userenv{'portfolioquota'}; if ($userenv{'portfolioquota'} ne '') { @@ -1904,6 +1865,13 @@ sub update_user_data { $changeHash{'firstname'},$changeHash{'middlename'}, $changeHash{'lastname'},$changeHash{'generation'}, $changeHash{'id'},undef,$changeHash{'permanentemail'}); + %userupdate = ( + lastname => $env{'form.clastname'}, + middlename => $env{'form.cmiddlename'}, + firstname => $env{'form.cfirstname'}, + generation => $env{'form.cgeneration'}, + id => $env{'form.cid'}, + ); } if (($namechanged && $namechgresult eq 'ok') || ($quotachanged && $quotachgresult eq 'ok')) { @@ -1931,8 +1899,11 @@ sub update_user_data { $lt{'gen'} $lt{'id'} $lt{'mail'} - $lt{'disk'} END + if ($showquota) { + $r->print(" + $lt{'disk'}\n"); + } $r->print(&Apache::loncommon::end_data_table_header_row(). &Apache::loncommon::start_data_table_row()); $r->print(<<"END"); @@ -1943,8 +1914,11 @@ END $userenv{'generation'} $userenv{'id'} $userenv{'permanentemail'} - $oldportfolioquota Mb $olddefquotatext END + if ($showquota) { + $r->print(" + $oldportfolioquota Mb $olddefquotatext \n"); + } $r->print(&Apache::loncommon::end_data_table_row(). &Apache::loncommon::start_data_table_row()); $r->print(<<"END"); @@ -1955,8 +1929,11 @@ END $env{'form.cgeneration'} $env{'form.cid'} $env{'form.cpermanentemail'} - $newportfolioquota Mb $newdefquotatext END + if ($showquota) { + $r->print(" + $newportfolioquota Mb $newdefquotatext \n"); + } $r->print(&Apache::loncommon::end_data_table_row(). &Apache::loncommon::end_data_table().'
'); if ($env{'form.cid'} ne $userenv{'id'}) { @@ -1964,13 +1941,6 @@ END ($env{'form.ccuname'} => $env{'form.cid'})); if (($recurseid) && (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'}))) { - %userupdate = ( - lastname => $env{'form.clasaname'}, - middlename => $env{'form.cmiddlename'}, - firstname => $env{'form.cfirstname'}, - generation => $env{'fora.cgeneration'}, - id => $env{'form.cid'}, - ); my $idresult = &Apache::lonuserutils::propagate_id_change( $env{'form.ccuname'},$env{'form.ccdomain'}, @@ -2006,8 +1976,11 @@ END $r->print('
['.$lt{'mail'}.': '. $userenv{'permanentemail'}.']'); } - $r->print('
['.$lt{'disk'}.': '.$oldportfolioquota.' Mb '. - $olddefquotatext.']'); + if ($showquota) { + $r->print('
['.$lt{'disk'}.': '.$oldportfolioquota.' Mb '. + $olddefquotatext.']'); + } + $r->print(''); } if (@mod_disallowed) { my ($rolestr,$contextname); @@ -2038,9 +2011,31 @@ END $r->print($no_forceid_alert. &Apache::lonuserutils::print_namespacing_alerts($env{'form.ccdomain'},\%alerts, \%curr_rules)); } - ## + if ($env{'form.action'} eq 'singlestudent') { + &enroll_single_student($r,$uhome,$amode,$genpwd,$now,$newuser); + } else { + my $rolechanges = &update_roles($r); + if (!$rolechanges && $namechanged) { + if ($context eq 'course') { + if (@userroles > 0) { + if (grep(/^st$/,@userroles)) { + my $classlistupdated = + &Apache::lonuserutils::update_classlist($cdom, + $cnum,$env{'form.ccdomain'}, + $env{'form.ccuname'},\%userupdate); + } + } + } + } + } + $r->print(&Apache::loncommon::end_page()); +} + +sub update_roles { + my ($r) = @_; my $now=time; my $rolechanges = 0; + my %disallowed; $r->print('

'.&mt('Modifying Roles').'

'); foreach my $key (keys (%env)) { next if (! $env{$key}); @@ -2113,7 +2108,7 @@ END if ($role eq 'st') { if ($url =~ m-^/($match_domain)/($match_courseid)/?(\w*)$-) { my $result = &Apache::loncommon::commit_studentrole(\$logmsg,$udom,$uname,$url,$role,$now,0,$1,$2,$3); - if (($result =~ /^error/) || ($result eq 'not_in_class') || ($result eq 'unknown_course')) { + if (($result =~ /^error/) || ($result eq 'not_in_class') || ($result eq 'unknown_course') || ($result eq 'refused')) { $output = "Error: $result\n"; } else { $output = &mt('Assigning').' '.$role.' in '.$url. @@ -2261,7 +2256,50 @@ END if (!$rolechanges) { $r->print(&mt('No roles to modify')); } - $r->print(&Apache::loncommon::end_page()); + return $rolechanges; +} + +sub enroll_single_student { + my ($r,$uhome,$amode,$genpwd,$now,$newuser) = @_; + $r->print('

'.&mt('Enrolling Student').'

'); + + # Remove non alphanumeric values from section + $env{'form.sections'}=~s/\W//g; + + # Clean out any old student roles the user has in this class. + &Apache::lonuserutils::modifystudent($env{'form.ccdomain'}, + $env{'form.ccuname'},$env{'request.course.id'},undef,$uhome); + my ($startdate,$enddate) = &Apache::lonuserutils::get_dates_from_form(); + my $enroll_result = + &Apache::lonnet::modify_student_enrollment($env{'form.ccdomain'}, + $env{'form.ccuname'},$env{'form.cid'},$env{'form.cfirstname'}, + $env{'form.cmiddlename'},$env{'form.clastname'}, + $env{'form.generation'},$env{'form.sections'},$enddate, + $startdate,'manual',undef,$env{'request.course.id'}); + if ($enroll_result =~ /^ok/) { + $r->print(&mt('[_1] enrolled',$env{'form.ccuname'}.':'.$env{'form.ccdomain'})); + if ($env{'form.sections'} ne '') { + $r->print(' '.&mt('in section [_1]',$env{'form.sections'})); + } + my ($showstart,$showend); + if ($startdate <= $now) { + $showstart = &mt('Access starts immediately'); + } else { + $showstart = &mt('Access starts: ').&Apache::lonlocal::locallocaltime($startdate); + } + if ($enddate == 0) { + $showend = &mt('ends: no ending date'); + } else { + $showend = &mt('ends: ').&Apache::lonlocal::locallocaltime($enddate); + } + $r->print('.
'.$showstart.'; '.$showend); + if ($startdate <= $now && !$newuser) { + $r->print("

".&mt('If the student is currently logged-in to LON-CAPA, the new role will be available when the student next logs in.')."

"); + } + } else { + $r->print(&mt('unable to enroll').": ".$enroll_result); + } + return; } sub get_defaultquota_text { @@ -2301,7 +2339,7 @@ sub update_result_form { } $outcome .= ''."\n". ''."\n". - ''."\n". + ''."\n". ''; return $outcome; }