Diff for /loncom/interface/slotrequest.pm between versions 1.47 and 1.51

version 1.47, 2006/02/09 18:04:51 version 1.51, 2006/03/07 21:47:06
Line 34  use Apache::Constants qw(:common :http : Line 34  use Apache::Constants qw(:common :http :
 use Apache::loncommon();  use Apache::loncommon();
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonnet;  use Apache::lonnet;
   use Apache::lonnavmaps();
 use Date::Manip;  use Date::Manip;
   
 sub fail {  sub fail {
Line 159  sub check_for_reservation { Line 160  sub check_for_reservation {
     return (undef,undef);      return (undef,undef);
 }  }
   
 sub check_for_conflict {  sub get_consumed_uniqueperiods {
     my ($symb,$new_slot_name,$new_slot,$slots)=@_;      my ($slots) = @_;
       my $navmap=Apache::lonnavmaps::navmap->new;
     if (!defined($new_slot->{'uniqueperiod'})) { return undef; }      my @problems = $navmap->retrieveResources(undef,
         sub { $_[0]->is_problem() },1,0);
       my %used_slots;
       foreach my $problem (@problems) {
    my $symb = $problem->symb();
    my $student = &Apache::lonnet::EXT("resource.0.availablestudent",
      $symb, $env{'user.domain'},
      $env{'user.name'});
    my $course =  &Apache::lonnet::EXT("resource.0.available",
      $symb, $env{'user.domain'},
      $env{'user.name'});
    if (&network_error($student) || &network_error($course)) {
       return 'error: Unable to determine current status';
    }
    foreach my $slot (split(/:/,$student), split(/:/, $course)) {
       $used_slots{$slot}=1;
    }
       }
   
     my $student = &Apache::lonnet::EXT("resource.0.availablestudent", $symb,  
        $env{'user.domain'}, $env{'user.name'});  
     my $course =  &Apache::lonnet::EXT("resource.0.available",        $symb,  
        $env{'user.domain'}, $env{'user.name'});  
     my @slots = (split(/:/,$student), split(/:/, $course));  
     my ($cnum,$cdom)=&get_course();  
     if (!ref($slots)) {      if (!ref($slots)) {
  my %slots=&Apache::lonnet::get('slots', [@slots], $cdom, $cnum);   my ($cnum,$cdom)=&get_course();
    my %slots=&Apache::lonnet::get('slots', [keys(%used_slots)], $cdom, $cnum);
    if (&network_error(%slots)) {
       return 'error: Unable to determine current status';
    }
  $slots = \%slots;   $slots = \%slots;
     }      }
   
     if (&network_error($student) || &network_error($course)  ||      my %consumed_uniqueperiods;
  &network_error(%$slots)) {      foreach my $slot_name (keys(%used_slots)) {
  return 'error: Unable to determine current status';  
     }      
   
     my ($new_uniq_start,$new_uniq_end) = @{$new_slot->{'uniqueperiod'}};  
     foreach my $slot_name (@slots) {  
  next if (!defined($slots->{$slot_name}) ||   next if (!defined($slots->{$slot_name}) ||
  !ref($slots->{$slot_name}));   !ref($slots->{$slot_name}));
   
         next if (!defined($slots->{$slot_name}{'uniqueperiod'}) ||          next if (!defined($slots->{$slot_name}{'uniqueperiod'}) ||
  !ref($slots->{$slot_name}{'uniqueperiod'}));   !ref($slots->{$slot_name}{'uniqueperiod'}));
  my ($start,$end)=@{$slots->{$slot_name}{'uniqueperiod'}};   $consumed_uniqueperiods{$slot_name} = 
       $slots->{$slot_name}{'uniqueperiod'};
       }
       return \%consumed_uniqueperiods;
   }
   
   sub check_for_conflict {
       my ($symb,$new_slot_name,$new_slot,$slots,$consumed_uniqueperiods)=@_;
   
       if (!defined($new_slot->{'uniqueperiod'})) { return undef; }
   
       if (!ref($consumed_uniqueperiods)) {
    $consumed_uniqueperiods = &get_consumed_uniqueperiods($slots);
    if (&network_error(%$consumed_uniqueperiods)) {
       return 'error: Unable to determine current status';
    }
       }
       
       my ($new_uniq_start,$new_uniq_end) = @{$new_slot->{'uniqueperiod'}};
       foreach my $slot_name (keys(%$consumed_uniqueperiods)) {
    my ($start,$end)=@{$consumed_uniqueperiods->{$slot_name}};
  if (!   if (!
     ($start < $new_uniq_start &&  $end < $new_uniq_start) ||      ($start < $new_uniq_start &&  $end < $new_uniq_start) ||
     ($start > $new_uniq_end   &&  $end > $new_uniq_end  )) {      ($start > $new_uniq_end   &&  $end > $new_uniq_end  )) {
Line 497  STUFF Line 528  STUFF
 }  }
   
 sub allowed_slot {  sub allowed_slot {
     my ($slot_name,$slot,$symb,$slots)=@_;      my ($slot_name,$slot,$symb,$slots,$consumed_uniqueperiods)=@_;
   
     #already started      #already started
     if ($slot->{'starttime'} < time) {      if ($slot->{'starttime'} < time) {
  # all open slot to be schedulable   # all open slot to be schedulable
  #return 0;   #return 0;
     }      }
     &Apache::lonxml::debug("$slot_name starttime good");      &Apache::lonxml::debug("$slot_name starttime good");
   
     #already ended      #already ended
     if ($slot->{'endtime'} < time) {      if ($slot->{'endtime'} < time) {
  return 0;   return 0;
     }      }
     &Apache::lonxml::debug("$slot_name endtime good");      &Apache::lonxml::debug("$slot_name endtime good");
   
     # not allowed to pick this one      # not allowed to pick this one
     if (defined($slot->{'type'})      if (defined($slot->{'type'})
  && $slot->{'type'} ne 'schedulable_student') {   && $slot->{'type'} ne 'schedulable_student') {
  return 0;   return 0;
     }      }
     &Apache::lonxml::debug("$slot_name type good");      &Apache::lonxml::debug("$slot_name type good");
   
       my $userallowed=0;
       # its for a different set of users
       if (defined($slot->{'allowedsections'})) {
    if (!defined($env{'request.role.sec'})
       && grep(/^No section assigned$/,
       split(',',$slot->{'allowedsections'}))) {
       $userallowed=1;
    }
    if (defined($env{'request.role.sec'})
       && grep(/^\Q$env{'request.role.sec'}\E$/,
       split(',',$slot->{'allowedsections'}))) {
       $userallowed=1;
    }
       }
       &Apache::lonxml::debug("$slot_name sections is $userallowed");
   
       # its for a different set of users
       if (defined($slot->{'allowedusers'})
    && grep(/^\Q$env{'user.name'}:$env{'user.domain'}\E$/,
    split(',',$slot->{'allowedusers'}))) {
    $userallowed=1;
       }
   
       if (!defined($slot->{'allowedusers'})
    && !defined($slot->{'allowedsections'})) {
    $userallowed=1;
       }
   
       &Apache::lonxml::debug("$slot_name user is $userallowed");
       return 0 if (!$userallowed);
   
     # not allowed for this resource      # not allowed for this resource
     if (defined($slot->{'symb'})      if (defined($slot->{'symb'})
  && $slot->{'symb'} ne $symb) {   && $slot->{'symb'} ne $symb) {
  return 0;   return 0;
     }      }
     my $conflict = &check_for_conflict($symb,$slot_name,$slot,$slots);  
       my $conflict = &check_for_conflict($symb,$slot_name,$slot,$slots,
          $consumed_uniqueperiods);
     if ($conflict) {      if ($conflict) {
  if ($slots->{$conflict}{'starttime'} < time) {   if ($slots->{$conflict}{'starttime'} < time) {
     return 0;      return 0;
Line 546  sub show_choices { Line 614  sub show_choices {
   
     my ($cnum,$cdom)=&get_course();      my ($cnum,$cdom)=&get_course();
     my %slots=&Apache::lonnet::dump('slots',$cdom,$cnum);      my %slots=&Apache::lonnet::dump('slots',$cdom,$cnum);
       my $consumed_uniqueperiods = &get_consumed_uniqueperiods(\%slots);
     my $available;      my $available;
     $r->print('<table border="1">');      $r->print('<table border="1">');
     &Apache::lonxml::debug("Checking Slots");      &Apache::lonxml::debug("Checking Slots");
Line 555  sub show_choices { Line 624  sub show_choices {
       (keys(%slots)))  {        (keys(%slots)))  {
   
  &Apache::lonxml::debug("Checking Slot $slot");   &Apache::lonxml::debug("Checking Slot $slot");
  next if (!&allowed_slot($slot,$slots{$slot},undef,\%slots));   next if (!&allowed_slot($slot,$slots{$slot},undef,\%slots,
    $consumed_uniqueperiods));
   
  $available++;   $available++;
   
Line 571  sub show_choices { Line 641  sub show_choices {
  $command='release';   $command='release';
     } else {      } else {
  my $conflict = &check_for_conflict($symb,$slot,$slots{$slot},   my $conflict = &check_for_conflict($symb,$slot,$slots{$slot},
    \%slots);     \%slots,
      $consumed_uniqueperiods);
  if ($conflict) {   if ($conflict) {
     $text=&mt('Change Reservation');      $text=&mt('Change Reservation');
     $command='get';      $command='get';
Line 703  sub show_table { Line 774  sub show_table {
     &Apache::grades::reset_perm();      &Apache::grades::reset_perm();
   
     my %show_fields=&Apache::lonlocal::texthash(      my %show_fields=&Apache::lonlocal::texthash(
      'name'         => 'Slot Name',       'name'            => 'Slot Name',
      'description'  => 'Description',       'description'     => 'Description',
      'type'         => 'Type',       'type'            => 'Type',
      'starttime'    => 'Start time',       'starttime'       => 'Start time',
      'endtime'      => 'End Time',       'endtime'         => 'End Time',
              'startreserve' => 'Time students can start reserving',               'startreserve'    => 'Time students can start reserving',
      'secret'       => 'Secret Word',       'secret'          => 'Secret Word',
      'maxspace'     => 'Maximum # of students',       'maxspace'        => 'Maximum # of students',
      'ip'           => 'IP or DNS restrictions',       'ip'              => 'IP or DNS restrictions',
      'symb'         => 'Resource slot is restricted to.',       'symb'            => 'Resource slot is restricted to.',
      'uniqueperiod' => 'Period of time slot is unique',       'allowedsections' => 'Sections slot is restricted to.',
      'scheduled'    => 'Scheduled Students',       'allowedusers'    => 'Users slot is restricted to.',
      'proctor'      => 'List of proctors');       'uniqueperiod'    => 'Period of time slot is unique',
        'scheduled'       => 'Scheduled Students',
        'proctor'         => 'List of proctors');
     my @show_order=('name','description','type','starttime','endtime',      my @show_order=('name','description','type','starttime','endtime',
        'startreserve','secret','maxspace','ip','symb',      'startreserve','secret','maxspace','ip','symb',
        'uniqueperiod','scheduled','proctor');      'allowedsections','allowedusers','uniqueperiod',
       'scheduled','proctor');
     my @show =       my @show = 
  (exists($env{'form.show'})) ? &Apache::loncommon::get_env_multiple('form.show')   (exists($env{'form.show'})) ? &Apache::loncommon::get_env_multiple('form.show')
                             : keys(%show_fields);                              : keys(%show_fields);
Line 797  sub show_table { Line 871  sub show_table {
   
     my %name_cache;      my %name_cache;
     my $slotsort = sub {      my $slotsort = sub {
  if ($env{'form.order'}=~/^(type|description|endtime|startreserve|maxspace|ip|symb)$/) {   if ($env{'form.order'}=~/^(type|description|endtime|startreserve|maxspace|ip|symb|allowedsections|allowedusers)$/) {
     if (lc($slots{$a}->{$env{'form.order'}})      if (lc($slots{$a}->{$env{'form.order'}})
  ne lc($slots{$b}->{$env{'form.order'}})) {   ne lc($slots{$b}->{$env{'form.order'}})) {
  return (lc($slots{$a}->{$env{'form.order'}})    return (lc($slots{$a}->{$env{'form.order'}}) 
Line 876  sub show_table { Line 950  sub show_table {
     $title='<a href="'.$res.'?symb='.$slots{$slot}{'symb'}.'">'.$title.'</a>';      $title='<a href="'.$res.'?symb='.$slots{$slot}{'symb'}.'">'.$title.'</a>';
  }   }
   
    my $allowedsections;
    if (exists($show{'allowedsections'})) {
       $allowedsections = 
    join(', ',sort(split(/\s*,\s*/,
        $slots{$slot}->{'allowedsections'})));
    }
   
    my @allowedusers;
    if (exists($show{'allowedusers'})) {
       @allowedusers= map {
    my ($uname,$udom)=split(/:/,$_);
    my $fullname=$name_cache{$_};
    if (!defined($fullname)) {
       $fullname = &Apache::loncommon::plainname($uname,$udom);
       $fullname =~s/\s/&nbsp;/g;
       $name_cache{$_} = $fullname;
    }
    &Apache::loncommon::aboutmewrapper($fullname,$uname,$udom);
       } (sort(split(/\s*,\s*/,$slots{$slot}->{'allowedusers'})));
    }
    my $allowedusers=join(', ',@allowedusers);
   
  my @proctors;   my @proctors;
  my $rowspan=1;   my $rowspan=1;
  my $colspan=1;   my $colspan=1;
Line 885  sub show_table { Line 981  sub show_table {
  my ($uname,$udom)=split(/@/,$_);   my ($uname,$udom)=split(/@/,$_);
  my $fullname=$name_cache{$_};   my $fullname=$name_cache{$_};
  if (!defined($fullname)) {   if (!defined($fullname)) {
     &Apache::lonnet::logthis("Gettign $uname $udom");  
     $fullname = &Apache::loncommon::plainname($uname,$udom);      $fullname = &Apache::loncommon::plainname($uname,$udom);
     $fullname =~s/\s/&nbsp;/g;      $fullname =~s/\s/&nbsp;/g;
     $name_cache{$_} = $fullname;      $name_cache{$_} = $fullname;
Line 935  DELETELINK Line 1030  DELETELINK
  if (exists($show{'symb'})) {   if (exists($show{'symb'})) {
     $colspan++;$r->print("<td>$title</td>\n");      $colspan++;$r->print("<td>$title</td>\n");
  }   }
  if (exists($show{'uniqueperiod'})) {   if (exists($show{'allowedsections'})) {
     $colspan++;$r->print("<td>$unique</td>\n");      $colspan++;$r->print("<td>$allowedsections</td>\n");
    }
    if (exists($show{'allowedusers'})) {
       $colspan++;$r->print("<td>$allowedusers</td>\n");
  }   }
  if (exists($show{'scheduled'})) {   if (exists($show{'scheduled'})) {
     $colspan++;$r->print("<td>$ids</td>\n</tr>\n");      $colspan++;$r->print("<td>$ids</td>\n</tr>\n");
Line 1121  sub csvupload_fields { Line 1219  sub csvupload_fields {
     ['maxspace','Maximum number of reservations'],      ['maxspace','Maximum number of reservations'],
     ['symb','Resource Restriction'],      ['symb','Resource Restriction'],
     ['uniqueperiod','Date range of slot exclusion'],      ['uniqueperiod','Date range of slot exclusion'],
     ['secret','Secret word proctor uses to validate']);      ['secret','Secret word proctor uses to validate'],
       ['allowedsections','Sections slot is restricted to'],
       ['allowedusers','Users slot is restricted to'],
       );
 }  }
   
 sub csv_upload_assign {  sub csv_upload_assign {

Removed from v.1.47  
changed lines
  Added in v.1.51


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