--- loncom/interface/loncreateuser.pm 2007/12/06 04:03:35 1.203 +++ loncom/interface/loncreateuser.pm 2007/12/21 15:33:32 1.217 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Create a user # -# $Id: loncreateuser.pm,v 1.203 2007/12/06 04:03:35 raeburn Exp $ +# $Id: loncreateuser.pm,v 1.217 2007/12/21 15:33:32 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -76,7 +76,7 @@ my $authformfsys; my $authformloc; sub initialize_authen_forms { - my ($dom,$curr_authtype) = @_; + my ($dom,$curr_authtype,$mode) = @_; my ($krbdefdom)=( $ENV{'SERVER_NAME'}=~/(\w+\.\w+)$/); $krbdefdom= uc($krbdefdom); my %param = ( formname => 'document.cu', @@ -91,6 +91,9 @@ sub initialize_authen_forms { if ($long_auth =~ /^krb(4|5)$/) { $param{'curr_kerb_ver'} = $1; } + if ($mode eq 'modifyuser') { + $param{'mode'} = $mode; + } } # no longer static due to configurable kerberos defaults # $loginscript = &Apache::loncommon::authform_header(%param); @@ -112,15 +115,6 @@ sub auth_abbrev { return %abv_auth; } -# ==================================================== Figure out author access - -sub authorpriv { - my ($auname,$audom)=@_; - unless ((&Apache::lonnet::allowed('cca',$audom.'/'.$auname)) - || (&Apache::lonnet::allowed('caa',$audom.'/'.$auname))) { return ''; } - return 1; -} - # ==================================================== sub portfolio_quota { @@ -206,12 +200,14 @@ END_SCRIPT # =================================================================== Phase one sub print_username_entry_form { - my ($r,$response,$srch,$forcenewuser) = @_; + my ($r,$context,$response,$srch,$forcenewuser) = @_; my $defdom=$env{'request.role.domain'}; my $formtoset = 'crtuser'; if (exists($env{'form.startrolename'})) { $formtoset = 'docustom'; $env{'form.rolename'} = $env{'form.startrolename'}; + } elsif ($env{'form.origform'} eq 'crtusername') { + $formtoset = $env{'form.origform'}; } my ($jsback,$elements) = &crumb_utilities(); @@ -227,15 +223,15 @@ sub print_username_entry_form { my $start_page = &Apache::loncommon::start_page('User Management', $jscript,{'add_entries' => \%loaditems,}); - if ($env{'form.action'} eq 'singleuser') { + if ($env{'form.action'} eq 'custom') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:backPage(document.crtuser)", - text=>"Single user search", - faq=>282,bug=>'Instructor Interface',}); - } elsif ($env{'form.action'} eq 'custom') { + text=>"Pick custom role",}); + } else { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:backPage(document.crtuser)", - text=>"Pick custom role",}); + text=>"Single user search", + faq=>282,bug=>'Instructor Interface',}); } my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('User Management'); my %existingroles=&Apache::lonuserutils::my_custom_roles(); @@ -249,22 +245,19 @@ sub print_username_entry_form { 'ecrp' => "Edit Custom Role Privileges", 'nr' => "Name of Role", 'cre' => "Custom Role Editor", - 'mod' => "to add/modify roles", + 'mod' => "to modify user information or add/modify roles", + 'enrl' => "to enroll one student", ); my $help = &Apache::loncommon::help_open_menu(undef,undef,282,'Instructor Interface'); my $helpsiur=&Apache::loncommon::help_open_topic('Course_Change_Privileges'); + my $helpsist=&Apache::loncommon::help_open_topic('Course_Add_Student'); my $helpecpr=&Apache::loncommon::help_open_topic('Course_Editing_Custom_Roles'); my $sellink=&Apache::loncommon::selectstudent_link('crtuser','srchterm','srchdomain'); if ($sellink) { $sellink = "$lt{'or'} ".$sellink; } $r->print($start_page."\n".$crumbs); - if ($env{'form.action'} eq 'singleuser') { - $r->print(" -

$lt{'srch'} $sellink $lt{'mod'}$helpsiur

-$response"); - $r->print(&entry_form($defdom,$srch,$forcenewuser)); - } elsif ($env{'form.action'} eq 'custom') { + if ($env{'form.action'} eq 'custom') { if (&Apache::lonnet::allowed('mcr','/')) { $r->print(< @@ -276,24 +269,82 @@ $lt{'nr'}: $choice ENDCUSTOM } + } else { + my $actiontext = $lt{'mod'}.$helpsiur; + if ($env{'form.action'} eq 'singlestudent') { + $actiontext = $lt{'enrl'}.$helpsist; + } + $r->print(" +

$lt{'srch'} $sellink $actiontext

"); + if ($env{'form.origform'} ne 'crtusername') { + $r->print("\n".$response); + } + $r->print(&entry_form($defdom,$srch,$forcenewuser,$context,$response)); } $r->print(&Apache::loncommon::end_page()); } sub entry_form { - my ($dom,$srch,$forcenewuser) = @_; + my ($dom,$srch,$forcenewuser,$context,$responsemsg) = @_; + my %domconf = &Apache::lonnet::get_dom('configuration',['usercreation'],$dom); + my $usertype; + if (ref($srch) eq 'HASH') { + if (($srch->{'srchin'} eq 'dom') && + ($srch->{'srchby'} eq 'uname') && + ($srch->{'srchtype'} eq 'exact') && + ($srch->{'srchdomain'} ne '') && + ($srch->{'srchterm'} ne '')) { + my ($rules,$ruleorder) = + &Apache::lonnet::inst_userrules($srch->{'srchdomain'},'username'); + $usertype = &Apache::lonuserutils::check_usertype($srch->{'srchdomain'},$srch->{'srchterm'},$rules); + } + } + my $cancreate = + &Apache::lonuserutils::can_create_user($dom,$context,$usertype); my $userpicker = &Apache::loncommon::user_picker($dom,$srch,$forcenewuser, - 'document.crtuser'); + 'document.crtuser',$cancreate,$usertype); my $srchbutton = &mt('Search'); - my $output = <<"ENDDOCUMENT"; + my $output = <<"ENDBLOCK";
$userpicker
+ENDBLOCK + if ($cancreate && $env{'form.phase'} eq '') { + my $defdom=$env{'request.role.domain'}; + my $domform = &Apache::loncommon::select_dom_form($defdom,'srchdomain'); + my $helpcrt=&Apache::loncommon::help_open_topic('Course_Change_Privileges'); + my %lt=&Apache::lonlocal::texthash( + 'crnu' => 'Create a new user', + 'usr' => 'Username', + 'dom' => 'in domain', + 'cra' => 'Create user', + ); + $output .= <<"ENDDOCUMENT"; +
+ + + + + + + +

$lt{crnu}$helpcrt

+$responsemsg + + + + + + + +
$lt{'usr'}: $lt{'dom'}:$domform 
+
ENDDOCUMENT + } return $output; } @@ -326,7 +377,7 @@ END # =================================================================== Phase two sub print_user_selection_page { - my ($r,$response,$srch,$srch_results,$operation,$srcharray) = @_; + my ($r,$response,$srch,$srch_results,$operation,$srcharray,$context) = @_; my @fields = ('username','domain','lastname','firstname','permanentemail'); my $sortby = $env{'form.sortby'}; @@ -360,8 +411,8 @@ ENDSCRIPT 'firstname' => "first name", 'permanentemail' => "permanent e-mail", ); + $r->print(&Apache::loncommon::start_page('User Management',$jscript)); if ($operation eq 'createuser') { - $r->print(&Apache::loncommon::start_page('User Management',$jscript)); &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:backPage(document.usersrchform,'','')", text=>"Create/modify user", @@ -371,11 +422,19 @@ ENDSCRIPT faq=>282,bug=>'Instructor Interface',}); $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management')); $r->print("$lt{'usrch'}
"); - $r->print(&entry_form($srch->{'srchdomain'},$srch)); + $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context)); $r->print('

'.$lt{'usel'}.'

