version 1.107, 2009/11/23 03:45:16
|
version 1.109.2.4, 2010/08/10 04:00:16
|
Line 36 use Apache::loncommon();
|
Line 36 use Apache::loncommon();
|
use Apache::lonhtmlcommon; |
use Apache::lonhtmlcommon; |
use Apache::lonlocal; |
use Apache::lonlocal; |
use Apache::longroup; |
use Apache::longroup; |
|
use Apache::lonnavmaps; |
use LONCAPA qw(:DEFAULT :match); |
use LONCAPA qw(:DEFAULT :match); |
|
|
############################################################### |
############################################################### |
Line 386 sub javascript_validations {
|
Line 387 sub javascript_validations {
|
if (($context eq 'course') || ($context eq 'domain')) { |
if (($context eq 'course') || ($context eq 'domain')) { |
if ($context eq 'course') { |
if ($context eq 'course') { |
if ($env{'request.course.sec'} eq '') { |
if ($env{'request.course.sec'} eq '') { |
$setsection_call = 'setSections(document.'.$param{'formname'}."'$crstype'".');'; |
$setsection_call = 'setSections(document.'.$param{'formname'}.",'$crstype'".');'; |
$setsections_js = |
$setsections_js = |
&setsections_javascript($param{'formname'},$groupslist, |
&setsections_javascript($param{'formname'},$groupslist, |
$mode,'',$crstype); |
$mode,'',$crstype); |
Line 1185 sub default_role_selector {
|
Line 1186 sub default_role_selector {
|
'exs' => "Existing sections", |
'exs' => "Existing sections", |
'new' => "New section", |
'new' => "New section", |
); |
); |
$options = '<select name="defaultrole">'."\n". |
$options = '<select name="defaultrole">'."\n"; |
' <option value="">'.&mt('Please select').'</option>'."\n"; |
unless (($context eq 'course') && (&Apache::loncommon::needs_gci_custom())) { |
|
$options .= ' <option value="">'.&mt('Please select').'</option>'."\n"; |
|
} |
if ($context eq 'course') { |
if ($context eq 'course') { |
$options .= &default_course_roles($context,$checkpriv,$crstype,%customroles); |
$options .= &default_course_roles($context,$checkpriv,$crstype,%customroles); |
} elsif ($context eq 'author') { |
} elsif ($context eq 'author') { |
Line 2093 sub process_date_info {
|
Line 2096 sub process_date_info {
|
|
|
sub show_users_list { |
sub show_users_list { |
my ($r,$context,$mode,$permission,$statusmode,$userlist,$keylist,$formname)=@_; |
my ($r,$context,$mode,$permission,$statusmode,$userlist,$keylist,$formname)=@_; |
|
my $custommenu; |
if ($formname eq '') { |
if ($formname eq '') { |
$formname = 'studentform'; |
$formname = 'studentform'; |
} |
} |
Line 2117 sub show_users_list {
|
Line 2121 sub show_users_list {
|
$sortby = 'username'; |
$sortby = 'username'; |
} |
} |
my $setting = $env{'form.roletype'}; |
my $setting = $env{'form.roletype'}; |
my ($cid,$cdom,$cnum,$classgroups,$displayphotos,$displayclickers,$crstype); |
my ($cid,$cdom,$cnum,$classgroups,$displayphotos,$displayclickers,$crstype, |
|
$clickersupport,$displaygroups); |
if ($context eq 'course') { |
if ($context eq 'course') { |
$cid = $env{'request.course.id'}; |
$cid = $env{'request.course.id'}; |
$crstype = &Apache::loncommon::course_type(); |
$crstype = &Apache::loncommon::course_type(); |
($cnum,$cdom) = &get_course_identity($cid); |
($cnum,$cdom) = &get_course_identity($cid); |
|
$custommenu = &Apache::loncommon::needs_gci_custom(); |
|
unless ($custommenu) { |
|
$clickersupport = 1; |
|
$displaygroups = 1; |
|
} |
($classgroups) = &Apache::loncoursedata::get_group_memberships( |
($classgroups) = &Apache::loncoursedata::get_group_memberships( |
$userlist,$keylist,$cdom,$cnum); |
$userlist,$keylist,$cdom,$cnum); |
if ($mode eq 'autoenroll') { |
if ($mode eq 'autoenroll') { |
Line 2242 END
|
Line 2252 END
|
'role' => "role", |
'role' => "role", |
'type' => "enroll type/action", |
'type' => "enroll type/action", |
'email' => "e-mail address", |
'email' => "e-mail address", |
|
'lastlogin' => "last login", |
|
'submissions' => "test status", |
'photo' => "photo", |
'photo' => "photo", |
'extent' => "extent", |
'extent' => "extent", |
'pr' => "Proceed", |
'pr' => "Proceed", |
Line 2288 END
|
Line 2300 END
|
push(@cols,'status'); |
push(@cols,'status'); |
} |
} |
if ($context eq 'course') { |
if ($context eq 'course') { |
push(@cols,'groups'); |
if ($displaygroups) { |
|
push(@cols,'groups'); |
|
} |
} |
} |
push(@cols,'email'); |
push(@cols,'email'); |
|
if ($context eq 'course') { |
|
if ($custommenu) { |
|
push(@cols,'lastlogin'); |
|
if (($env{'form.showrole'} eq 'Any') || ($env{'form.showrole'} eq 'st')) { |
|
push(@cols,'submissions'); |
|
} |
|
} |
|
} |
} |
} |
|
|
my $rolefilter = $env{'form.showrole'}; |
my $rolefilter = $env{'form.showrole'}; |
Line 2413 END
|
Line 2435 END
|
} |
} |
} |
} |
foreach my $item (@cols) { |
foreach my $item (@cols) { |
$output .= "<th><a href=\"javascript:document.$formname.sortby.value='$item';document.$formname.submit();\">$lt{$item}</a></th>\n"; |
if (grep(/^\Q$item\E$/,@sortable)) { |
|
$output .= "<th><a href=\"javascript:document.$formname.sortby.value='$item';document.$formname.submit();\">$lt{$item}</a></th>\n"; |
|
} else { |
|
$output .= "<th>$lt{$item}</th>\n"; |
|
} |
} |
} |
my %role_types = &role_type_names(); |
my %role_types = &role_type_names(); |
if ($context eq 'course' && $mode ne 'autoenroll') { |
if ($context eq 'course' && $mode ne 'autoenroll') { |
if ($env{'form.showrole'} eq 'st' || $env{'form.showrole'} eq 'Any') { |
if ($env{'form.showrole'} eq 'st' || $env{'form.showrole'} eq 'Any') { |
# Clicker display on or off? |
# Clicker display on or off? |
my %clicker_options = ( |
if ($clickersupport) { |
'on' => 'Show', |
my %clicker_options = ( |
'off' => 'Hide', |
'on' => 'Show', |
); |
'off' => 'Hide', |
my $clickerchg = 'on'; |
); |
if ($displayclickers eq 'on') { |
my $clickerchg = 'on'; |
$clickerchg = 'off'; |
if ($displayclickers eq 'on') { |
} |
$clickerchg = 'off'; |
$output .= ' <th>'."\n".' ' |
} |
.&mt('[_1]'.$clicker_options{$clickerchg}.'[_2] clicker id' |
$output .= ' <th>'."\n".' ' |
|
.&mt('[_1]'.$clicker_options{$clickerchg}.'[_2] clicker id' |
,'<a href="javascript:document.'.$formname.'.displayclickers.value=' |
,'<a href="javascript:document.'.$formname.'.displayclickers.value=' |
."'".$clickerchg."'".';document.'.$formname.'.submit();">' |
."'".$clickerchg."'".';document.'.$formname.'.submit();">' |
,'</a>') |
,'</a>') |
."\n".' </th>'."\n"; |
."\n".' </th>'."\n"; |
|
} |
# Photo display on or off? |
# Photo display on or off? |
if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) { |
if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) { |
my %photo_options = &Apache::lonlocal::texthash( |
my %photo_options = &Apache::lonlocal::texthash( |
Line 2462 END
|
Line 2489 END
|
time.'_'.rand(1000000000).'.csv'; |
time.'_'.rand(1000000000).'.csv'; |
unless ($CSVfile = Apache::File->new('>/home/httpd'.$CSVfilename)) { |
unless ($CSVfile = Apache::File->new('>/home/httpd'.$CSVfilename)) { |
$r->log_error("Couldn't open $CSVfilename for output $!"); |
$r->log_error("Couldn't open $CSVfilename for output $!"); |
$r->print(&mt('Problems occurred in writing the CSV file. ' |
$r->print( |
.'This error has been logged. ' |
'<p class="LC_error">' |
.'Please alert your LON-CAPA administrator.')); |
.&mt('Problems occurred in writing the CSV file.') |
|
.' '.&mt('This error has been logged.') |
|
.' '.&mt('Please alert your LON-CAPA administrator.') |
|
.'</p>' |
|
); |
$CSVfile = undef; |
$CSVfile = undef; |
} |
} |
# |
# |
push @cols,'clicker'; |
if ($clickersupport) { |
|
push @cols,'clicker'; |
|
} |
# Write headers and data to file |
# Write headers and data to file |
print $CSVfile '"'.$results_description.'"'."\n"; |
print $CSVfile '"'.$results_description.'"'."\n"; |
print $CSVfile '"'.join('","',map { |
print $CSVfile '"'.join('","',map { |
&Apache::loncommon::csv_translate($lt{$_}) |
&Apache::loncommon::csv_translate($lt{$_}) |
} (@cols))."\"\n"; |
} (@cols))."\"\n"; |
} elsif ($mode eq 'excel') { |
} elsif ($mode eq 'excel') { |
push @cols,'clicker'; |
if ($clickersupport) { |
|
push @cols,'clicker'; |
|
} |
# Create the excel spreadsheet |
# Create the excel spreadsheet |
($excel_workbook,$excel_filename,$format) = |
($excel_workbook,$excel_filename,$format) = |
&Apache::loncommon::create_workbook($r); |
&Apache::loncommon::create_workbook($r); |
Line 2511 END
|
Line 2546 END
|
Future => 'Future', |
Future => 'Future', |
Expired => 'Expired', |
Expired => 'Expired', |
); |
); |
|
# If this is for a single course get last course "log-in" and submissions. |
|
my (%crslogins,%stusubmissions,%elapsed,$numparts,%nummultipart,$multipart); |
|
my $now = time; |
|
if ($context eq 'course') { |
|
if ($custommenu) { |
|
%crslogins=&Apache::lonnet::dump('nohist_crslastlogin',$cdom,$cnum); |
|
%stusubmissions=&Apache::lonnet::dump('nohist_submissiontracker',$cdom,$cnum); |
|
%elapsed = &Apache::lonlocal::texthash( |
|
-1 => 'more than a month ago', |
|
2592000 => 'within last 30 days', |
|
604800 => 'within last 7 days', |
|
86400 => 'within last 24 hours', |
|
); |
|
my $navmap = Apache::lonnavmaps::navmap->new(); |
|
if (defined($navmap)) { |
|
my @allres=$navmap->retrieveResources('/uploaded/'.$cdom.'/'.$cnum.'/default_1261144274.sequence',sub { $_[0]->is_problem() },0); |
|
foreach my $resource (@allres) { |
|
my @parts = $resource->parts(); |
|
my $count = scalar(@parts); |
|
if ($count > 1) { |
|
$nummultipart{$count} ++; |
|
} |
|
$numparts += $count; |
|
} |
|
if (keys(%nummultipart) > 0) { |
|
$multipart = '<br />'.'contains'; |
|
foreach my $key (sort {$a <=> $b} keys(%nummultipart)) { |
|
$multipart .= " nummultipart{$key} multipart questions (with $key parts)"; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
# Get groups, role, permanent e-mail so we can sort on them if |
# Get groups, role, permanent e-mail so we can sort on them if |
# necessary. |
# necessary. |
foreach my $user (keys(%{$userlist})) { |
foreach my $user (keys(%{$userlist})) { |
Line 2657 END
|
Line 2726 END
|
} else { |
} else { |
$in{'end'} = &Apache::lonlocal::locallocaltime($in{'end'}); |
$in{'end'} = &Apache::lonlocal::locallocaltime($in{'end'}); |
} |
} |
|
if ($context eq 'course') { |
|
if ($custommenu) { |
|
my $lastlogin = $crslogins{$in{'username'}.':'.$in{'domain'}.':'.$in{'section'}.':'.$role}; |
|
if ($lastlogin ne '') { |
|
my $sincelogin = $now - $lastlogin; |
|
if ($sincelogin < 86400) { |
|
$in{'lastlogin'} = $elapsed{'86400'}; |
|
} elsif ($sincelogin < 604800) { |
|
$in{'lastlogin'} = $elapsed{'604800'}; |
|
} elsif ($sincelogin < 2592000 ) { |
|
$in{'lastlogin'} = $elapsed{'2592000'}; |
|
} else { |
|
$in{'lastlogin'} = $elapsed{'-1'}; |
|
} |
|
} |
|
} |
|
if ($role eq 'st') { |
|
my $numsub = $stusubmissions{$in{'username'}.':'.$in{'domain'}."\0attempts"} + |
|
$stusubmissions{$in{'username'}.':'.$in{'domain'}."\0pilotsubs"}; |
|
if (!$numsub) { |
|
$in{'submissions'} = 'not attempted'; |
|
} elsif ($numsub < $numparts) { |
|
$in{'submissions'} = 'incomplete ('.$numsub.'/'.$numparts.')'; |
|
} else { |
|
$in{'submissions'} = 'completed'; |
|
} |
|
} |
|
} |
if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll' || $mode eq 'pickauthor') { |
if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll' || $mode eq 'pickauthor') { |
$r->print(&Apache::loncommon::start_data_table_row()); |
$r->print(&Apache::loncommon::start_data_table_row()); |
my $checkval; |
my $checkval; |
Line 2730 END
|
Line 2827 END
|
$showitem = $ltstatus{$in{$item}}; |
$showitem = $ltstatus{$in{$item}}; |
} |
} |
$r->print('<td>'.$showitem.'</td>'."\n"); |
$r->print('<td>'.$showitem.'</td>'."\n"); |
|
} elsif ($item eq 'submissions') { |
|
if ($in{$item} =~ /^incomplete/) { |
|
$r->print('<td>'.$in{$item}.$multipart.'</td>'); |
|
} else { |
|
$r->print('<td>'.$in{$item}.'</td>'."\n"); |
|
} |
} else { |
} else { |
$r->print('<td>'.$in{$item}.'</td>'."\n"); |
$r->print('<td>'.$in{$item}.'</td>'."\n"); |
} |
} |
} |
} |
if (($context eq 'course') && ($mode ne 'autoenroll')) { |
if (($context eq 'course') && ($mode ne 'autoenroll')) { |
if ($env{'form.showrole'} eq 'st' || $env{'form.showrole'} eq 'Any') { |
if ($env{'form.showrole'} eq 'st' || $env{'form.showrole'} eq 'Any') { |
if ($displayclickers eq 'on') { |
if ($clickersupport) { |
my $clickers = |
if ($displayclickers eq 'on') { |
|
my $clickers = |
(&Apache::lonnet::userenvironment($in{'domain'},$in{'username'},'clickers'))[1]; |
(&Apache::lonnet::userenvironment($in{'domain'},$in{'username'},'clickers'))[1]; |
if ($clickers!~/\w/) { $clickers='-'; } |
if ($clickers!~/\w/) { $clickers='-'; } |
$r->print('<td>'.$clickers.'</td>'); |
$r->print('<td>'.$clickers.'</td>'); |
} else { |
} else { |
$r->print(' <td> </td> '); |
$r->print(' <td> </td> '); |
|
} |
} |
} |
if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) { |
if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) { |
if ($displayphotos eq 'on' && $role eq 'st' && $in{'photo'} ne '') { |
if ($displayphotos eq 'on' && $role eq 'st' && $in{'photo'} ne '') { |
Line 3458 sub show_drop_list {
|
Line 3563 sub show_drop_list {
|
my ($r,$classlist,$nosort,$permission,$crstype) = @_; |
my ($r,$classlist,$nosort,$permission,$crstype) = @_; |
my $cid = $env{'request.course.id'}; |
my $cid = $env{'request.course.id'}; |
my ($cnum,$cdom) = &get_course_identity($cid); |
my ($cnum,$cdom) = &get_course_identity($cid); |
|
my $displaygroups; |
|
unless (&Apache::loncommon::needs_gci_custom()) { |
|
$displaygroups = 1; |
|
} |
if (! exists($env{'form.sortby'})) { |
if (! exists($env{'form.sortby'})) { |
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, |
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, |
['sortby']); |
['sortby']); |
Line 3535 END
|
Line 3644 END
|
<th>$lt{'sec'}</th> |
<th>$lt{'sec'}</th> |
<th>$lt{'start'}</th> |
<th>$lt{'start'}</th> |
<th>$lt{'end'}</th> |
<th>$lt{'end'}</th> |
<th>$lt{'groups'}</th> |
|
END |
END |
|
if ($displaygroups) { |
|
$r->print(" <th>$lt{'groups'}</th>\n"); |
|
} |
$r->print(&Apache::loncommon::end_data_table_header_row()); |
$r->print(&Apache::loncommon::end_data_table_header_row()); |
} else { |
} else { |
$r->print(&Apache::loncommon::start_data_table(). |
$r->print(&Apache::loncommon::start_data_table(). |
Line 3557 END
|
Line 3668 END
|
<a href="/adm/createuser?action=$action&sortby=start">$lt{'start'}</a> |
<a href="/adm/createuser?action=$action&sortby=start">$lt{'start'}</a> |
</th><th> |
</th><th> |
<a href="/adm/createuser?action=$action&sortby=end">$lt{'end'}</a> |
<a href="/adm/createuser?action=$action&sortby=end">$lt{'end'}</a> |
</th><th> |
|
<a href="/adm/createuser?action=$action&sortby=groups">$lt{'groups'}</a> |
|
</th> |
</th> |
END |
END |
|
if ($displaygroups) { |
|
$r->print("<th> |
|
<a href=\"/adm/createuser?action=$action&sortby=groups\">$lt{'groups'}</a> |
|
</th>\n"); |
|
} |
$r->print(&Apache::loncommon::end_data_table_header_row()); |
$r->print(&Apache::loncommon::end_data_table_header_row()); |
} |
} |
# |
# |
Line 3613 END
|
Line 3727 END
|
<td>$section</td> |
<td>$section</td> |
<td>$start $startitem</td> |
<td>$start $startitem</td> |
<td>$end</td> |
<td>$end</td> |
<td>$active_groups</td> |
|
END |
END |
|
if ($displaygroups) { |
|
$r->print(" <td>$active_groups</td>\n"); |
|
} |
$r->print(&Apache::loncommon::end_data_table_row()); |
$r->print(&Apache::loncommon::end_data_table_row()); |
} |
} |
$r->print(&Apache::loncommon::end_data_table().'<br />'); |
$r->print(&Apache::loncommon::end_data_table().'<br />'); |
Line 3651 sub print_first_users_upload_form {
|
Line 3767 sub print_first_users_upload_form {
|
$str .= '<input type="hidden" name="action" value="upload" />'; |
$str .= '<input type="hidden" name="action" value="upload" />'; |
$str .= '<input type="hidden" name="state" value="got_file" />'; |
$str .= '<input type="hidden" name="state" value="got_file" />'; |
|
|
$str .= '<h2>'.&mt('Upload a file containing information about users').'</h2>'."\n"; |
$str .= '<h3>'.&mt('Upload a file containing information about users').'</h3>'."\n"; |
|
|
# Excel and CSV Help |
# Excel and CSV Help |
$str .= '<div class="LC_left_float">' |
$str .= '<div class="LC_left_float">' |
Line 3662 sub print_first_users_upload_form {
|
Line 3778 sub print_first_users_upload_form {
|
&mt("How do I create a CSV file from a spreadsheet")) |
&mt("How do I create a CSV file from a spreadsheet")) |
.'</div><br clear="all" />'."\n"; |
.'</div><br clear="all" />'."\n"; |
$str .= &Apache::lonhtmlcommon::start_pick_box() |
$str .= &Apache::lonhtmlcommon::start_pick_box() |
.&Apache::lonhtmlcommon::row_title(&mt('File')); |
.&Apache::lonhtmlcommon::row_title(&mt('File')) |
if (&Apache::lonlocal::current_language() ne 'en') { |
.&Apache::loncommon::upfile_select_html() |
if ($context eq 'course') { |
|
$str .= '<p class="LC_info">'."\n" |
|
.&mt('Please upload an UTF8 encoded file to ensure a correct character encoding in your classlist.')."\n" |
|
.'</p>'."\n"; |
|
} |
|
} |
|
$str .= &Apache::loncommon::upfile_select_html() |
|
.&Apache::lonhtmlcommon::row_closure() |
.&Apache::lonhtmlcommon::row_closure() |
.&Apache::lonhtmlcommon::row_title( |
.&Apache::lonhtmlcommon::row_title( |
'<label for="noFirstLine">' |
'<label for="noFirstLine">' |
Line 3684 sub print_first_users_upload_form {
|
Line 3793 sub print_first_users_upload_form {
|
.'<input type="submit" name="fileupload" value="'.&mt('Next').'" />' |
.'<input type="submit" name="fileupload" value="'.&mt('Next').'" />' |
.'</p>'; |
.'</p>'; |
|
|
$str .= &Apache::loncommon::end_page(); |
|
|
|
$r->print($str); |
$r->print($str); |
return; |
return; |
} |
} |
Line 5028 sub roles_by_context {
|
Line 5135 sub roles_by_context {
|
if ($env{'request.role'} =~ m{^dc\./}) { |
if ($env{'request.role'} =~ m{^dc\./}) { |
push(@allroles,'ad'); |
push(@allroles,'ad'); |
} |
} |
push(@allroles,('ta','ep','in')); |
if (&Apache::loncommon::needs_gci_custom()) { |
if ($crstype eq 'Community') { |
if ($crstype eq 'Community') { |
push(@allroles,'co'); |
push(@allroles,'co'); |
|
} else { |
|
push(@allroles,'cc'); |
|
} |
} else { |
} else { |
push(@allroles,'cc'); |
push(@allroles,('ta','ep','in')); |
} |
if ($crstype eq 'Community') { |
if ($custom) { |
push(@allroles,'co'); |
push(@allroles,'cr'); |
} else { |
|
push(@allroles,'cc'); |
|
} |
|
if ($custom) { |
|
push(@allroles,'cr'); |
|
} |
} |
} |
} elsif ($context eq 'author') { |
} elsif ($context eq 'author') { |
@allroles = ('ca','aa'); |
@allroles = ('ca','aa'); |