--- loncom/homework/bridgetask.pm 2006/05/12 01:18:50 1.147
+++ loncom/homework/bridgetask.pm 2006/05/23 19:55:40 1.153
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# definition of tags that give a structure to a document
#
-# $Id: bridgetask.pm,v 1.147 2006/05/12 01:18:50 albertel Exp $
+# $Id: bridgetask.pm,v 1.153 2006/05/23 19:55:40 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -40,7 +40,7 @@ use Apache::slotrequest();
use Time::HiRes qw( gettimeofday tv_interval );
BEGIN {
- &Apache::lonxml::register('Apache::bridgetask',('Task','IntroParagraph','Dimension','Instance','InstanceText','Criteria','ClosingParagraph'));
+ &Apache::lonxml::register('Apache::bridgetask',('Task','IntroParagraph','Dimension','Question','Instance','InstanceText','Criteria','ClosingParagraph'));
}
sub initialize_bridgetask {
@@ -79,39 +79,56 @@ sub proctor_check_auth {
$authenticated=1;
}
}
- if ($authenticated && $type eq 'Task') {
- # increment version
- my $version=
- $Apache::lonhomework::history{'resource.0.version'};
- $version++;
-
- #clean out all current results
- foreach my $key (keys(%Apache::lonhomework::history)) {
- if ($key=~/^resource\.0\./) {
- $Apache::lonhomework::results{$key}='';
- }
- }
-
- #setup new version and who did it
- $Apache::lonhomework::results{'resource.0.version'}=$version;
- $Apache::lonhomework::results{"resource.$version.0.checkedin"}=
- $user.':'.$domain;
- $Apache::lonhomework::results{"resource.$version.0.checkedin.slot"}=
- $slot_name;
-
+ if ($authenticated) {
+ &create_new_version($type,$user,$domain,$slot_name);
return 1;
- } elsif ($authenticated && $type eq 'problem') {
- &Apache::lonxml::debug("authed $slot_name");
- $Apache::lonhomework::results{"resource.0.checkedin"}=
- $user.':'.$domain;
- $Apache::lonhomework::results{"resource.0.checkedin.slot"}=
- $slot_name;
}
}
}
return 0;
}
+sub create_new_version {
+ my ($type,$user,$domain,$slot_name) = @_;
+ if ($type eq 'Task') {
+ # increment version
+ my $version=
+ $Apache::lonhomework::history{'resource.0.version'};
+ $version++;
+ &Apache::lonxml::debug("Making version $version");
+ #clean out all current results
+ foreach my $key (keys(%Apache::lonhomework::history)) {
+ if ($key=~/^resource\.0\./) {
+ $Apache::lonhomework::results{$key}='';
+ }
+ }
+
+ #setup new version and who did it
+ $Apache::lonhomework::results{'resource.0.version'}=$version;
+ if (defined($user) && defined($domain)) {
+ $Apache::lonhomework::results{"resource.$version.0.checkedin"}=
+ $user.':'.$domain;
+ } else {
+ $Apache::lonhomework::results{"resource.$version.0.checkedin"}=
+ $env{'user.name'}.':'.$env{'user.domain'};
+ }
+ if (defined($slot_name)) {
+ $Apache::lonhomework::results{"resource.$version.0.checkedin.slot"}=
+ $slot_name;
+ }
+ } elsif ($type eq 'problem') {
+ &Apache::lonxml::debug("authed $slot_name");
+ if (defined($user) && defined($domain)) {
+ $Apache::lonhomework::results{"resource.0.checkedin"}=
+ $user.':'.$domain;
+ }
+ if (defined($slot_name)) {
+ $Apache::lonhomework::results{"resource.0.checkedin.slot"}=
+ $slot_name;
+ }
+ }
+}
+
sub get_version {
my ($version,$previous);
if ($env{'form.previousversion'} &&
@@ -120,7 +137,11 @@ sub get_version {
$version=$env{'form.previousversion'};
$previous=1;
} else {
- $version=$Apache::lonhomework::history{'resource.0.version'};
+ if (defined($Apache::lonhomework::results{'resource.0.version'})) {
+ $version=$Apache::lonhomework::results{'resource.0.version'};
+ } elsif (defined($Apache::lonhomework::history{'resource.0.version'})) {
+ $version=$Apache::lonhomework::history{'resource.0.version'};
+ }
$previous=0;
}
if (wantarray) {
@@ -223,6 +244,12 @@ sub add_request_another_attempt_button {
if (!$text) { $text="Request another attempt"; }
my $result;
my $symb=&Apache::lonnet::symbread();
+ # not a slot access based resource
+ my $useslots = &Apache::lonnet::EXT("resource.0.useslots",$symb);
+ if ($useslots =~ /^\s*no\s*$/i) {
+ return '';
+ }
+
my ($slot_name,$slot)=&Apache::slotrequest::check_for_reservation($symb);
my $action='get_reservation';
if ($slot_name) {
@@ -278,7 +305,8 @@ sub show_task {
( $status eq 'NOT_IN_A_SLOT') ||
( $status eq 'NEEDS_CHECKIN') ||
( $status eq 'WAITING_FOR_GRADE') ||
- ( $status eq 'INVALID_ACCESS') )) {
+ ( $status eq 'INVALID_ACCESS') ||
+ ( &get_version() eq ''))) {
return 0;
}
if ($env{'form.donescreen'}) { return 0; }
@@ -429,6 +457,14 @@ sub start_Task {
my ($version,$previous)=&get_version();
($status,$accessmsg,my $slot_name,$slot) =
&Apache::lonhomework::check_slot_access('0','Task');
+ if ($status eq 'CAN_ANSWER' && $version eq '') {
+ &create_new_version('Task',undef,undef,$slot_name);
+ &add_to_queue('gradingqueue',{'type' => 'Task',
+ 'time' => time,
+ 'slot' => $slot_name});
+ ($version,$previous)=&get_version();
+ }
+
push(@Apache::inputtags::status,$status);
$Apache::inputtags::slot_name=$slot_name;
my $expression='$external::datestatus="'.$status.'";';
@@ -496,8 +532,12 @@ DONESCREEN
if ($status eq 'NEEDS_CHECKIN') {
if(&proctor_check_auth($slot_name,$slot,'Task')
&& defined($Apache::inputtags::slot_name)) {
- my $result=&add_to_queue('gradingqueue',
- [$Apache::inputtags::slot_name]);
+ my $result=
+ &add_to_queue('gradingqueue',
+ {'type' => 'Task',
+ 'time' => time,
+ 'slot' =>
+ $Apache::inputtags::slot_name});
&Apache::lonxml::debug("add_to_queue said $result");
}
}
@@ -803,11 +843,19 @@ DONEBUTTON
my $bt_status=$Apache::lonhomework::history{"resource.$version.0.status"};
my $title=&Apache::lonnet::gettitle();
+ my $start_time;
+
my $slot_name=
$Apache::lonhomework::history{"resource.$version.0.checkedin.slot"};
- my %slot=&Apache::lonnet::get_slot($slot_name);
- my $start_time=
- &Apache::lonlocal::locallocaltime($slot{'starttime'});
+ if ($slot_name) {
+ my %slot=&Apache::lonnet::get_slot($slot_name);
+
+ $start_time=$slot{'starttime'}
+ } else {
+ $start_time=
+ &Apache::lonnet::EXT('resource.0.opendate');
+ }
+ $start_time=&Apache::lonlocal::locallocaltime($start_time);
my $status = "\n
\n";
@@ -836,6 +884,7 @@ DONEBUTTON
$man_count++;
}
}
+
my $opt_req=&Apache::lonxml::get_param('OptionalRequired',
$parstack,$safeeval);
if ($opt_req !~ /\S/) { $opt_req='0'; }
@@ -844,8 +893,6 @@ DONEBUTTON
my $internal_location=&internal_location();
$result=~s/\Q$internal_location\E/$status/;
}
- }
- if ($target eq 'web') {
$result.="\n
\n".
&Apache::loncommon::end_page({'discussion' => 1});
}
@@ -871,9 +918,18 @@ DONEBUTTON
}
&Apache::lonhomework::showhash(%Apache::lonhomework::results);
&Apache::structuretags::finalize_storage();
- if ($award eq 'SUBMITTED'
- && defined($Apache::inputtags::slot_name)) {
- &add_to_queue('gradingqueue',[$Apache::inputtags::slot_name]);
+ if ($award eq 'SUBMITTED') {
+ my $useslots = &Apache::lonnet::EXT("resource.0.useslots");
+ if ($useslots =~ /^\s*no\s*$/i) {
+ &add_to_queue('gradingqueue',
+ {'type' => 'Task',
+ 'time' => time});
+ } elsif (defined($Apache::inputtags::slot_name)) {
+ &add_to_queue('gradingqueue',
+ {'type' => 'Task',
+ 'time' => time,
+ 'slot' => $Apache::inputtags::slot_name});
+ }
}
} elsif ($Apache::lonhomework::results{'INTERNAL_store'}) {
&Apache::structuretags::finalize_storage();
@@ -1012,7 +1068,7 @@ sub move_between_queues {
} else {
$cur_data = ['none'];
}
- my $result=&add_to_queue($dest_queue,[$cur_data->[0]]);
+ my $result=&add_to_queue($dest_queue,$cur_data);
if ($result ne 'ok') {
return $result;
}
@@ -1111,17 +1167,17 @@ sub check_queue_for_key {
if (defined($results{"$todo\0locked"})) {
return 'locked';
}
- my $slot;
- if (ref($results{$todo}) eq 'ARRAY') {
- $slot = $results{$todo}[0];
- } elsif (ref($results{$todo}) eq 'HASH') {
- $slot = $results{$todo}{'slot'};
- }
- if (defined($slot)) {
+ if (my $slot=&slotted_access($results{$todo})) {
my %slot_data=&Apache::lonnet::get_slot($slot);
if ($slot_data{'endtime'} > time) {
return 'in_progress';
}
+ } else {
+ my ($symb) = &decode_queue_key($todo);
+ my $due_date = &Apache::lonhomework::due_date('0',$symb);
+ if ($due_date > time) {
+ return 'in_progress';
+ }
}
return 'enqueued';
}
@@ -1181,8 +1237,15 @@ sub show_queue {
&Apache::lonlocal::locallocaltime($queue{$key})."";
} elsif ($key!~/(timestamp|locked)$/) {
$result.="
";
- my $slot=$queue{$key}->[0];
- my %slot_data=&Apache::lonnet::get_slot($slot);
+ my ($end_time,$slot_text);
+ if (my $slot=&slotted_access($queue{$key})) {
+ my %slot_data=&Apache::lonnet::get_slot($slot);
+ $end_time = $slot_data{'endtime'};
+ $slot_text = &mt('Slot: [_1]',$slot);
+ } else {
+ $end_time = &Apache::lonhomework::due_date('0',$symb);
+ $slot_text = '';
+ }
if ($with_selects) {
my $ekey=&Apache::lonnet::escape($key);
my ($action,$description,$status)=('select',&mt('Select'));
@@ -1200,7 +1263,7 @@ sub show_queue {
$seclist.='';
}
- if (time > $slot_data{'endtime'}) {
+ if ($end_time ne '' && time > $end_time) {
$result.=(<
";
}
}
@@ -1253,13 +1316,19 @@ sub get_queue_counts {
} elsif ($key!~/(timestamp|locked)$/) {
my ($symb,$uname,$udom) = &decode_queue_key($key);
$entries++;
- my $slot=$queue{$key}->[0];
- if (!exists($slot_cache{$slot})) {
- my %slot_data=&Apache::lonnet::get_slot($slot);
- $slot_cache{$slot} = \%slot_data;
- }
- if (time > $slot_cache{$slot}{'endtime'}) {
- $ready_to_grade++;
+ if (my $slot=&slotted_access($queue{$key})) {
+ if (!exists($slot_cache{$slot})) {
+ my %slot_data=&Apache::lonnet::get_slot($slot);
+ $slot_cache{$slot} = \%slot_data;
+ }
+ if (time > $slot_cache{$slot}{'endtime'}) {
+ $ready_to_grade++;
+ }
+ } else {
+ my $due_date = &Apache::lonhomework::due_date('0',$symb);
+ if ($due_date ne '' && time > $due_date) {
+ $ready_to_grade++;
+ }
}
}
}
@@ -1293,6 +1362,22 @@ sub queue_key_locked {
return undef;
}
+sub slotted_access {
+ my ($queue_entry) = @_;
+ if (ref($queue_entry) eq 'ARRAY') {
+ if (defined($queue_entry->[0])) {
+ return $queue_entry->[0];
+ }
+ return undef;
+ } elsif (ref($queue_entry) eq 'HASH') {
+ if (defined($queue_entry->{'slot'})) {
+ return $queue_entry->{'slot'};
+ }
+ return undef;
+ }
+ return undef;
+}
+
sub pick_from_queue_data {
my ($queue,$check_section,$queuedata,$cdom,$cnum)=@_;
my @possible; # will hold queue entries that are valid to be selected
@@ -1307,17 +1392,28 @@ sub pick_from_queue_data {
next;
}
}
- my $slot=$queuedata->{$key}[0];
- my %slot_data=&Apache::lonnet::get_slot($slot);
- if ($slot_data{'endtime'} > time) {
+ my $end_time;
+ if (my $slot=&slotted_access($queuedata->{$key})) {
+ my %slot_data=&Apache::lonnet::get_slot($slot);
+ if ($slot_data{'endtime'} < time) {
+ $end_time = $slot_data{'endtime'};
+ }
+ } else {
+ my $due_date = &Apache::lonhomework::due_date('0',$symb);
+ if ($due_date > time) {
+ $end_time = $due_date;
+ }
+ }
+ if ($end_time ne '') {
&Apache::lonxml::debug("not time");
next;
}
+
if (exists($queuedata->{"$key\0locked"})) {
&Apache::lonxml::debug("someone already has um.");
next;
}
- push(@possible,[$key,$slot_data{'endtime'}]);
+ push(@possible,[$key,$end_time]);
}
if (@possible) {
# sort entries in order by slot end time
@@ -1620,6 +1716,7 @@ sub get_id {
}
my %dimension;
+sub start_Question { return &start_Dimension(@_); }
sub start_Dimension {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
undef(%dimension);
@@ -1662,9 +1759,11 @@ sub get_instance {
}
@instances = &Math::Random::random_permutation(@instances);
$instance = $instances[($version-1)%scalar(@instances)];
- $Apache::lonhomework::results{"resource.$version.0.$dim.instance"} =
- $instance;
- $Apache::lonhomework::results{'INTERNAL_store'} = 1;
+ if ($version =~ /^\d$/) {
+ $Apache::lonhomework::results{"resource.$version.0.$dim.instance"} =
+ $instance;
+ $Apache::lonhomework::results{'INTERNAL_store'} = 1;
+ }
&Apache::response::poprandomnumber();
return $instance;
}
@@ -1673,9 +1772,11 @@ sub get_instance {
{
my $last_link;
sub link {
- my ($instance,$id) = @_;
- return 'LC_GRADING_criteria_'.$instance.'_'.$id;
+ my ($id) = @_;
+ $id =~ s/\./_/g;
+ return 'LC_GRADING_criteria_'.$id;
}
+ sub end_Question { return &end_Dimension(@_); }
sub end_Dimension {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
my $result=&Apache::lonxml::endredirection();
@@ -1711,11 +1812,12 @@ sub get_instance {
my $man_passed=0;
my $opt_count=0;
my $opt_passed=0;
- foreach my $id (@{$dimension{$instance.'.criterias'}}) {
- if ($dimension{$instance.'.criteria.'.$id.'.mandatory'}
+ foreach my $id ( @{$dimension{$instance.'.criterias'}},
+ @{$dimension{'criterias'}} ) {
+ if ($dimension{'criteria.'.$id.'.mandatory'}
eq 'N') {
$opt_count++;
- if ($Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.status"} eq 'pass') {
+ if ($Apache::lonhomework::history{"resource.$version.0.$dim.$id.status"} eq 'pass') {
$opt_passed++;
}
} else {
@@ -1726,17 +1828,24 @@ sub get_instance {
}
}
if ($man_passed eq $man_count) { $man_passed='all'; }
+
my $opt_req=$dimension{$instance.'.optionalrequired'};
- if ($opt_req !~ /\S/) { $opt_req='0'; }
+ if ($opt_req !~ /\S/) {
+ $opt_req=
+ &Apache::lonxml::get_param('OptionalRequired',
+ $parstack,$safeeval);
+ if ($opt_req !~ /\S/) { $opt_req = 0; }
+ }
$dim_info.="\n
".&mt('You passed [_1] of the [_2] mandatory components and [_3] of the [_4] optional components, of which you were required to pass [_5].',$man_passed,$man_count,$opt_passed,$opt_count,$opt_req)."
\n";
my $internal_location=&internal_location($dim);
$result=~s/\Q$internal_location\E/$dim_info/;
- foreach my $id (@{$dimension{$instance.'.criterias'}}) {
- my $status=$Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.status"};
- my $comment=$Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.comment"};
- my $mandatory=($dimension{$instance.'.criteria.'.$id.'.mandatory'} ne 'N');
+ foreach my $id (@{$dimension{$instance.'.criterias'}},
+ @{$dimension{'criterias'}}) {
+ my $status=$Apache::lonhomework::history{"resource.$version.0.$dim.$id.status"};
+ my $comment=$Apache::lonhomework::history{"resource.$version.0.$dim.$id.comment"};
+ my $mandatory=($dimension{'criteria.'.$id.'.mandatory'} ne 'N');
if ($mandatory) {
$mandatory='Mandatory';
} else {
@@ -1749,15 +1858,14 @@ sub get_instance {
}
my $status_display=$status;
$status_display=~s/^([a-z])/uc($1)/e;
- @Apache::scripttag::parser_env = @_;
$result.=
'