Diff for /loncom/homework/bridgetask.pm between versions 1.264.8.1 and 1.274

version 1.264.8.1, 2020/09/01 17:07:59 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 67  sub proctor_check_auth { Line 69  sub proctor_check_auth {
     my $user=$env{'form.proctorname'};      my $user=$env{'form.proctorname'};
     $user =~ s/^\s+|\s+$//g;      $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'});
     foreach my $possible (@allowed) {      foreach my $possible (@allowed) {
  my ($puser,$pdom)=(split(':',$possible));   my ($puser,$pdom)=(split(':',$possible));
Line 84  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 96  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 160  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 170  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 682  sub start_Task { Line 721  sub start_Task {
         $target eq 'tex') {          $target eq 'tex') {
         if ($env{'form.markaccess'}) {          if ($env{'form.markaccess'}) {
             my @interval=&Apache::lonnet::EXT("resource.0.interval");              my @interval=&Apache::lonnet::EXT("resource.0.interval");
             &Apache::lonnet::set_first_access($interval[1],$interval[0]);              my ($timelimit) = ($interval[0] =~ /^(\d+)/);
               &Apache::lonnet::set_first_access($interval[1],$timelimit);
         }          }
     }      }
   
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 1408  DONEBUTTON Line 1454  DONEBUTTON
             if ($canstore) {              if ($canstore) {
         &Apache::structuretags::finalize_storage();          &Apache::structuretags::finalize_storage();
                 my @interval = &Apache::lonnet::EXT("resource.0.interval");                  my @interval = &Apache::lonnet::EXT("resource.0.interval");
                 if ($interval[0] =~ /^\d+$/ && $interval[1] eq 'resource') {                  if ($interval[0] =~ /^\d+/ && $interval[1] eq 'resource') {
                     my $key=$courseid."\0".$symb;                      my $key=$courseid."\0".$symb;
                     my %times=&Apache::lonnet::get('firstaccesstimes',                      my %times=&Apache::lonnet::get('firstaccesstimes',
                                                    [$key],$domain,$name);                                                     [$key],$domain,$name);
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'}" autocomplete="off" /></td></tr>  <br />
   <tr><td>$lt{'pasw'}</td><td><input type="password" name="proctorpassword" value="" autocomplete="off" /></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'}" autocomplete="off" /></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;

Removed from v.1.264.8.1  
changed lines
  Added in v.1.274


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>