version 1.264.6.1, 2020/01/13 14:31:19
|
version 1.274, 2025/03/31 13:55:08
|
Line 32 package Apache::bridgetask;
|
Line 32 package Apache::bridgetask;
|
|
|
use strict; |
use strict; |
use Apache::lonnet; |
use Apache::lonnet; |
|
use Apache::loncommon; |
use Apache::File(); |
use Apache::File(); |
use Apache::lonmenu; |
use Apache::lonmenu; |
use Apache::lonlocal; |
use Apache::lonlocal; |
use Apache::lonxml; |
use Apache::lonxml; |
use Apache::slotrequest(); |
use Apache::slotrequest(); |
use Apache::structuretags(); |
use Apache::structuretags(); |
|
use HTML::Entities(); |
use Time::HiRes qw( gettimeofday tv_interval ); |
use Time::HiRes qw( gettimeofday tv_interval ); |
use LONCAPA; |
use LONCAPA; |
|
|
Line 65 sub initialize_bridgetask {
|
Line 67 sub initialize_bridgetask {
|
sub proctor_check_auth { |
sub proctor_check_auth { |
my ($slot_name,$slot,$type)=@_; |
my ($slot_name,$slot,$type)=@_; |
my $user=$env{'form.proctorname'}; |
my $user=$env{'form.proctorname'}; |
|
$user =~ s/^\s+|\s+$//g; |
my $domain=$env{'form.proctordomain'}; |
my $domain=$env{'form.proctordomain'}; |
|
|
my @allowed=split(",",$slot->{'proctor'}); |
my @allowed=split(",",$slot->{'proctor'}); |
Line 83 sub proctor_check_auth {
|
Line 86 sub proctor_check_auth {
|
} |
} |
} |
} |
if ($authenticated) { |
if ($authenticated) { |
my $check = &check_in($type,$user,$domain,$slot_name); |
my $check = &check_in($type,$user,$domain,$slot_name,$slot->{'iptied'}); |
if ($check =~ /^error:/) { |
if ($check =~ /^error:/) { |
return 0; |
return 0; |
} |
} |
Line 95 sub proctor_check_auth {
|
Line 98 sub proctor_check_auth {
|
} |
} |
|
|
sub check_in { |
sub check_in { |
my ($type,$user,$domain,$slot_name) = @_; |
my ($type,$user,$domain,$slot_name,$needsiptied) = @_; |
my $useslots = &Apache::lonnet::EXT("resource.0.useslots"); |
my $useslots = &Apache::lonnet::EXT("resource.0.useslots"); |
|
my $ip=$ENV{'REMOTE_ADDR'} || $env{'request.host'}; |
if ( $useslots eq 'map_map') { |
if ( $useslots eq 'map_map') { |
my $result = &check_in_sequence($user,$domain,$slot_name); |
my $result = &check_in_sequence($user,$domain,$slot_name,$ip,$needsiptied); |
if ($result =~ /^error: /) { |
if ($result =~ /^error: /) { |
return $result; |
return $result; |
} |
} |
} else { |
} else { |
&create_new_version($type,$user,$domain,$slot_name); |
my ($symb) = &Apache::lonnet::whichuser(); |
&Apache::structuretags::finalize_storage(); |
my $result = &create_new_version($type,$user,$domain,$slot_name,$symb,$ip,$needsiptied); |
|
if ($result eq 'ok') { |
|
&Apache::structuretags::finalize_storage(); |
|
} |
|
return $result; |
} |
} |
return 1; |
return 1; |
} |
} |
|
|
sub check_in_sequence { |
sub check_in_sequence { |
my ($user,$domain,$slot_name) = @_; |
my ($user,$domain,$slot_name,$ip,$needsiptied) = @_; |
my $navmap = Apache::lonnavmaps::navmap->new(); |
my $navmap = Apache::lonnavmaps::navmap->new(); |
if (!defined($navmap)) { |
if (!defined($navmap)) { |
return 'error: '; |
return 'error: No navmap'; |
} |
} |
my ($symb) = &Apache::lonnet::whichuser(); |
my ($symb) = &Apache::lonnet::whichuser(); |
my ($map) = &Apache::lonnet::decode_symb($symb); |
my ($map) = &Apache::lonnet::decode_symb($symb); |
my @resources = |
my @resources = |
$navmap->retrieveResources($map, sub { $_[0]->is_problem() },0,0); |
$navmap->retrieveResources($map, sub { $_[0]->is_problem() || $_[0]->is_tool() },0,0); |
my %old_history = %Apache::lonhomework::history; |
my %old_history = %Apache::lonhomework::history; |
my %old_results = %Apache::lonhomework::results; |
my %old_results = %Apache::lonhomework::results; |
|
|
|
my $errorcount; |
foreach my $res (@resources) { |
foreach my $res (@resources) { |
&Apache::lonxml::debug("doing ".$res->src); |
&Apache::lonxml::debug("doing ".$res->src); |
&Apache::structuretags::initialize_storage($res->symb); |
&Apache::structuretags::initialize_storage($res->symb); |
my $type = ($res->is_task()) ? 'Task' : 'problem'; |
my $type; |
&create_new_version($type,$user,$domain,$slot_name); |
if ($res->is_task()) { |
&Apache::structuretags::finalize_storage($res->symb); |
$type = 'Task'; |
|
} elsif ($res->is_tool) { |
|
$type = 'tool'; |
|
} else { |
|
$type = 'problem'; |
|
} |
|
my $result = &create_new_version($type,$user,$domain,$slot_name,$res->symb,$ip,$needsiptied); |
|
if ($result eq 'ok') { |
|
&Apache::structuretags::finalize_storage($res->symb); |
|
} else { |
|
$errorcount ++; |
|
} |
} |
} |
|
|
%Apache::lonhomework::history = %old_history; |
%Apache::lonhomework::history = %old_history; |
%Apache::lonhomework::results = %old_results; |
%Apache::lonhomework::results = %old_results; |
|
if ($errorcount) { |
|
return 'error: IP taken'; |
|
} |
} |
} |
|
|
sub create_new_version { |
sub create_new_version { |
my ($type,$user,$domain,$slot_name) = @_; |
my ($type,$user,$domain,$slot_name,$symb,$ip,$needsiptied) = @_; |
|
|
|
if ($needsiptied) { |
|
my $uniqkey = "$slot_name\0$symb\0$ip"; |
|
my ($cdom,$cnum); |
|
if ($env{'request.course.id'}) { |
|
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
my %hash = ( |
|
"$slot_name\0$symb\0$ip" => $env{'user.name'}.':'.$env{'user.domain'}, |
|
); |
|
unless (&Apache::lonnet::newput('slot_uniqueips',\%hash,$cdom,$cnum) eq 'ok') { |
|
return 'error: IP taken'; |
|
} |
|
} |
|
} |
|
|
my $id = '0'; |
my $id = '0'; |
if ($type eq 'Task') { |
if ($type eq 'Task') { |
Line 159 sub create_new_version {
|
Line 197 sub create_new_version {
|
$domain = $env{'user.domain'}; |
$domain = $env{'user.domain'}; |
} |
} |
|
|
} elsif ($type eq 'problem') { |
} elsif (($type eq 'problem') || ($type eq 'tool')) { |
&Apache::lonxml::debug("authed $slot_name"); |
&Apache::lonxml::debug("authed $slot_name"); |
} |
} |
if (!defined($user) || !defined($domain)) { |
if (!defined($user) || !defined($domain)) { |
Line 169 sub create_new_version {
|
Line 207 sub create_new_version {
|
|
|
$Apache::lonhomework::results{"resource.$id.checkedin"}= |
$Apache::lonhomework::results{"resource.$id.checkedin"}= |
$user.':'.$domain; |
$user.':'.$domain; |
|
$Apache::lonhomework::results{"resource.$id.checkedin.ip"}=$ip; |
|
|
if (defined($slot_name)) { |
if (defined($slot_name)) { |
$Apache::lonhomework::results{"resource.$id.checkedin.slot"}= |
$Apache::lonhomework::results{"resource.$id.checkedin.slot"}= |
$slot_name; |
$slot_name; |
} |
} |
|
return 'ok'; |
} |
} |
|
|
sub get_version { |
sub get_version { |
Line 710 sub start_Task {
|
Line 750 sub start_Task {
|
if ((($status eq 'CAN_ANSWER') || ($status eq 'NOT_YET_VIEWED')) && ($version eq '')) { |
if ((($status eq 'CAN_ANSWER') || ($status eq 'NOT_YET_VIEWED')) && ($version eq '')) { |
# CAN_ANSWER or NOT_YET_VIEWED mode, and no current version, unproctored access |
# CAN_ANSWER or NOT_YET_VIEWED mode, and no current version, unproctored access |
# thus self-checkedin |
# thus self-checkedin |
my $check = &check_in('Task',undef,undef,$slot_name); |
my $needsiptied; |
if ($check =~ /^error: /) { |
if (ref($slot)) { |
|
$needsiptied = $slot->{'iptied'}; |
|
} |
|
my $check = &check_in('Task',undef,undef,$slot_name,$needsiptied); |
|
if ($check =~ /^error:\s+(.*)$/) { |
my $symb=&Apache::lonnet::symbread(); |
my $symb=&Apache::lonnet::symbread(); |
&Apache::lonnet::logthis("Error during self-checkin of version $version of Task (symb: $symb) using slot: $slot_name"); |
&Apache::lonnet::logthis("Error: $1 during self-checkin of version $version of Task (symb: $symb) using slot: $slot_name"); |
} |
} |
&add_to_queue('gradingqueue',{'type' => 'Task', |
&add_to_queue('gradingqueue',{'type' => 'Task', |
'time' => time, |
'time' => time, |
Line 766 sub start_Task {
|
Line 810 sub start_Task {
|
} elsif ($status eq 'NOT_YET_VIEWED') { |
} elsif ($status eq 'NOT_YET_VIEWED') { |
my $symb=&Apache::lonnet::symbread(); |
my $symb=&Apache::lonnet::symbread(); |
$msg.=&Apache::structuretags::firstaccess_msg($accessmsg,$symb); |
$msg.=&Apache::structuretags::firstaccess_msg($accessmsg,$symb); |
|
} elsif ($status eq 'NEED_DIFFERENT_IP') { |
|
#FIXME |
} else { |
} else { |
$msg.='<p class="LC_warning">'.&mt('Not open to be viewed').'</p>'; |
$msg.='<p class="LC_warning">'.&mt('Not open to be viewed').'</p>'; |
} |
} |
Line 3234 sub proctor_validation_screen {
|
Line 3280 sub proctor_validation_screen {
|
my ($slot) = @_; |
my ($slot) = @_; |
my (undef,undef,$domain,$user) = &Apache::lonnet::whichuser(); |
my (undef,undef,$domain,$user) = &Apache::lonnet::whichuser(); |
my $url=&Apache::lonnet::studentphoto($domain,$user,'jpg'); |
my $url=&Apache::lonnet::studentphoto($domain,$user,'jpg'); |
if ($url ne '/adm/lonKaputt/lonlogo_broken.gif') { |
|
$url = "<tr><td colspan=\"2\"><img src=\"$url\" /></td></tr>"; |
|
} else { |
|
undef($url); |
|
} |
|
|
|
my $name=&Apache::loncommon::plainname($user,$domain); |
my $name=&Apache::loncommon::plainname($user,$domain); |
|
|
my $msg; |
my $msg; |
if ($env{'form.proctorpassword'}) { |
if ($env{'form.proctorpassword'}) { |
$msg.='<p><span class="LC_warning">' |
$msg.='<p><span class="LC_warning">' |
Line 3269 sub proctor_validation_screen {
|
Line 3309 sub proctor_validation_screen {
|
my %lt = &Apache::lonlocal::texthash( |
my %lt = &Apache::lonlocal::texthash( |
'prva' => "Proctor Validation", |
'prva' => "Proctor Validation", |
'yoro' => "Your room's proctor needs to validate your access to this resource.", |
'yoro' => "Your room's proctor needs to validate your access to this resource.", |
'prus' => "Proctor's Username:", |
'prus' => "Proctor's Username", |
'pasw' => "Password:", |
'pasw' => "Password", |
'prdo' => "Proctor's Domain:", |
'prdo' => "Proctor's Domain", |
'vali' => 'Validate', |
'vali' => 'Validate', |
'stui' => "Student who should be logged in is:", |
'stui' => "Student who should be logged in is:", |
'name' => "Name:", |
'name' => "Name", |
'sid' => "Student/Employee ID", |
'sid' => "Student/Employee ID", |
'unam' => "Username:", |
'unam' => "Username", |
|
'phot' => "Photo", |
); |
); |
my $result= (<<ENDCHECKOUT); |
my $proctortable = |
<h2>$lt{'prva'}</h2> |
&Apache::lonhtmlcommon::start_pick_box()."\n". |
<p>$lt{'yoro'}</p> |
&Apache::lonhtmlcommon::row_title('<label for="proctorname">'.$lt{'prus'}.'</label>'). |
$msg |
'<input type="text" name="proctorname" value="'.$env{'form.proctorname'}.'" '. |
|
'id="proctorname" autocomplete="new-password" />'. |
|
&Apache::lonhtmlcommon::row_closure()."\n". |
|
&Apache::lonhtmlcommon::row_title('<label for="proctorpassword">'.$lt{'pasw'}.'</label>'). |
|
'<input type="password" name="proctorpassword" value="" '. |
|
'id="proctorpassword" autocomplete="new-password" />'. |
|
&Apache::lonhtmlcommon::row_closure()."\n". |
|
&Apache::lonhtmlcommon::row_title('<label for="proctordomain">'.$lt{'prdo'}.'</label>'). |
|
'<input type="text" name="proctordomain" value="'.$env{'form.proctordomain'}.'" '. |
|
'id="proctordomain" autocomplete="off" />'. |
|
&Apache::lonhtmlcommon::row_closure(1)."\n". |
|
&Apache::lonhtmlcommon::end_pick_box()."\n"; |
|
|
|
my $studenttable = |
|
&Apache::loncommon::start_data_table('LC_manage_reservations'). |
|
&Apache::loncommon::start_data_table_row(). |
|
'<th>'.$lt{'name'}.':</th><td>'.$name.'</td>'. |
|
&Apache::loncommon::end_data_table_row()."\n". |
|
&Apache::loncommon::start_data_table_row(). |
|
'<th>'.$lt{'sid'}.':</th><td>'.$env{'environment.id'}.'</td>'. |
|
&Apache::loncommon::end_data_table_row()."\n". |
|
&Apache::loncommon::start_data_table_row(). |
|
'<th>'.$lt{'unam'}.':</th><td>'.$user.':'.$domain.'</td>'. |
|
&Apache::loncommon::end_data_table_row(); |
|
if ($url ne '/adm/lonKaputt/lonlogo_broken.gif') { |
|
$studenttable .= &Apache::loncommon::start_data_table_row(). |
|
'<th valign="top">'.$lt{'phot'}.'</th>'. |
|
'<td valign="top"><img src="'.&HTML::Entities::encode($url,'&<>"').'" '. |
|
'alt="'.&mt('Photo of [_1]',$name).'" /></td>'. |
|
&Apache::loncommon::end_data_table_row()."\n"; |
|
} |
|
$studenttable .= &Apache::loncommon::end_data_table()."\n"; |
|
if ($msg ne '') { |
|
$msg = "<p>$msg</p>"; |
|
} else { |
|
$msg = '<br /><br />'; |
|
} |
|
return (<<ENDCHECKOUT); |
|
<div style="padding:0;clear:both;margin:0;border:0"> |
|
<h2 class="LC_heading_2">$lt{'prva'}</h2><hr /> |
|
<div class="LC_left_float"> |
|
$lt{'yoro'} |
|
$msg |
<form name="checkout" method="post" action="$uri"> |
<form name="checkout" method="post" action="$uri"> |
<input type="hidden" name="validate" value="yes" /> |
<input type="hidden" name="validate" value="yes" /> |
<input type="hidden" name="submitted" value="yes" /> |
<input type="hidden" name="submitted" value="yes" /> |
<table> |
$proctortable |
<tr><td>$lt{'prus'}</td><td><input type="string" name="proctorname" value="$env{'form.proctorname'}" /></td></tr> |
<br /> |
<tr><td>$lt{'pasw'}</td><td><input type="password" name="proctorpassword" value="" /></td></tr> |
<input type="submit" name="checkoutbutton" value="$lt{'vali'}" /> |
<tr><td>$lt{'prdo'}</td><td><input type="string" name="proctordomain" value="$env{'form.proctordomain'}" /></td></tr> |
|
</table> |
|
<input type="submit" name="checkoutbutton" value="$lt{'vali'}" /><br /> |
|
<table border="1"> |
|
<tr><td> |
|
<table> |
|
<tr><td colspan="2">$lt{'stui'}</td></tr> |
|
<tr><td>$lt{'name'}</td><td>$name</td></tr> |
|
<tr><td>$lt{'sid'}</td><td>$env{'environment.id'}</td></tr> |
|
<tr><td>$lt{'unam'}</td><td>$user:$domain</td></tr> |
|
$url |
|
</table> |
|
</tr></td> |
|
</table> |
|
</form> |
</form> |
|
</div> |
|
<div class="LC_left_float"> |
|
$lt{'stui'} |
|
<br /><br /> |
|
$studenttable |
|
</div> |
|
</div> |
ENDCHECKOUT |
ENDCHECKOUT |
|
|
return $result; |
|
} |
} |
|
|
1; |
1; |