--- loncom/interface/loncreateuser.pm 2009/10/31 14:27:48 1.321 +++ loncom/interface/loncreateuser.pm 2010/03/21 21:05:42 1.337 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Create a user # -# $Id: loncreateuser.pm,v 1.321 2009/10/31 14:27:48 raeburn Exp $ +# $Id: loncreateuser.pm,v 1.337 2010/03/21 21:05:42 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -51,13 +51,14 @@ In LON-CAPA, roles are actually collecti Assistant", "Course Coordinator", and other such roles are really just collection of privileges that are useful in many circumstances. -Creating custom roles can be done by the Domain Coordinator through -the Create User functionality. That screen will show all privileges -that can be assigned to users. For a complete list of privileges, -please see C</home/httpd/lonTabs/rolesplain.tab>. +Custom roles can be defined by a Domain Coordinator, Course Coordinator +or Community Coordinator via the Manage User functionality. +The custom role editor screen will show all privileges which can be +assigned to users. For a complete list of privileges, please see +C</home/httpd/lonTabs/rolesplain.tab>. -Custom role definitions are stored in the C<roles.db> file of the role -author. +Custom role definitions are stored in the C<roles.db> file of the creator +of the role. =cut @@ -218,7 +219,7 @@ END_SCRIPT sub build_tools_display { my ($ccuname,$ccdomain,$context) = @_; my (@usertools,%userenv,$output,@options,%validations,%reqtitles,%reqdisplay, - $colspan); + $colspan,$isadv,%domconfig); my %lt = &Apache::lonlocal::texthash ( 'blog' => "Personal User Blog", 'aboutme' => "Personal Information Page", @@ -242,6 +243,9 @@ sub build_tools_display { %reqtitles = &courserequest_titles(); %reqdisplay = &courserequest_display(); $colspan = ' colspan="2"'; + %domconfig = + &Apache::lonnet::get_dom('configuration',['requestcourses'],$ccdomain); + $isadv = &Apache::lonnet::is_advanced_user($ccuname,$ccdomain); } else { %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname, 'tools.aboutme','tools.portfolio','tools.blog'); @@ -288,7 +292,14 @@ sub build_tools_display { &Apache::loncommon::start_data_table_row()."\n"; if ($context eq 'requestcourses') { my ($curroption,$currlimit); - $curroption = $userenv{$context.'.'.$item}; + if ($userenv{$context.'.'.$item} ne '') { + $curroption = $userenv{$context.'.'.$item}; + } else { + my (@inststatuses); + $curroption = + &Apache::loncoursequeueadmin::get_processtype($ccuname,$ccdomain,$isadv,$ccdomain, + $item,\@inststatuses,\%domconfig); + } if (!$curroption) { $curroption = 'norequest'; } @@ -487,6 +498,11 @@ sub print_username_entry_form { '// ]]>'."\n". '</script>'."\n"; + my %existingroles=&Apache::lonuserutils::my_custom_roles($crstype); + if (($env{'form.action'} eq 'custom') && (keys(%existingroles) > 0) + && (&Apache::lonnet::allowed('mcr','/'))) { + $jscript .= &customrole_javascript(); + } my %loaditems = ( 'onload' => "javascript:setFormElements(document.$formtoset)", ); @@ -512,31 +528,53 @@ sub print_username_entry_form { } my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('User Management', $helpitem); - my %existingroles=&Apache::lonuserutils::my_custom_roles(); - my $choice=&Apache::loncommon::select_form('make new role','rolename', - ('make new role' => 'Generate new role ...',%existingroles)); my %lt=&Apache::lonlocal::texthash( 'srst' => 'Search for a user and enroll as a student', 'srme' => 'Search for a user and enroll as a member', 'srad' => 'Search for a user and modify/add user information or roles', 'usr' => "Username", 'dom' => "Domain", - 'ecrp' => "Edit Custom Role Privileges", - 'nr' => "Name of Role", + 'ecrp' => "Define or Edit Custom Role", + 'nr' => "role name", 'cre' => "Next", ); $r->print($start_page."\n".$crumbs); if ($env{'form.action'} eq 'custom') { if (&Apache::lonnet::allowed('mcr','/')) { - $r->print(<<ENDCUSTOM); -<form action="/adm/createuser" method="post" name="docustom"> -<input type="hidden" name="action" value="$env{'form.action'}" /> -<input type="hidden" name="phase" value="selected_custom_edit" /> -<h3>$lt{'ecrp'}</h3> -$choice $lt{'nr'}: <input type="text" size="15" name="newrolename" /><br /> -<input name="customeditor" type="submit" value="$lt{'cre'}" /> -</form> -ENDCUSTOM + my $newroletext = &mt('Define new custom role:'); + $r->print('<form action="/adm/createuser" method="post" name="docustom">'. + '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'. + '<input type="hidden" name="phase" value="selected_custom_edit" />'. + '<h3>'.$lt{'ecrp'}.'</h3>'. + &Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_row(). + '<td>'); + if (keys(%existingroles) > 0) { + $r->print('<br /><label><input type="radio" name="customroleaction" value="new" checked="checked" onclick="setCustomFields();" /><b>'.$newroletext.'</b></label>'); + } else { + $r->print('<br /><input type="hidden" name="customroleaction" value="new" /><b>'.$newroletext.'</b>'); + } + $r->print('</td><td align="center">'.$lt{'nr'}.'<br /><input type="text" size="15" name="newrolename" onfocus="setCustomAction('."'new'".');" /></td>'. + &Apache::loncommon::end_data_table_row()); + if (keys(%existingroles) > 0) { + $r->print(&Apache::loncommon::start_data_table_row().'<td><br />'. + '<label><input type="radio" name="customroleaction" value="edit" onclick="setCustomFields();"/><b>'. + &mt('View/Modify existing role:').'</b></label></td>'. + '<td align="center"><br />'. + '<select name="rolename" onchange="setCustomAction('."'edit'".');">'. + '<option value="" selected="selected">'. + &mt('Select')); + foreach my $role (sort(keys(%existingroles))) { + $r->print('<option value="'.$role.'">'.$role.'</option>'); + } + $r->print('</select>'. + '</td>'. + &Apache::loncommon::end_data_table_row()); + } + $r->print(&Apache::loncommon::end_data_table().'<p>'. + '<input name="customeditor" type="submit" value="'. + $lt{'cre'}.'" /></p>'. + '</form>'); } } else { my $actiontext = $lt{'srad'}; @@ -547,8 +585,7 @@ ENDCUSTOM $actiontext = $lt{'srst'}; } } - $r->print(" -<h3>$actiontext</h3>"); + $r->print("<h3>$actiontext</h3>"); if ($env{'form.origform'} ne 'crtusername') { $r->print("\n".$response); } @@ -557,6 +594,44 @@ ENDCUSTOM $r->print(&Apache::loncommon::end_page()); } +sub customrole_javascript { + my $js = <<"END"; +<script type="text/javascript"> +// <![CDATA[ + +function setCustomFields() { + if (document.docustom.customroleaction.length > 0) { + for (var i=0; i<document.docustom.customroleaction.length; i++) { + if (document.docustom.customroleaction[i].checked) { + if (document.docustom.customroleaction[i].value == 'new') { + document.docustom.rolename.selectedIndex = 0; + } else { + document.docustom.newrolename.value = ''; + } + } + } + } + return; +} + +function setCustomAction(caller) { + if (document.docustom.customroleaction.length > 0) { + for (var i=0; i<document.docustom.customroleaction.length; i++) { + if (document.docustom.customroleaction[i].value == caller) { + document.docustom.customroleaction[i].checked = true; + } + } + } + setCustomFields(); + return; +} + +// ]]> +</script> +END + return $js; +} + sub entry_form { my ($dom,$srch,$forcenewuser,$context,$responsemsg,$crstype) = @_; my %domconf = &Apache::lonnet::get_dom('configuration',['usercreation'],$dom); @@ -870,7 +945,7 @@ sub print_user_modification_page { ); my $response; if ($env{'form.origform'} eq 'crtusername') { - $response = '<span class="LC_warning">'.&mt('No match was found for the username ([_1]) in LON-CAPA domain: [_2]',$ccuname,$ccdomain). + $response = '<span class="LC_warning">'.&mt('No match found for the username [_1] in LON-CAPA domain: [_2]','<b>'.$ccuname.'</b>',$ccdomain). '</span><br />'; } $response .= '<p class="LC_warning">' @@ -963,10 +1038,24 @@ sub print_user_modification_page { <input type="hidden" name="pres_type" value="" /> <input type="hidden" name="pres_marker" value="" /> ENDFORMINFO - my %inccourses; - foreach my $key (keys(%env)) { - if ($key=~/^user\.priv\.cm\.\/($match_domain)\/($match_username)/) { - $inccourses{$1.'_'.$2}=1; + my (%inccourses,$roledom); + if ($context eq 'course') { + $inccourses{$env{'request.course.id'}}=1; + $roledom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + } elsif ($context eq 'author') { + $roledom = $env{'request.role.domain'}; + } elsif ($context eq 'domain') { + foreach my $key (keys(%env)) { + $roledom = $env{'request.role.domain'}; + if ($key=~/^user\.priv\.cm\.\/($roledom)\/($match_username)/) { + $inccourses{$1.'_'.$2}=1; + } + } + } else { + foreach my $key (keys(%env)) { + if ($key=~/^user\.priv\.cm\.\/($match_domain)\/($match_username)/) { + $inccourses{$1.'_'.$2}=1; + } } } if ($newuser) { @@ -1203,10 +1292,10 @@ ENDNOTOOLSPRIV } $r->print('</div><div class="LC_clear_float_footer"></div>'); if ($env{'form.action'} ne 'singlestudent') { - &display_existing_roles($r,$ccuname,$ccdomain,\%inccourses); + &display_existing_roles($r,$ccuname,$ccdomain,\%inccourses,$context, + $roledom,$crstype); } } ## End of new user/old user logic - if ($env{'form.action'} eq 'singlestudent') { my $btntxt; if ($crstype eq 'Community') { @@ -1324,13 +1413,9 @@ sub validation_javascript { } 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( + my ($r,$ccuname,$ccdomain,$inccourses,$context,$roledom,$crstype) = @_; + my $now=time; + my %lt=&Apache::lonlocal::texthash( 'rer' => "Existing Roles", 'rev' => "Revoke", 'del' => "Delete", @@ -1340,198 +1425,257 @@ sub display_existing_roles { '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); + my (%rolesdump,%roletext,%sortrole,%roleclass,%rolepriv); + if ($context eq 'course' || $context eq 'author') { + my @roles = &Apache::lonuserutils::roles_by_context($context,1,$crstype); + my %roleshash = + &Apache::lonnet::get_my_roles($ccuname,$ccdomain,'userroles', + ['active','previous','future'],\@roles,$roledom,1); + foreach my $key (keys(%roleshash)) { + my ($start,$end) = split(':',$roleshash{$key}); + next if ($start eq '-1' || $end eq '-1'); + my ($rnum,$rdom,$role,$sec) = split(':',$key); + if ($context eq 'course') { + next unless (($rnum eq $env{'course.'.$env{'request.course.id'}.'.num'}) + && ($rdom eq $env{'course.'.$env{'request.course.id'}.'.domain'})); + } elsif ($context eq 'author') { + next unless (($rnum eq $env{'user.name'}) && ($rdom eq $env{'request.role.domain'})); + } + my ($newkey,$newvalue,$newrole); + $newkey = '/'.$rdom.'/'.$rnum; + if ($sec ne '') { + $newkey .= '/'.$sec; + } + $newvalue = $role; + if ($role =~ /^cr/) { + $newrole = 'cr'; + } else { + $newrole = $role; + } + $newkey .= '_'.$newrole; + if ($start ne '' && $end ne '') { + $newvalue .= '_'.$end.'_'.$start; + } elsif ($end ne '') { + $newvalue .= '_'.$end; + } + $rolesdump{$newkey} = $newvalue; + } + } else { + %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); + return if ($tmp =~ /^(con_lost|error)/i); + 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'}. - '<br />'.&mt('Domain').': '.$coursedom.(' 'x8). - &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$coursedir,$coursedom); - $sortkey.="\0".$coursedata{'description'}; - $class=$coursedata{'type'}; + 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); + my $cid = $1.'_'.$2; + # $1.'_'.$2 is the course id (eg. 103_12345abcef103l3). + my %coursedata= + &Apache::lonnet::coursedescription($cid); + if ($coursedir =~ /^$match_community$/) { + $class='Community'; + } + $sortkey.="\0$coursedom"; + my $carea; + if (defined($coursedata{'description'})) { + $carea=$coursedata{'description'}. + '<br />'.&mt('Domain').': '.$coursedom.(' 'x8). + &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$coursedir,$coursedom); + $sortkey.="\0".$coursedata{'description'}; + } else { + if ($class eq 'Community') { + $carea=&mt('Unavailable community').': '.$area; + $sortkey.="\0".&mt('Unavailable community').': '.$area; } 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; + } + $sortkey.="\0$coursedir"; + $inccourses->{$cid}=1; + if ((&Apache::lonnet::allowed('c'.$role_code,$coursedom.'/'.$coursedir)) || + (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) { + $allowed=1; + } + unless ($allowed) { + my $isowner = &is_courseowner($cid,$coursedata{'internal.courseowner'}); + if ($isowner) { + if (($role_code eq 'co') && ($class eq 'Community')) { + $allowed = 1; + } elsif (($role_code eq 'cc') && ($class eq 'Course')) { + $allowed = 1; + } } + } + if ((&Apache::lonnet::allowed('dro',$coursedom)) || + (&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; - } + if ($croletitle) { + if (&Apache::lonnet::allowed('ccr',$coursedom.'/'.$coursedir)) { + $allowed=1; + $thisrole.='.'.$role_code; } - # Compute the background color based on $area - if ($area=~m{^/($match_domain)/($match_courseid)/(\w+)}) { - $carea.='<br />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; - } + } + if ($area=~m{^/($match_domain)/($match_courseid)/(\w+)}) { + $carea.='<br />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; - } + } + $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 ($role_code eq 'ca' || $role_code eq 'au') { - $class='Construction Space'; - } elsif ($role_code eq 'su') { - $class='System'; - } else { - $class='Domain'; + if (((&Apache::lonnet::allowed('dro',$1)) || + (&Apache::lonnet::allowed('dro',$ccdomain))) && + ($role_code ne 'dc')) { + $delallowed=1; } - } - if (($role_code eq 'ca') || ($role_code eq 'aa')) { - $area=~m{/($match_domain)/($match_username)}; - if (&Apache::lonuserutils::authorpriv($2,$1)) { + } else { + if (&Apache::lonnet::allowed('c'.$role_code,'/')) { $allowed=1; - } else { - $allowed=0; } } - my $row = ''; - $row.= '<td>'; - my $active=1; - $active=0 if (($role_end_time) && ($now>$role_end_time)); - if (($active) && ($allowed)) { - $row.= '<input type="checkbox" name="rev:'.$thisrole.'" />'; + if ($role_code eq 'ca' || $role_code eq 'au') { + $class='Construction Space'; + } elsif ($role_code eq 'su') { + $class='System'; } else { - if ($active) { - $row.=' '; - } else { - $row.=&mt('expired or revoked'); - } + $class='Domain'; } - $row.='</td><td>'; - if ($allowed && !$active) { - $row.= '<input type="checkbox" name="ren:'.$thisrole.'" />'; + } + if (($role_code eq 'ca') || ($role_code eq 'aa')) { + $area=~m{/($match_domain)/($match_username)}; + if (&Apache::lonuserutils::authorpriv($2,$1)) { + $allowed=1; } else { - $row.=' '; + $allowed=0; } - $row.='</td><td>'; - if ($delallowed) { - $row.= '<input type="checkbox" name="del:'.$thisrole.'" />'; + } + my $row = ''; + $row.= '<td>'; + my $active=1; + $active=0 if (($role_end_time) && ($now>$role_end_time)); + if (($active) && ($allowed)) { + $row.= '<input type="checkbox" name="rev:'.$thisrole.'" />'; + } else { + if ($active) { + $row.=' '; } else { - $row.=' '; + $row.=&mt('expired or revoked'); } - my $plaintext=''; - if (!$croletitle) { - $plaintext=&Apache::lonnet::plaintext($role_code,$class) - } else { - $plaintext= + } + $row.='</td><td>'; + if ($allowed && !$active) { + $row.= '<input type="checkbox" name="ren:'.$thisrole.'" />'; + } else { + $row.=' '; + } + $row.='</td><td>'; + if ($delallowed) { + $row.= '<input type="checkbox" name="del:'.$thisrole.'" />'; + } else { + $row.=' '; + } + my $plaintext=''; + if (!$croletitle) { + $plaintext=&Apache::lonnet::plaintext($role_code,$class) + } else { + $plaintext= "Customrole '$croletitle'<br />defined by $croleuname\@$croleudom"; - } - $row.= '</td><td>'.$plaintext. - '</td><td>'.$area. - '</td><td>'.($role_start_time?&Apache::lonlocal::locallocaltime($role_start_time) - : ' ' ). - '</td><td>'.($role_end_time ?&Apache::lonlocal::locallocaltime($role_end_time) - : ' ' ) - ."</td>"; - $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','Community','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} = '<tr class="LC_info_row">'. - "<td align='center' colspan='7'>".&mt($type)."</td></tr>". - $output{$type}; - $rolesdisplay = 1; - } - } - if ($rolesdisplay == 1) { - my $contextrole=''; - if ($env{'request.course.id'}) { - my $crstype = &Apache::loncommon::course_type(); - $contextrole = "Existing Roles in this $crstype"; - } elsif ($env{'request.role'} =~ /^au\./) { - $contextrole = 'Existing Co-Author Roles in your Construction Space'; + } + $row.= '</td><td>'.$plaintext. + '</td><td>'.$area. + '</td><td>'.($role_start_time?&Apache::lonlocal::locallocaltime($role_start_time) + : ' ' ). + '</td><td>'.($role_end_time ?&Apache::lonlocal::locallocaltime($role_end_time) + : ' ' ) + ."</td>"; + $sortrole{$sortkey}=$envkey; + $roletext{$envkey}=$row; + $roleclass{$envkey}=$class; + $rolepriv{$envkey}=$allowed; + } # end of foreach (table building loop) + + my $rolesdisplay = 0; + my %output = (); + foreach my $type ('Construction Space','Course','Community','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} = '<tr class="LC_info_row">'. + "<td align='center' colspan='7'>".&mt($type)."</td></tr>". + $output{$type}; + $rolesdisplay = 1; + } + } + if ($rolesdisplay == 1) { + my $contextrole=''; + if ($env{'request.course.id'}) { + if (&Apache::loncommon::course_type() eq 'Community') { + $contextrole = &mt('Existing Roles in this Community'); } else { - $contextrole = 'Existing Roles in this Domain'; + $contextrole = &mt('Existing Roles in this Course'); } - $r->print(' + } elsif ($env{'request.role'} =~ /^au\./) { + $contextrole = &mt('Existing Co-Author Roles in your Construction Space'); + } else { + $contextrole = &mt('Existing Roles in this Domain'); + } + $r->print(' <h3>'.$lt{'rer'}.'</h3>'. -'<div>'.&mt($contextrole).'</div>'. +'<div>'.$contextrole.'</div>'. &Apache::loncommon::start_data_table("LC_createuser"). &Apache::loncommon::start_data_table_header_row(). '<th>'.$lt{'rev'}.'</th><th>'.$lt{'ren'}.'</th><th>'.$lt{'del'}. '</th><th>'.$lt{'rol'}.'</th><th>'.$lt{'ext'}. '</th><th>'.$lt{'sta'}.'</th><th>'.$lt{'end'}.'</th>'. &Apache::loncommon::end_data_table_header_row()); - foreach my $type ('Construction Space','Course','Community','Domain','System','Unknown') { - if ($output{$type}) { - $r->print($output{$type}."\n"); - } + foreach my $type ('Construction Space','Course','Community','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 + $r->print(&Apache::loncommon::end_data_table()); + } return; } @@ -1921,9 +2065,22 @@ sub personal_data_display { if ($canmodify_status{'inststatus'}) { $shown = &pick_inst_statuses($userenv{'inststatus'},$usertypes,$types); } else { - $shown .= $userenv{'inststatus'}; if ($userenv{'inststatus'} eq '') { $hiderow = 1; + } else { + my @showitems; + foreach my $item ( map { &unescape($_); } split(':',$userenv{'inststatus'})) { + if (exists($usertypes->{$item})) { + push(@showitems,$usertypes->{$item}); + } else { + push(@showitems,$item); + } + } + if (@showitems) { + $shown = join(', ',@showitems); + } else { + $hiderow = 1; + } } } if (!$hiderow) { @@ -2141,10 +2298,14 @@ sub update_user_data { $r->print('<h3>'.&mt('User [_1] in domain [_2]', $env{'form.ccuname'}, $env{'form.ccdomain'}).'</h3>'); my (%alerts,%rulematch,%inst_results,%curr_rules); + my @userinfo = ('firstname','middlename','lastname','generation','permanentemail','id'); my @usertools = ('aboutme','blog','portfolio'); my @requestcourses = ('official','unofficial','community'); my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($env{'form.ccdomain'}); + my %canmodify_status = + &Apache::lonuserutils::can_modify_userinfo($context,$env{'form.ccdomain'}, + ['inststatus']); if ($env{'form.makeuser'}) { $r->print('<h3>'.&mt('Creating new account.').'</h3>'); # Check for the authentication mode and password @@ -2204,49 +2365,50 @@ sub update_user_data { $r->print(&mt('Generating user').': '.$result); $uhome = &Apache::lonnet::homeserver($env{'form.ccuname'}, $env{'form.ccdomain'}); - my (%changeHash,%newcustom,%changed); + my (%changeHash,%newcustom,%changed,%changedinfo); if ($uhome ne 'no_host') { - if ($env{'form.customquota'} == 1) { - if ($env{'form.portfolioquota'} eq '') { - $newcustom{'quota'} = 0; - } else { - $newcustom{'quota'} = $env{'form.portfolioquota'}; - $newcustom{'quota'} =~ s/[^\d\.]//g; + if ($context eq 'domain') { + if ($env{'form.customquota'} == 1) { + if ($env{'form.portfolioquota'} eq '') { + $newcustom{'quota'} = 0; + } else { + $newcustom{'quota'} = $env{'form.portfolioquota'}; + $newcustom{'quota'} =~ s/[^\d\.]//g; + } + $changed{'quota'} = "a_admin($newcustom{'quota'},\%changeHash); } - $changed{'quota'} = "a_admin($newcustom{'quota'},\%changeHash); - } - foreach my $item (@usertools) { - if ($env{'form.custom'.$item} == 1) { - $newcustom{$item} = $env{'form.tools_'.$item}; - $changed{$item} = &tool_admin($item,$newcustom{$item}, - \%changeHash,'tools'); + foreach my $item (@usertools) { + if ($env{'form.custom'.$item} == 1) { + $newcustom{$item} = $env{'form.tools_'.$item}; + $changed{$item} = &tool_admin($item,$newcustom{$item}, + \%changeHash,'tools'); + } } - } - foreach my $item (@requestcourses) { - $newcustom{$item} = $env{'form.crsreq_'.$item}; - if ($env{'form.crsreq_'.$item} eq 'autolimit') { - $newcustom{$item} .= '='; - unless ($env{'form.crsreq_'.$item.'_limit'} =~ /\D/) { - $newcustom{$item} .= $env{'form.crsreq_'.$item.'_limit'}; + foreach my $item (@requestcourses) { + $newcustom{$item} = $env{'form.crsreq_'.$item}; + if ($env{'form.crsreq_'.$item} eq 'autolimit') { + $newcustom{$item} .= '='; + unless ($env{'form.crsreq_'.$item.'_limit'} =~ /\D/) { + $newcustom{$item} .= $env{'form.crsreq_'.$item.'_limit'}; + } } + $changed{$item} = &tool_admin($item,$newcustom{$item}, + \%changeHash,'requestcourses'); } - $changed{$item} = &tool_admin($item,$newcustom{$item}, - \%changeHash,'requestcourses'); } - if (exists($env{'form.inststatus'})) { - my @inststatuses = &Apache::loncommon::get_env_multiple('form.inststatus'); - if (@inststatuses > 0) { - $changeHash{'inststatus'} = join(',',@inststatuses); - $changed{'inststatus'} = $changeHash{'inststatus'}; + if ($canmodify_status{'inststatus'}) { + if (exists($env{'form.inststatus'})) { + my @inststatuses = &Apache::loncommon::get_env_multiple('form.inststatus'); + if (@inststatuses > 0) { + $changeHash{'inststatus'} = join(',',@inststatuses); + $changed{'inststatus'} = $changeHash{'inststatus'}; + } } } if (keys(%changed)) { - $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'}; + foreach my $item (@userinfo) { + $changeHash{$item} = $env{'form.c'.$item}; + } my $chgresult = &Apache::lonnet::put('environment',\%changeHash, $env{'form.ccdomain'},$env{'form.ccuname'}); @@ -2275,7 +2437,7 @@ sub update_user_data { } } ## - my (@userroles,%userupdate,$cnum,$cdom,$crstype,$namechanged); + my (@userroles,%userupdate,$cnum,$cdom,$crstype,%namechanged); if ($context eq 'course') { ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity(); $crstype = &Apache::loncommon::course_type($cdom.'_'.$cnum); @@ -2365,7 +2527,6 @@ sub update_user_data { push(@longroles,&Apache::lonnet::plaintext($role,$crstype)); } } - 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 @@ -2412,40 +2573,46 @@ sub update_user_data { } } my ($quotachanged,$oldportfolioquota,$newportfolioquota,$oldinststatus, - $inststatus,$newinststatus,$oldisdefault,$newisdefault,$olddefquotatext, - $newdefquotatext,%oldaccess,%oldaccesstext,%newaccess,%newaccesstext, - $oldinststatuses,$newinststatuses); - my ($defquota,$settingstatus) = - &Apache::loncommon::default_quota($env{'form.ccdomain'},$inststatus); - my ($showquota,$showtools,$showrequestcourses,$showinststatus,$showreqotherdom); + $newinststatus,$oldisdefault,$newisdefault,%oldsettings, + %oldsettingstext,%newsettings,%newsettingstext,@disporder); + @disporder = ('inststatus'); + if ($env{'request.role.domain'} eq $env{'form.ccdomain'}) { + push(@disporder,'requestcourses'); + } else { + push(@disporder,'reqcrsotherdom'); + } + push(@disporder,('quota','tools')); + my ($defquota,my $settingstatus) = + &Apache::loncommon::default_quota($env{'form.ccdomain'},$oldinststatus); + my %canshow; if (&Apache::lonnet::allowed('mpq',$env{'form.ccdomain'})) { - $showquota = 1; + $canshow{'quota'} = 1; } if (&Apache::lonnet::allowed('mut',$env{'form.ccdomain'})) { - $showtools = 1; + $canshow{'tools'} = 1; } if (&Apache::lonnet::allowed('ccc',$env{'form.ccdomain'})) { - $showrequestcourses = 1; + $canshow{'requestcourses'} = 1; } elsif (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) { - $showreqotherdom = 1; + $canshow{'reqcrsotherdom'} = 1; } if (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'})) { - $showinststatus = 1; + $canshow{'inststatus'} = 1; } my (%changeHash,%changed); $oldinststatus = $userenv{'inststatus'}; if ($oldinststatus eq '') { - $oldinststatuses = $othertitle; + $oldsettings{'inststatus'} = $othertitle; } else { if (ref($usertypes) eq 'HASH') { - $oldinststatuses = join(', ',map{ $usertypes->{ &unescape($_) }; } (split(/:/,$userenv{'inststatus'}))); + $oldsettings{'inststatus'} = join(', ',map{ $usertypes->{ &unescape($_) }; } (split(/:/,$userenv{'inststatus'}))); } else { - $oldinststatuses = join(', ',map{ &unescape($_); } (split(/:/,$userenv{'inststatus'}))); + $oldsettings{'inststatus'} = join(', ',map{ &unescape($_); } (split(/:/,$userenv{'inststatus'}))); } } $changeHash{'inststatus'} = $userenv{'inststatus'}; - my %canmodify_inststatus = &Apache::lonuserutils::can_modify_userinfo($context,$env{'form.ccdomain'},['inststatus'],\@userroles); - if ($canmodify_inststatus{'inststatus'}) { + if ($canmodify_status{'inststatus'}) { + $canshow{'inststatus'} = 1; if (exists($env{'form.inststatus'})) { my @inststatuses = &Apache::loncommon::get_env_multiple('form.inststatus'); if (@inststatuses > 0) { @@ -2455,84 +2622,82 @@ sub update_user_data { $changed{'inststatus'} = $newinststatus; } if (ref($usertypes) eq 'HASH') { - $newinststatuses = join(', ',map{ $usertypes->{$_}; } (@inststatuses)); + $newsettings{'inststatus'} = join(', ',map{ $usertypes->{$_}; } (@inststatuses)); } else { - $newinststatuses = join(', ',map{ $usertypes->{$_}; } (@inststatuses)); - } - } else { - $newinststatus = ''; - $changeHash{'inststatus'} = $newinststatus; - $newinststatuses = $othertitle; - if ($newinststatus ne $oldinststatus) { - $changed{'inststatus'} = $changeHash{'inststatus'}; + $newsettings{'inststatus'} = join(', ',@inststatuses); } } + } else { + $newinststatus = ''; + $changeHash{'inststatus'} = $newinststatus; + $newsettings{'inststatus'} = $othertitle; + if ($newinststatus ne $oldinststatus) { + $changed{'inststatus'} = $changeHash{'inststatus'}; + } } + } elsif ($context ne 'selfcreate') { + $canshow{'inststatus'} = 1; + $newsettings{'inststatus'} = $oldsettings{'inststatus'}; } $changeHash{'portfolioquota'} = $userenv{'portfolioquota'}; - if ($userenv{'portfolioquota'} ne '') { - $oldportfolioquota = $userenv{'portfolioquota'}; - if ($env{'form.customquota'} == 1) { - if ($env{'form.portfolioquota'} eq '') { - $newportfolioquota = 0; + if ($context eq 'domain') { + if ($userenv{'portfolioquota'} ne '') { + $oldportfolioquota = $userenv{'portfolioquota'}; + if ($env{'form.customquota'} == 1) { + if ($env{'form.portfolioquota'} eq '') { + $newportfolioquota = 0; + } else { + $newportfolioquota = $env{'form.portfolioquota'}; + $newportfolioquota =~ s/[^\d\.]//g; + } + if ($newportfolioquota != $oldportfolioquota) { + $changed{'quota'} = "a_admin($newportfolioquota,\%changeHash); + } } else { - $newportfolioquota = $env{'form.portfolioquota'}; - $newportfolioquota =~ s/[^\d\.]//g; - } - if ($newportfolioquota != $oldportfolioquota) { - $changed{'quota'} = "a_admin($newportfolioquota,\%changeHash); + $changed{'quota'} = "a_admin('',\%changeHash); + $newportfolioquota = $defquota; + $newisdefault = 1; } } else { - $changed{'quota'} = "a_admin('',\%changeHash); - $newportfolioquota = $defquota; - $newisdefault = 1; - } - } else { - $oldisdefault = 1; - $oldportfolioquota = $defquota; - if ($env{'form.customquota'} == 1) { - if ($env{'form.portfolioquota'} eq '') { - $newportfolioquota = 0; + $oldisdefault = 1; + $oldportfolioquota = $defquota; + if ($env{'form.customquota'} == 1) { + if ($env{'form.portfolioquota'} eq '') { + $newportfolioquota = 0; + } else { + $newportfolioquota = $env{'form.portfolioquota'}; + $newportfolioquota =~ s/[^\d\.]//g; + } + $changed{'quota'} = "a_admin($newportfolioquota,\%changeHash); } else { - $newportfolioquota = $env{'form.portfolioquota'}; - $newportfolioquota =~ s/[^\d\.]//g; + $newportfolioquota = $defquota; + $newisdefault = 1; } - $changed{'quota'} = "a_admin($newportfolioquota,\%changeHash); + } + if ($oldisdefault) { + $oldsettingstext{'quota'} = &get_defaultquota_text($settingstatus); + } + if ($newisdefault) { + $newsettingstext{'quota'} = &get_defaultquota_text($settingstatus); + } + &tool_changes('tools',\@usertools,\%oldsettings,\%oldsettingstext,\%userenv, + \%changeHash,\%changed,\%newsettings,\%newsettingstext); + if ($env{'form.ccdomain'} eq $env{'request.role.domain'}) { + &tool_changes('requestcourses',\@requestcourses,\%oldsettings,\%oldsettingstext, + \%userenv,\%changeHash,\%changed,\%newsettings,\%newsettingstext); } else { - $newportfolioquota = $defquota; - $newisdefault = 1; + &tool_changes('reqcrsotherdom',\@requestcourses,\%oldsettings,\%oldsettingstext, + \%userenv,\%changeHash,\%changed,\%newsettings,\%newsettingstext); + } + } + foreach my $item (@userinfo) { + if ($env{'form.c'.$item} ne $userenv{$item}) { + $namechanged{$item} = 1; } } - if ($oldisdefault) { - $olddefquotatext = &get_defaultquota_text($settingstatus); - } - if ($newisdefault) { - $newdefquotatext = &get_defaultquota_text($settingstatus); - } - &tool_changes('tools',\@usertools,\%oldaccess,\%oldaccesstext,\%userenv, - \%changeHash,\%changed,\%newaccess,\%newaccesstext); - if ($env{'form.ccdomain'} eq $env{'request.role.domain'}) { - &tool_changes('requestcourses',\@requestcourses,\%oldaccess,\%oldaccesstext, - \%userenv,\%changeHash,\%changed,\%newaccess,\%newaccesstext); - } else { - &tool_changes('reqcrsotherdom',\@requestcourses,\%oldaccess,\%oldaccesstext, - \%userenv,\%changeHash,\%changed,\%newaccess,\%newaccesstext); - } - 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) || (keys(%changed) > 0)) { - $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'}; + $oldsettings{'quota'} = $oldportfolioquota.' Mb'; + $newsettings{'quota'} = $newportfolioquota.' Mb'; + if ((keys(%namechanged) > 0) || (keys(%changed) > 0)) { my ($chgresult,$namechgresult); if (keys(%changed) > 0) { $chgresult = @@ -2548,8 +2713,7 @@ sub update_user_data { $newenvhash{'environment.requestcourses.'.$key} = $changeHash{'requestcourses.'.$key}; if ($changeHash{'requestcourses.'.$key} ne '') { - $newenvhash{'environment.canrequest.'.$key} = - $changeHash{'requestcourses.'.$key}; + $newenvhash{'environment.canrequest.'.$key} = 1; } else { $newenvhash{'environment.canrequest.'.$key} = &Apache::lonnet::usertools_access($env{'user.name'},$env{'user.domain'}, @@ -2573,14 +2737,17 @@ sub update_user_data { } } } - if ($namechanged) { - # Make the change + if (keys(%namechanged) > 0) { + foreach my $field (@userinfo) { + $changeHash{$field} = $env{'form.c'.$field}; + } +# 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'}); + $changeHash{'id'},undef,$changeHash{'permanentemail'},undef,\@userinfo); %userupdate = ( lastname => $env{'form.clastname'}, middlename => $env{'form.cmiddlename'}, @@ -2589,139 +2756,13 @@ sub update_user_data { id => $env{'form.cid'}, ); } - if (($namechanged && $namechgresult eq 'ok') || + if (((keys(%namechanged) > 0) && $namechgresult eq 'ok') || ((keys(%changed) > 0) && $chgresult eq 'ok')) { # Tell the user we changed the name - my %lt=&Apache::lonlocal::texthash( - 'uic' => 'User Information Changed', - 'frst' => 'First Name', - 'mddl' => 'Middle Name', - 'lst' => 'Last Name', - 'gen' => 'Generation', - 'id' => 'Student/Employee ID', - 'mail' => 'Permanent e-mail address', - 'disk' => 'Disk space allocated to portfolio files', - 'blog' => 'Blog Availability', - 'aboutme' => 'Personal Information Page Availability', - 'portfolio' => 'Portfolio Availability', - 'official' => 'Can Request Official Courses', - 'unofficial' => 'Can Request Unofficial Courses', - 'community' => 'Can Request Communities', - 'inststatus' => "Affiliation", - 'prvs' => 'Previous Value:', - 'chto' => 'Changed To:' - ); - $r->print('<h4>'.$lt{'uic'}.'</h4>'. - &Apache::loncommon::start_data_table(). - &Apache::loncommon::start_data_table_header_row()); - $r->print(<<"END"); - <th> </th> - <th>$lt{'frst'}</th> - <th>$lt{'mddl'}</th> - <th>$lt{'lst'}</th> - <th>$lt{'gen'}</th> - <th>$lt{'id'}</th> - <th>$lt{'mail'}</th> -END - if ($showinststatus) { - $r->print(" - <th>$lt{'inststatus'}</th>\n"); - } - if ($showrequestcourses) { - foreach my $item (@requestcourses) { - $r->print(" - <th>$lt{$item}</th>\n"); - } - } elsif ($showreqotherdom) { - foreach my $item (@requestcourses) { - $r->print(" - <th>$lt{$item}</th>\n"); - } - } - if ($showquota) { - $r->print(" - <th>$lt{'disk'}</th>\n"); - } - if ($showtools) { - foreach my $item (@usertools) { - $r->print(" - <th>$lt{$item}</th>\n"); - } - } - $r->print(&Apache::loncommon::end_data_table_header_row(). - &Apache::loncommon::start_data_table_row()); - $r->print(<<"END"); - <td><b>$lt{'prvs'}</b></td> - <td>$userenv{'firstname'} </td> - <td>$userenv{'middlename'} </td> - <td>$userenv{'lastname'} </td> - <td>$userenv{'generation'} </td> - <td>$userenv{'id'}</td> - <td>$userenv{'permanentemail'} </td> -END - if ($showinststatus) { - $r->print(" - <td>$oldinststatuses</td>\n"); - } - if ($showrequestcourses) { - foreach my $item (@requestcourses) { - $r->print(" - <td>$oldaccess{$item} $oldaccesstext{$item}</td>\n"); - } - } elsif ($showreqotherdom) { - foreach my $item (@requestcourses) { - $r->print(" - <td>$oldaccess{$item} $oldaccesstext{$item}</td>\n"); - } - } - if ($showquota) { - $r->print(" - <td>$oldportfolioquota Mb $olddefquotatext </td>\n"); - } - if ($showtools) { - foreach my $item (@usertools) { - $r->print(" - <td>$oldaccess{$item} $oldaccesstext{$item} </td>\n"); - } - } - $r->print(&Apache::loncommon::end_data_table_row(). - &Apache::loncommon::start_data_table_row()); - $r->print(<<"END"); - <td><span class="LC_nobreak"><b>$lt{'chto'}</b></span></td> - <td>$env{'form.cfirstname'} </td> - <td>$env{'form.cmiddlename'} </td> - <td>$env{'form.clastname'} </td> - <td>$env{'form.cgeneration'} </td> - <td>$env{'form.cid'} </td> - <td>$env{'form.cpermanentemail'} </td> -END - if ($showinststatus) { - $r->print(" - <td>$newinststatuses</td>\n"); - } - if ($showrequestcourses) { - foreach my $item (@requestcourses) { - $r->print(" - <td>$newaccess{$item} $newaccesstext{$item} </td>\n"); - } - } elsif ($showreqotherdom) { - foreach my $item (@requestcourses) { - $r->print(" - <td>$newaccess{$item} $newaccesstext{$item} </td>\n"); - } - } - if ($showquota) { - $r->print(" - <td>$newportfolioquota Mb $newdefquotatext </td>\n"); - } - if ($showtools) { - foreach my $item (@usertools) { - $r->print(" - <td>$newaccess{$item} $newaccesstext{$item} </td>\n"); - } - } - $r->print(&Apache::loncommon::end_data_table_row(). - &Apache::loncommon::end_data_table().'<br />'); + &display_userinfo($r,1,\@disporder,\%canshow,\@requestcourses, + \@usertools,\%userenv,\%changed,\%namechanged, + \%oldsettings, \%oldsettingstext,\%newsettings, + \%newsettingstext); if ($env{'form.cid'} ne $userenv{'id'}) { &Apache::lonnet::idput($env{'form.ccdomain'}, ($env{'form.ccuname'} => $env{'form.cid'})); @@ -2747,54 +2788,13 @@ END $env{'form.ccuname'}.' '.&mt('in domain').' '. $env{'form.ccdomain'}.'</span><br />'); } - } else { # End of if ($env ... ) logic + } else { # End of if ($env ... ) logic # They did not want to change the users name, quota, tool availability, # or ability to request creation of courses, # but we can still tell them what the name and quota and availabilities are - my %lt=&Apache::lonlocal::texthash( - 'id' => "Student/Employee ID", - 'mail' => "Permanent e-mail address", - 'disk' => "Disk space allocated to user's portfolio files", - 'blog' => "Blog Availability", - 'aboutme' => "Personal Information Page Availability", - 'portfolio' => "Portfolio Availability", - 'official' => "Can Request Official Courses", - 'unofficial' => "Can Request Unofficial Courses", - 'community' => "Can Request Communities", - 'inststatus' => "Affiliation", - ); - $r->print(<<"END"); -<h4>$userenv{'firstname'} $userenv{'middlename'} $userenv{'lastname'} $userenv{'generation'} -END - if ($userenv{'permanentemail'} ne '') { - $r->print('<br />['.$lt{'mail'}.': '. - $userenv{'permanentemail'}.']'); - } - if ($showinststatus) { - $r->print('<br />['.$lt{'inststatus'}.': '.$oldinststatuses.']'); - } - if ($showrequestcourses) { - foreach my $item (@requestcourses) { - $r->print('<br />['.$lt{$item}.': '.$newaccess{$item}.' '. - $newaccesstext{$item}.']'."\n"); - } - } elsif ($showreqotherdom) { - foreach my $item (@requestcourses) { - $r->print('<br />['.$lt{$item}.': '.$newaccess{$item}.' '. - $newaccesstext{$item}.']'."\n"); - } - } - if ($showtools) { - foreach my $item (@usertools) { - $r->print('<br />['.$lt{$item}.': '.$newaccess{$item}.' '. - $newaccesstext{$item}.']'."\n"); - } - } - if ($showquota) { - $r->print('<br />['.$lt{'disk'}.': '.$oldportfolioquota.' Mb '. - $olddefquotatext.']'); - } - $r->print('</h4>'); + &display_userinfo($r,undef,\@disporder,\%canshow,\@requestcourses, + \@usertools,\%userenv,\%changed,\%namechanged,\%oldsettings, + \%oldsettingstext,\%newsettings,\%newsettingstext); } if (@mod_disallowed) { my ($rolestr,$contextname); @@ -2841,7 +2841,7 @@ END $r->print('</a></p>'); } else { my @rolechanges = &update_roles($r,$context); - if ($namechanged) { + if (keys(%namechanged) > 0) { if ($context eq 'course') { if (@userroles > 0) { if ((@rolechanges == 0) || @@ -2870,6 +2870,136 @@ END $r->print(&Apache::loncommon::end_page()); } +sub display_userinfo { + my ($r,$changed,$order,$canshow,$requestcourses,$usertools,$userenv, + $changedhash,$namechangedhash,$oldsetting,$oldsettingtext, + $newsetting,$newsettingtext) = @_; + return unless (ref($order) eq 'ARRAY' && + ref($canshow) eq 'HASH' && + ref($requestcourses) eq 'ARRAY' && + ref($usertools) eq 'ARRAY' && + ref($userenv) eq 'HASH' && + ref($changedhash) eq 'HASH' && + ref($oldsetting) eq 'HASH' && + ref($oldsettingtext) eq 'HASH' && + ref($newsetting) eq 'HASH' && + ref($newsettingtext) eq 'HASH'); + my %lt=&Apache::lonlocal::texthash( + 'ui' => 'User Information (unchanged)', + 'uic' => 'User Information Changed', + 'firstname' => 'First Name', + 'middlename' => 'Middle Name', + 'lastname' => 'Last Name', + 'generation' => 'Generation', + 'id' => 'Student/Employee ID', + 'permanentemail' => 'Permanent e-mail address', + 'quota' => 'Disk space allocated to portfolio files', + 'blog' => 'Blog Availability', + 'aboutme' => 'Personal Information Page Availability', + 'portfolio' => 'Portfolio Availability', + 'official' => 'Can Request Official Courses', + 'unofficial' => 'Can Request Unofficial Courses', + 'community' => 'Can Request Communities', + 'inststatus' => "Affiliation", + 'prvs' => 'Previous Value:', + 'chto' => 'Changed To:' + ); + my $title = $lt{'ui'}; + if ($changed) { + $title = $lt{'uic'}; + } + $r->print('<h4>'.$title.'</h4>'. + &Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row()); + if ($changed) { + $r->print("<th> </th>\n"); + } + my @userinfo = ('firstname','middlename','lastname','generation','permanentemail','id'); + foreach my $item (@userinfo) { + $r->print("<th>$lt{$item}</th>\n"); + } + foreach my $entry (@{$order}) { + if ($canshow->{$entry}) { + if (($entry eq 'requestcourses') || ($entry eq 'reqcrsotherdom')) { + foreach my $item (@{$requestcourses}) { + $r->print("<th>$lt{$item}</th>\n"); + } + } elsif ($entry eq 'tools') { + foreach my $item (@{$usertools}) { + $r->print("<th>$lt{$item}</th>\n"); + } + } else { + $r->print("<th>$lt{$entry}</th>\n"); + } + } + } + $r->print(&Apache::loncommon::end_data_table_header_row(). + &Apache::loncommon::start_data_table_row()); + if ($changed) { + $r->print('<td><b>'.$lt{'prvs'}.'</b></td>'."\n"); + } + foreach my $item (@userinfo) { + $r->print('<td>'.$userenv->{$item}.' </td>'."\n"); + } + foreach my $entry (@{$order}) { + if ($canshow->{$entry}) { + if (($entry eq 'requestcourses') || ($entry eq 'reqcrsotherdom')) { + foreach my $item (@{$requestcourses}) { + $r->print("<td>$oldsetting->{$item} $oldsettingtext->{$item}</td>\n"); + } + } elsif ($entry eq 'tools') { + foreach my $item (@{$usertools}) { + $r->print("<td>$oldsetting->{$item} $oldsettingtext->{$item}</td>\n"); + } + } else { + $r->print("<td>$oldsetting->{$entry} $oldsettingtext->{$entry} </td>\n"); + } + } + } + $r->print(&Apache::loncommon::end_data_table_row()); + if ($changed) { + $r->print(&Apache::loncommon::start_data_table_row(). + '<td><span class="LC_nobreak"><b>'.$lt{'chto'}.'</b></span></td>'."\n"); + foreach my $item (@userinfo) { + my $value = $env{'form.c'.$item}; + if ($namechangedhash->{$item}) { + $value = '<span class="LC_cusr_emph">'.$value.'</span>'; + } + $r->print("<td>$value </td>\n"); + } + foreach my $entry (@{$order}) { + if ($canshow->{$entry}) { + if (($entry eq 'requestcourses') || ($entry eq 'reqcrsotherdom')) { + foreach my $item (@{$requestcourses}) { + my $value = $newsetting->{$item}.' '.$newsettingtext->{$item}; + if ($changedhash->{$item}) { + $value = '<span class="LC_cusr_emph">'.$value.'</span>'; + } + $r->print("<td>$value </td>\n"); + } + } elsif ($entry eq 'tools') { + foreach my $item (@{$usertools}) { + my $value = $newsetting->{$item}.' '.$newsettingtext->{$item}; + if ($changedhash->{$item}) { + $value = '<span class="LC_cusr_emph">'.$value.'</span>'; + } + $r->print("<td>$value </td>\n"); + } + } else { + my $value = $newsetting->{$entry}.' '.$newsettingtext->{$entry}; + if ($changedhash->{$entry}) { + $value = '<span class="LC_cusr_emph">'.$value.'</span>'; + } + $r->print("<td>$value </td>\n"); + } + } + } + $r->print(&Apache::loncommon::end_data_table_row()); + } + $r->print(&Apache::loncommon::end_data_table().'<br />'); + return; +} + sub tool_changes { my ($context,$usertools,$oldaccess,$oldaccesstext,$userenv,$changeHash, $changed,$newaccess,$newaccesstext) = @_; @@ -3478,18 +3608,27 @@ sub build_roles { sub custom_role_editor { my ($r) = @_; - my $rolename=$env{'form.rolename'}; - - if ($rolename eq 'make new role') { - $rolename=$env{'form.newrolename'}; + my $action = $env{'form.customroleaction'}; + my $rolename; + if ($action eq 'new') { + $rolename=$env{'form.newrolename'}; + } else { + $rolename=$env{'form.rolename'}; } $rolename=~s/[^A-Za-z0-9]//gs; - if (!$rolename || $env{'form.phase'} eq 'pickrole') { &print_username_entry_form($r); return; } + my ($crstype,$context); + if ($env{'request.course.id'}) { + $crstype = &Apache::loncommon::course_type(); + $context = 'course'; + } else { + $context = 'domain'; + $crstype = $env{'form.templatecrstype'}; + } # ------------------------------------------------------- What can be assigned? my %full=(); my %courselevel=(); @@ -3498,7 +3637,6 @@ sub custom_role_editor { my $dompriv=''; my $coursepriv=''; my $body_top; - my ($disp_dummy,$disp_roles) = &Apache::lonnet::get('roles',["st"]); my ($rdummy,$roledef)= &Apache::lonnet::get('roles',["rolesdef_$rolename"]); # ------------------------------------------------------- Does this role exist? @@ -3507,6 +3645,9 @@ sub custom_role_editor { $body_top .= &mt('Existing Role').' "'; # ------------------------------------------------- Get current role privileges ($syspriv,$dompriv,$coursepriv)=split(/\_/,$roledef); + if ($crstype eq 'Community') { + $syspriv =~ s/bre\&S//; + } } else { $body_top .= &mt('New Role').' "'; $roledef=''; @@ -3548,20 +3689,50 @@ sub custom_role_editor { my $head_script = "\n"; $head_script .= '<script type="text/javascript">'."\n" .'// <![CDATA['."\n"; - my $crstype; - if ($env{'request.course.id'}) { - $crstype = &Apache::loncommon::course_type(); + my @template_roles = ("in","ta","ep"); + if ($context eq 'domain') { + push(@template_roles,"ad"); } - my @template_roles = ("in","ta","ep","st"); + push(@template_roles,"st"); if ($crstype eq 'Community') { unshift(@template_roles,'co'); } else { unshift(@template_roles,'cc'); } foreach my $role (@template_roles) { - $head_script .= &make_script_template($role); + $head_script .= &make_script_template($role,$crstype); $button_code .= &make_button_code($role,$crstype).' '; } + my $context_code; + if ($context eq 'domain') { + my $checkedCommunity = ''; + my $checkedCourse = ' checked="checked"'; + if ($env{'form.templatecrstype'} eq 'Community') { + $checkedCommunity = $checkedCourse; + $checkedCourse = ''; + } + $context_code = '<label>'. + '<input type="radio" name="templatecrstype" value="Course"'.$checkedCourse.' onclick="this.form.submit();">'. + &mt('Course'). + '</label>'.(' ' x2). + '<label>'. + '<input type="radio" name="templatecrstype" value="Community"'.$checkedCommunity.' onclick="this.form.submit();">'. + &mt('Community'). + '</label>'. + '</fieldset>'. + '<input type="hidden" name="customroleaction" value="'. + $action.'" />'; + if ($env{'form.customroleaction'} eq 'new') { + $context_code .= '<input type="hidden" name="newrolename" value="'. + $rolename.'" />'; + } else { + $context_code .= '<input type="hidden" name="rolename" value="'. + $rolename.'" />'; + } + $context_code .= '<input type="hidden" name="action" value="custom" />'. + '<input type="hidden" name="phase" value="selected_custom_edit" />'; + } + $head_script .= "\n".$jsback."\n" .'// ]]>'."\n" .'</script>'."\n"; @@ -3583,13 +3754,22 @@ sub custom_role_editor { 'dml' => "Domain Level", 'ssl' => "System Level"); - $r->print('<div>' + + $r->print('<div class="LC_left_float">' .'<form action=""><fieldset>' .'<legend>'.&mt('Select a Template').'</legend>' .$button_code - .'</fieldset></form>' - .'</div>' - ); + .'</fieldset></form></div>'); + if ($context_code) { + $r->print('<div class="LC_left_float">' + .'<form action="/adm/createuser" method="post"><fieldset>' + .'<legend>'.&mt('Context').'</legend>' + .$context_code + .'</form>' + .'</div>' + ); + } + $r->print('<br clear="all" />'); $r->print(<<ENDCCF); <form name="form1" method="post"> @@ -3601,7 +3781,7 @@ ENDCCF '<th>'.$lt{'prv'}.'</th><th>'.$lt{'crl'}.'</th><th>'.$lt{'dml'}. '</th><th>'.$lt{'ssl'}.'</th>'. &Apache::loncommon::end_data_table_header_row()); - foreach my $priv (sort keys %full) { + foreach my $priv (sort(keys(%full))) { my $privtext = &Apache::lonnet::plaintext($priv,$crstype); $r->print(&Apache::loncommon::start_data_table_row(). '<td>'.$privtext.'</td><td>'. @@ -3610,11 +3790,15 @@ ENDCCF '</td><td>'. ($domainlevel{$priv}?'<input type="checkbox" name="'.$priv.'_d"'. ($domainlevelcurrent{$priv}?' checked="checked"':'').' />':' '). - '</td><td>'. - ($systemlevel{$priv}?'<input type="checkbox" name="'.$priv.'_s"'. - ($systemlevelcurrent{$priv}?' checked="checked"':'').' />':' '). - '</td>'. - &Apache::loncommon::end_data_table_row()); + '</td><td>'); + if ($priv eq 'bre' && $crstype eq 'Community') { + $r->print(' '); + } else { + $r->print($systemlevel{$priv}?'<input type="checkbox" name="'.$priv.'_s"'. + ($systemlevelcurrent{$priv}?' checked="checked"':'').' />':' '); + } + $r->print('</td>'. + &Apache::loncommon::end_data_table_row()); } $r->print(&Apache::loncommon::end_data_table(). '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'. @@ -3626,7 +3810,7 @@ ENDCCF } # -------------------------------------------------------- sub make_script_template { - my ($role) = @_; + my ($role,$crstype) = @_; my %full_c=(); my %full_d=(); my %full_s=(); @@ -3640,6 +3824,7 @@ sub make_script_template { $full_d{$priv}=1; } foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:s'})) { + next if (($crstype eq 'Community') && ($item eq 'bre&S')); my ($priv,$restrict)=split(/\&/,$item); $full_s{$priv}=1; } @@ -3944,7 +4129,7 @@ sub handler { $r->print(&Apache::lonhtmlcommon::breadcrumbs("Update Users", 'Course_View_Class_List')); if ($permission->{'cusr'}) { - &Apache::lonuserutils::update_user_list($r,$context,$setting,$choice); + &Apache::lonuserutils::update_user_list($r,$context,$setting,$choice,$crstype); $r->print(&Apache::loncommon::end_page()); } else { $r->print(&mt('You are not authorized to make bulk changes to user roles')); @@ -4290,14 +4475,14 @@ sub print_main_menu { }, { linktext => $linktext{$crstype}{'groups'}, - icon => 'conf.png', + icon => 'grps.png', #help => 'Course_Manage_Group', url => '/adm/coursegroups?refpage=cusr', permission => $permission->{'grp_manage'}, linktitle => $linktitle{$crstype}{'groups'}, }, { - linktext => 'Change Logs', + linktext => 'Change Log', icon => 'document-properties.png', #help => 'Course_User_Logs', url => '/adm/createuser?action=changelogs', @@ -4365,6 +4550,7 @@ sub restore_prev_selections { sub print_selfenroll_menu { my ($r,$context,$permission) = @_; + my $crstype = &Apache::loncommon::course_type(); my $formname = 'enrollstudent'; my $nolink = 1; my ($row,$lt) = &get_selfenroll_titles(); @@ -4726,8 +4912,12 @@ ENDSCRIPT &mt('No').'</label>'; my %advhash = &Apache::lonnet::get_course_adv_roles($cid,1); my (@ccs,%notified); - if ($advhash{'cc'}) { - @ccs = split(/,/,$advhash{'cc'}); + my $ccrole = 'cc'; + if ($crstype eq 'Community') { + $ccrole = 'co'; + } + if ($advhash{$ccrole}) { + @ccs = split(/,/,$advhash{$ccrole}); } if ($currnotified) { foreach my $current (split(/,/,$currnotified)) { @@ -5036,7 +5226,6 @@ sub print_userchangelogs_display { my %roleslog=&Apache::lonnet::dump('nohist_rolelog',$cdom,$cnum); if ((keys(%roleslog))[0]=~/^error\:/) { undef(%roleslog); } - $r->print('<form action="/adm/createuser" method="post" name="'.$formname.'">'); my %saveable_parameters = ('show' => 'scalar',); &Apache::loncommon::store_course_settings('roles_log', \%saveable_parameters); @@ -5071,7 +5260,6 @@ sub print_userchangelogs_display { } my (%whodunit,%changed,$version); ($version) = ($r->dir_config('lonVersion') =~ /^([\d\.]+)\-/); - $r->print(&role_display_filter($formname,$cdom,$cnum,\%curr,$version,$crstype)); my ($minshown,$maxshown); $minshown = 1; my $count = 0; @@ -5082,8 +5270,29 @@ sub print_userchangelogs_display { } } - # Collect user change log data - my $content = ''; + # Form Header + $r->print('<form action="/adm/createuser" method="post" name="'.$formname.'">'. + &role_display_filter($formname,$cdom,$cnum,\%curr,$version,$crstype)); + + # Create navigation + my ($nav_script,$nav_links) = &userlogdisplay_nav($formname,\%curr,$more_records); + my $showntableheader = 0; + + # Table Header + my $tableheader = + &Apache::loncommon::start_data_table_header_row() + .'<th> </th>' + .'<th>'.&mt('When').'</th>' + .'<th>'.&mt('Who made the change').'</th>' + .'<th>'.&mt('Changed User').'</th>' + .'<th>'.&mt('Role').'</th>' + .'<th>'.&mt('Section').'</th>' + .'<th>'.&mt('Context').'</th>' + .'<th>'.&mt('Start').'</th>' + .'<th>'.&mt('End').'</th>' + .&Apache::loncommon::end_data_table_header_row(); + + # Display user change log data foreach my $id (sort { $roleslog{$b}{'exe_time'}<=>$roleslog{$a}{'exe_time'} } (keys(%roleslog))) { next if (($roleslog{$id}{'exe_time'} < $curr{'rolelog_start_date'}) || ($roleslog{$id}{'exe_time'} > $curr{'rolelog_end_date'})); @@ -5105,7 +5314,14 @@ sub print_userchangelogs_display { } $count ++; next if ($count < $minshown); - + unless ($showntableheader) { + $r->print($nav_script + .$nav_links + .&Apache::loncommon::start_data_table() + .$tableheader); + $r->rflush(); + $showntableheader = 1; + } if ($whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}} eq '') { $whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}} = &Apache::loncommon::plainname($roleslog{$id}{'exe_uname'},$roleslog{$id}{'exe_udom'}); @@ -5144,7 +5360,7 @@ sub print_userchangelogs_display { if ($chgcontext ne '' && $lt{$chgcontext} ne '') { $chgcontext = $lt{$chgcontext}; } - $content .= + $r->print( &Apache::loncommon::start_data_table_row() .'<td>'.$count.'</td>' .'<td>'.&Apache::lonlocal::locallocaltime($roleslog{$id}{'exe_time'}).'</td>' @@ -5155,30 +5371,34 @@ sub print_userchangelogs_display { .'<td>'.$chgcontext.'</td>' .'<td>'.$rolestart.'</td>' .'<td>'.$roleend.'</td>' - .&Apache::loncommon::end_data_table_row(); + .&Apache::loncommon::end_data_table_row()."\n"); } - # Form Footer - my $form_footer = - '<input type="hidden" name="page" value="'.$curr{'page'}.'" />' - .'<input type="hidden" name="action" value="changelogs" />' - .'</form>'; - - # Only display table, if content is available (has been collected above) - if (!$content) { + if ($showntableheader) { # Table footer, if content displayed above + $r->print(&Apache::loncommon::end_data_table() + .$nav_links); + } else { # No content displayed above $r->print('<p class="LC_info">' .&mt('There are no records to display.') .'</p>' ); - $r->print($form_footer); - return; } - # Content to display, so create navigation and display table + # Form Footer + $r->print( + '<input type="hidden" name="page" value="'.$curr{'page'}.'" />' + .'<input type="hidden" name="action" value="changelogs" />' + .'</form>'); + return; +} - # Create Navigation: - # Navigation Script - my $nav_script = <<"ENDSCRIPT"; +sub userlogdisplay_nav { + my ($formname,$curr,$more_records) = @_; + my ($nav_script,$nav_links); + if (ref($curr) eq 'HASH') { + # Create Navigation: + # Navigation Script + $nav_script = <<"ENDSCRIPT"; <script type="text/javascript"> // <![CDATA[ function chgPage(caller) { @@ -5188,57 +5408,31 @@ function chgPage(caller) { if (caller == 'next') { document.$formname.page.value ++; } - document.$formname.submit(); + document.$formname.submit(); return; } // ]]> </script> ENDSCRIPT - # Navigation Buttons - my $nav_links; - $nav_links = '<p>'; - if (($curr{'page'} > 1) || ($more_records)) { - if ($curr{'page'} > 1) { - $nav_links .= '<input type="button"' - .' onclick="javascript:chgPage('."'previous'".');"' - .' value="'.&mt('Previous [_1] changes',$curr{'show'}) - .'" /> '; - } - if ($more_records) { - $nav_links .= '<input type="button"' - .' onclick="javascript:chgPage('."'next'".');"' - .' value="'.&mt('Next [_1] changes',$curr{'show'}) - .'" />'; + # Navigation Buttons + $nav_links = '<p>'; + if (($curr->{'page'} > 1) || ($more_records)) { + if ($curr->{'page'} > 1) { + $nav_links .= '<input type="button"' + .' onclick="javascript:chgPage('."'previous'".');"' + .' value="'.&mt('Previous [_1] changes',$curr->{'show'}) + .'" /> '; + } + if ($more_records) { + $nav_links .= '<input type="button"' + .' onclick="javascript:chgPage('."'next'".');"' + .' value="'.&mt('Next [_1] changes',$curr->{'show'}) + .'" />'; + } } + $nav_links .= '</p>'; } - $nav_links .= '</p>'; - - # Table Header - my $tableheader = - &Apache::loncommon::start_data_table_header_row() - .'<th> </th>' - .'<th>'.&mt('When').'</th>' - .'<th>'.&mt('Who made the change').'</th>' - .'<th>'.&mt('Changed User').'</th>' - .'<th>'.&mt('Role').'</th>' - .'<th>'.&mt('Section').'</th>' - .'<th>'.&mt('Context').'</th>' - .'<th>'.&mt('Start').'</th>' - .'<th>'.&mt('End').'</th>' - .&Apache::loncommon::end_data_table_header_row(); - - # Print Content - $r->print( - $nav_script - .$nav_links - .&Apache::loncommon::start_data_table() - .$tableheader - .$content - .&Apache::loncommon::end_data_table() - .$nav_links - .$form_footer - ); - return; + return ($nav_script,$nav_links); } sub role_display_filter { @@ -5665,12 +5859,12 @@ sub build_search_response { my ($context,$srch,%srch_results) = @_; my ($currstate,$response,$forcenewuser); my %names = ( - 'uname' => 'username', - 'lastname' => 'last name', + 'uname' => 'username', + 'lastname' => 'last name', 'lastfirst' => 'last name, first name', - 'crs' => 'this course', - 'dom' => 'LON-CAPA domain: ', - 'instd' => 'the institutional directory for domain: ', + 'crs' => 'this course', + 'dom' => 'LON-CAPA domain', + 'instd' => 'the institutional directory for domain', ); my %single = ( @@ -5690,14 +5884,20 @@ sub build_search_response { $currstate = 'modify'; $response = &mt("$single{$srch->{'srchtype'}} was found for the $names{$srch->{'srchby'}} ([_1]) in $names{$srch->{'srchin'}}.",$srch->{'srchterm'}); if ($srch->{'srchin'} eq 'dom' || $srch->{'srchin'} eq 'instd') { - $response .= &display_domain_info($srch->{'srchdomain'}); + $response .= ': '.&display_domain_info($srch->{'srchdomain'}); } - } else { - $response = '<span class="LC_warning">'.&mt("$nomatch{$srch->{'srchtype'}} found for the $names{$srch->{'srchby'}} ([_1]) in $names{$srch->{'srchin'}}",$srch->{'srchterm'}); + } else { # Search has nothing found. Prepare message to user. + $response = '<span class="LC_warning">'; if ($srch->{'srchin'} eq 'dom' || $srch->{'srchin'} eq 'instd') { - $response .= &display_domain_info($srch->{'srchdomain'}); + $response .= &mt("$nomatch{$srch->{'srchtype'}} found for the $names{$srch->{'srchby'}} [_1] in $names{$srch->{'srchin'}}: [_2]", + '<b>'.$srch->{'srchterm'}.'</b>', + &display_domain_info($srch->{'srchdomain'})); + } else { + $response .= &mt("$nomatch{$srch->{'srchtype'}} found for the $names{$srch->{'srchby'}} [_1] in $names{$srch->{'srchin'}}.", + '<b>'.$srch->{'srchterm'}.'</b>'); } $response .= '</span>'; + if ($srch->{'srchin'} ne 'alc') { $forcenewuser = 1; my $cansrchinst = 0; @@ -5847,10 +6047,11 @@ sub course_level_table { 'end' => "End" ); - foreach my $protectedcourse (sort( keys(%inccourses))) { + foreach my $protectedcourse (sort(keys(%inccourses))) { my $thiscourse=$protectedcourse; $thiscourse=~s:_:/:g; my %coursedata=&Apache::lonnet::coursedescription($thiscourse); + my $isowner = &is_courseowner($protectedcourse,$coursedata{'internal.courseowner'}); my $area=$coursedata{'description'}; my $crstype=$coursedata{'type'}; if (!defined($area)) { $area=&mt('Unavailable course').': '.$protectedcourse; } @@ -5865,9 +6066,10 @@ sub course_level_table { my @roles = &Apache::lonuserutils::roles_by_context('course','',$crstype); foreach my $role (@roles) { my $plrole=&Apache::lonnet::plaintext($role,$crstype); - if (&Apache::lonnet::allowed('c'.$role,$thiscourse)) { + if ((&Apache::lonnet::allowed('c'.$role,$thiscourse)) || + ((($role eq 'cc') || ($role eq 'co')) && ($isowner))) { $table .= &course_level_row($protectedcourse,$role,$area,$domain, - $plrole,\%sections_count,\%lt); + $plrole,\%sections_count,\%lt); } elsif ($env{'request.course.sec'} ne '') { if (&Apache::lonnet::allowed('c'.$role,$thiscourse.'/'. $env{'request.course.sec'})) { @@ -5877,7 +6079,8 @@ sub course_level_table { } } if (&Apache::lonnet::allowed('ccr',$thiscourse)) { - foreach my $cust (sort keys %customroles) { + foreach my $cust (sort(keys(%customroles))) { + next if ($crstype eq 'Community' && $customroles{$cust} =~ /bre\&S/); my $role = 'cr_cr_'.$env{'user.domain'}.'_'.$env{'user.name'}.'_'.$cust; $table .= &course_level_row($protectedcourse,$role,$area,$domain, $cust,\%sections_count,\%lt); @@ -5908,7 +6111,7 @@ sub course_level_row { $protectedcourse.'_'.$role.'" /></td>'."\n". ' <td>'.$plrole.'</td>'."\n". ' <td>'.$area.'<br />Domain: '.$domain.'</td>'."\n"; - if ($role eq 'cc') { + if (($role eq 'cc') || ($role eq 'co')) { $row .= '<td> </td>'; } elsif ($env{'request.course.sec'} ne '') { $row .= ' <td><input type="hidden" value="'. @@ -5956,8 +6159,8 @@ sub course_level_dc { '<input type="hidden" name="origdom" value="'.$dcdom.'" />'. '<input type="hidden" name="dccourse" value="" />'; my $courseform='<b>'.&Apache::loncommon::selectcourse_link - ('cu','dccourse','dcdomain','coursedesc',undef,undef,'Course').'</b>'; - my $cb_jscript = &Apache::loncommon::coursebrowser_javascript($dcdom,'currsec','cu','role'); + ('cu','dccourse','dcdomain','coursedesc',undef,undef,'Course/Community','crstype').'</b>'; + my $cb_jscript = &Apache::loncommon::coursebrowser_javascript($dcdom,'currsec','cu','role','Course/Community Browser'); my %lt=&Apache::lonlocal::texthash( 'rol' => "Role", 'grs' => "Section", @@ -5968,14 +6171,14 @@ sub course_level_dc { 'ssd' => "Set Start Date", 'sed' => "Set End Date" ); - my $header = '<h4>'.&mt('Course Level').'</h4>'. + my $header = '<h4>'.&mt('Course/Community Level').'</h4>'. &Apache::loncommon::start_data_table(). &Apache::loncommon::start_data_table_header_row(). '<th>'.$courseform.'</th><th>'.$lt{'rol'}.'</th><th>'.$lt{'grs'}.'</th><th>'.$lt{'sta'}.'</th><th>'.$lt{'end'}.'</th>'. &Apache::loncommon::end_data_table_header_row(); my $otheritems = &Apache::loncommon::start_data_table_row()."\n". - '<td><input type="text" name="coursedesc" value="" onfocus="this.blur();opencrsbrowser('."'cu','dccourse','dcdomain','coursedesc',''".')" /></td>'."\n". - '<td><select name="role">'."\n"; + '<td><br /><input type="text" name="coursedesc" value="" onfocus="this.blur();opencrsbrowser('."'cu','dccourse','dcdomain','coursedesc','','','','crstype'".')" /></td>'."\n". + '<td valign><br /><select name="role">'."\n"; foreach my $role (@roles) { my $plrole=&Apache::lonnet::plaintext($role); $otheritems .= ' <option value="'.$role.'">'.$plrole; @@ -5995,13 +6198,14 @@ sub course_level_dc { '<td valign="top"> <b>'.$lt{'new'}.'</b><br />'. '<input type="text" name="newsec" value="" />'. '<input type="hidden" name="section" value="" />'. - '<input type="hidden" name="groups" value="" /></td>'. + '<input type="hidden" name="groups" value="" />'. + '<input type="hidden" name="crstype" value="" /></td>'. '</tr></table></td>'; $otheritems .= <<ENDTIMEENTRY; -<td><input type="hidden" name="start" value='' /> +<td><br /><input type="hidden" name="start" value='' /> <a href= "javascript:pjump('date_start','Start Date',document.cu.start.value,'start','cu.pres','dateset')">$lt{'ssd'}</a></td> -<td><input type="hidden" name="end" value='' /> +<td><br /><input type="hidden" name="end" value='' /> <a href= "javascript:pjump('date_end','End Date',document.cu.end.value,'end','cu.pres','dateset')">$lt{'sed'}</a></td> ENDTIMEENTRY @@ -6368,6 +6572,21 @@ sub get_selfenroll_titles { return (\@row,\%lt); } +sub is_courseowner { + my ($thiscourse,$courseowner) = @_; + if ($courseowner eq '') { + if ($env{'request.course.id'} eq $thiscourse) { + $courseowner = $env{'course.'.$env{'request.course.id'}.'.internal.courseowner'}; + } + } + if ($courseowner ne '') { + if ($courseowner eq $env{'user.name'}.':'.$env{'user.domain'}) { + return 1; + } + } + return; +} + #---------------------------------------------- end functions for &phase_two #--------------------------------- functions for &phase_two and &phase_three