--- loncom/interface/lonuserutils.pm 2012/08/21 01:50:34 1.140 +++ loncom/interface/lonuserutils.pm 2013/01/23 17:48:37 1.147 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Utility functions for managing LON-CAPA user accounts # -# $Id: lonuserutils.pm,v 1.140 2012/08/21 01:50:34 raeburn Exp $ +# $Id: lonuserutils.pm,v 1.147 2013/01/23 17:48:37 bisitz Exp $ # # Copyright Michigan State University Board of Trustees # @@ -335,13 +335,22 @@ sub print_upload_manager_header { $env{'request.role.domain'},$context, $groupslist,$crstype); my $checked=(($env{'form.noFirstLine'})?' checked="checked"':''); - $r->print('<p>' - .&mt('Total number of records found in file: [_1]' - ,'<b>'.$distotal.'</b>') - ."</p>\n"); - $r->print('<div class="LC_left_float"><h3>'. - &mt('Identify fields in uploaded list')."</h3>\n"); - $r->print(&mt('Enter as many fields as you can.<br /> The system will inform you and bring you back to this page, <br /> if the data selected are insufficient to add users.')."<br />\n"); + $r->print( + '<h3>'.&mt('Identify fields in uploaded list')."</h3>\n". + '<p class="LC_info">'. + &mt('Total number of records found in file: [_1]' + ,'<b>'.$distotal.'</b>'). + "</p>\n" + ); + if ($distotal == 0) { + $r->print('<p class="LC_warning">'.&mt('None found').'</p>'); + } + $r->print( + '<p>'. + &mt('Enter as many fields as you can.').'<br />'. + &mt('The system will inform you and bring you back to this page,[_1]if the data selected are insufficient to add users.','<br />'). + "</p>\n" + ); $r->print(&hidden_input('action','upload'). &hidden_input('state','got_file'). &hidden_input('associate',''). @@ -349,17 +358,23 @@ sub print_upload_manager_header { &hidden_input('fileupload',$env{'form.fileupload'}). &hidden_input('upfiletype',$env{'form.upfiletype'}). &hidden_input('upfile_associate',$env{'form.upfile_associate'})); - $r->print('<br /><label><input type="checkbox" name="noFirstLine"'.$checked.' />'. - &mt('Ignore First Line').'</label><br />'); - $r->print('<br /><input type="button" value="'.&mt('Reverse Association').'" '. + $r->print( + '<div class="LC_left_float">'. + '<fieldset><legend>'.&mt('Functions').'</legend>'. + '<label><input type="checkbox" name="noFirstLine"'.$checked.' />'. + &mt('Ignore First Line').'</label>'. + ' <input type="button" value="'.&mt('Reverse Association').'" '. 'name="Reverse Association" '. - 'onclick="javascript:this.form.associate.value=\'Reverse Association\';submit(this.form);" />'); - $r->print("<br /><br />\n". - '<script type="text/javascript" language="Javascript">'."\n". - '// <![CDATA['."\n". - $javascript."\n".$javascript_validations."\n". - '// ]]>'."\n". - '</script>'); + 'onclick="javascript:this.form.associate.value=\'Reverse Association\';submit(this.form);" />'. + '</fieldset></div><br clear="all" />' + ); + $r->print( + '<script type="text/javascript" language="Javascript">'."\n". + '// <![CDATA['."\n". + $javascript."\n".$javascript_validations."\n". + '// ]]>'."\n". + '</script>' + ); } ############################################################### @@ -603,7 +618,7 @@ sub upload_manager_javascript_forward_as $numbuttons ++; } if (!$can_assign->{'int'}) { - my $warning = &mt('You may not specify an initial password for each user, as this is only available when new users use LON-CAPA internal authentication.\n'). + my $warning = &mt('You may not specify an initial password for each user, as this is only available when new users use LON-CAPA internal authentication.').'\n' &mt('Your current role does not have rights to create users with that authentication type.'); $auth_update = <<"END"; // Currently the initial password field is only supported for internal auth @@ -1082,7 +1097,6 @@ sub print_upload_manager_form { $keyfields=join(',',sort(keys(%sone))); } } - $r->print('</div>'); &print_upload_manager_footer($r,$i,$keyfields,$defdom,$today,$halfyear, $context,$permission,$crstype); } @@ -1568,10 +1582,10 @@ sub print_userlist { $clearcoursepick = 1; } if (($env{'form.coursepick'}) && (!$clearcoursepick)) { - $r->print('<hr />'.&mt('Searching').' ...<br /> <br />'); + $r->print('<hr />'.&mt('Searching ...').'<br /> <br />'); } } else { - $r->print('<hr /><div id="searching">'.&mt('Searching').' ...</div>'); + $r->print('<hr /><div id="searching">'.&mt('Searching ...').'</div>'); } $r->rflush(); if ($context eq 'course') { @@ -1691,21 +1705,23 @@ sub print_userlist { } } if (keys(%userlist) == 0) { + my $msg = ''; if ($context eq 'author') { - $r->print(&mt('There are no co-authors to display.')."\n"); + $msg = &mt('There are no co-authors to display.'); } elsif ($context eq 'domain') { if ($env{'form.roletype'} eq 'domain') { - $r->print(&mt('There are no users with domain roles to display.')."\n"); + $msg = &mt('There are no users with domain roles to display.'); } elsif ($env{'form.roletype'} eq 'author') { - $r->print(&mt('There are no authors or co-authors to display.')."\n"); + $msg = &mt('There are no authors or co-authors to display.'); } elsif ($env{'form.roletype'} eq 'course') { - $r->print(&mt('There are no course users to display')."\n"); + $msg = &mt('There are no course users to display'); } elsif ($env{'form.roletype'} eq 'community') { - $r->print(&mt('There are no community users to display')."\n"); + $msg = &mt('There are no community users to display'); } } elsif ($context eq 'course') { $r->print(&mt('There are no course users to display.')."\n"); } + $r->print('<p class="LC_info"'.$msg.'</p>'."\n") if $msg; } else { # Print out the available choices my $usercount; @@ -1717,7 +1733,7 @@ sub print_userlist { $permission,$env{'form.Status'},\%userlist,$keylist); } if (!$usercount) { - $r->print('<br /><span class="LC_warning">' + $r->print('<br /><span class="LC_info">' .&mt('There are no users matching the search criteria.') .'</span>' ); @@ -1905,8 +1921,8 @@ sub column_checkboxes { if ($env{'form.Status'} ne 'Any') { $disabledchk{'status'} = 1; } - if ($env{'form.showrole'} ne 'Any') { - $disabledchk{'role'} = 1; + if (($env{'form.showrole'} ne 'Any') && ($env{'form.showrole'} ne 'cr')) { + $disabledchk{'role'} = 1; } } my $numposs = scalar(@cols); @@ -2539,6 +2555,12 @@ END if (&Apache::lonnet::allowed('c'.$role,$env{'request.course.id'}.'/'.$env{'request.course.sec'})) { $canchangesec{$role} = $env{'request.course.sec'}; } + } elsif ((($role eq 'co') && ($crstype eq 'Community')) || + (($role eq 'cc') && ($crstype eq 'Course'))) { + if (&is_courseowner($env{'request.course.id'}, + $env{'course.'.$env{'request.course.id'}.'.internal.courseowner'})) { + $canchange{$role} = 1; + } } } } @@ -2571,7 +2593,11 @@ END if ($env{'form.userwin'}) { $checkwin = ' checked="checked"'; } - $output .= '</td><td valign="top" style="border-left: 1px solid;"><span class="LC_nobreak"><input type="checkbox" name="userwin" value="1"'.$checkwin.' />'.$lt{'owin'}.'</span></td></tr></table></fieldset></div>'; + $output .= + '</td><td valign="top" style="border-left: 1px solid;">' + .'<span class="LC_nobreak"><label>' + .'<input type="checkbox" name="userwin" value="1"'.$checkwin.' />'.$lt{'owin'} + .'</label></span></td></tr></table></fieldset></div>'; } $output .= "\n".'<br clear="all" />'."\n". &Apache::loncommon::start_data_table(). @@ -2854,17 +2880,26 @@ END if ($showcheckbox) { $checkval = $user; if ($context eq 'course') { - if ($role eq 'st') { - $checkval .= ':st'; - } - $checkval .= ':'.$in{'section'}; - if ($role eq 'st') { - $checkval .= ':'.$in{'type'}.':'. - $in{'lockedtype'}; - } + if (($role eq 'co' || $role eq 'cc') && + ($user =~ /^\Q$env{'user.name'}:$env{'user.domain'}:$role\E/)) { + $showcheckbox = 0; + } else { + if ($role eq 'st') { + $checkval .= ':st'; + } + $checkval .= ':'.$in{'section'}; + if ($role eq 'st') { + $checkval .= ':'.$in{'type'}.':'. + $in{'lockedtype'}; + } + } + } + if ($showcheckbox) { + $r->print('<td><input type="checkbox" name="'. + 'actionlist" value="'.$checkval.'" /></td>'); + } else { + $r->print('<td> </td>'); } - $r->print('<td><input type="checkbox" name="'. - 'actionlist" value="'.$checkval.'" /></td>'); } else { $r->print('<td> </td>'); } @@ -3110,15 +3145,20 @@ sub select_actions { } if ($context eq 'course') { if ($env{'form.showrole'} ne 'Any') { - if (!&Apache::lonnet::allowed('c'.$env{'form.showrole'}, - $env{'request.course.id'})) { - if ($env{'request.course.sec'} eq '') { - return; - } else { - if (!&Apache::lonnet::allowed('c'.$env{'form.showrole'},$env{'request.course.id'}.'/'.$env{'request.course.sec'})) { - return; - } - } + my $showactions; + if (&Apache::lonnet::allowed('c'.$env{'form.showrole'}, + $env{'request.course.id'})) { + $showactions = 1; + } elsif ($env{'request.course.sec'} ne '') { + if (&Apache::lonnet::allowed('c'.$env{'form.showrole'},$env{'request.course.id'}.'/'.$env{'request.course.sec'})) { + $showactions = 1; + } + } + unless ($showactions) { + unless (&is_courseowner($env{'request.course.id'}, + $env{'course.'.$env{'request.course.id'}.'.internal.courseowner'})) { + return; + } } } } @@ -3644,11 +3684,13 @@ END } } if (!$studentcount) { + my $msg = ''; if ($crstype eq 'Community') { - $r->print(&mt('There are no members to drop.')); + $msg = &mt('There are no members to drop.'); } else { - $r->print(&mt('There are no students to drop.')); + $msg = &mt('There are no students to drop.'); } + $r->print('<p class="LC_info">'.$msg.'</p>'); return; } my ($classgroups) = &Apache::loncoursedata::get_group_memberships( @@ -3794,16 +3836,17 @@ sub print_first_users_upload_form { $str .= '<input type="hidden" name="action" value="upload" />'; $str .= '<input type="hidden" name="state" value="got_file" />'; + $str .= &Apache::grades::checkforfile_js(); + $str .= '<h2>'.&mt('Upload a file containing information about users').'</h2>'."\n"; # Excel and CSV Help - $str .= '<div class="LC_left_float">' + $str .= '<div class="LC_columnSection">' .&Apache::loncommon::help_open_topic("Course_Create_Class_List", &mt("How do I create a users list from a spreadsheet")) - .'</div><div class="LC_left_float">'."\n" - .&Apache::loncommon::help_open_topic("Course_Convert_To_CSV", + .' '.&Apache::loncommon::help_open_topic("Course_Convert_To_CSV", &mt("How do I create a CSV file from a spreadsheet")) - .'</div><br clear="all" />'."\n"; + ."</div>\n"; $str .= &Apache::lonhtmlcommon::start_pick_box() .&Apache::lonhtmlcommon::row_title(&mt('File')); if (&Apache::lonlocal::current_language() ne 'en') { @@ -3824,7 +3867,8 @@ sub print_first_users_upload_form { .&Apache::lonhtmlcommon::end_pick_box(); $str .= '<p>' - .'<input type="submit" name="fileupload" value="'.&mt('Next').'" />' + .'<input type="submit" name="fileupload" value="'.&mt('Next').'"' + .' onclick="javascript:checkUpload(this.form);" />' .'</p>'; $r->print($str); @@ -4107,7 +4151,7 @@ sub upfile_drop_add { if ($entries{$fields{'domain'}} ne &LONCAPA::clean_domain($entries{$fields{'domain'}})) { $r->print('<br />'. '<b>'.$entries{$fields{'domain'}}. - '</b>: '.&mt('Unacceptable domain for user [_2] [_3] [_4] [_5]',$fname,$mname,$lname,$gen)); + '</b>: '.&mt('Unacceptable domain for user [_1] [_2] [_3] [_4]',$fname,$mname,$lname,$gen)); next; } my $username = $entries{$fields{'username'}}; @@ -4439,7 +4483,7 @@ sub upfile_drop_add { if (! defined($classlist)) { $r->print('<form name="studentform" method="post" action="/adm/createuser" />'. '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'. - &mt('There are no students with current/future access to the course.'). + '<p class="LC_info">'.&mt('There are no students with current/future access to the course.').'</p>'. '</form>'."\n"); } elsif (ref($classlist) eq 'HASH') { # Remove the students we just added from the list of students. @@ -4563,11 +4607,13 @@ sub print_drop_menu { '<form name="studentform" method="post">'."\n"); my $classlist = &Apache::loncoursedata::get_classlist(); if (! defined($classlist)) { + my $msg = ''; if ($crstype eq 'Community') { - $r->print(&mt('There are no members currently enrolled.')."\n"); + $msg = &mt('There are no members currently enrolled.'); } else { - $r->print(&mt('There are no students currently enrolled.')."\n"); + $msg = &mt('There are no students currently enrolled.'); } + $r->print('<p class="LC_info">'.$msg."</p>\n"); } else { &show_drop_list($r,$classlist,'nosort',$permission,$crstype); } @@ -4900,7 +4946,7 @@ sub update_user_list { } } } - $r->print('<p><b>'.&mt("$result_text{'ok'}{$choice} for [quant,_1,user role,user roles,no user roles].",$count).'</b></p>'); + $r->print('<p><b>'.&mt("$result_text{'ok'}{$choice} [quant,_1,user role,user roles,no user roles].",$count).'</b></p>'); if ($count > 0) { if ($choice eq 'revoke' || $choice eq 'drop') { $r->print('<p>'.&mt('Re-enabling will re-activate data for the role.').'</p>'); @@ -4917,7 +4963,10 @@ sub update_user_list { if ($choice eq 'drop') { $linktext = &mt('Display current class roster'); } - $r->print('<a href="javascript:document.studentform.submit()">'.$linktext.'</a></form>'."\n"); + $r->print( + &Apache::lonhtmlcommon::actionbox( + ['<a href="javascript:document.studentform.submit()">'.$linktext.'</a>']) + .'</form>'."\n"); } sub dates_feedback { @@ -4925,7 +4974,7 @@ sub dates_feedback { my $dates; if ($start < $now) { if ($end == 0) { - $dates .= &mt('role(s) active now; no end date'); + $dates = &mt('role(s) active now; no end date'); } elsif ($end > $now) { $dates = &mt('role(s) active now; ends [_1].',&Apache::lonlocal::locallocaltime($end)); } else { @@ -5122,7 +5171,7 @@ sub setsections_javascript { acor => 'A coordinator role will be added with access to all sections', inea => 'In each course, each user may only have one student role at a time.', inco => 'In each community, each user may only have one member role at a time.', - youh => 'You had selected ', + youh => 'You had selected', secs => 'sections.', plmo => 'Please modify your selections so they include no more than one section.', mayn => 'may not be used as the name for a section, as it is a reserved word.', @@ -5751,5 +5800,20 @@ sub authcheck_alerts { return %alerts; } +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; +} + 1;