'); - } else { + } elsif ($operation eq 'enrollstudent') { + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"javascript:backPage(document.usersrchform,'','')", + text=>"Create/modify student", + faq=>282,bug=>'Instructor Interface',}, + {href=>"javascript:backPage(document.usersrchform,'get_user_info','select')", + text=>"Select Student", + faq=>282,bug=>'Instructor Interface',}); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management')); $r->print($jscript."$lt{'stusrch'}
"); - $r->print(&Apache::londropadd::single_user_entry_form($srch->{'srchdomain'},$srch)); + $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context)); $r->print('

'.$lt{'stusel'}.'

'); } $r->print('
'. @@ -421,14 +480,8 @@ ENDSCRIPT ' '."\n". ' '."\n". ' '."\n". - ' '."\n"); - $r->print($response); - if ($operation eq 'createuser') { - $r->print('
'.&Apache::loncommon::end_page()); - } else { - $r->print(''."\n". - ''."\n"); - } + ' '."\n"); + $r->print($response.''.&Apache::loncommon::end_page()); } sub print_user_query_page { @@ -440,17 +493,50 @@ sub print_user_query_page { } sub print_user_modification_page { - my ($r,$ccuname,$ccdomain,$srch,$response,$context) = @_; + my ($r,$ccuname,$ccdomain,$srch,$response,$context,$permission) = @_; if (($ccuname eq '') || ($ccdomain eq '')) { - my $usermsg = &mt('No username and/or domain provided.'); - &print_username_entry_form($r,$usermsg); + my $usermsg = &mt('No username and/or domain provided.'); + $env{'form.phase'} = ''; + &print_username_entry_form($r,$context,$usermsg); return; } + my ($form,$formname); + if ($env{'form.action'} eq 'singlestudent') { + $form = 'document.enrollstudent'; + $formname = 'enrollstudent'; + } else { + $form = 'document.cu'; + $formname = 'cu'; + } my %abv_auth = &auth_abbrev(); my ($curr_authtype,%rulematch,%inst_results,$curr_kerb_ver,$newuser, %alerts,%curr_rules,%got_rules); my $uhome=&Apache::lonnet::homeserver($ccuname,$ccdomain); if ($uhome eq 'no_host') { + my $usertype; + my ($rules,$ruleorder) = + &Apache::lonnet::inst_userrules($ccdomain,'username'); + $usertype = + &Apache::lonuserutils::check_usertype($ccdomain,$ccuname,$rules); + my $cancreate = + &Apache::lonuserutils::can_create_user($ccdomain,$context, + $usertype); + if (!$cancreate) { + my $helplink = ' href="javascript:helpMenu('."'display'".')"'; + my %usertypetext = ( + official => 'institutional', + unofficial => 'non-institutional', + ); + my $response; + if ($env{'form.origform'} eq 'crtusername') { + $response = ''.&mt('No match was found for the username ([_1]) in LON-CAPA domain: [_2]',$ccuname,$ccdomain). + '
'; + } + $response .= ''.&mt("You are not authorized to create new $usertypetext{$usertype} users in this domain.").' '.&mt('Contact the helpdesk for assistance.',$helplink).'

'; + $env{'form.phase'} = ''; + &print_username_entry_form($r,$context,$response); + return; + } $newuser = 1; my $checkhash; my $checks = { 'username' => 1 }; @@ -471,9 +557,10 @@ sub print_user_modification_page { $domdesc,$curr_rules{$ccdomain}{'username'}, 'username'); } - &print_username_entry_form($r,$userchkmsg); + $env{'form.phase'} = ''; + &print_username_entry_form($r,$context,$userchkmsg); return; - } + } } } } else { @@ -488,7 +575,7 @@ sub print_user_modification_page { } } if ($response) { - $response = '
'.$response + $response = '
'.$response; } my $defdom=$env{'request.role.domain'}; @@ -508,165 +595,35 @@ sub print_user_modification_page { my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition(); my $dc_setcourse_code = ''; my $nondc_setsection_code = ''; - my %loaditem; - my $groupslist; - my %curr_groups = &Apache::longroup::coursegroups(); - if (%curr_groups) { - $groupslist = join('","',sort(keys(%curr_groups))); - $groupslist = '"'.$groupslist.'"'; - } - - if ($env{'request.role'} =~ m-^dc\./($match_domain)/$-) { - my $dcdom = $1; - $loaditem{'onload'} = "document.cu.coursedesc.value='';"; - my @rolevals = ('st','ta','ep','in','cc'); - my (@crsroles,@grproles); - for (my $i=0; $i<@rolevals; $i++) { - $crsroles[$i]=&Apache::lonnet::plaintext($rolevals[$i],'Course'); - $grproles[$i]=&Apache::lonnet::plaintext($rolevals[$i],'Group'); - } - my $rolevalslist = join('","',@rolevals); - my $crsrolenameslist = join('","',@crsroles); - my $grprolenameslist = join('","',@grproles); - my $pickcrsfirst = '<--'.&mt('Pick course first'); - my $pickgrpfirst = '<--'.&mt('Pick group first'); - $dc_setcourse_code = <<"ENDSCRIPT"; - function setCourse() { - var course = document.cu.dccourse.value; - if (course != "") { - if (document.cu.dcdomain.value != document.cu.origdom.value) { - alert("You must select a course in the current domain"); - return; - } - var userrole = document.cu.role.options[document.cu.role.selectedIndex].value - var section=""; - var numsections = 0; - var newsecs = new Array(); - for (var i=0; i 1)) { - alert("In each course, each user may only have one student role at a time. You had selected "+numsections+" sections.\\nPlease modify your selections so they include no more than one section.") - return; - } - for (var j=0; j 0)) { - alert("Section designations do not apply to Course Coordinator roles.\\nA course coordinator role will be added with access to all sections."); - section = ""; - } - var coursename = "_$dcdom"+"_"+course+"_"+userrole - var numcourse = getIndex(document.cu.dccourse); - if (numcourse == "-1") { - alert("There was a problem with your course selection"); - return - } - else { - document.cu.elements[numcourse].name = "act"+coursename; - var numnewsec = getIndex(document.cu.newsec); - if (numnewsec != "-1") { - document.cu.elements[numnewsec].name = "sec"+coursename; - document.cu.elements[numnewsec].value = section; - } - var numstart = getIndex(document.cu.start); - if (numstart != "-1") { - document.cu.elements[numstart].name = "start"+coursename; - } - var numend = getIndex(document.cu.end); - if (numend != "-1") { - document.cu.elements[numend].name = "end"+coursename - } - } - } - document.cu.submit(); - } - - function getIndex(caller) { - for (var i=0;i'."\n".$jsback."\n". - $javascript_validations.''; + my $js = &validation_javascript($context,$ccdomain,$pjump_def, + $groupslist,$newuser,$formname,\%loaditem); my $start_page = &Apache::loncommon::start_page('User Management', $js,{'add_entries' => \%loaditem,}); + my %breadcrumb_text = &singleuser_breadcrumb(); &Apache::lonhtmlcommon::add_breadcrumb - ({href=>"javascript:backPage(document.cu)", - text=>"Create/modify user", + ({href=>"javascript:backPage($form)", + text=>$breadcrumb_text{'search'}, faq=>282,bug=>'Instructor Interface',}); if ($env{'form.phase'} eq 'userpicked') { &Apache::lonhtmlcommon::add_breadcrumb - ({href=>"javascript:backPage(document.cu,'get_user_info','select')", - text=>"Select a user", + ({href=>"javascript:backPage($form,'get_user_info','select')", + text=>$breadcrumb_text{'userpicked'}, faq=>282,bug=>'Instructor Interface',}); } &Apache::lonhtmlcommon::add_breadcrumb - ({href=>"javascript:backPage(document.cu,'$env{'form.phase'}','modify')", - text=>"Set user role", + ({href=>"javascript:backPage($form,'$env{'form.phase'}','modify')", + text=>$breadcrumb_text{'modify'}, faq=>282,bug=>'Instructor Interface',}); my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('User Management'); my $forminfo =<<"ENDFORMINFO"; -
+ @@ -680,7 +637,7 @@ ENDFORMINFO $inccourses{$1.'_'.$2}=1; } } - if ($uhome eq 'no_host') { + if ($newuser) { my $portfolioform; if (&Apache::lonnet::allowed('mpq',$env{'request.role.domain'})) { # Current user has quota modification privileges @@ -689,6 +646,7 @@ ENDFORMINFO &initialize_authen_forms($ccdomain); my %lt=&Apache::lonlocal::texthash( 'cnu' => 'Create New User', + 'ast' => 'as a student', 'ind' => 'in domain', 'lg' => 'Login Data', 'hs' => "Home Server", @@ -702,11 +660,16 @@ $forminfo $loginscript -

$lt{'cnu'} "$ccuname" $lt{'ind'} $ccdomain

+

$lt{'cnu'} "$ccuname" $lt{'ind'} $ccdomain ENDTITLE - $r->print('
'. - &personal_data_display($ccuname,$ccdomain,$newuser, - %inst_results)); + if ($env{'form.action'} eq 'singlestudent') { + $r->print(' ('.$lt{'ast'}.')'); + } + $r->print('

'."\n".'
'); + my $personal_table = + &personal_data_display($ccuname,$ccdomain,$newuser,$context, + $inst_results{$ccuname.':'.$ccdomain}); + $r->print($personal_table); my ($home_server_pick,$numlib) = &Apache::loncommon::home_server_form_item($ccdomain,'hserver', 'default','hide'); @@ -768,25 +731,36 @@ ENDAUTH } else { $r->print(&Apache::lonuserutils::set_login($ccdomain,$authformkrb,$authformint,$authformloc)); } - $r->print(< -ENDPORT + $r->print($portfolioform); + if ($env{'form.action'} eq 'singlestudent') { + $r->print(&date_sections_select($context,$newuser,$formname, + $permission)); + } + $r->print('
'); } else { # user already exists my %lt=&Apache::lonlocal::texthash( 'cup' => "Modify existing user: ", + 'ens' => "Enroll one student: ", 'id' => "in domain", ); $r->print(<$lt{'cup'} "$ccuname" $lt{'id'} "$ccdomain" +

ENDCHANGEUSER - $r->print('
'. - &personal_data_display($ccuname,$ccdomain,$newuser, - %inst_results)); - if ($context eq 'domain') { + if ($env{'form.action'} eq 'singlestudent') { + $r->print($lt{'ens'}); + } else { + $r->print($lt{'cup'}); + } + $r->print(' "'.$ccuname.'" '.$lt{'id'}.' "'.$ccdomain.'"

'. + "\n".'
'); + my ($personal_table,$showforceid) = + &personal_data_display($ccuname,$ccdomain,$newuser,$context, + $inst_results{$ccuname.':'.$ccdomain}); + $r->print($personal_table); + if ($showforceid) { $r->print(&Apache::lonuserutils::forceid_change($context)); } $r->print('
'); @@ -816,209 +790,32 @@ ENDNOPORTPRIV if ($user_quota_text ne '') { $r->print($user_quota_text); } - $r->print(''); - + if ($env{'form.action'} eq 'singlestudent') { + $r->print(&date_sections_select($context,$newuser,$formname)); + } } elsif ($user_quota_text ne '') { - $r->print('
'.$user_quota_text.'
'); + $r->print('
'.$user_quota_text); + if ($env{'form.action'} eq 'singlestudent') { + $r->print(&date_sections_select($context,$newuser,$formname)); + } + } else { + if ($env{'form.action'} eq 'singlestudent') { + $r->print('
'. + &date_sections_select($context,$newuser,$formname)); + } + } + $r->print('
'); + if ($env{'form.action'} ne 'singlestudent') { + &display_existing_roles($r,$ccuname,$ccdomain,\%inccourses); } - $r->print(''); - my %rolesdump=&Apache::lonnet::dump('roles',$ccdomain,$ccuname); - # Build up table of user roles to allow revocation of a role. - my ($tmp) = keys(%rolesdump); - unless ($tmp =~ /^(con_lost|error)/i) { - my $now=time; - my %lt=&Apache::lonlocal::texthash( - 'rer' => "Existing Roles", - 'rev' => "Revoke", - 'del' => "Delete", - 'ren' => "Re-Enable", - 'rol' => "Role", - 'ext' => "Extent", - 'sta' => "Start", - 'end' => "End" - ); - my (%roletext,%sortrole,%roleclass,%rolepriv); - foreach my $area (sort { my $a1=join('_',(split('_',$a))[1,0]); - my $b1=join('_',(split('_',$b))[1,0]); - return $a1 cmp $b1; - } keys(%rolesdump)) { - next if ($area =~ /^rolesdef/); - my $envkey=$area; - my $role = $rolesdump{$area}; - my $thisrole=$area; - $area =~ s/\_\w\w$//; - my ($role_code,$role_end_time,$role_start_time) = - split(/_/,$role); -# Is this a custom role? Get role owner and title. - my ($croleudom,$croleuname,$croletitle)= - ($role_code=~m{^cr/($match_domain)/($match_username)/(\w+)$}); - my $allowed=0; - my $delallowed=0; - my $sortkey=$role_code; - my $class='Unknown'; - if ($area =~ m{^/($match_domain)/($match_courseid)} ) { - $class='Course'; - my ($coursedom,$coursedir) = ($1,$2); - $sortkey.="\0$coursedom"; - # $1.'_'.$2 is the course id (eg. 103_12345abcef103l3). - my %coursedata= - &Apache::lonnet::coursedescription($1.'_'.$2); - my $carea; - if (defined($coursedata{'description'})) { - $carea=$coursedata{'description'}. - '
'.&mt('Domain').': '.$coursedom.(' 'x8). - &Apache::loncommon::syllabuswrapper('Syllabus',$coursedir,$coursedom); - $sortkey.="\0".$coursedata{'description'}; - $class=$coursedata{'type'}; - } else { - $carea=&mt('Unavailable course').': '.$area; - $sortkey.="\0".&mt('Unavailable course').': '.$area; - } - $sortkey.="\0$coursedir"; - $inccourses{$1.'_'.$2}=1; - if ((&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2)) || - (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) { - $allowed=1; - } - if ((&Apache::lonnet::allowed('dro',$1)) || - (&Apache::lonnet::allowed('dro',$ccdomain))) { - $delallowed=1; - } -# - custom role. Needs more info, too - if ($croletitle) { - if (&Apache::lonnet::allowed('ccr',$1.'/'.$2)) { - $allowed=1; - $thisrole.='.'.$role_code; - } - } - # Compute the background color based on $area - if ($area=~m{^/($match_domain)/($match_courseid)/(\w+)}) { - $carea.='
Section: '.$3; - $sortkey.="\0$3"; - } - $area=$carea; - } else { - $sortkey.="\0".$area; - # Determine if current user is able to revoke privileges - if ($area=~m{^/($match_domain)/}) { - if ((&Apache::lonnet::allowed('c'.$role_code,$1)) || - (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) { - $allowed=1; - } - if (((&Apache::lonnet::allowed('dro',$1)) || - (&Apache::lonnet::allowed('dro',$ccdomain))) && - ($role_code ne 'dc')) { - $delallowed=1; - } - } else { - if (&Apache::lonnet::allowed('c'.$role_code,'/')) { - $allowed=1; - } - } - if ($role_code eq 'ca' || $role_code eq 'au') { - $class='Construction Space'; - } elsif ($role_code eq 'su') { - $class='System'; - } else { - $class='Domain'; - } - } - if (($role_code eq 'ca') || ($role_code eq 'aa')) { - $area=~m{/($match_domain)/($match_username)}; - if (&authorpriv($2,$1)) { - $allowed=1; - } else { - $allowed=0; - } - } - my $row = ''; - $row.= ''; - my $active=1; - $active=0 if (($role_end_time) && ($now>$role_end_time)); - if (($active) && ($allowed)) { - $row.= ''; - } else { - if ($active) { - $row.=' '; - } else { - $row.=&mt('expired or revoked'); - } - } - $row.=''; - if ($allowed && !$active) { - $row.= ''; - } else { - $row.=' '; - } - $row.=''; - if ($delallowed) { - $row.= ''; - } else { - $row.=' '; - } - my $plaintext=''; - if (!$croletitle) { - $plaintext=&Apache::lonnet::plaintext($role_code,$class) - } else { - $plaintext= - "Customrole '$croletitle'
defined by $croleuname\@$croleudom"; - } - $row.= ''.$plaintext. - ''.$area. - ''.($role_start_time?localtime($role_start_time) - : ' ' ). - ''.($role_end_time ?localtime($role_end_time) - : ' ' ) - .""; - $sortrole{$sortkey}=$envkey; - $roletext{$envkey}=$row; - $roleclass{$envkey}=$class; - $rolepriv{$envkey}=$allowed; - #$r->print($row); - } # end of foreach (table building loop) - my $rolesdisplay = 0; - my %output = (); - foreach my $type ('Construction Space','Course','Group','Domain','System','Unknown') { - $output{$type} = ''; - foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) { - if ( ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/ ) && ($rolepriv{$sortrole{$which}}) ) { - $output{$type}.= - &Apache::loncommon::start_data_table_row(). - $roletext{$sortrole{$which}}. - &Apache::loncommon::end_data_table_row(); - } - } - unless($output{$type} eq '') { - $output{$type} = ''. - "".&mt($type)."". - $output{$type}; - $rolesdisplay = 1; - } - } - if ($rolesdisplay == 1) { - $r->print(' -

'.$lt{'rer'}.'

'. -&Apache::loncommon::start_data_table("LC_createuser"). -&Apache::loncommon::start_data_table_header_row(). -''.$lt{'rev'}.''.$lt{'ren'}.''.$lt{'del'}. -''.$lt{'rol'}.''.$lt{'ext'}. -''.$lt{'sta'}.''.$lt{'end'}.''. -&Apache::loncommon::end_data_table_header_row()); - foreach my $type ('Construction Space','Course','Group','Domain','System','Unknown') { - if ($output{$type}) { - $r->print($output{$type}."\n"); - } - } - $r->print(&Apache::loncommon::end_data_table()); - } - } # End of unless } ## End of new user/old user logic my $addrolesdisplay = 0; $r->print('

'.&mt('Add Roles').'

'); # # Co-Author # - if (&authorpriv($env{'user.name'},$env{'request.role.domain'}) && + if (&Apache::lonuserutils::authorpriv($env{'user.name'}, + $env{'request.role.domain'}) && ($env{'user.name'} ne $ccuname || $env{'user.domain'} ne $ccdomain)) { # No sense in assigning co-author role to yourself $addrolesdisplay = 1; @@ -1069,7 +866,8 @@ ENDNOPORTPRIV &Apache::loncommon::end_data_table_row()."\n". &Apache::loncommon::end_data_table()); } elsif ($env{'request.role'} =~ /^au\./) { - if (!(&authorpriv($env{'user.name'},$env{'request.role.domain'}))) { + if (!(&Apache::lonuserutils::authorpriv($env{'user.name'}, + $env{'request.role.domain'}))) { $r->print(''. &mt('You do not have privileges to assign co-author roles.'). ''); @@ -1148,6 +946,268 @@ ENDNOPORTPRIV $r->print("".&Apache::loncommon::end_page()); } +sub singleuser_breadcrumb { + my %breadcrumb_text; + if ($env{'form.action'} eq 'singlestudent') { + $breadcrumb_text{'search'} = 'Enroll a student'; + $breadcrumb_text{'userpicked'} = 'Select a user', + $breadcrumb_text{'modify'} = 'Set section/dates', + } else { + $breadcrumb_text{'search'} = 'Create/modify user'; + $breadcrumb_text{'userpicked'} = 'Select a user', + $breadcrumb_text{'modify'} = 'Set user role', + } + return %breadcrumb_text; +} + +sub date_sections_select { + my ($context,$newuser,$formname,$permission) = @_; + my $cid = $env{'request.course.id'}; + my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity($cid); + my $date_table = '

'.&mt('Starting and Ending Dates').'

'."\n". + &Apache::lonuserutils::date_setting_table(undef,undef,$context, + undef,$formname,$permission); + my $rowtitle = 'Section'; + my $secbox = '

'.&mt('Section').'

'."\n". + &Apache::lonuserutils::section_picker($cdom,$cnum,'st',$rowtitle, + $permission); + my $output = $date_table.$secbox; + return $output; +} + +sub validation_javascript { + my ($context,$ccdomain,$pjump_def,$groupslist,$newuser,$formname, + $loaditem) = @_; + my $dc_setcourse_code = ''; + my $nondc_setsection_code = ''; + if ($context eq 'domain') { + my $dcdom = $env{'request.role.domain'}; + $loaditem->{'onload'} = "document.cu.coursedesc.value='';"; + $dc_setcourse_code = &Apache::lonuserutils::dc_setcourse_js('cu','singleuser'); + } else { + $nondc_setsection_code = + &Apache::lonuserutils::setsections_javascript($formname,$groupslist); + } + my $js = &user_modification_js($pjump_def,$dc_setcourse_code, + $nondc_setsection_code,$groupslist); + + my ($jsback,$elements) = &crumb_utilities(); + my $javascript_validations; + if ((&Apache::lonnet::allowed('mau',$ccdomain)) || ($newuser)) { + my ($krbdef,$krbdefdom) = + &Apache::loncommon::get_kerberos_defaults($ccdomain); + $javascript_validations = + &Apache::lonuserutils::javascript_validations('createuser',$krbdefdom,undef, + undef,$ccdomain); + } + $js .= "\n". + ''; + return $js; +} + +sub display_existing_roles { + my ($r,$ccuname,$ccdomain,$inccourses) = @_; + my %rolesdump=&Apache::lonnet::dump('roles',$ccdomain,$ccuname); + # Build up table of user roles to allow revocation and re-enabling of roles. + my ($tmp) = keys(%rolesdump); + if ($tmp !~ /^(con_lost|error)/i) { + my $now=time; + my %lt=&Apache::lonlocal::texthash( + 'rer' => "Existing Roles", + 'rev' => "Revoke", + 'del' => "Delete", + 'ren' => "Re-Enable", + 'rol' => "Role", + 'ext' => "Extent", + 'sta' => "Start", + 'end' => "End", + ); + my (%roletext,%sortrole,%roleclass,%rolepriv); + foreach my $area (sort { my $a1=join('_',(split('_',$a))[1,0]); + my $b1=join('_',(split('_',$b))[1,0]); + return $a1 cmp $b1; + } keys(%rolesdump)) { + next if ($area =~ /^rolesdef/); + my $envkey=$area; + my $role = $rolesdump{$area}; + my $thisrole=$area; + $area =~ s/\_\w\w$//; + my ($role_code,$role_end_time,$role_start_time) = + split(/_/,$role); +# Is this a custom role? Get role owner and title. + my ($croleudom,$croleuname,$croletitle)= + ($role_code=~m{^cr/($match_domain)/($match_username)/(\w+)$}); + my $allowed=0; + my $delallowed=0; + my $sortkey=$role_code; + my $class='Unknown'; + if ($area =~ m{^/($match_domain)/($match_courseid)} ) { + $class='Course'; + my ($coursedom,$coursedir) = ($1,$2); + $sortkey.="\0$coursedom"; + # $1.'_'.$2 is the course id (eg. 103_12345abcef103l3). + my %coursedata= + &Apache::lonnet::coursedescription($1.'_'.$2); + my $carea; + if (defined($coursedata{'description'})) { + $carea=$coursedata{'description'}. + '
'.&mt('Domain').': '.$coursedom.(' 'x8). + &Apache::loncommon::syllabuswrapper('Syllabus',$coursedir,$coursedom); + $sortkey.="\0".$coursedata{'description'}; + $class=$coursedata{'type'}; + } else { + $carea=&mt('Unavailable course').': '.$area; + $sortkey.="\0".&mt('Unavailable course').': '.$area; + } + $sortkey.="\0$coursedir"; + $inccourses->{$1.'_'.$2}=1; + if ((&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2)) || + (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) { + $allowed=1; + } + if ((&Apache::lonnet::allowed('dro',$1)) || + (&Apache::lonnet::allowed('dro',$ccdomain))) { + $delallowed=1; + } +# - custom role. Needs more info, too + if ($croletitle) { + if (&Apache::lonnet::allowed('ccr',$1.'/'.$2)) { + $allowed=1; + $thisrole.='.'.$role_code; + } + } + # Compute the background color based on $area + if ($area=~m{^/($match_domain)/($match_courseid)/(\w+)}) { + $carea.='
Section: '.$3; + $sortkey.="\0$3"; + if (!$allowed) { + if ($env{'request.course.sec'} eq $3) { + if (&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2.'/'.$3)) { + $allowed = 1; + } + } + } + } + $area=$carea; + } else { + $sortkey.="\0".$area; + # Determine if current user is able to revoke privileges + if ($area=~m{^/($match_domain)/}) { + if ((&Apache::lonnet::allowed('c'.$role_code,$1)) || + (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) { + $allowed=1; + } + if (((&Apache::lonnet::allowed('dro',$1)) || + (&Apache::lonnet::allowed('dro',$ccdomain))) && + ($role_code ne 'dc')) { + $delallowed=1; + } + } else { + if (&Apache::lonnet::allowed('c'.$role_code,'/')) { + $allowed=1; + } + } + if ($role_code eq 'ca' || $role_code eq 'au') { + $class='Construction Space'; + } elsif ($role_code eq 'su') { + $class='System'; + } else { + $class='Domain'; + } + } + if (($role_code eq 'ca') || ($role_code eq 'aa')) { + $area=~m{/($match_domain)/($match_username)}; + if (&Apache::lonuserutils::authorpriv($2,$1)) { + $allowed=1; + } else { + $allowed=0; + } + } + my $row = ''; + $row.= ''; + my $active=1; + $active=0 if (($role_end_time) && ($now>$role_end_time)); + if (($active) && ($allowed)) { + $row.= ''; + } else { + if ($active) { + $row.=' '; + } else { + $row.=&mt('expired or revoked'); + } + } + $row.=''; + if ($allowed && !$active) { + $row.= ''; + } else { + $row.=' '; + } + $row.=''; + if ($delallowed) { + $row.= ''; + } else { + $row.=' '; + } + my $plaintext=''; + if (!$croletitle) { + $plaintext=&Apache::lonnet::plaintext($role_code,$class) + } else { + $plaintext= + "Customrole '$croletitle'
defined by $croleuname\@$croleudom"; + } + $row.= ''.$plaintext. + ''.$area. + ''.($role_start_time?localtime($role_start_time) + : ' ' ). + ''.($role_end_time ?localtime($role_end_time) + : ' ' ) + .""; + $sortrole{$sortkey}=$envkey; + $roletext{$envkey}=$row; + $roleclass{$envkey}=$class; + $rolepriv{$envkey}=$allowed; + #$r->print($row); + } # end of foreach (table building loop) + my $rolesdisplay = 0; + my %output = (); + foreach my $type ('Construction Space','Course','Group','Domain','System','Unknown') { + $output{$type} = ''; + foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) { + if ( ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/ ) && ($rolepriv{$sortrole{$which}}) ) { + $output{$type}.= + &Apache::loncommon::start_data_table_row(). + $roletext{$sortrole{$which}}. + &Apache::loncommon::end_data_table_row(); + } + } + unless($output{$type} eq '') { + $output{$type} = ''. + "".&mt($type)."". + $output{$type}; + $rolesdisplay = 1; + } + } + if ($rolesdisplay == 1) { + $r->print(' +

'.$lt{'rer'}.'

'. +&Apache::loncommon::start_data_table("LC_createuser"). +&Apache::loncommon::start_data_table_header_row(). +''.$lt{'rev'}.''.$lt{'ren'}.''.$lt{'del'}. +''.$lt{'rol'}.''.$lt{'ext'}. +''.$lt{'sta'}.''.$lt{'end'}.''. +&Apache::loncommon::end_data_table_header_row()); + foreach my $type ('Construction Space','Course','Group','Domain','System','Unknown') { + if ($output{$type}) { + $r->print($output{$type}."\n"); + } + } + $r->print(&Apache::loncommon::end_data_table()); + } + } # End of check for keys in rolesdump + return; +} + sub user_authentication { my ($ccuname,$ccdomain,$krbdefdom,$abv_auth) = @_; my $currentauth=&Apache::lonnet::queryauthenticate($ccuname,$ccdomain); @@ -1197,12 +1257,8 @@ $lt{'uuas'} ($currentauth). $lt{'adcs'}. ENDBADAUTH } } else { # Authentication type is valid - &initialize_authen_forms($ccdomain,$currentauth); - my $authformnop_row; - if (&Apache::lonnet::allowed('mau',$ccdomain)) { - $authformnop_row = &Apache::loncommon::start_data_table_row(); - } - my ($authformcurrent,$authform_other,$can_modify) = + &initialize_authen_forms($ccdomain,$currentauth,'modifyuser'); + my ($authformcurrent,$can_modify,@authform_others) = &modify_login_block($ccdomain,$currentauth); if (&Apache::lonnet::allowed('mau',$ccdomain)) { # Current user has login modification privileges @@ -1217,7 +1273,7 @@ ENDBADAUTH ''."\n". '

'.$lt{'ld'}.'

'. &Apache::loncommon::start_data_table(). - $authformnop_row. + &Apache::loncommon::start_data_table_row(). ''.$authformnop; if ($can_modify) { $outcome .= ''."\n". @@ -1229,11 +1285,12 @@ ENDBADAUTH $outcome .= ' ('.$authformcurrent.')'. &Apache::loncommon::end_data_table_row()."\n"; } - if ($authform_other ne '') { - $outcome .= $authform_other; + foreach my $item (@authform_others) { + $outcome .= &Apache::loncommon::start_data_table_row(). + ''.$item.''. + &Apache::loncommon::end_data_table_row()."\n"; } - $outcome .= &Apache::loncommon::end_data_table_row(). - &Apache::loncommon::end_data_table(); + $outcome .= &Apache::loncommon::end_data_table(); } else { if (&Apache::lonnet::allowed('mau',$env{'request.role.domain'})) { my %lt=&Apache::lonlocal::texthash( @@ -1256,18 +1313,14 @@ sub modify_login_block { my %domconfig = &Apache::lonnet::get_dom('configuration',['usercreation'],$dom); my ($authnum,%can_assign) = &Apache::loncommon::get_assignable_auth($dom); - my ($authformcurrent,$authform_other,$show_override_msg); + my ($authformcurrent,@authform_others,$show_override_msg); if ($currentauth=~/^krb(4|5):/) { $authformcurrent=$authformkrb; if ($can_assign{'int'}) { - $authform_other = &Apache::loncommon::start_data_table_row(). - ''.$authformint.''. - &Apache::loncommon::end_data_table_row()."\n" + push(@authform_others,$authformint); } if ($can_assign{'loc'}) { - $authform_other .= &Apache::loncommon::start_data_table_row(). - ''.$authformloc.''. - &Apache::loncommon::end_data_table_row()."\n"; + push(@authform_others,$authformloc); } if (($can_assign{'krb4'}) || ($can_assign{'krb5'})) { $show_override_msg = 1; @@ -1275,14 +1328,10 @@ sub modify_login_block { } elsif ($currentauth=~/^internal:/) { $authformcurrent=$authformint; if (($can_assign{'krb4'}) || ($can_assign{'krb5'})) { - $authform_other = &Apache::loncommon::start_data_table_row(). - ''.$authformkrb.''. - &Apache::loncommon::end_data_table_row()."\n"; + push(@authform_others,$authformkrb); } if ($can_assign{'loc'}) { - $authform_other .= &Apache::loncommon::start_data_table_row(). - ''.$authformloc.''. - &Apache::loncommon::end_data_table_row()."\n"; + push(@authform_others,$authformloc); } if ($can_assign{'int'}) { $show_override_msg = 1; @@ -1290,19 +1339,13 @@ sub modify_login_block { } elsif ($currentauth=~/^unix:/) { $authformcurrent=$authformfsys; if (($can_assign{'krb4'}) || ($can_assign{'krb5'})) { - $authform_other = &Apache::loncommon::start_data_table_row(). - ''.$authformkrb.''. - &Apache::loncommon::end_data_table_row()."\n"; + push(@authform_others,$authformkrb); } if ($can_assign{'int'}) { - $authform_other .= &Apache::loncommon::start_data_table_row(). - ''.$authformint.''. - &Apache::loncommon::end_data_table_row()."\n" + push(@authform_others,$authformint); } if ($can_assign{'loc'}) { - $authform_other .= &Apache::loncommon::start_data_table_row(). - ''.$authformloc.''. - &Apache::loncommon::end_data_table_row()."\n"; + push(@authform_others,$authformloc); } if ($can_assign{'fsys'}) { $show_override_msg = 1; @@ -1310,35 +1353,38 @@ sub modify_login_block { } elsif ($currentauth=~/^localauth:/) { $authformcurrent=$authformloc; if (($can_assign{'krb4'}) || ($can_assign{'krb5'})) { - $authform_other = &Apache::loncommon::start_data_table_row(). - ''.$authformkrb.''. - &Apache::loncommon::end_data_table_row()."\n"; + push(@authform_others,$authformkrb); } if ($can_assign{'int'}) { - $authform_other .= &Apache::loncommon::start_data_table_row(). - ''.$authformint.''. - &Apache::loncommon::end_data_table_row()."\n" + push(@authform_others,$authformint); } if ($can_assign{'loc'}) { $show_override_msg = 1; } } if ($show_override_msg) { - $authformcurrent.= ' '. + $authformcurrent = ''."\n". + ''. + ''. + '
'.$authformcurrent. + '
   '.&mt('Currently in use').''. &mt('will override current values'). - '
'; + '
'; } - return ($authformcurrent,$authform_other,$show_override_msg); + return ($authformcurrent,$show_override_msg,@authform_others); } sub personal_data_display { - my ($ccuname,$ccdomain,$newuser,%inst_results) = @_; - my ($output,%userenv); + my ($ccuname,$ccdomain,$newuser,$context,$inst_results) = @_; + my ($output,$showforceid,%userenv,%domconfig); 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); } my %lt=&Apache::lonlocal::texthash( 'pd' => "Personal Data", @@ -1370,27 +1416,57 @@ sub personal_data_display { } $output .= &Apache::lonhtmlcommon::row_title($rowtitle,undef,'LC_oddrow_value')."\n"; if ($newuser) { - if ($inst_results{$item} ne '') { - $output .= ''.$inst_results{$item}; + if (ref($inst_results) eq 'HASH') { + if ($inst_results->{$item} ne '') { + $output .= ''.$inst_results->{$item}; + } else { + $output .= ''; + } } else { $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) { $output .= ''; } else { $output .= $userenv{$item}; } + if ($item eq 'id') { + $showforceid = $canmodify; + } } $output .= &Apache::lonhtmlcommon::row_closure(1); } $output .= &Apache::lonhtmlcommon::end_pick_box(); - return $output; + if (wantarray) { + return ($output,$showforceid); + } else { + return $output; + } } # ================================================================= Phase Three sub update_user_data { - my ($r) = @_; + my ($r,$context) = @_; my $uhome=&Apache::lonnet::homeserver($env{'form.ccuname'}, $env{'form.ccdomain'}); # Error messages @@ -1405,20 +1481,20 @@ sub update_user_data { } else { $title='Modify User Privileges'; } - + my $newuser = 0; my ($jsback,$elements) = &crumb_utilities(); my $jscript = ''."\n"; - + my %breadcrumb_text = &singleuser_breadcrumb(); $r->print(&Apache::loncommon::start_page($title,$jscript)); &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:backPage(document.userupdate)", - text=>"Create/modify user", + text=>$breadcrumb_text{'search'}, faq=>282,bug=>'Instructor Interface',}); if ($env{'form.prevphase'} eq 'userpicked') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:backPage(document.userupdate,'get_user_info','select')", - text=>"Select a user", + text=>$breadcrumb_text{'userpicked'}, faq=>282,bug=>'Instructor Interface',}); } &Apache::lonhtmlcommon::add_breadcrumb @@ -1578,6 +1654,10 @@ sub update_user_data { } } ## + my (@userroles,%userupdate,$cnum,$cdom,$namechanged); + if ($context eq 'course') { + ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity(); + } if (! $env{'form.makeuser'} ) { # Check for need to change my %userenv = &Apache::lonnet::get @@ -1588,10 +1668,115 @@ sub update_user_data { if ($tmp =~ /^(con_lost|error)/i) { %userenv = (); } - # Check to see if we need to change user information + my $no_forceid_alert; + # Check to see if user information can be changed + my %domconfig = + &Apache::lonnet::get_dom('configuration',['usermodification'], + $env{'form.ccdomain'}); + 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') { + $auname = $env{'user.name'}; + $audom = $env{'user.domain'}; + } + foreach my $item (keys(%roles)) { + my ($rolenum,$roledom,$role) = split(/:/,$item); + if ($context eq 'course') { + if ($cnum ne '' && $cdom ne '') { + if ($rolenum eq $cnum && $roledom eq $cdom) { + if (!grep(/^\Q$role\E$/,@userroles)) { + push(@userroles,$role); + } + } + } + } elsif ($context eq 'author') { + if ($rolenum eq $auname && $roledom eq $audom) { + if (!grep(/^\Q$role\E$/,@userroles)) { + push(@userroles,$role); + } + } + } + } + # 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); + } + } elsif ($key =~/^form\.ren\:\Q$cdom\E\/\Q$cnum\E(\/?\w*)_([^_]+)/) { + if (!grep(/^\Q$1\E$/,@userroles)) { + push(@userroles,$1); + } + } + } + } + } + #Check to see if we can change personal data for the user + my (@mod_disallowed,@longroles); + foreach my $role (@userroles) { + if ($role eq 'cr') { + push(@longroles,'Custom'); + } else { + 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; + } + } + } # Strip leading and trailing whitespace $env{'form.c'.$item} =~ s/(\s+$|^\s+)//g; + if (!$canmodify) { + if (defined($env{'form.c'.$item})) { + if ($env{'form.c'.$item} ne $userenv{$item}) { + push(@mod_disallowed,$item); + } + } + $env{'form.c'.$item} = $userenv{$item}; + } } # Check to see if we can change the ID/student number my $forceid = $env{'form.forceid'}; @@ -1605,6 +1790,7 @@ sub update_user_data { (!$forceid)) { if ($env{'form.cid'} ne $uidhash{$env{'form.ccuname'}}) { $env{'form.cid'} = $userenv{'id'}; + $no_forceid_alert = &mt('New student/employeeID does not match existing ID for this user.').'
'.&mt('Change is not permitted without checking the \'Force ID change\' checkbox on the previous page.').'
'."\n"; } } if ($env{'form.cid'} ne $userenv{'id'}) { @@ -1622,11 +1808,13 @@ sub update_user_data { } } } - my ($quotachanged,$namechanged,$oldportfolioquota,$newportfolioquota, - $inststatus,$isdefault,$defquotatext); + my ($quotachanged,$oldportfolioquota,$newportfolioquota, + $inststatus,$oldisdefault,$newisdefault,$olddefquotatext, + $newdefquotatext); my ($defquota,$settingstatus) = &Apache::loncommon::default_quota($env{'form.ccdomain'},$inststatus); my %changeHash; + $changeHash{'portfolioquota'} = $userenv{'portfolioquota'}; if ($userenv{'portfolioquota'} ne '') { $oldportfolioquota = $userenv{'portfolioquota'}; if ($env{'form.customquota'} == 1) { @@ -1636,15 +1824,16 @@ sub update_user_data { $newportfolioquota = $env{'form.portfolioquota'}; $newportfolioquota =~ s/[^\d\.]//g; } - if ($newportfolioquota != $userenv{'portfolioquota'}) { + if ($newportfolioquota != $oldportfolioquota) { $quotachanged = "a_admin($newportfolioquota,\%changeHash); } } else { $quotachanged = "a_admin('',\%changeHash); $newportfolioquota = $defquota; - $isdefault = 1; + $newisdefault = 1; } } else { + $oldisdefault = 1; $oldportfolioquota = $defquota; if ($env{'form.customquota'} == 1) { if ($env{'form.portfolioquota'} eq '') { @@ -1656,43 +1845,47 @@ sub update_user_data { $quotachanged = "a_admin($newportfolioquota,\%changeHash); } else { $newportfolioquota = $defquota; - $isdefault = 1; + $newisdefault = 1; } } - if ($isdefault) { - if ($settingstatus eq '') { - $defquotatext = &mt('(default)'); - } else { - my ($usertypes,$order) = - &Apache::lonnet::retrieve_inst_usertypes($env{'form.ccdomain'}); - if ($usertypes->{$settingstatus} eq '') { - $defquotatext = &mt('(default)'); - } else { - $defquotatext = &mt('(default for [_1])',$usertypes->{$settingstatus}); - } - } + if ($oldisdefault) { + $olddefquotatext = &get_defaultquota_text($settingstatus); + } + if ($newisdefault) { + $newdefquotatext = &get_defaultquota_text($settingstatus); } - if (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'}) && - ($env{'form.cfirstname'} ne $userenv{'firstname'} || - $env{'form.cmiddlename'} ne $userenv{'middlename'} || - $env{'form.clastname'} ne $userenv{'lastname'} || - $env{'form.cgeneration'} ne $userenv{'generation'} || - $env{'form.cid'} ne $userenv{'id'} || - $env{'form.cpermanentemail'} ne $userenv{'permanentemail'} )) { + if ($env{'form.cfirstname'} ne $userenv{'firstname'} || + $env{'form.cmiddlename'} ne $userenv{'middlename'} || + $env{'form.clastname'} ne $userenv{'lastname'} || + $env{'form.cgeneration'} ne $userenv{'generation'} || + $env{'form.cid'} ne $userenv{'id'} || + $env{'form.cpermanentemail'} ne $userenv{'permanentemail'} ) { $namechanged = 1; } - if ($namechanged) { - # Make the change + if ($namechanged || $quotachanged) { $changeHash{'firstname'} = $env{'form.cfirstname'}; $changeHash{'middlename'} = $env{'form.cmiddlename'}; $changeHash{'lastname'} = $env{'form.clastname'}; $changeHash{'generation'} = $env{'form.cgeneration'}; $changeHash{'id'} = $env{'form.cid'}; $changeHash{'permanentemail'} = $env{'form.cpermanentemail'}; - my $putresult = &Apache::lonnet::put - ('environment',\%changeHash, - $env{'form.ccdomain'},$env{'form.ccuname'}); - if ($putresult eq 'ok') { + my ($quotachgresult,$namechgresult); + if ($quotachanged) { + $quotachgresult = + &Apache::lonnet::put('environment',\%changeHash, + $env{'form.ccdomain'},$env{'form.ccuname'}); + } + if ($namechanged) { + # Make the change + $namechgresult = + &Apache::lonnet::modifyuser($env{'form.ccdomain'}, + $env{'form.ccuname'},$changeHash{'id'},undef,undef, + $changeHash{'firstname'},$changeHash{'middlename'}, + $changeHash{'lastname'},$changeHash{'generation'}, + $changeHash{'id'},undef,$changeHash{'permanentemail'}); + } + if (($namechanged && $namechgresult eq 'ok') || + ($quotachanged && $quotachgresult eq 'ok')) { # Tell the user we changed the name my %lt=&Apache::lonlocal::texthash( 'uic' => "User Information Changed", @@ -1729,7 +1922,7 @@ END $userenv{'generation'} $userenv{'id'} $userenv{'permanentemail'} - $oldportfolioquota Mb + $oldportfolioquota Mb $olddefquotatext END $r->print(&Apache::loncommon::end_data_table_row(). &Apache::loncommon::start_data_table_row()); @@ -1741,16 +1934,16 @@ END $env{'form.cgeneration'} $env{'form.cid'} $env{'form.cpermanentemail'} - $newportfolioquota Mb $defquotatext + $newportfolioquota Mb $newdefquotatext END $r->print(&Apache::loncommon::end_data_table_row(). - &Apache::loncommon::end_data_table()); + &Apache::loncommon::end_data_table().'
'); if ($env{'form.cid'} ne $userenv{'id'}) { &Apache::lonnet::idput($env{'form.ccdomain'}, ($env{'form.ccuname'} => $env{'form.cid'})); if (($recurseid) && (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'}))) { - my %userupdate = ( + %userupdate = ( lastname => $env{'form.clasaname'}, middlename => $env{'form.cmiddlename'}, firstname => $env{'form.cfirstname'}, @@ -1775,17 +1968,11 @@ END } else { # error occurred $r->print(''.&mt('Unable to successfully change environment for').' '. $env{'form.ccuname'}.' '.&mt('in domain').' '. - $env{'form.ccdomain'}.''); + $env{'form.ccdomain'}.'

'); } } else { # End of if ($env ... ) logic - my $putresult; - if ($quotachanged) { - $putresult = &Apache::lonnet::put - ('environment',\%changeHash, - $env{'form.ccdomain'},$env{'form.ccuname'}); - } - # They did not want to change the users name but we can - # still tell them what the name is + # They did not want to change the users name or quota but we can + # still tell them what the name and quota are my %lt=&Apache::lonlocal::texthash( 'id' => "ID/Student number", 'mail' => "Permanent e-mail", @@ -1794,20 +1981,41 @@ END $r->print(<<"END");

$userenv{'firstname'} $userenv{'middlename'} $userenv{'lastname'} $userenv{'generation'} END - if ($userenv{'permanentemail'} eq '') { - $r->print('

'); + if ($userenv{'permanentemail'} ne '') { + $r->print('
['.$lt{'mail'}.': '. + $userenv{'permanentemail'}.']'); + } + $r->print('
['.$lt{'disk'}.': '.$oldportfolioquota.' Mb '. + $olddefquotatext.']'); + } + if (@mod_disallowed) { + my ($rolestr,$contextname); + if (@longroles > 0) { + $rolestr = join(', ',@longroles); } else { - $r->print('  ('.$lt{'mail'}.': '. - $userenv{'permanentemail'}.')'); + $rolestr = &mt('No roles'); } - if ($putresult eq 'ok') { - if ($oldportfolioquota != $newportfolioquota) { - $r->print('

'.$lt{'disk'}.': '.$newportfolioquota.' Mb '. - $defquotatext.'

'); - &Apache::lonnet::appenv('environment.portfolioquota' => $changeHash{'portfolioquota'}); - } + if ($context eq 'course') { + $contextname = &mt('course'); + } elsif ($context eq 'author') { + $contextname = &mt('co-author'); + } + $r->print(&mt('The following fields were not updated: ').'
    '); + my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles(); + foreach my $field (@mod_disallowed) { + $r->print('
  • '.$fieldtitles{$field}.'
  • '."\n"); + } + $r->print('
'); + if (@mod_disallowed == 1) { + $r->print(&mt("You do not have the authority to change this field given the user's current set of active/future [_1] roles:",$contextname)); + } else { + $r->print(&mt("You do not have the authority to change these fields given the user's current set of active/future [_1] roles:",$contextname)); } + $r->print(''.$rolestr.'
'. + &mt('Contact your helpdesk for more information.',"javascript:helpMenu('display')").'
'); } + $r->print($no_forceid_alert. + &Apache::lonuserutils::print_namespacing_alerts($env{'form.ccdomain'},\%alerts, \%curr_rules)); } ## my $now=time; @@ -2035,6 +2243,23 @@ END $r->print(&Apache::loncommon::end_page()); } +sub get_defaultquota_text { + my ($settingstatus) = @_; + my $defquotatext; + if ($settingstatus eq '') { + $defquotatext = &mt('(default)'); + } else { + my ($usertypes,$order) = + &Apache::lonnet::retrieve_inst_usertypes($env{'form.ccdomain'}); + if ($usertypes->{$settingstatus} eq '') { + $defquotatext = &mt('(default)'); + } else { + $defquotatext = &mt('(default for [_1])',$usertypes->{$settingstatus}); + } + } + return $defquotatext; +} + sub update_result_form { my ($uhome) = @_; my $outcome = @@ -2042,6 +2267,9 @@ sub update_result_form { foreach my $item ('srchby','srchin','srchtype','srchterm','srchdomain','ccuname','ccdomain') { $outcome .= ''."\n"; } + if ($env{'form.origname'} ne '') { + $outcome .= ''."\n"; + } foreach my $item ('sortby','seluname','seludom') { if (exists($env{'form.'.$item})) { $outcome .= ''."\n"; @@ -2400,7 +2628,7 @@ sub handler { if ($env{'request.course.id'}) { $context = 'course'; } elsif ($env{'request.role'} =~ /^au\./) { - $context = 'construction_space'; + $context = 'author'; } else { $context = 'domain'; } @@ -2412,7 +2640,8 @@ sub handler { ({href=>"/adm/createuser", text=>"User Management"}); } - my ($permission,$allowed) = &get_permission($context); + my ($permission,$allowed) = + &Apache::lonuserutils::get_permission($context); if (!$allowed) { $env{'user.error.msg'}= "/adm/createuser:cst:0:0:Cannot create/modify user data ". @@ -2427,7 +2656,7 @@ sub handler { if (! exists($env{'form.action'})) { $r->print(&header()); $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management')); - $r->print(&print_main_menu($permission)); + $r->print(&print_main_menu($permission,$context)); $r->print(&Apache::loncommon::end_page()); } elsif ($env{'form.action'} eq 'upload' && $permission->{'cusr'}) { $r->print(&header()); @@ -2451,22 +2680,8 @@ sub handler { &Apache::lonuserutils::print_first_users_upload_form($r,$context); } $r->print(''.&Apache::loncommon::end_page()); - } elsif ($env{'form.action'} eq 'expire' && $permission->{'cusr'}) { - $r->print(&header()); - &Apache::lonhtmlcommon::add_breadcrumb - ({href=>'/adm/createuser?action=expire', - text=>"Expire User Roles"}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('Expire User Roles', - 'User_Management_Drops')); - if (! exists($env{'form.state'})) { - &Apache::lonuserutils::print_expire_menu($r,$context); - } elsif ($env{'form.state'} eq 'done') { - &Apache::lonuserutils::expire_user_list($r,$context); - } else { - &Apache::lonuserutils::print_expire_menu($r,$context); - } - $r->print(&Apache::loncommon::end_page()); - } elsif ($env{'form.action'} eq 'singleuser' && $permission->{'cusr'}) { + } elsif ((($env{'form.action'} eq 'singleuser') || ($env{'form.action'} + eq 'singlestudent')) && ($permission->{'cusr'})) { my $phase = $env{'form.phase'}; my @search = ('srchterm','srchby','srchin','srchtype','srchdomain'); &Apache::loncreateuser::restore_prev_selections(); @@ -2475,16 +2690,34 @@ sub handler { $srch->{$item} = $env{'form.'.$item}; } - if (($phase eq 'get_user_info') || ($phase eq 'userpicked')) { - if ($env{'form.phase'} eq 'get_user_info') { + if (($phase eq 'get_user_info') || ($phase eq 'userpicked') || + ($phase eq 'createnewuser')) { + if ($env{'form.phase'} eq 'createnewuser') { + my $response; + if ($env{'form.srchterm'} !~ /^$match_username$/) { + my $response = &mt('You must specify a valid username. Only the following are allowed: letters numbers - . @'); + &print_username_entry_form($r,$context,$response,$srch); + } else { + my $ccuname =&LONCAPA::clean_username($srch->{'srchterm'}); + my $ccdomain=&LONCAPA::clean_domain($srch->{'srchdomain'}); + &print_user_modification_page($r,$ccuname,$ccdomain, + $srch,$response,$context); + } + } elsif ($env{'form.phase'} eq 'get_user_info') { my ($currstate,$response,$forcenewuser,$results) = &user_search_result($srch); if ($env{'form.currstate'} eq 'modify') { $currstate = $env{'form.currstate'}; } if ($currstate eq 'select') { + my $operation; + if ($env{'form.action'} eq 'singleuser') { + $operation = 'createuser'; + } elsif ($env{'form.action'} eq 'singlestudent') { + $operation = 'enrollstudent'; + } &print_user_selection_page($r,$response,$srch,$results, - 'createuser',\@search); + $operation,\@search,$context); } elsif ($currstate eq 'modify') { my ($ccuname,$ccdomain); if (($srch->{'srchby'} eq 'uname') && @@ -2505,7 +2738,7 @@ sub handler { } elsif ($currstate eq 'query') { &print_user_query_page($r,'createuser'); } else { - &print_username_entry_form($r,$response,$srch, + &print_username_entry_form($r,$context,$response,$srch, $forcenewuser); } } elsif ($env{'form.phase'} eq 'userpicked') { @@ -2515,9 +2748,9 @@ sub handler { $context); } } elsif ($env{'form.phase'} eq 'update_user_data') { - &update_user_data($r); + &update_user_data($r,$context); } else { - &print_username_entry_form($r,undef,$srch); + &print_username_entry_form($r,$context,undef,$srch); } } elsif ($env{'form.action'} eq 'custom' && $permission->{'custom'}) { if ($env{'form.phase'} eq 'set_custom_roles') { @@ -2525,7 +2758,8 @@ sub handler { } else { &custom_role_editor($r); } - } elsif ($env{'form.action'} eq 'listusers' && $permission->{'view'}) { + } elsif (($env{'form.action'} eq 'listusers') && + ($permission->{'view'} || $permission->{'cusr'})) { if ($env{'form.phase'} eq 'bulkchange') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>'backPage(document.studentform)', @@ -2566,19 +2800,24 @@ sub handler { $formname,$totcodes,$codetitles,$idlist,$idlist_titles); $r->print(&Apache::loncommon::end_page()); } - } elsif ($env{'form.action'} eq 'expire' && $permission->{'cusr'}) { + } elsif ($env{'form.action'} eq 'drop' && $permission->{'cusr'}) { $r->print(&header()); &Apache::lonhtmlcommon::add_breadcrumb ({href=>'/adm/createuser?action=drop', - text=>"Expire Users"}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('Expire User Roles', - 'User_Management_Drops')); - if (! exists($env{'form.state'})) { - &Apache::lonuserutils::print_expire_menu($r,$context); + text=>"Drop Students"}); + if (!exists($env{'form.state'})) { + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Drop Students', + 'Course_Drop_Student')); + + &Apache::lonuserutils::print_drop_menu($r,$context,$permission); } elsif ($env{'form.state'} eq 'done') { - &Apache::lonuserutiles::expire_user_list($r,$context); - } else { - &print_expire_menu($r,$context); + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>'/adm/createuser?action=drop', + text=>"Result"}); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Drop Students', + 'Course_Drop_Student')); + &Apache::lonuserutils::update_user_list($r,$context,undef, + $env{'form.action'}); } $r->print(&Apache::loncommon::end_page()); } elsif ($env{'form.action'} eq 'dateselect') { @@ -2594,7 +2833,7 @@ sub handler { } else { $r->print(&header()); $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management')); - $r->print(&print_main_menu($permission)); + $r->print(&print_main_menu($permission,$context)); $r->print(&Apache::loncommon::end_page()); } return OK; @@ -2634,35 +2873,80 @@ END ############################################################### # Menu Phase One sub print_main_menu { - my ($permission) = @_; + my ($permission,$context) = @_; + my %links = ( + domain => { + upload => 'Upload a File of Users', + singleuser => 'Add/Manage a Single User', + listusers => 'Manage Multiple Users', + }, + author => { + upload => 'Upload a File of Co-authors', + singleuser => 'Add/Manage a Single Co-author', + listusers => 'Display Co-authors and Manage Multiple Users', + }, + course => { + upload => 'Upload a File of Course Users', + singleuser => 'Add/Manage a Single Course User', + listusers => 'Display Class Lists and Manage Multiple Users', + }, + ); my @menu = ( - { text => 'Upload a File of Users to Modify/Create Users and/or Add roles', + { text => $links{$context}{'upload'}, help => 'User_Management_Upload', action => 'upload', permission => $permission->{'cusr'}, }, - { text => 'Create User/Set User Roles for a single user', + { text => $links{$context}{'singleuser'}, help => 'User_Management_Single_User', action => 'singleuser', permission => $permission->{'cusr'}, }, - { text => 'Display Lists of Users', + { text => $links{$context}{'listusers'}, help => 'User_Management_List', action => 'listusers', - permission => $permission->{'view'}, - }, -# { text => 'Expire User Roles', -# help => 'User_Management_Drops', -# action => 'expire', -# permission => $permission->{'cusr'}, -# }, - { text => 'Edit Custom Roles', - help => 'Custom_Role_Edit', - action => 'custom', - permission => $permission->{'custom'}, + permission => ($permission->{'view'} || $permission->{'cusr'}), }, ); + if ($context eq 'domain' || $context eq 'course') { + my $customlink = { text => 'Edit Custom Roles', + help => 'Custom_Role_Edit', + action => 'custom', + permission => $permission->{'custom'}, + }; + push(@menu,$customlink); + } + if ($context eq 'course') { + my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity(); + my @courselinks = + ( + { text => 'Enroll a Single Student', + help => 'Course_Single_Student', + action => 'singlestudent', + permission => $permission->{'cusr'}, + }, + { text => 'Drop Students', + help => 'Course_Drop_Student', + action => 'drop', + permission => $permission->{'cusr'}, + }); + if (!exists($permission->{'cusr_section'})) { + push(@courselinks, + { text => 'Automated Student Enrollment Manager', + permission => (&Apache::lonnet::auto_run($cnum,$cdom) + && $permission->{'cusr'}), + url => '/adm/populate', + }); + } + push(@courselinks, + { text => 'Manage Course Groups', + help => 'Course_Manage_Group', + permission => $permission->{'grp_manage'}, + url => '/adm/coursegroups?refpage=cusr', + }); + push(@menu,@courselinks); + } my $menu_html = ''; foreach my $menu_item (@menu) { next if (! $menu_item->{'permission'}); @@ -2684,57 +2968,6 @@ sub print_main_menu { return $menu_html; } -sub get_permission { - my ($context) = @_; - my %permission; - if ($context eq 'course') { - if ((&Apache::lonnet::allowed('cta',$env{'request.course.id'})) || - (&Apache::lonnet::allowed('cin',$env{'request.course.id'})) || - (&Apache::lonnet::allowed('ccr',$env{'request.course.id'})) || - (&Apache::lonnet::allowed('cep',$env{'request.course.id'})) || - (&Apache::lonnet::allowed('cst',$env{'request.course.id'}))) { - $permission{'cusr'} = 1; - $permission{'view'} = - &Apache::lonnet::allowed('vcl',$env{'request.course.id'}); - - } - if (&Apache::lonnet::allowed('ccr',$env{'request.course.id'})) { - $permission{'custom'} = 1; - } - if (&Apache::lonnet::allowed('vcl',$env{'request.course.id'})) { - $permission{'view'} = 1; - if (!$permission{'view'}) { - my $scope = $env{'request.course.id'}.'/'.$env{'request.course.sec'}; - $permission{'view'} = &Apache::lonnet::allowed('vcl',$scope); - if ($permission{'view'}) { - $permission{'view_section'} = $env{'request.course.sec'}; - } - } - } - } elsif ($context eq 'construction_space') { - $permission{'cusr'} = &authorpriv($env{'user.name'},$env{'request.role.domain'}); - $permission{'view'} = $permission{'cusr'}; - } else { - if ((&Apache::lonnet::allowed('cad',$env{'request.role.domain'})) || - (&Apache::lonnet::allowed('cli',$env{'request.role.domain'})) || - (&Apache::lonnet::allowed('cau',$env{'request.role.domain'})) || - (&Apache::lonnet::allowed('csc',$env{'request.role.domain'})) || - (&Apache::lonnet::allowed('cdg',$env{'request.role.domain'})) || - (&Apache::lonnet::allowed('mau',$env{'request.role.domain'}))) { - $permission{'cusr'} = 1; - } - if (&Apache::lonnet::allowed('ccr',$env{'request.role.domain'})) { - $permission{'custom'} = 1; - } - $permission{'view'} = $permission{'cusr'}; - } - my $allowed = 0; - foreach my $perm (values(%permission)) { - if ($perm) { $allowed=1; last; } - } - return (\%permission,$allowed); -} - sub restore_prev_selections { my %saveable_parameters = ('srchby' => 'scalar', 'srchin' => 'scalar', @@ -3137,6 +3370,10 @@ sub crumb_utilities { srchtype => 'selectbox', srchdomain => 'selectbox', }, + crtusername => { + srchterm => 'text', + srchdomain => 'selectbox', + }, docustom => { rolename => 'selectbox', newrolename => 'textbox', @@ -3152,8 +3389,18 @@ sub crumb_utilities { my $jsback .= qq| function backPage(formname,prevphase,prevstate) { - formname.phase.value = prevphase; - formname.currstate.value = prevstate; + if (typeof prevphase == 'undefined') { + formname.phase.value = ''; + } + else { + formname.phase.value = prevphase; + } + if (typeof prevstate == 'undefined') { + formname.currstate.value = ''; + } + else { + formname.currstate.value = prevstate; + } formname.submit(); } |; @@ -3195,7 +3442,8 @@ sub course_level_table { &Apache::loncommon::get_sections($domain,$cnum); } } - foreach my $role ('st','ta','ep','in','cc') { + my @roles = &Apache::lonuserutils::roles_by_context('course'); + foreach my $role (@roles) { if (&Apache::lonnet::allowed('c'.$role,$thiscourse)) { my $plrole=&Apache::lonnet::plaintext($role); $table .= &Apache::loncommon::start_data_table_row(). @@ -3295,6 +3543,7 @@ $table. sub course_level_dc { my ($dcdom) = @_; my %customroles=&Apache::lonuserutils::my_custom_roles(); + my @roles = &Apache::lonuserutils::roles_by_context('course'); my $hiddenitems = ''. ''. ''; @@ -3319,7 +3568,7 @@ sub course_level_dc { my $otheritems = &Apache::loncommon::start_data_table_row()."\n". ''."\n". '