'."\n";
+ }
return $result;
}
@@ -223,6 +288,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) {
@@ -231,18 +302,19 @@ sub add_request_another_attempt_button {
my $description=&Apache::slotrequest::get_description($slot_name,
$slot);
$result.=(< Will be next available: $description
+
Will be next available: $description
STUFF
}
if ($env{'request.enc'}) { $symb=&Apache::lonenc::encrypted($symb); }
- $symb=&Apache::lonnet::escape($symb);
- $result.='';
+ &mt($text).'" />'."\n\t".
+ ''."\n";
return $result;
}
@@ -262,9 +334,22 @@ sub style {
my ($target) = @_;
if ($target eq 'web'
|| $target eq 'webgrade') {
- return (<
STYLE
+ if ($env{'browser.type'} eq 'explorer'
+ && $env{'browser.os'} eq 'win' ) {
+ if ($env{'browser.version'} < 7) {
+ $style .= (<
+STYLE
+ } else {
+ $style .= (<
+STYLE
+ }
+ }
+ return $style;
}
return;
}
@@ -278,25 +363,60 @@ 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; }
return 1;
}
+my @delay;
+sub nest {
+ if (@delay) {
+ return $delay[-1];
+ } else {
+ return;
+ }
+}
+
+sub nested_parse {
+ my ($str,$env,$args) = @_;
+ my @old_env = @Apache::scripttag::parser_env;
+ @Apache::scripttag::parser_env = @$env;
+ if (exists($args->{'set_dim_id'})) {
+ &enable_dimension_parsing($args->{'set_dim_id'});
+ }
+ push(@delay,(($args->{'delayed_dim_results'})? 1 : 0));
+ my $result = &Apache::scripttag::xmlparse($$str);
+ pop(@delay);
+ if (exists($args->{'set_dim_id'})) {
+ &disable_dimension_parsing();
+ }
+ @Apache::scripttag::parser_env = @old_env;
+ if ($args->{'delayed_dim_results'}) {
+ my $dim = &get_dim_id();
+ &Apache::lonxml::debug(" tossing out $result ");
+ &Apache::lonxml::debug(" usining out $dim 's ". $dimension{$dim}{'result'});
+ return $dimension{$dim}{'result'};
+ }
+ return $result;
+}
+
sub internal_location {
my ($id)=@_;
return '';
}
sub submission_time_stamp {
- my ($symb,$courseid,$udom,$uname)=&Apache::lonxml::whichuser();
+ my ($symb,$courseid,$udom,$uname)=&Apache::lonnet::whichuser();
my $submissiontime;
my $version=$Apache::lonhomework::history{'resource.0.version'};
for (my $v=$Apache::lonhomework::history{'version'};$v>0;$v--) {
- if (defined($Apache::lonhomework::history{$v.':resource.'.$version.'.0.bridgetask.portfiles'})) {
+ if (defined($Apache::lonhomework::history{$v.':resource.'.$version.'.0.bridgetask.portfiles'})
+ && defined($Apache::lonhomework::history{$v.':resource.'.$version.'.0.tries'})) {
$submissiontime=$Apache::lonhomework::history{$v.':timestamp'};
+ last;
}
}
my $result;
@@ -307,16 +427,18 @@ sub submission_time_stamp {
my ($color,$when)=('#FF6666','after');
if ($diff > 0) { ($color,$when)=('#336600','before'); }
my $info;
+ $diff = abs($diff);
if ($diff%60) { $info=($diff%60).' seconds'; }
$diff=int($diff/60);
if ($diff%60) { $info=($diff%60).' minutes '.$info; }
$diff=int($diff/60);
if ($diff) { $info=$diff.' hours '.$info; }
$result='
'.
- &mt('Student submitted [_1] [_2] the deadline.
- (Submission was at [_3], end of period was [_4].)',
- $info,$when,scalar(localtime($submissiontime)),
- scalar(localtime($slot{'endtime'}))).
+ &mt('Student submitted [_1] [_2] the deadline. '.
+ '(Submission was at [_3], end of period was [_4].)',
+ $info,$when,
+ &Apache::lonlocal::locallocaltime($submissiontime),
+ &Apache::lonlocal::locallocaltime($slot{'endtime'})).
'
';
}
return $result;
@@ -325,7 +447,7 @@ sub submission_time_stamp {
sub file_list {
my ($files,$uname,$udom) = @_;
if (!defined($uname) || !defined($udom)) {
- (undef,undef,$udom,$uname) = &Apache::lonxml::whichuser();
+ (undef,undef,$udom,$uname) = &Apache::lonnet::whichuser();
}
my $file_url = '/uploaded/'.$udom.'/'.$uname.'/portfolio/';
@@ -334,39 +456,112 @@ sub file_list {
my $file=$file_url.$partial_file;
$file=~s|/+|/|g;
&Apache::lonnet::allowuploaded('/adm/bridgetask',$file);
- $file_list.='
+$message_status
+$comment_status
+DONESCREEN
+
+}
+
sub start_Task {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
my ($status,$accessmsg,$slot);
+ &Apache::structuretags::init_problem_globals('Task');
if ($target ne 'webgrade') {
- &Apache::structuretags::init_problem_globals('Task');
&Apache::structuretags::initialize_storage();
&Apache::lonhomework::showhash(%Apache::lonhomework::history);
if ($env{'request.state'} eq 'construct') {
@@ -381,20 +576,23 @@ sub start_Task {
$name = &Apache::structuretags::get_resource_name($parstack,$safeeval);
}
- #should get back a or the neccesary stuff to start XML/MathML
- my ($result,$form_tag_start)=
- &Apache::structuretags::page_start($target,$token,$tagstack,$parstack,
- $parser,$safeeval,$name,&style());
-
- $result .= '
\n";
+ $result.= &Apache::loncommon::end_data_table()."\n";
return $result;
}
sub get_queue_counts {
my ($queue)=@_;
my $result;
- my ($symb,$cid,$udom,$uname)=&Apache::lonxml::whichuser();
+ my ($symb,$cid,$udom,$uname)=&Apache::lonnet::whichuser();
my $cnum=$env{'course.'.$cid.'.num'};
my $cdom=$env{'course.'.$cid.'.domain'};
+
+ my $classlist=&get_limited_classlist();
+
my $regexp="^$symb\0";
my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp);
my ($tmp)=%queue;
@@ -1239,20 +1616,27 @@ sub get_queue_counts {
my ($entries,$ready_to_grade,$locks)=(0,0,0);
my %slot_cache;
foreach my $key (sort(keys(%queue))) {
+ my ($symb,$uname,$udom) = &decode_queue_key($key);
+ if (!defined($classlist->{$uname.':'.$udom})) { next; }
if ($key=~/locked$/) {
$locks++;
} elsif ($key=~/timestamp$/) {
#ignore
} 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++;
+ }
}
}
}
@@ -1274,7 +1658,7 @@ sub decode_queue_key {
sub queue_key_locked {
my ($queue,$key,$cdom,$cnum)=@_;
if (!defined($cdom) || !defined($cnum)) {
- my (undef,$cid)=&Apache::lonxml::whichuser();
+ my (undef,$cid)=&Apache::lonnet::whichuser();
$cnum=$env{'course.'.$cid.'.num'};
$cdom=$env{'course.'.$cid.'.domain'};
}
@@ -1286,31 +1670,65 @@ 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 ($queue,$check_section,$queuedata,$cdom,$cnum,$classlist)=@_;
my @possible; # will hold queue entries that are valid to be selected
foreach my $key (keys(%$queuedata)) {
if ($key =~ /\0locked$/) { next; }
if ($key =~ /\0timestamp$/) { next; }
+
my ($symb,$uname,$udom)=&decode_queue_key($key);
+ if (!defined($classlist->{$uname.':'.$udom})) { next; }
+
if ($check_section) {
- my $section=&Apache::lonnet::getsection($uname,$udom);
+ my $section =
+ $classlist->{$uname.':'.$udom}[&Apache::loncoursedata::CL_SECTION()];
if ($section eq $check_section) {
&Apache::lonxml::debug("my sec");
next;
}
}
- my $slot=$queuedata->{$key}[0];
- my %slot_data=&Apache::lonnet::get_slot($slot);
- if ($slot_data{'endtime'} > time) {
- &Apache::lonxml::debug("not time");
- next;
+ my $end_time;
+ if (my $slot=&slotted_access($queuedata->{$key})) {
+ &Apache::lonxml::debug("looking at slot $slot");
+ my %slot_data=&Apache::lonnet::get_slot($slot);
+ if ($slot_data{'endtime'} < time) {
+ $end_time = $slot_data{'endtime'};
+ } else {
+ &Apache::lonxml::debug("not time ".$slot_data{'endtime'});
+ next;
+ }
+ } else {
+ my $due_date = &Apache::lonhomework::due_date('0',$symb);
+ if ($due_date < time) {
+ $end_time = $due_date;
+ } else {
+ &Apache::lonxml::debug("not time $due_date");
+ 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
@@ -1330,7 +1748,7 @@ sub pick_from_queue_data {
sub find_mid_grade {
my ($queue,$symb,$cdom,$cnum)=@_;
- my $todo=&Apache::lonnet::unescape($env{'form.gradingkey'});
+ my $todo=&unescape($env{'form.gradingkey'});
my $me=$env{'user.name'}.':'.$env{'user.domain'};
if ($todo) {
my $who=&queue_key_locked($queue,$todo,$cdom,$cnum);
@@ -1352,7 +1770,7 @@ sub find_mid_grade {
sub lock_key {
my ($queue,$todo)=@_;
my $me=$env{'user.name'}.':'.$env{'user.domain'};
- my (undef,$cid)=&Apache::lonxml::whichuser();
+ my (undef,$cid)=&Apache::lonnet::whichuser();
my $cnum=$env{'course.'.$cid.'.num'};
my $cdom=$env{'course.'.$cid.'.domain'};
my $success=&Apache::lonnet::newput($queue,{"$todo\0locked"=> $me},
@@ -1367,10 +1785,12 @@ sub lock_key {
sub get_queue_symb_status {
my ($queue,$symb,$cdom,$cnum) = @_;
if (!defined($cdom) || !defined($cnum)) {
- my (undef,$cid)=&Apache::lonxml::whichuser();
+ my (undef,$cid)=&Apache::lonnet::whichuser();
$cnum=$env{'course.'.$cid.'.num'};
$cdom=$env{'course.'.$cid.'.domain'};
}
+ my $classlist=&get_limited_classlist();
+
my $regexp="^$symb\0";
my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp);
my ($tmp)=%queue;
@@ -1380,6 +1800,7 @@ sub get_queue_symb_status {
next if ($key=~/locked$/);
next if ($key=~/timestamp$/);
my ($symb,$uname,$udom) = &decode_queue_key($key);
+ next if (!defined($classlist->{$uname.':'.$udom}));
push(@users,"$uname:$udom");
}
return @users;
@@ -1388,13 +1809,16 @@ sub get_queue_symb_status {
sub get_from_queue {
my ($queue)=@_;
my $result;
- my ($symb,$cid,$udom,$uname)=&Apache::lonxml::whichuser();
+ my ($symb,$cid,$udom,$uname)=&Apache::lonnet::whichuser();
my $cnum=$env{'course.'.$cid.'.num'};
my $cdom=$env{'course.'.$cid.'.domain'};
my $todo=&find_mid_grade($queue,$symb,$cdom,$cnum);
&Apache::lonxml::debug("found ".join(':',&decode_queue_key($todo)));
if ($todo) { return $todo; }
my $attempts=0;
+
+ my $classlist=&get_limited_classlist();
+
while (1) {
if ($attempts > 2) {
# tried twice to get a queue entry, giving up
@@ -1405,21 +1829,22 @@ sub get_from_queue {
$cdom,$cnum);
&Apache::lonxml::debug("$starttime");
my $regexp="^$symb\0queue\0";
- my $range= ($attempts < 1 ) ? '0-100' : '0-400';
+ #my $range= ($attempts < 1 ) ? '0-100' : '0-400';
my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp);
#make a pass looking for a user _not_ in my section
if ($env{'request.course.sec'}) {
&Apache::lonxml::debug("sce");
$todo=&pick_from_queue_data($queue,$env{'request.course.sec'},
- \%queue,$cdom,$cnum);
+ \%queue,$cdom,$cnum,$classlist);
&Apache::lonxml::debug("sce $todo");
}
# no one _not_ in our section so look for any user that is
# ready for grading
if (!$todo) {
&Apache::lonxml::debug("no sce");
- $todo=&pick_from_queue_data($queue,undef,\%queue,$cdom,$cnum);
+ $todo=&pick_from_queue_data($queue,undef,\%queue,$cdom,$cnum,
+ $classlist);
&Apache::lonxml::debug("no sce $todo");
}
# no user to grade
@@ -1460,22 +1885,21 @@ sub get_from_queue {
}
sub select_user {
- my ($symb,$cid)=&Apache::lonxml::whichuser();
+ my ($symb,$cid)=&Apache::lonnet::whichuser();
my @chosen_sections=
&Apache::loncommon::get_env_multiple('form.chosensections');
- &Apache::grades::init_perm();
- my ($classlist,$section,$fullname)=&Apache::grades::getclasslist(\@chosen_sections,);
- &Apache::grades::reset_perm();
+
+ my $classlist = &get_limited_classlist(\@chosen_sections);
my $result;
if (!(grep(/^all$/,@chosen_sections))) {
$result.='
Showing only sections '.join(', ',@chosen_sections).
'.
'."\n";
}
- $result.='
';
+ $result.=&Apache::loncommon::start_data_table();
- foreach my $student (sort {lc($$fullname{$a}) cmp lc($$fullname{$b}) } keys %$fullname) {
+ foreach my $student (sort {lc($classlist->{$a}[&Apache::loncoursedata::CL_FULLNAME()]) cmp lc($classlist->{$b}[&Apache::loncoursedata::CL_FULLNAME()]) } (keys(%$classlist))) {
my ($uname,$udom) = split(/:/,$student);
my $cnum=$env{'course.'.$cid.'.num'};
@@ -1496,9 +1920,10 @@ sub select_user {
}
}
my $todo =
- &Apache::lonnet::escape(&encode_queue_key($symb,$udom,$uname));
+ &escape(&encode_queue_key($symb,$udom,$uname));
if ($cannot_grade) {
- $result.='
Question : you did not pass this '.$mandatory.' question
';
- }
- my $man_count=0;
- my $man_passed=0;
- my $opt_count=0;
- my $opt_passed=0;
- foreach my $id (@{$dimension{$instance.'.criterias'}}) {
- if ($dimension{$instance.'.criteria.'.$id.'.mandatory'}
- eq 'N') {
- $opt_count++;
- if ($Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.status"} eq 'pass') {
- $opt_passed++;
- }
- } else {
- $man_count++;
- if ($Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.status"} eq 'pass') {
- $man_passed++;
- }
- }
+sub get_criteria {
+ my ($what,$version,$dim,$id) = @_;
+ my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
+ my $prefix = ($type eq 'criteria' && $dim ne $top) ? "$dim.$id"
+ : "$id";
+ my $entry = "resource.$version.0.$prefix.$what";
+ if (exists($Apache::lonhomework::results{$entry})) {
+ return $Apache::lonhomework::results{$entry};
+ }
+ return $Apache::lonhomework::history{$entry};
+}
+
+sub link {
+ 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();
+ my $dim=&get_id($parstack,$safeeval);
+ if (&skip_dimension_parsing($dim)) {
+ &disable_dimension_parsing($dim);
+ pop(@Apache::bridgetask::dimension);
+ return;
+ }
+ my $instance=&get_instance($dim);
+ my $version=&get_version();
+ if ($target eq 'web') {
+ $result .= &nested_parse(\$dimension{$dim}{'intro'},[@_]);
+ my @instances = $instance;
+ if (&Apache::response::showallfoils()) {
+ @instances = @{$dimension{$dim}{'instances'}};
+ }
+ my $shown_question_text;
+ foreach my $instance (@instances) {
+ $result .= &nested_parse(\$dimension{$dim}{$instance.'.text'},
+ [@_]);
+ $result .= &nested_parse(\$dimension{$dim}{'questiontext'},
+ [@_],{'set_dim_id' => undef});
+ my $task_status =
+ $Apache::lonhomework::history{"resource.$version.0.status"};
+ if ($task_status ne 'pass' && $task_status ne 'fail') {
+
+ foreach my $id (@{$dimension{$dim}{$instance.'.criterias'}},
+ @{$dimension{$dim}{'criterias'}}) {
+ my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
+ &Apache::lonxml::debug("$id is $type");
+ if ($type eq 'dimension') {
+ $result.=
+ &nested_parse(\$dimension{$dim}{'criteria.'.$id},
+ [@_],{'set_dim_id' => $id});
}
- if ($man_passed eq $man_count) { $man_passed='all'; }
- my $opt_req=$dimension{$instance.'.optionalrequired'};
- 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');
- if ($mandatory) {
- $mandatory='Mandatory';
- } else {
- $mandatory='Optional';
- }
- if ($status eq 'fail') {
- } elsif ($status eq 'pass') {
+ }
+ } else {
+ my $dim_status=$Apache::lonhomework::history{"resource.$version.0.$dim.status"};
+ my $mandatory='Mandatory';
+ if (&Apache::lonxml::get_param('Mandatory',$parstack,$safeeval) eq 'N') {
+ $mandatory='Optional';
+ }
+ my $dim_info=
+ "\n
\n\t";
+ my $question = ('sub' x $dimension{$dim}{'depth'}).'question';
+ $question =~ s/^(.)/uc($1)/e;
+ if ($dim_status eq 'pass') {
+ $dim_info.='
'.$question.' : you passed the above '.$mandatory.' question
';
+ } else {
+ my $criteria =
+ &nested_parse(\$dimension{$dim}{'criteria.'.$id},
+ [@_]);
+ $dim_info .= &layout_web_Criteria($dim,$id,$criteria);
}
}
+ # puts the results at the end of the dimension
+ $result .= $dim_info;
+
+ # puts the results at the beginning of the dimension
+ # my $internal_location=&internal_location($dim);
+ # $result=~s/\Q$internal_location\E/$dim_info/;
}
- } elsif ($target eq 'webgrade') {
- # in case of any side effects that we need
- @Apache::scripttag::parser_env = @_;
- &Apache::scripttag::xmlparse($dimension{'intro'});
- @Apache::scripttag::parser_env = @_;
- &Apache::scripttag::xmlparse($dimension{$instance.'.text'});
- foreach my $id (@{$dimension{$instance.'.criterias'}}) {
- my $link=&link($instance,$id);
- my $status=$Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.status"};
- $result.='
'.
+ &mt('Note to graders:').'';
+ }
+ my $note=&Apache::lonxml::get_all_text('/gradernote',$parser,$style);
+ return;
+}
+
+sub end_GraderNote {
+ my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
+
+ if ($target eq 'webgrade') {
+ return '
';
+ }
+ return;
+}
+
+
+
sub proctor_validation_screen {
my ($slot) = @_;
- my (undef,undef,$domain,$user) = &Apache::lonxml::whichuser();
+ my (undef,undef,$domain,$user) = &Apache::lonnet::whichuser();
my $url=&Apache::lonnet::studentphoto($domain,$user,'jpg');
my $name=&Apache::loncommon::plainname($user,$domain);