--- loncom/interface/lonuserutils.pm	2013/09/26 17:46:42	1.156
+++ loncom/interface/lonuserutils.pm	2014/02/14 17:44:00	1.162
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Utility functions for managing LON-CAPA user accounts
 #
-# $Id: lonuserutils.pm,v 1.156 2013/09/26 17:46:42 raeburn Exp $
+# $Id: lonuserutils.pm,v 1.162 2014/02/14 17:44:00 bisitz Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -401,7 +401,7 @@ sub javascript_validations {
 
     my $showcredits;
     my %domdefaults = &Apache::lonnet::get_domain_defaults($domain);
-    if ($domdefaults{'officialcredits'} || $domdefaults{'unofficialcredits'}) {
+    if ($domdefaults{'officialcredits'} || $domdefaults{'unofficialcredits'} || $domdefaults{'textbookcredits'}) {
         $showcredits = 1;
     }
 
@@ -1013,7 +1013,9 @@ sub print_upload_manager_footer {
                .&Apache::lonhtmlcommon::row_closure();
     }
     if ($context eq 'course' || $context eq 'domain') {
-        $Str .= &forceid_change($context);
+        $Str .= &Apache::lonhtmlcommon::row_title(&mt('Student/Employee ID'))
+               .&forceid_change($context)
+               .&Apache::lonhtmlcommon::row_closure(1); # last row in pick_box
     }
 
     $Str .= &Apache::lonhtmlcommon::end_pick_box();
@@ -1047,10 +1049,12 @@ sub get_defaultcredits {
     return unless(($cdom =~ /^$match_domain$/) && ($cnum =~ /^$match_courseid$/)); 
     my ($defaultcredits,$domdefcredits);
     my %domdefaults = &Apache::lonnet::get_domain_defaults($cdom);
-    if ($domdefaults{'officialcredits'} || $domdefaults{'unofficialcredits'}) {
+    if ($domdefaults{'officialcredits'} || $domdefaults{'unofficialcredits'} || $domdefaults{'textbookcredits'}) {
         my $instcode = $env{'course.'.$cdom.'_'.$cnum.'.internal.coursecode'};
         if ($instcode) {
             $domdefcredits = $domdefaults{'officialcredits'};
+        } elsif ($env{'course.'.$cdom.'_'.$cnum.'.internal.textbook'}) {
+            $domdefcredits = $domdefaults{'textbookcredits'};
         } else {
             $domdefcredits = $domdefaults{'unofficialcredits'};
         }
@@ -1076,8 +1080,7 @@ sub get_defaultcredits {
 sub forceid_change {
     my ($context) = @_;
     my $output = 
-        &Apache::lonhtmlcommon::row_title(&mt('Student/Employee ID'))
-       .'<label><input type="checkbox" name="forceid" value="yes" />'
+        '<label><input type="checkbox" name="forceid" value="yes" />'
        .&mt('Disable Student/Employee ID Safeguard and force change of conflicting IDs')
        .'</label><br />'."\n"
        .&mt('(only do if you know what you are doing.)')."\n";
@@ -1087,7 +1090,6 @@ sub forceid_change {
   &mt('Update student/employee ID in courses in which user is active/future student,[_1](if forcing change).','<br />').
                    '</label>'."\n";
     }
-    $output .= &Apache::lonhtmlcommon::row_closure(1); # last row in pick_box
     return $output;
 }
 
@@ -1392,9 +1394,9 @@ sub default_role_selector {
                       &default_course_roles($context,$checkpriv,'Course',%customroles)."\n".
                       '</select></td><td>'.
                       '<table class="LC_createuser">'.
-                      '<tr class="LC_section_row"><td valign"top">'.
+                      '<tr class="LC_section_row"><td valign="top">'.
                       $lt{'exs'}.'<br /><select name="currsec">'.
-                      ' <option value=""><--'.&mt('Pick course first').
+                      ' <option value="">&lt;--'.&mt('Pick course first').
                       '</select></td>'.
                       '<td>&nbsp;&nbsp;</td>'.
                       '<td valign="top">'.$lt{'new'}.'<br />'.
@@ -1637,7 +1639,7 @@ sub print_userlist {
          return;
     }
     my ($indexhash,$keylist) = &make_keylist_array();
-    my (%userlist,%userinfo,$clearcoursepick);
+    my (%userlist,%userinfo,$clearcoursepick,$needauthorquota,$needauthorusage);
     if (($context eq 'domain') && 
         ($env{'form.roletype'} eq 'course') || 
         ($env{'form.roletype'} eq 'community')) {
@@ -1709,6 +1711,12 @@ sub print_userlist {
                              \%cstr_roles,$permission);
         } elsif ($context eq 'domain') {
             if ($env{'form.roletype'} eq 'domain') {
+                if (grep(/^authorusage$/,@cols)) {
+                    $needauthorusage = 1;
+                }
+                if (grep(/^authorquota$/,@cols)) {
+                    $needauthorquota = 1;
+                }
                 %dom_roles = &Apache::lonnet::get_domain_roles($env{'request.role.domain'});
                 foreach my $key (keys(%dom_roles)) {
                     if (ref($dom_roles{$key}) eq 'HASH') {
@@ -1821,7 +1829,7 @@ sub print_userlist {
         } else {
             ($usercount) = &show_users_list($r,$context,$env{'form.output'},
                                $permission,$env{'form.Status'},\%userlist,
-                               $keylist,'',$showcredits);
+                               $keylist,'',$showcredits,$needauthorquota,$needauthorusage);
         }
         if (!$usercount) {
             $r->print('<br /><span class="LC_info">'
@@ -1991,7 +1999,7 @@ sub get_cols_array {
             push(@cols,'photo');
         }
         if ($context eq 'domain') {
-            push (@cols,'extent');
+            push (@cols,('authorusage','authorquota','extent'));
         }
     }
     return @cols;
@@ -2027,6 +2035,8 @@ sub column_checkboxes {
             if (($env{'form.roletype'} eq 'course') || 
                 ($env{'form.roletype'} eq 'community')) {
                 $disabledchk{'status'} = 1;
+                $disabledchk{'authorusage'} = 1;
+                $disabledchk{'authorquota'} = 1;
             } elsif ($env{'form.roletype'} eq 'domain') {
                 $disabledchk{'extent'} = 1; 
             }
@@ -2078,7 +2088,11 @@ sub column_checkboxes {
             if (($env{'form.roletype'} eq 'domain') || ($env{'form.roletype'} eq '')) {
                 $style = ' style="display: none;"';
             } 
-        } 
+        } elsif (($cols[$i] eq 'authorusage') || ($cols[$i] eq 'authorquota')) {
+            if ($env{'form.roletype'} ne 'domain') {
+                $style = ' style="display: none;"';
+            }
+        }
         $output .= '<span id="show'.$cols[$i].'"'.$style.'><label>'.
                    '<input id="showcol'.$cols[$i].'" type="checkbox" name="showcol" value="'.$cols[$i].'"'.$checked.' /><span id="showcoltext'.$cols[$i].'">'.
                    $lt{$cols[$i]}.'</span>'.
@@ -2112,6 +2126,8 @@ sub get_column_names {
         'photo'      => "photo",
         'lastlogin'  => "last login",
         'extent'     => "extent",
+        'authorusage' => "disk usage (%)",
+        'authorquota' => "disk quota (MB)",
         'ca'         => "check all",
         'ua'         => "uncheck all",
         'clicker'    => "clicker-ID",
@@ -2395,6 +2411,8 @@ sub make_keylist_array {
     $index->{'photo'} = &Apache::loncoursedata::CL_PHOTO();
     $index->{'thumbnail'} = &Apache::loncoursedata::CL_THUMBNAIL();
     $index->{'credits'} = &Apache::loncoursedata::CL_CREDITS();
+    $index->{'authorquota'} = &Apache::loncoursedata::CL_AUTHORQUOTA();
+    $index->{'authorusage'} = &Apache::loncoursedata::CL_AUTHORUSAGE();
     foreach my $key (keys(%{$index})) {
         $keylist->[$index->{$key}] = $key;
     }
@@ -2444,10 +2462,11 @@ sub process_date_info {
 
 sub show_users_list {
     my ($r,$context,$mode,$permission,$statusmode,$userlist,$keylist,$formname,
-        $showcredits)=@_;
+        $showcredits,$needauthorquota,$needauthorusage)=@_;
     if ($formname eq '') {
         $formname = 'studentform';
     }
+    my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'};
     #
     # Variables for excel output
     my ($excel_workbook, $excel_sheet, $excel_filename,$row,$format);
@@ -2464,12 +2483,16 @@ sub show_users_list {
         }
     } else {
         push(@sortable,'extent');
+        if (($context eq 'domain') && ($env{'form.roletype'} eq 'domain') &&
+            (($env{'form.showrole'} eq 'Any') || ($env{'form.showrole'} eq 'au'))) {
+            push(@sortable,('authorusage','authorquota'));
+        }
     }
     if ($mode eq 'pickauthor') {
         @sortable = ('username','fullname','email','status');
     }
     my %is_sortable;
-    map { $is_sortable{$_} => 1; } @sortable;
+    map { $is_sortable{$_} = 1; } @sortable;
     unless ($is_sortable{$sortby}) {
         $sortby = 'username';
     }
@@ -2710,13 +2733,13 @@ END
         } else {
             $output .= "\n".'<th>&nbsp;</th>'."\n";
             if ($actionselect) {
-                $output .= '<th>'.&mt('Select').'</th>'."\n";
+                $output .= '<th class="LC_nobreak" valign="top">'.&mt('Select').'</th>'."\n";
             }
         }
         foreach my $item (@cols) {
-            $output .= "<th>";
+            $output .= '<th class="LC_nobreak" valign="top">';
             if ($is_sortable{$item}) {
-                $output .= "<a href=\"javascript:document.$formname.sortby.value='$item';document.$formname.submit();\">$lt{$item}</a>";
+                $output .= "<a href=\"javascript:document.$formname.sortby.value='$item';document.$formname.submit();\" style=\"text-decoration:none;\">$lt{$item}<span class=\"LC_fontsize_small\"> &#9660;</span></a>";
             } else {
                 $output .= $lt{$item};
             }
@@ -2891,6 +2914,26 @@ END
         if ($emails{'permanentemail'} =~ /\S/) {
             $userlist->{$user}->[$index{'email'}] = $emails{'permanentemail'};
         }
+        if (($context eq 'domain') && ($env{'form.roletype'} eq 'domain') && 
+            ($role eq 'au')) {
+            my ($disk_quota,$current_disk_usage,$percent); 
+            if (($needauthorusage) || ($needauthorquota)) {
+                $disk_quota = &Apache::loncommon::get_user_quota($uname,$udom,'author');
+            }
+            if ($needauthorusage) {
+                $current_disk_usage =
+                    &Apache::lonnet::diskusage($udom,$uname,"$londocroot/priv/$udom/$uname");
+                if ($disk_quota == 0) {
+                    $percent = 100.0;
+                } else {
+                    $percent = $current_disk_usage/(10 * $disk_quota);
+                }
+                $userlist->{$user}->[$index{'authorusage'}] = sprintf("%.0f",$percent);
+            }
+            if ($needauthorquota) {
+                $userlist->{$user}->[$index{'authorquota'}] = sprintf("%.2f",$disk_quota);
+            }
+        }
         $usercount ++;
     }
     my $autocount = 0;
@@ -2911,12 +2954,20 @@ END
     my $index  = $index{$sortby};
     my $second = $index{'username'};
     my $third  = $index{'domain'};
-    my @sorted_users = sort {
-        lc($userlist->{$a}->[$index])  cmp lc($userlist->{$b}->[$index])
-            ||
-        lc($userlist->{$a}->[$second]) cmp lc($userlist->{$b}->[$second])            ||
-        lc($userlist->{$a}->[$third]) cmp lc($userlist->{$b}->[$third])
-        } (keys(%$userlist));
+    my @sorted_users;
+    if (($sortby eq 'authorquota') || ($sortby eq 'authorusage')) {  
+        @sorted_users = sort {
+            $userlist->{$b}->[$index] <=> $userlist->{$a}->[$index]           ||
+            lc($userlist->{$a}->[$second]) cmp lc($userlist->{$b}->[$second]) ||
+            lc($userlist->{$a}->[$third]) cmp lc($userlist->{$b}->[$third])
+            } (keys(%$userlist));
+    } else {
+        @sorted_users = sort {
+            lc($userlist->{$a}->[$index]) cmp lc($userlist->{$b}->[$index])   ||
+            lc($userlist->{$a}->[$second]) cmp lc($userlist->{$b}->[$second]) ||
+            lc($userlist->{$a}->[$third]) cmp lc($userlist->{$b}->[$third])
+            } (keys(%$userlist));
+    }
     my $rowcount = 0;
     foreach my $user (@sorted_users) {
         my %in;
@@ -2927,7 +2978,7 @@ END
         }
         my $clickers = (&Apache::lonnet::userenvironment($in{'domain'},$in{'username'},'clickers'))[1];
         if ($clickers!~/\w/) { $clickers='-'; }
-        $in{'clicker'} = $clickers; 
+        $in{'clicker'} = $clickers;
 	my $role = $in{'role'};
         $in{'role'}=&Apache::lonnet::plaintext($sdata->[$index{'role'}],$crstype);
         unless ($mode eq 'excel') {
@@ -2954,10 +3005,10 @@ END
             if ($mode eq 'autoenroll') {
                 my $cellentry;
                 if ($in{'type'} eq 'auto') {
-                    $cellentry = '<b>'.&mt('auto').'</b>&nbsp;<label><input type="checkbox" name="chgauto" value="'.$in{'username'}.':'.$in{'domain'}.'" />&nbsp;Change</label>';
+                    $cellentry = '<b>'.&mt('auto').'</b>&nbsp;<label><input type="checkbox" name="chgauto" value="'.$in{'username'}.':'.$in{'domain'}.'" />&nbsp;'.&mt('Change').'</label>';
                     $autocount ++;
                 } else {
-                    $cellentry = '<table border="0" cellspacing="0"><tr><td rowspan="2"><b>'.&mt('manual').'</b></td><td><span class="LC_nobreak"><label><input type="checkbox" name="chgmanual" value="'.$in{'username'}.':'.$in{'domain'}.'" />&nbsp;Change</label></span></td></tr><tr><td><span class="LC_nobreak">';
+                    $cellentry = '<table border="0" cellspacing="0"><tr><td rowspan="2"><b>'.&mt('manual').'</b></td><td><span class="LC_nobreak"><label><input type="checkbox" name="chgmanual" value="'.$in{'username'}.':'.$in{'domain'}.'" />&nbsp;'.&mt('Change').'</label></span></td></tr><tr><td><span class="LC_nobreak">';
                     $manualcount ++;
                     if ($in{'lockedtype'}) {
                         $cellentry .= '<label><input type="checkbox" name="unlockchg" value="'.$in{'username'}.':'.$in{'domain'}.'" />&nbsp;'.&mt('Unlock').'</label>';
@@ -3051,6 +3102,8 @@ END
                              $r->print('<td>&nbsp;</td>'."\n");
                         } 
                     }
+                } elsif (($item eq 'authorquota') || ($item eq 'authorusage')) {
+                    $r->print('<td align="right">'.$in{$item}.'</td>'."\n");
                 } else {
                     $r->print('<td>'.$in{$item}.'</td>'."\n");
                 }
@@ -3086,10 +3139,10 @@ END
             $r->print(&Apache::loncommon::end_data_table().'<br />');
     } elsif ($mode eq 'excel') {
         $excel_workbook->close();
-	$r->print(&mt('[_1]Your Excel spreadsheet[_2] is ready for download.', '<p><a href="'.$excel_filename.'">','</a>')."</p>\n");
+	$r->print('<p>'.&mt('[_1]Your Excel spreadsheet[_2] is ready for download.', '<a href="'.$excel_filename.'">','</a>')."</p>\n");
     } elsif ($mode eq 'csv') {
         close($CSVfile);
-	$r->print(&mt('[_1]Your CSV file[_2] is ready for download.', '<p><a href="'.$CSVfilename.'">','</a>')."</p>\n");
+	$r->print('<p>'.&mt('[_1]Your CSV file[_2] is ready for download.', '<a href="'.$CSVfilename.'">','</a>')."</p>\n");
         $r->rflush();
     }
     if ($mode eq 'autoenroll') {
@@ -3787,7 +3840,6 @@ sub show_drop_list {
 $check_uncheck_js
 // ]]>
 </script>
-<p>
 <input type="hidden" name="phase" value="four" />
 END
     my ($indexhash,$keylist) = &make_keylist_array();
@@ -3824,6 +3876,7 @@ END
                                               $classlist,$keylist,$cdom,$cnum);
     my %lt=&Apache::lonlocal::texthash('usrn'   => "username",
                                        'dom'    => "domain",
+                                       'id'     => "ID",
                                        'sn'     => "student name",
                                        'mn'     => "member name",
                                        'sec'    => "section",
@@ -3842,7 +3895,7 @@ END
     <th>&nbsp;</th>
     <th>$lt{'usrn'}</th>
     <th>$lt{'dom'}</th>
-    <th>ID</th>
+    <th>$lt{'id'}</th>
     <th>$nametitle</th>
     <th>$lt{'sec'}</th>
     <th>$lt{'start'}</th>
@@ -3856,21 +3909,21 @@ END
         $r->print(<<END);
     <th>&nbsp;</th>
     <th>
-       <a href="/adm/createuser?action=$action&sortby=username">$lt{'usrn'}</a>
+       <a href="/adm/createuser?action=$action&amp;sortby=username">$lt{'usrn'}</a>
     </th><th>
-       <a href="/adm/createuser?action=$action&sortby=domain">$lt{'dom'}</a>
+       <a href="/adm/createuser?action=$action&amp;sortby=domain">$lt{'dom'}</a>
     </th><th>
-       <a href="/adm/createuser?action=$action&sortby=id">ID</a>
+       <a href="/adm/createuser?action=$action&amp;sortby=id">$lt{'id'}</a>
     </th><th>
-       <a href="/adm/createuser?action=$action&sortby=fullname">$nametitle</a>
+       <a href="/adm/createuser?action=$action&amp;sortby=fullname">$nametitle</a>
     </th><th>
-       <a href="/adm/createuser?action=$action&sortby=section">$lt{'sec'}</a>
+       <a href="/adm/createuser?action=$action&amp;sortby=section">$lt{'sec'}</a>
     </th><th>
-       <a href="/adm/createuser?action=$action&sortby=start">$lt{'start'}</a>
+       <a href="/adm/createuser?action=$action&amp;sortby=start">$lt{'start'}</a>
     </th><th>
-       <a href="/adm/createuser?action=$action&sortby=end">$lt{'end'}</a>
+       <a href="/adm/createuser?action=$action&amp;sortby=end">$lt{'end'}</a>
     </th><th>
-       <a href="/adm/createuser?action=$action&sortby=groups">$lt{'groups'}</a>
+       <a href="/adm/createuser?action=$action&amp;sortby=groups">$lt{'groups'}</a>
     </th>
 END
         $r->print(&Apache::loncommon::end_data_table_header_row());
@@ -3941,7 +3994,6 @@ END
         $btn = $lt{'dm'}; 
     }
     $r->print(<<"END");
-</p>
 <p>
 <input type="button" value="$lt{'ca'}" onclick="javascript:checkAll(document.studentform.droplist)" /> &nbsp;
 <input type="button" value="$lt{'ua'}" onclick="javascript:uncheckAll(document.studentform.droplist)" />
@@ -4271,18 +4323,23 @@ sub upfile_drop_add {
                     if ($entries{$fields{'username'}} =~ /\s/) {
                         $nowhitespace = ' - '.&mt('usernames may not contain spaces.');
                     }
-                    $r->print('<br />'.
-      &mt('[_1]: Unacceptable username for user [_2] [_3] [_4] [_5]',
-          '<b>'.$entries{$fields{'username'}}.'</b>',$fname,$mname,$lname,$gen).
-                              $nowhitespace);
+                    $r->print(
+                        '<br />'.
+                        &mt('Unacceptable username [_1] for user [_2] [_3] [_4] [_5]',
+                                '"<b>'.$entries{$fields{'username'}}.'</b>"',
+                                $fname,$mname,$lname,$gen).
+                        $nowhitespace);
                     next;
                 } else {
                     $entries{$fields{'domain'}} =~ s/^\s+|\s+$//g;
                     if ($entries{$fields{'domain'}} 
                         ne &LONCAPA::clean_domain($entries{$fields{'domain'}})) {
-                        $r->print('<br />'. '<b>'.$entries{$fields{'domain'}}.
-                                  '</b>: '.&mt('Unacceptable domain for user [_1] [_2] [_3] [_4]',$fname,$mname,$lname,$gen));
-                        next;
+                        $r->print(
+                            '<br />'.
+                            &mt('Unacceptable domain [_1] for user [_2] [_3] [_4] [_5]',
+                                   '"<b>'.$entries{$fields{'domain'}}.'</b>"',
+                                    $fname,$mname,$lname,$gen));
+                    next;
                     }
                     my $username = $entries{$fields{'username'}};
                     my $userdomain = $entries{$fields{'domain'}};
@@ -4762,7 +4819,7 @@ sub print_drop_menu {
     } else {
         &show_drop_list($r,$classlist,'nosort',$permission,$crstype);
     }
-    $r->print('</form>'. &Apache::loncommon::end_page());
+    $r->print('</form>');
     return;
 }