--- loncom/interface/loncreateuser.pm 2009/08/23 13:09:54 1.295.2.10 +++ loncom/interface/loncreateuser.pm 2009/09/10 23:04:52 1.314 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Create a user # -# $Id: loncreateuser.pm,v 1.295.2.10 2009/08/23 13:09:54 raeburn Exp $ +# $Id: loncreateuser.pm,v 1.314 2009/09/10 23:04:52 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -110,6 +110,7 @@ sub initialize_authen_forms { sub auth_abbrev { my %abv_auth = ( + krb5 => 'krb', krb4 => 'krb', internal => 'int', localuth => 'loc', @@ -228,12 +229,14 @@ sub build_tools_display { 'usde' => "Use default", 'uscu' => "Use custom", 'official' => 'Can request creation of official courses', - 'unofficial' => 'Can request creation of unofficial courses', + 'unofficial' => 'Can request creation of unofficial courses', + 'community' => 'Can request creation of communities', ); if ($context eq 'requestcourses') { %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname, - 'requestcourses.official','requestcourses.unofficial'); - @usertools = ('official','unofficial'); + 'requestcourses.official','requestcourses.unofficial', + 'requestcourses.community'); + @usertools = ('official','unofficial','community'); @options =('norequest','approval','autolimit','validate'); %validations = &Apache::lonnet::auto_courserequest_checks($ccdomain); %reqtitles = &courserequest_titles(); @@ -291,7 +294,11 @@ sub build_tools_display { } if ($curroption =~ /^autolimit=(\d*)$/) { $currlimit = $1; - $currdisp = &mt('Yes, up to [quant,_1,request]/user',$currlimit); + if ($currlimit eq '') { + $currdisp = &mt('Yes, automatic creation'); + } else { + $currdisp = &mt('Yes, up to [quant,_1,request]/user',$currlimit); + } } else { $currdisp = $reqdisplay{$curroption}; } @@ -325,9 +332,12 @@ sub build_tools_display { if ($option eq 'autolimit') { $custdisp .= '<input type="text" name="crsreq_'. $item.'_limit" size="1" '. - 'value="'.$currlimit.'" />'; + 'value="'.$currlimit.'" /></span><br />'. + $reqtitles{'unlimited'}; + } else { + $custdisp .= '</span>'; } - $custdisp .= '</span></td></tr>'; + $custdisp .= '</td></tr>'; } $custdisp .= '</table>'; $custradio = '</span></td><td>'.&mt('Custom setting').'<br />'.$custdisp; @@ -377,22 +387,27 @@ sub coursereq_externaluser { my ($curroption,$currlimit,$tooloff); if ($userenv{'reqcrsotherdom.'.$item} ne '') { my @curr = split(',',$userenv{'reqcrsotherdom.'.$item}); - if (grep(/^\Q$cdom\E:($optregex)=?(\d*)$/,@curr)) { - $curroption = $1; - $currlimit = $2; - if (!$curroption) { - $curroption = 'norequest'; + foreach my $req (@curr) { + if ($req =~ /^\Q$cdom\E\:($optregex)=?(\d*)$/) { + $curroption = $1; + $currlimit = $2; + last; } } + if (!$curroption) { + $curroption = 'norequest'; + $tooloff = ' checked="checked"'; + } } else { $curroption = 'norequest'; $tooloff = ' checked="checked"'; } $output.= &Apache::loncommon::start_data_table_row()."\n". - ' <td><span class="LC_nobreak">'.$lt{$item}.': '. + ' <td><span class="LC_nobreak">'.$lt{$item}.': </span></td><td>'. + '<table><tr><td valign="top">'."\n". '<label><input type="radio" name="reqcrsotherdom_'.$item. - '" value="0"'.$tooloff.' />'.$reqtitles{'norequest'}. - '</label> '; + '" value=""'.$tooloff.' />'.$reqtitles{'norequest'}. + '</label></td>'; foreach my $option (@options) { if ($option eq 'validate') { my $canvalidate = 0; @@ -407,18 +422,21 @@ sub coursereq_externaluser { if ($option eq $curroption) { $checked = ' checked="checked"'; } - $output .= '<span class="LC_nobreak"><label>'. + $output .= '<td valign="top"><span class="LC_nobreak"><label>'. '<input type="radio" name="reqcrsotherdom_'.$item. '" value="'.$option.'"'.$checked.' />'. - $reqtitles{$option}.'</label> '; + $reqtitles{$option}.'</label>'; if ($option eq 'autolimit') { - $output .= '<input type="text" name="reqcrsotherdom_'. + $output .= ' <input type="text" name="reqcrsotherdom_'. $item.'_limit" size="1" '. - 'value="'.$currlimit.'" />'; + 'value="'.$currlimit.'" /></span>'. + '<br />'.$reqtitles{'unlimited'}; + } else { + $output .= '</span>'; } - $output .= ' ' + $output .= '</td>'; } - $output .= '</span></td>'."\n". + $output .= '</td></tr></table></td>'."\n". &Apache::loncommon::end_data_table_row()."\n"; } return $output; @@ -433,16 +451,17 @@ sub courserequest_titles { approval => 'Approval by Dom. Coord.', validate => 'With validation', autolimit => 'Numerical limit', + unlimited => '(blank for unlimited)', ); - return %titles; -} - + return %titles; +} + sub courserequest_display { my %titles = &Apache::lonlocal::texthash ( approval => 'Yes, need approval', validate => 'Yes, with validation', norequest => 'No', - ); + ); return %titles; } @@ -708,13 +727,13 @@ ENDSCRIPT faq=>282,bug=>'Instructor Interface',}); if ($env{'form.action'} eq 'singleuser') { $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management', - 'Course_Change_Privileges')); + 'Course_Change_Privileges')); $r->print("<b>$lt{'usrch'}</b><br />"); $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context)); $r->print('<h3>'.$lt{'usel'}.'</h3>'); } elsif ($env{'form.action'} eq 'singlestudent') { $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management', - 'Course_Add_Student')); + 'Course_Add_Student')); $r->print($jscript."<b>$lt{'stusrch'}</b><br />"); $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context)); $r->print('</form><h3>'.$lt{'stusel'}.'</h3>'); @@ -1556,8 +1575,10 @@ sub new_domain_roles { &mt('Extent').'</th>'. '<th>'.&mt('Start').'</th><th>'.&mt('End').'</th>'. &Apache::loncommon::end_data_table_header_row(); + my @allroles = &Apache::lonuserutils::roles_by_context('domain'); foreach my $thisdomain (sort(&Apache::lonnet::all_domains())) { - foreach my $role ('dc','li','dg','au','sc') { + foreach my $role (@allroles) { + next if ($role eq 'ad'); if (&Apache::lonnet::allowed('c'.$role,$thisdomain)) { my $plrole=&Apache::lonnet::plaintext($role); my %lt=&Apache::lonlocal::texthash( @@ -2075,7 +2096,7 @@ sub update_user_data { $env{'form.ccuname'}, $env{'form.ccdomain'}).'</h3>'); my (%alerts,%rulematch,%inst_results,%curr_rules); my @usertools = ('aboutme','blog','portfolio'); - my @requestcourses = ('official','unofficial'); + my @requestcourses = ('official','unofficial','community'); my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($env{'form.ccdomain'}); if ($env{'form.makeuser'}) { @@ -2443,7 +2464,6 @@ sub update_user_data { } &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); @@ -2476,7 +2496,8 @@ sub update_user_data { ($env{'user.domain'} eq $env{'form.ccdomain'})) { my %newenvhash; foreach my $key (keys(%changed)) { - if (($key eq 'official') || ($key eq 'unofficial')) { + if (($key eq 'official') || ($key eq 'unofficial') + || ($key eq 'community')) { $newenvhash{'environment.requestcourses.'.$key} = $changeHash{'requestcourses.'.$key}; if ($changeHash{'requestcourses.'.$key} ne '') { @@ -2538,6 +2559,7 @@ sub update_user_data { '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:' @@ -2690,7 +2712,8 @@ END 'aboutme' => "Personal Information Page Availability", 'portfolio' => "Portfolio Availability", 'official' => "Can Request Official Courses", - 'unofficial' => "Can Request Unofficial Course", + 'unofficial' => "Can Request Unofficial Courses", + 'community' => "Can Request Communities", 'inststatus' => "Affiliation", ); $r->print(<<"END"); @@ -2810,48 +2833,56 @@ sub tool_changes { my %reqdisplay = &courserequest_display(); my $cdom = $env{'request.role.domain'}; foreach my $tool (@{$usertools}) { - $oldaccesstext->{$tool} = &mt('no'); + $oldaccesstext->{$tool} = &mt('No'); + $newaccesstext->{$tool} = $oldaccesstext->{$tool}; $changeHash->{$context.'.'.$tool} = $userenv->{$context.'.'.$tool}; + my $newop; + if ($env{'form.'.$context.'_'.$tool}) { + $newop = $env{'form.'.$context.'_'.$tool}; + if ($newop eq 'autolimit') { + my $limit = $env{'form.'.$context.'_'.$tool.'_limit'}; + $limit =~ s/\D+//g; + $newop .= '='.$limit; + } + } if ($userenv->{$context.'.'.$tool} eq '') { - if ($env{'form.'.$context.'_'.$tool}) { - $changed->{$tool}=&tool_admin($tool,$cdom, + if ($newop) { + $changed->{$tool}=&tool_admin($tool,$cdom.':'.$newop, $changeHash,$context); if ($changed->{$tool}) { - $newaccesstext->{$tool} = &mt('yes'); + $newaccesstext->{$tool} = &mt('Yes'); } else { - $newaccesstext->{$tool} = $oldaccesstext->{$tool}; } + $newaccesstext->{$tool} = $oldaccesstext->{$tool}; + } } } else { my @curr = split(',',$userenv->{$context.'.'.$tool}); my @new; my $changedoms; - my $newop = $env{'form.'.$context.'_'.$tool}; - if ($newop eq 'autolimit') { - $newop .= '='; - unless ($env{'form.'.$context.'_'.$tool.'_limit'} =~ /\D/) { - $newop .= $env{'form.'.$context.'_'.$tool.'_limit'}; - } - } - if (grep(/^\Q$cdom:($optregex\=?\d*)\E$/,@curr)) { - $oldaccesstext->{$tool} = &mt('yes'); - my $oldop = $1; - if ($oldop ne $newop) { - $changedoms = 1; - foreach my $dom (@curr) { - unless ($dom eq $cdom) { - push(@new,$dom); + foreach my $req (@curr) { + if ($req =~ /^\Q$cdom\E\:($optregex\=?\d*)$/) { + $oldaccesstext->{$tool} = &mt('Yes'); + my $oldop = $1; + if ($oldop ne $newop) { + $changedoms = 1; + foreach my $item (@curr) { + my ($reqdom,$option) = split(':',$item); + unless ($reqdom eq $cdom) { + push(@new,$item); + } } + if ($newop) { + push(@new,$cdom.':'.$newop); + } + @new = sort(@new); } - if ($newop) { - push(@new,$cdom.':'.$newop); - } - @new = sort(@new); + last; } - } elsif ($env{'form.'.$context.'_'.$tool}) { + } + if ((!$changedoms) && ($newop)) { $changedoms = 1; @new = sort(@curr,$cdom.':'.$newop); } - $newaccesstext->{$tool} = $oldaccesstext->{$tool}; if ($changedoms) { my $newdomstr; if (@new) { @@ -2862,10 +2893,12 @@ sub tool_changes { if ($changed->{$tool}) { if ($env{'form.'.$context.'_'.$tool}) { if ($env{'form.'.$context.'_'.$tool} eq 'autolimit') { - if ($env{'form.'.$context.'_'.$tool.'_limit'} =~ /\D/) { - $newaccesstext->{$tool} = &mt('Yes, processed automatically'); + my $limit = $env{'form.'.$context.'_'.$tool.'_limit'}; + $limit =~ s/\D+//g; + if ($limit) { + $newaccesstext->{$tool} = &mt('Yes, up to limit of [quant,_1,request] per user.',$limit); } else { - $newaccesstext->{$tool} = &mt('Yes, up to limit of [quant,_1,request] per user).',$env{'form.'.$context.'_'.$tool.'_limit'}); + $newaccesstext->{$tool} = &mt('Yes, processed automatically'); } } else { $newaccesstext->{$tool} = $reqdisplay{$env{'form.'.$context.'_'.$tool}}; @@ -3449,16 +3482,16 @@ sub custom_role_editor { my ($jsback,$elements) = &crumb_utilities(); my $button_code = "\n"; my $head_script = "\n"; - $head_script .= '<script type="text/javascript">'."\n". - '// <![CDATA['."\n"; + $head_script .= '<script type="text/javascript">'."\n" + .'// <![CDATA['."\n"; my @template_roles = ("cc","in","ta","ep","st"); foreach my $role (@template_roles) { $head_script .= &make_script_template($role); $button_code .= &make_button_code($role).' '; } - $head_script .= "\n".$jsback."\n". - '// ]]>'."\n". - '</script>'."\n"; + $head_script .= "\n".$jsback."\n" + .'// ]]>'."\n" + .'</script>'."\n"; $r->print(&Apache::loncommon::start_page('Custom Role Editor',$head_script)); &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:backPage(document.form1,'pickrole','')", @@ -3601,11 +3634,11 @@ sub set_custom_role { return; } my ($jsback,$elements) = &crumb_utilities(); - my $jscript = '<script type="text/javascript">'. - '// <![CDATA['."\n". - $jsback."\n". - '// ]]>'."\n". - '</script>'; + my $jscript = '<script type="text/javascript">' + .'// <![CDATA['."\n" + .$jsback."\n" + .'// ]]>'."\n" + .'</script>'."\n"; $r->print(&Apache::loncommon::start_page('Save Custom Role'),$jscript); &Apache::lonhtmlcommon::add_breadcrumb @@ -3938,7 +3971,6 @@ sub handler { $r->print('<h3>'.&mt('Pending enrollment requests').'</h3>'."\n"); $r->print(&Apache::loncoursequeueadmin::display_queued_requests($context, $cdom,$cnum)); - } elsif ($env{'form.state'} eq 'done') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>'/adm/createuser?action=selfenrollqueue', @@ -3981,11 +4013,11 @@ sub header { sub add_script { my ($js) = @_; - return '<script type="text/javascript">'."\n". - '// <![CDATA['."\n". - "\n".$js."\n". - '// ]]>'."\n". - '</script>'."\n"; + return '<script type="text/javascript">'."\n" + .'// <![CDATA['."\n" + .$js."\n" + .'// ]]>'."\n" + .'</script>'."\n"; } sub verify_user_display { @@ -4008,121 +4040,167 @@ END sub print_main_menu { my ($permission,$context) = @_; my %links = ( - domain => { - upload => 'Upload a File of Users', - singleuser => 'Add/Modify a Single User', - listusers => 'Manage Multiple Users', - }, - author => { - upload => 'Upload a File of Co-authors', - singleuser => 'Add/Modify a Single Co-author', - listusers => 'Display Co-authors and Manage Multiple Users', - }, - course => { - upload => 'Upload a File of Course Users', - singleuser => 'Add/Modify a Single Course User', - listusers => 'Display Class Lists and Manage Multiple Users', - }, + domain => { + upload => 'Upload a File of Users', + singleuser => 'Add/Modify a User', + listusers => 'Manage Users', + }, + author => { + upload => 'Upload a File of Co-authors', + singleuser => 'Add/Modify a Co-author', + listusers => 'Manage Co-authors', + }, + course => { + upload => 'Upload a File of Course Users', + singleuser => 'Add/Modify a Course User', + listusers => 'Manage Course Users', + }, ); + my @menu = ( {categorytitle => 'Single Users', + items => + [ + { + linktext => $links{$context}{'singleuser'}, + icon => 'edit-redo.png', + #help => 'Course_Change_Privileges', + url => '/adm/createuser?action=singleuser', + permission => $permission->{'cusr'}, + linktitle => 'Add a user with a certain role to this course.', + }, + ]}, - my @menu = - ( - { text => $links{$context}{'upload'}, - help => 'Course_Create_Class_List', - action => 'upload', - permission => $permission->{'cusr'}, + {categorytitle => 'Multiple Users', + items => + [ + { + linktext => $links{$context}{'upload'}, + icon => 'sctr.png', + #help => 'Course_Create_Class_List', + url => '/adm/createuser?action=upload', + permission => $permission->{'cusr'}, + linktitle => 'Upload a CSV or a text file containing users.', }, - { text => $links{$context}{'singleuser'}, - help => 'Course_Change_Privileges', - action => 'singleuser', - permission => $permission->{'cusr'}, + { + linktext => $links{$context}{'listusers'}, + icon => 'edit-find.png', + #help => 'Course_View_Class_List', + url => '/adm/createuser?action=listusers', + permission => ($permission->{'view'} || $permission->{'cusr'}), + linktitle => 'Show and manage users of this course.', + }, + + ]}, + + {categorytitle => 'Administration', + items => [ ]}, + ); + + if ($context eq 'domain'){ + + push(@{ $menu[2]->{items} }, #Category: Administration + { + linktext => 'Custom Roles', + icon => 'emblem-photos.png', + #help => 'Course_Editing_Custom_Roles', + url => '/adm/createuser?action=custom', + permission => $permission->{'custom'}, + linktitle => 'Configure a custom role.', }, - { text => $links{$context}{'listusers'}, - help => 'Course_View_Class_List', - action => 'listusers', - permission => ($permission->{'view'} || $permission->{'cusr'}), - }, ); - if ($context eq 'domain' || $context eq 'course') { - my $customlink = { text => 'Edit Custom Roles', - help => 'Course_Editing_Custom_Roles', - action => 'custom', - permission => $permission->{'custom'}, - }; - push(@menu,$customlink); - } - if ($context eq 'course') { + + }elsif ($context eq 'course'){ my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity(); - my @courselinks = - ( - { text => 'Enroll a Single Student', - help => 'Course_Add_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 Enrollment Manager', - help => 'Course_Automated_Enrollment', + + push(@{ $menu[0]->{items} }, #Category: Single Users + { + linktext => 'Add/Modify a Student', + #help => 'Course_Add_Student', + icon => 'list-add.png', + url => '/adm/createuser?action=singlestudent', + permission => $permission->{'cusr'}, + linktitle => 'Add a user with the role student to this course.', + }, + ); + + push(@{ $menu[1]->{items} }, #Category: Multiple Users + { + linktext => 'Drop Students', + icon => 'edit-undo.png', + #help => 'Course_Drop_Student', + url => '/adm/createuser?action=drop', + permission => $permission->{'cusr'}, + linktitle =>'Remove a student from this course.', + }, + ); + push(@{ $menu[2]->{items} }, #Category: Administration + { + linktext => 'Custom Roles', + icon => 'emblem-photos.png', + #help => 'Course_Editing_Custom_Roles', + url => '/adm/createuser?action=custom', + permission => $permission->{'custom'}, + linktitle => 'Configure a custom role.', + }, + { + linktext => 'Course Groups', + icon => 'conf.png', + #help => 'Course_Manage_Group', + url => '/adm/coursegroups?refpage=cusr', + permission => $permission->{'grp_manage'}, + linktitle => 'Manage course groups.', + }, + { + linktext => 'Change Logs', + icon => 'document-properties.png', + #help => 'Course_User_Logs', + url => '/adm/createuser?action=changelogs', + permission => $permission->{'cusr'}, + linktitle => 'View change log.', + }, + ); + if ($env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_approval'}) { + push(@{ $menu[2]->{items} }, + { + linktext => 'Enrollment Requests', + icon => 'selfenrl-queue.png', + #help => 'Course_Approve_Selfenroll', + url => '/adm/createuser?action=selfenrollqueue', + permission => $permission->{'cusr'}, + linktitle =>'Approve or reject enrollment requests.', + }, + ); + } + + if (!exists($permission->{'cusr_section'})){ + + push(@{ $menu[2]->{items} }, + { + linktext => 'Automated Enrollment', + icon => 'roles.png', + #help => 'Course_Automated_Enrollment', permission => (&Apache::lonnet::auto_run($cnum,$cdom) - && $permission->{'cusr'}), + && $permission->{'cusr'}), url => '/adm/populate', - }, - { text => 'Configure User Self-enrollment', - help => 'Course_Self_Enrollment', - action => 'selfenroll', + linktitle => 'Automated enrollment manager.', + }, + { + linktext => 'User Self-Enrollment', + icon => 'cstr.png', + #help => 'Course_Self_Enrollment', + url => '/adm/createuser?action=selfenroll', permission => $permission->{'cusr'}, - }); + linktitle => 'Configure user self enrollment.', + }, + ); + } - if ($env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_approval'}) { - push(@courselinks, - { text => 'Enrollment Requests', - help => 'Course_Approve_Selfenroll', - action => 'selfenrollqueue', - permission => $permission->{'cusr'}, - }); - } - push(@courselinks, - { text => 'Manage Course Groups', - help => 'Course_Manage_Group', - permission => $permission->{'grp_manage'}, - url => '/adm/coursegroups?refpage=cusr', - }, - { text => 'View Change Logs', - help => 'Course_User_Logs', - action => 'changelogs', - permission => $permission->{'cusr'}, - },); + }; +return Apache::lonhtmlcommon::generate_menu(@menu); # { text => 'View Log-in History', # help => 'Course_User_Logins', # action => 'logins', # permission => $permission->{'cusr'}, # }); - push(@menu,@courselinks); - } - my $menu_html = ''; - foreach my $menu_item (@menu) { - next if (! $menu_item->{'permission'}); - $menu_html.='<p>'; - if (exists($menu_item->{'help'})) { - $menu_html.= - &Apache::loncommon::help_open_topic($menu_item->{'help'}); - } - $menu_html.='<font size="+1">'; - if (exists($menu_item->{'url'})) { - $menu_html.=qq{<a href="$menu_item->{'url'}">}; - } else { - $menu_html.= - qq{<a href="/adm/createuser?action=$menu_item->{'action'}">}; } - $menu_html.= &mt($menu_item->{'text'}).'</a></font>'; - $menu_html.='</p>'; - } - return $menu_html; } sub restore_prev_selections { @@ -4350,9 +4428,7 @@ ENDSCRIPT if (ref($lt) eq 'HASH') { $title = $lt->{$item}; } - $output .= - &Apache::lonhtmlcommon::row_title($title, - 'LC_selfenroll_pick_box_title','LC_oddrow_value')."\n"; + $output .= &Apache::lonhtmlcommon::row_title($title); if ($item eq 'types') { my $curr_types = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_types'}; my $showdomdesc = 1; @@ -4846,13 +4922,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)); - my $showntablehdr = 0; - my $tablehdr = &Apache::loncommon::start_data_table(). - &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(); my ($minshown,$maxshown); $minshown = 1; my $count = 0; @@ -4862,6 +4931,9 @@ sub print_userchangelogs_display { $minshown = 1 + ($curr{'page'} - 1) * $curr{'show'}; } } + + # Collect user change log data + my $content = ''; 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'})); @@ -4883,10 +4955,7 @@ sub print_userchangelogs_display { } $count ++; next if ($count < $minshown); - if (!$showntablehdr) { - $r->print($tablehdr); - $showntablehdr = 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'}); @@ -4925,20 +4994,41 @@ sub print_userchangelogs_display { if ($chgcontext ne '' && $lt{$chgcontext} ne '') { $chgcontext = $lt{$chgcontext}; } - $r->print(&Apache::loncommon::start_data_table_row().'<td>'.$count.'</td><td>'.&Apache::lonlocal::locallocaltime($roleslog{$id}{'exe_time'}).'</td><td>'.$whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}}.'</td><td>'.$changed{$roleslog{$id}{'uname'}.':'.$roleslog{$id}{'udom'}}.'</td><td>'.&Apache::lonnet::plaintext($roleslog{$id}{'logentry'}{'role'}).'</td><td>'.$sec.'</td><td>'.$chgcontext.'</td><td>'.$rolestart.'</td><td>'.$roleend.'</td>'.&Apache::loncommon::end_data_table_row()."\n"); + $content .= + &Apache::loncommon::start_data_table_row() + .'<td>'.$count.'</td>' + .'<td>'.&Apache::lonlocal::locallocaltime($roleslog{$id}{'exe_time'}).'</td>' + .'<td>'.$whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}}.'</td>' + .'<td>'.$changed{$roleslog{$id}{'uname'}.':'.$roleslog{$id}{'udom'}}.'</td>' + .'<td>'.&Apache::lonnet::plaintext($roleslog{$id}{'logentry'}{'role'}).'</td>' + .'<td>'.$sec.'</td>' + .'<td>'.$chgcontext.'</td>' + .'<td>'.$rolestart.'</td>' + .'<td>'.$roleend.'</td>' + .&Apache::loncommon::end_data_table_row(); + } + + # 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) { + $r->print('<p class="LC_info">' + .&mt('There are no records to display.') + .'</p>' + ); + $r->print($form_footer); + return; } - if ($showntablehdr) { - $r->print(&Apache::loncommon::end_data_table().'<br />'); - if (($curr{'page'} > 1) || ($more_records)) { - $r->print('<table><tr>'); - if ($curr{'page'} > 1) { - $r->print('<td><a href="javascript:chgPage('."'previous'".');">'.&mt('Previous [_1] changes',$curr{'show'}).'</a></td>'); - } - if ($more_records) { - $r->print('<td><a href="javascript:chgPage('."'next'".');">'.&mt('Next [_1] changes',$curr{'show'}).'</a></td>'); - } - $r->print('</tr></table>'); - $r->print(<<"ENDSCRIPT"); + + # Content to display, so create navigation and display table + + # Create Navigation: + # Navigation Script + my $nav_script = <<"ENDSCRIPT"; <script type="text/javascript"> // <![CDATA[ function chgPage(caller) { @@ -4954,14 +5044,50 @@ function chgPage(caller) { // ]]> </script> ENDSCRIPT - } - } else { - $r->print('<p class="LC_info">'. - &mt('There are no records to display'). - '</p>'); - } - $r->print('<input type="hidden" name="page" value="'.$curr{'page'}.'" />'. - '<input type="hidden" name="action" value="changelogs" /></form>'); + # 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'}) + .'" />'; + } + } + $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; } @@ -4983,9 +5109,13 @@ sub role_display_filter { $curr->{'rolelog_end_date'},undef, undef,undef,undef,undef,undef,undef,$nolink); my %lt = &rolechg_contexts(); - $output .= '<td valign="top"><b>'.&mt('Window during which changes occurred:').'</b><br /><table><tr><td>'.&mt('After:'). - '</td><td>'.$startform.'</td></tr><tr><td>'.&mt('Before:').'</td><td>'. - $endform.'</td></tr></table></td><td> </td>'. + $output .= '<td valign="top"><b>'.&mt('Window during which changes occurred:').'</b><br />'. + '<table><tr><td>'.&mt('After:'). + '</td><td>'.$startform.'</td></tr>'. + '<tr><td>'.&mt('Before:').'</td>'. + '<td>'.$endform.'</td></tr></table>'. + '</td>'. + '<td> </td>'. '<td valign="top"><b>'.&mt('Role:').'</b><br />'. '<select name="role"><option value="any"'; if ($curr->{'role'} eq 'any') { @@ -5006,7 +5136,9 @@ sub role_display_filter { } $output .= ' <option value="'.$role.'"'.$selstr.'>'.$plrole.'</option>'; } - $output .= '</select></td><td> </td><td valign="top"><b>'. + $output .= '</select></td>'. + '<td> </td>'. + '<td valign="top"><b>'. &mt('Context:').'</b><br /><select name="chgcontext">'; foreach my $chgtype ('any','auto','updatenow','createcourse','course','domain','selfenroll') { my $selstr = ''; @@ -5027,13 +5159,13 @@ sub role_display_filter { .'</p>'; # Server version info - $output .= '<p style="font-size: smaller;" class="LC_info">' + $output .= '<p class="LC_info">' .&mt('Only changes made from servers running LON-CAPA [_1] or later are displayed.' ,'2.6.99.0'); if ($version) { $output .= ' '.&mt('This LON-CAPA server is version [_1]',$version); } - $output .= '</p><hr /><br />'; + $output .= '</p><hr />'; return $output; } @@ -5045,7 +5177,8 @@ sub rolechg_contexts { createcourse => 'Course Creation', course => 'User Management in course', domain => 'User Management in domain', - selfenroll => 'Self-enrolled', + selfenroll => 'Self-enrolled', + requestcourses => 'Course Request', ); return %lt; } @@ -5130,6 +5263,15 @@ sub user_search_result { &build_search_response($context,$srch,%srch_results); } else { $currstate = 'modify'; + my $uname = $srch->{'srchterm'}; + my $udom = $srch->{'srchdomain'}; + $srch_results{$uname.':'.$udom} = + { &Apache::lonnet::get('environment', + ['firstname', + 'lastname', + 'permanentemail'], + $udom,$uname) + }; } } else { %srch_results = &Apache::lonnet::usersearch($srch); @@ -5432,7 +5574,7 @@ sub build_search_response { &Apache::lonuserutils::can_create_user($createdom,$context); my $targetdom = '<span class="LC_cusr_emph">'.$createdom.'</span>'; if ($cancreate) { - my $showdom = &display_domain_info($createdom); + my $showdom = &display_domain_info($createdom); $response .= '<br /><br />' .'<b>'.&mt('To add a new user:').'</b>' .'<br />'; @@ -5441,7 +5583,7 @@ sub build_search_response { } else { $response .= &mt("(You can only create new users in your current role's domain - [_1])",$targetdom); } - $response .= '<ul><li>' + $response .='<ul><li>' .&mt("Set 'Domain/institution to search' to: [_1]",'<span class="LC_cusr_emph">'.$showdom.'</span>') .'</li><li>' .&mt("Set 'Search criteria' to: [_1]username is ..... in selected LON-CAPA domain[_2]",'<span class="LC_cusr_emph">','</span>') @@ -5459,10 +5601,10 @@ sub build_search_response { $response .= &mt("You are not authorized to create new users in your current role's domain - [_1].",$targetdom); } $response .= '<br />' - .&mt('Please contact the [_1]helpdesk[_2] if you need to create a new user.' + .&mt('Please contact the [_1]helpdesk[_2] if you need to create a new user.' ,' <a'.$helplink.'>' ,'</a>') - .'<br /><br />'; + .'<br /><br />'; } } }