From: Gavin L. v. a. <act...@de...> - 2005-01-28 00:38:57
|
Log Message: ----------- Update ProblemSets listing to give more intelligible entries for gateway tests: add Score and Date columns, clean up status column, and change set names to be more logical for gateways. This works best when making the 'info' column in the template narrower (e.g., 15% instead of the default 30%), which might argue that a gateway template should be added to the available templates. Tags: ---- rel-2-1-a1 Modified Files: -------------- webwork2/lib/WeBWorK/ContentGenerator: ProblemSets.pm Revision Data ------------- Index: ProblemSets.pm =================================================================== RCS file: /webwork/cvs/system/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm,v retrieving revision 1.50.2.4 retrieving revision 1.50.2.5 diff -Llib/WeBWorK/ContentGenerator/ProblemSets.pm -Llib/WeBWorK/ContentGenerator/ProblemSets.pm -u -r1.50.2.4 -r1.50.2.5 --- lib/WeBWorK/ContentGenerator/ProblemSets.pm +++ lib/WeBWorK/ContentGenerator/ProblemSets.pm @@ -105,37 +105,65 @@ print CGI::p({-align=>'center'},CGI::a({-href=>$instructorLink},'Instructor Tools')); } - $sort = "status" unless $sort eq "status" or $sort eq "name"; - my $nameHeader = $sort eq "name" - ? CGI::u("Name") - : CGI::a({href=>$self->systemLink($urlpath, params=>{sort=>"name"})}, "Name"); - my $statusHeader = $sort eq "status" - ? CGI::u("Status") - : CGI::a({href=>$self->systemLink($urlpath, params=>{sort=>"status"})}, "Status"); my $hardcopyPage = $urlpath->newFromModule("WeBWorK::ContentGenerator::Hardcopy", courseID => $courseName); my $actionURL = $self->systemLink($hardcopyPage, authen => 0); # no authen info for form action print CGI::startform(-method=>"POST", -action=>$actionURL); print $self->hidden_authen_fields; - print CGI::start_table(); - print CGI::Tr( - CGI::th("Sel."), - CGI::th($nameHeader), - CGI::th($statusHeader), - ); + # moved table header down after sets to allow inclusion of versioned set/ + # gateway columns my @setIDs = $db->listUserSets($effectiveUser); my @userSetIDs = map {[$effectiveUser, $_]} @setIDs; $WeBWorK::timer->continue("Begin collecting merged sets") if defined($WeBWorK::timer); my @sets = $db->getMergedSets( @userSetIDs ); + + $WeBWorK::timer->continue("Begin set-type check") if defined($WeBWorK::timer); +# check to see if we have gateways, in which case we want to include date +# taken and score columns in the output, and change the default sort order + my $existVersions = 0; + foreach ( @sets ) { + if ( defined( $_->assignment_type() ) && + $_->assignment_type() =~ /gateway/ ) { + $existVersions = 1; + last; + } + } +# change default sort order, if it wasn't declared earlier + $sort = 'name' if ( $existVersions && ! $r->param("sort") ); + $WeBWorK::timer->continue("Begin sorting merged sets") if defined($WeBWorK::timer); - @sets = sortByName("set_id", @sets) if $sort eq "name"; @sets = sort byUrgency @sets if $sort eq "status"; $WeBWorK::timer->continue("End preparing merged sets") if defined($WeBWorK::timer); - + + $sort = "status" unless $sort eq "status" or $sort eq "name"; + my $nameHeader = $sort eq "name" + ? CGI::u("Name") + : CGI::a({href=>$self->systemLink($urlpath, params=>{sort=>"name"})}, "Name"); + my $statusHeader = $sort eq "status" + ? CGI::u("Status") + : CGI::a({href=>$self->systemLink($urlpath, params=>{sort=>"status"})}, "Status"); + + print CGI::start_table(); + if ( ! $existVersions ) { + print CGI::Tr( + CGI::th("Sel."), + CGI::th($nameHeader), + CGI::th($statusHeader), + ); + } else { + print CGI::Tr( + CGI::th("Sel."), + CGI::th($nameHeader), + CGI::th("Score"), + CGI::th("Date"), + CGI::th($statusHeader), + ); + } + foreach my $set (@sets) { die "set $set not defined" unless $set; @@ -154,11 +182,8 @@ } warn "undefined published button".$set->set_id unless defined($set->published); if ($set->published || $authz->hasPermissions($user, "view_unpublished_sets")) { -# && $set->set_id() !~ /,v\d+$/ ) { -# should we exclude versions? we get new versions by clicking the global set -# but probably want to look at old ones too - print $self->setListRow($set, $authz->hasPermissions($user, "view_multiple_sets"), $authz->hasPermissions($user, "view_unopened_sets")); + print $self->setListRow($set, $authz->hasPermissions($user, "view_multiple_sets"), $authz->hasPermissions($user, "view_unopened_sets"),$existVersions,$db); } } @@ -193,7 +218,7 @@ } sub setListRow { - my ($self, $set, $multiSet, $preOpenSets) = @_; + my ($self, $set, $multiSet, $preOpenSets, $existVersions, $db) = @_; my $r = $self->r; my $ce = $r->ce; my $urlpath = $r->urlpath; @@ -244,12 +269,46 @@ } my $interactive = CGI::a({-href=>$interactiveURL}, "set $name"); - +# edit this a bit for gateways + if ( defined( $set->assignment_type() ) && + $set->assignment_type() =~ /gateway/ ) { + if ( $name =~ /,v\d+$/ ) { + my $sname = $name; + $sname =~ s/,v(\d+)$//; + $interactive = CGI::a({-href=>$interactiveURL}, + "$sname (test$1)"); + } else { # this is the case of a template URL + $interactive = CGI::a({-href=>$interactiveURL}, + "Take new $name test"); + } + } + +# for gateways, we aren't as verbose about open/closed status, because +# there's only one attempt and we default to showing answers once the +# test is done. my $status; - if (time < $set->open_date) { - $status = "will open on $openDate"; - $control = "" unless $preOpenSets; - $interactive = $name unless $preOpenSets; + if ( defined($set->assignment_type()) && + $set->assignment_type() =~ /gateway/ ) { + if ( $set->set_id() =~ /,v\d+$/ ) { + $status = ' '; # for g/w, we only give one attempt per version, + # so by the time we're here it's closed + } else { + my $t = time(); + if ( $t < $set->open_date() ) { + $status = "will open on $openDate"; + $control = "" unless $preOpenSets; + $interactive = $name unless $preOpenSets; + } elsif ( $t < $set->due_date() ) { + $status = "open, due $dueDate"; + } else { + $status = "closed"; + } + } +# old conditional + } elsif (time < $set->open_date) { + $status = "will open on $openDate"; + $control = "" unless $preOpenSets; + $interactive = $name unless $preOpenSets; } elsif (time < $set->due_date) { if ( $set->set_id() !~ /,v\d+$/ ) { $status = "now open, due $dueDate"; @@ -267,12 +326,48 @@ my $publishedClass = ($set->published) ? "Published" : "Unpublished"; $status = CGI::font({class=>$publishedClass}, $status) if $preOpenSets; - - return CGI::Tr(CGI::td([ - $control, - $interactive, - $status, - ])); + +# check to see if we need to return a score and a date column + if ( ! $existVersions ) { + return CGI::Tr(CGI::td([ + $control, + $interactive, + $status, + ])); + } else { + my ( $startTime, $score ); + + if ( defined( $set->assignment_type() ) && + $set->assignment_type() =~ /gateway/ && + $set->set_id() =~ /,v\d+$/ ) { + $startTime = localtime( $set->version_creation_time() ); + + # find score + my @problemRecords = $db->getAllUserProblems( $set->user_id(), + $set->set_id() ); + my $possible = 0; + $score = 0; + foreach my $pRec ( @problemRecords ) { + if ( defined( $pRec ) && $score ne 'undef' ) { + $score += $pRec->status() || 0; + } else { + $score = 'undef'; + } + $possible++; + } + $score = "$score/$possible"; + } else { + $startTime = ' '; + $score = $startTime; + } + return CGI::Tr(CGI::td([ + $control, + $interactive, + $score, + $startTime, + $status, + ])); + } } sub byname { $a->set_id cmp $b->set_id; } |