You can subscribe to this list here.
2004 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(58) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2005 |
Jan
(53) |
Feb
(56) |
Mar
|
Apr
|
May
(30) |
Jun
(78) |
Jul
(121) |
Aug
(155) |
Sep
(77) |
Oct
(61) |
Nov
(45) |
Dec
(94) |
2006 |
Jan
(116) |
Feb
(33) |
Mar
(11) |
Apr
(23) |
May
(60) |
Jun
(89) |
Jul
(130) |
Aug
(109) |
Sep
(124) |
Oct
(63) |
Nov
(82) |
Dec
(45) |
2007 |
Jan
(31) |
Feb
(35) |
Mar
(123) |
Apr
(36) |
May
(18) |
Jun
(134) |
Jul
(133) |
Aug
(241) |
Sep
(126) |
Oct
(31) |
Nov
(15) |
Dec
(5) |
2008 |
Jan
(11) |
Feb
(6) |
Mar
(16) |
Apr
(29) |
May
(43) |
Jun
(149) |
Jul
(27) |
Aug
(29) |
Sep
(37) |
Oct
(20) |
Nov
(4) |
Dec
(6) |
2009 |
Jan
(34) |
Feb
(30) |
Mar
(16) |
Apr
(6) |
May
(1) |
Jun
(32) |
Jul
(22) |
Aug
(7) |
Sep
(18) |
Oct
(50) |
Nov
(22) |
Dec
(8) |
2010 |
Jan
(17) |
Feb
(15) |
Mar
(10) |
Apr
(9) |
May
(67) |
Jun
(30) |
Jul
|
Aug
|
Sep
(2) |
Oct
|
Nov
(1) |
Dec
|
From: Mike G. v. a. <we...@ma...> - 2005-12-26 22:07:54
|
Log Message: ----------- This file replaces the SetsAssignedToUser.pm module. It allows you to=20 change the dates on several homework sets for a single student from one p= age. This is a common activity, particularly when adding students, and is now = a much faster procedure. Added Files: ----------- webwork-modperl/lib/WeBWorK/ContentGenerator/Instructor: UserDetail.pm Revision Data ------------- --- /dev/null +++ lib/WeBWorK/ContentGenerator/Instructor/UserDetail.pm @@ -0,0 +1,500 @@ +########################################################################= ######## +# WeBWorK Online Homework Delivery System +# Copyright =A9 2000-2003 The WeBWorK Project, http://openwebwork.sf.net= / +# $CVSHeader:=20 +#=20 +# This program is free software; you can redistribute it and/or modify i= t under +# the terms of either: (a) the GNU General Public License as published b= y the +# Free Software Foundation; either version 2, or (at your option) any la= ter +# version, or (b) the "Artistic License" which comes with this package. +#=20 +# This program is distributed in the hope that it will be useful, but WI= THOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or = FITNESS +# FOR A PARTICULAR PURPOSE. See either the GNU General Public License o= r the +# Artistic License for more details. +########################################################################= ######## + +package WeBWorK::ContentGenerator::Instructor::UserDetail; +use base qw(WeBWorK::ContentGenerator::Instructor); + +=3Dhead1 NAME + +WeBWorK::ContentGenerator::Instructor::UserDetail - Detailed User specif= ic information + +=3Dcut + +use strict; +use warnings; +use CGI qw(); +use WeBWorK::Utils qw(sortByName); +use WeBWorK::Debug; + +use constant DATE_FIELDS =3D> { open_date =3D> " Open: ", + due_date =3D> " Due : ", + answer_date =3D> " Ans : " +}; +use constant DATE_FIELDS_ORDER =3D>[qw(open_date due_date answer_date )]= ; +sub initialize { + my ($self) =3D @_; + my $r =3D $self->r; + my $urlpath =3D $r->urlpath; + my $db =3D $r->db; + my $authz =3D $r->authz; + my $userID =3D $r->param("user"); + my $editForUserID =3D $urlpath->arg("userID"); + + return CGI::div({class =3D> "ResultsWithError"}, "You are not authorize= d to edit user specific information.") + unless $authz->hasPermissions($userID, "access_instructor_tools"); + + # templates for getting field names + my $userTemplate =3D $self->{userTemplate} =3D $db->newUser; + my $permissionLevelTemplate =3D $self->{permissionLevelTemplate} =3D $d= b->newPermissionLevel; +=09 + # first check to see if a save form has been submitted + return '' unless $r->param('save_button'); +=09 + # As it stands we need to check each set to see if it is still assigned= =20 + # the forms are not currently set up to simply transmit changes +=09 + #Get the list of sets and the global set records + my @setIDs =3D $db->listGlobalSets; + my @setRecords =3D grep { defined $_ } $db->getGlobalSets(@setIDs); +=09 + my @assignedSets =3D (); + foreach my $setID (@setIDs) { + push @assignedSets, $setID if defined($r->param("set.$setID.assignment= ")); + } + debug("assignedSets", join(" ", @assignedSets)); + my %selectedSets =3D map { $_ =3D> 1 } @assignedSets; + #debug ########################## + #print STDERR ("aSsigned sets", join(" ",@assignedSets)); + #my @params =3D $r->param(); + #print STDERR " parameters ", join(" ", @params); + ############### + #Get the user(s) whose records are to be modified + # for now: $editForUserID + # check the user exists? Is this necessary? + my $editUserRecord =3D $db->getUser($editForUserID); + die "record not found for $editForUserID.\n" unless $editUserRecord; +=09 +=09 + #Perform the desired assignments or deletions + my %userSets =3D map { $_ =3D> 1 } $db->listUserSets($editForUserID); + =09 + # go through each possible set + debug(" parameters ", join(" ", $r->param()) ); + foreach my $setRecord (@setRecords) { + my $setID =3D $setRecord->set_id; + # does the user want it to be assigned to the selected user + if (exists $selectedSets{$setID}) { + $self->assignSetToUser($editForUserID, $setRecord); + #override dates + =09 + + my $userSetRecord =3D $db->getUserSet($editForUserID, $setID); + # get the dates + =09 + + + #do checks to see if new dates meet criteria + my $rh_dates =3D $self->checkDates($setRecord,$setID); + unless ( $rh_dates->{error} ) { #returns 1 if error + # if no error update database + foreach my $field (keys %{DATE_FIELDS()}) { + if (defined $r->param("set.$setID.$field.override")) { + $userSetRecord->$field($rh_dates->{$field}); =20 + } else { + $userSetRecord->$field(undef); #stop override + } + } + $db->putUserSet($userSetRecord); + =09 + } + + } else { + # user asked to NOT have the set assigned to the selected user + # debug("deleteUserSet($editForUserID, $setID)"); + $db->deleteUserSet($editForUserID, $setID); + # debug("done deleteUserSet($editForUserID, $setID)"); + } + } +=09 + return ''; +=09 +=09 +=09 +} + +sub body { + my ($self) =3D @_; + my $r =3D $self->r; + my $urlpath =3D $r->urlpath; + my $db =3D $r->db; + my $ce =3D $r->ce; + my $authz =3D $r->authz; + my $courseID =3D $urlpath->arg("courseID"); + my $editForUserID =3D $urlpath->arg("userID"); + my $userID =3D $r->param("user"); +=09 + my @editForSets =3D $r->param("editForSets"); +=09 + return CGI::div({class =3D> "ResultsWithError"}, "You are not authorize= d to edit user specific information.") + unless $authz->hasPermissions($userID, "access_instructor_tools"); +=09 + my $UserRecord =3D $db->getUser($editForUserID); + my $PermissionRecord =3D $db->getPermissionLevel($editForUserID); + my @UserSetIDs =3D $db->listUserSets($editForUserID); +=09 + my $userName =3D $UserRecord->first_name . " " . $UserRecord->last_name= ; + + # templates for getting field names + my $userTemplate =3D $self->{userTemplate}; + my $permissionLevelTemplate =3D $self->{permissionLevelTemplate}; +=09 + # This table can be consulted when display-ready forms of field names a= re needed. + my %prettyFieldNames =3D map { $_ =3D> $_ }=20 + $userTemplate->FIELDS(); +=09 +# @prettyFieldNames{qw( +# #user_id +# first_name +# last_name +# email_address +# student_id +# status +# section +# recitation +# comment +# permission +# )} =3D ( +# #"Login Name", +# "First Name", +# "Last Name", +# "Email", +# "Student ID", +# "Status", +# "Section", +# "Recitation", +# "Comment", +# "Permission Level", +# ); +=09 + my @dateFields =3D @{DATE_FIELDS_ORDER()}; + my $rh_dateFieldLabels =3D DATE_FIELDS(); + + + # create a link to the SetsAssignedToUser page +# my $editSetsPath =3D $urlpath->newFromModule( +# "WeBWorK::ContentGenerator::Instructor::SetsAssignedToUser", +# courseID =3D> $courseID, +# userID =3D> $userID, +# ); +# my $editSetsAssignedToUserURL =3D $self->systemLink($editSetsPath); +=09 + # create a message about how many sets have been assigned to this user + my $setCount =3D $db->countUserSets($editForUserID); +# my $userCountMessage =3D CGI::a({href=3D>$editSetsAssignedToUserURL}= , $setCount . " sets."); +# $userCountMessage =3D "The user " . CGI::b($userName . " ($editForUse= rID)") . " has been assigned " . $userCountMessage; + my $basicInfoPage =3D $urlpath->new(type =3D>'instructor_user_list', + args =3D>{ + courseID =3D> $courseID, + } + ); + my $basicInfoUrl =3D $self->systemLink($basicInfoPage, + params =3D>{visible_users =3D> $e= ditForUserID, + editMode =3D> 1, + } + ); + + print CGI::h4({align=3D>'center'},"Edit ",CGI::a({href=3D>$basicInfoUrl= },'class list data')," for $userName ($editForUserID) who has been assig= ned $setCount sets."); +=09 + #print CGI::h4("User Data"); +# print CGI::start_table({ align=3D>'center', border=3D>1,cellpadding=3D= >5}); +# print CGI::Tr( +# CGI::th(CGI::checkbox({ type =3D> 'checkbox', +# name =3D> "edit.basic.info", +# label =3D> '', +# checked =3D> 0 +# }),"Edit class list data for $editForUserID"), +# CGI::th(CGI::checkbox({ type =3D> 'checkbox', +# name =3D> "change.password", +# label =3D> '', +# checked =3D> 0 +# }),"Change Password for $editForUserID")); +# =20 +# print "<tr><td rowspan=3D\"2\">"; +# ######################################## +# # Basic student data +# ######################################## +# print CGI::start_table(); +# foreach ($userTemplate->FIELDS()) { +# next if $_ eq 'user_id'; # don't print login name +# print CGI::Tr( +# CGI::td([ +# $prettyFieldNames{$_},=20 +# CGI::input({ -value =3D> $UserRecord->$_, -size =3D> 25 }) +# ]) +# ); +# } +# foreach ($permissionLevelTemplate->FIELDS()) { +# print CGI::Tr( +# CGI::td([ +# $prettyFieldNames{$_},=20 +# CGI::input({ -value =3D> $PermissionRecord->$_, -size =3D> 25 }) +# ]) +# ); +# } +# print CGI::end_table(); +# =09 +# #print CGI::br(); +# print "</td><td valign=3D\"top\">"; +# ######################################## +# # Change password section +# ######################################## +# my $profRecord =3D $db->getUser($userID); +# my $profName =3D $profRecord->first_name . " " . $profRecord->last_na= me; +# my $poss =3D "'s "; +# my $pass =3D " password "; +# =09 +# print CGI::start_table(); +# print CGI::Tr(CGI::td(["<b>$profName</b>$poss$pass", CGI::input({ -ty= pe =3D> "password", -name =3D> "$userID.password"})])); +# print CGI::Tr(CGI::td(["<b>$userName</b>$poss new $pass", CGI::input(= { -type =3D> "password", -name =3D> "$editForUserID.password.1"})])); +# print CGI::Tr(CGI::td(["Confirm <b>$userName</b>$poss new $pass", CGI= ::input({ -type =3D> "password", -name =3D> "$editForUserID.password.2"})= ])); +# print CGI::end_table(); +# print "</td></tr>"; +# print CGI::Tr(CGI::th( #FIXME enable this once it can be handled +# # CGI::checkbox({ type =3D> 'checkbox', +# # name =3D> "change.login", +# # label =3D> '', +# # checked =3D> 0 +# # }), +# "Change login name $editForUserID to ", CGI::input({-name=3D>'= new_login', -value=3D>'' ,-size=3D>25}) +# )); +# print CGI::end_table(); +=09 + print CGI::br(); + + #print CGI::h4("Sets assigned to $userName"); + # construct url for the form + my $userDetailPage =3D $urlpath->new(type =3D>'instructor_user_detail', + args =3D>{ + courseID =3D> $courseID, + userID =3D> $editForUserID, #FIXME = eventually this should be a list?? + } + ); + my $userDetailUrl =3D $self->systemLink($userDetailPage,authen=3D>0); + + my %GlobalSetRecords =3D map { $_->set_id =3D> $_ } $db->getGlobalSets(= $db->listGlobalSets()); + my @UserSetRefs =3D map { [$editForUserID, $_] } sortByName(undef, @Use= rSetIDs); + my %UserSetRecords =3D map { $_->set_id =3D> $_ } $db->getUserSets(@Use= rSetRefs); + my @MergedSetRefs =3D map { [$editForUserID, $_] } sortByName(undef, @U= serSetIDs); + my %MergedSetRecords =3D map { $_->set_id =3D> $_ } $db->getMergedSets(= @MergedSetRefs); +=09 + ######################################## + # Print warning + ######################################## + print CGI::div({-class=3D>'ResultsWithError'}, + "Do not uncheck a set unless you know what you are doing.", CGI= ::br(), + "There is NO undo for unassigning a set."); + + print CGI::p("To change status (scores or grades) for this student for = one + set, click on the individual set link."); + + print CGI::div({-class=3D>'ResultsWithError'},"When you uncheck a homew= ork set (and save the changes), you destroy all + of the data for that set for this student. If you + reassign the set, the student will receive a new version of each= problem. + Make sure this is what you want to do before unchecking sets." + ); + ######################################## + # Assigned sets form + ######################################## + + print CGI::start_form( {method=3D>'post',action=3D>$userDetailUrl, name= =3D>'UserDetail'}),"\n"; + print $self->hidden_authen_fields(); + print CGI::p(CGI::submit(-name=3D>'save_button',-label=3D>'Save changes= ',)); +=09 + print CGI::start_table({ border=3D> 1,cellpadding=3D>5}),"\n"; + print CGI::Tr( + CGI::th({align=3D>'center',colspan=3D>3}, "Sets assigned to $userName = ($editForUserID)") + ),"\n"; + print CGI::Tr( + CGI::th({ -align =3D> "center"}, [ + "Assigned", + "Edit set for $editForUserID", + "Dates", + ]) + ),"\n"; + foreach my $setID (sortByName(undef, $db->listGlobalSets())) { + my $GlobalSetRecord =3D $GlobalSetRecords{$setID}; + my $UserSetRecord =3D $UserSetRecords{$setID}; + my $MergedSetRecord =3D $MergedSetRecords{$setID}; + my $setListPage =3D $urlpath->new(type =3D>'instructor_set_detail', + args =3D>{ + courseID =3D> $courseID, + setID =3D> $setID + } + ); + my $url =3D $self->systemLink($setListPage, + params =3D>{effectiveUser =3D> $editForUserID, + editForUser =3D> $editForUserID, + }); + + print CGI::Tr( + CGI::td({ -align =3D> "center" }, [ + CGI::checkbox({ type =3D> 'checkbox', + name =3D> "set.$setID.assignment", + label =3D> '', + value =3D> 'assigned', + checked =3D> (defined $MergedSetRecord) + }), + defined($MergedSetRecord) ? CGI::b(CGI::a({href=3D>$url},$setID, ) )= : CGI::b($setID, ), + join "\n", $self->DBFieldTable($GlobalSetRecord, $UserSetRecord, $Me= rgedSetRecord, "set", $setID, \@dateFields,$rh_dateFieldLabels), + ]) + ),"\n"; + } + print CGI::end_table(),"\n"; + print CGI::p(CGI::submit(-name=3D>'save_button',-label=3D>'Save changes= ',)); + print CGI::end_form(),"\n"; + ######################################## + # Print warning + ######################################## + + CGI::div( {class=3D>'ResultsWithError'}, + "There is NO undo for this function. =20 + Do not use it unless you know what you are doing! When you unassig= n + sets using this button, or by unchecking their set names, you destr= oy all + of the data for those sets for this student." + ); + + +# print CGI::start_table(); +# print CGI::Tr( +# CGI::th({ -align =3D> "center"},[ +# "Assigned", +# "Set Name", +# "Opens", +# "Answers Due", +# "Answers Available", +# ]) +# ); + =09 +# foreach my $setID (sortByName(undef, @UserSetIDs)) { +# my $MergedSetRecord =3D $MergedSetRecords{$setID}; +# print CGI::Tr( +# CGI::td({ -align =3D> "center" }, [ +# CGI::checkbox({checked =3D> (defined $MergedSetRecord)}), +# $setID, +# CGI::checkbox() . +# CGI::input({ -value =3D> $self->formatDateTime($MergedSetRecord->op= en_date), -size =3D> 25}), +# CGI::checkbox() . +# CGI::input({ -value =3D> $self->formatDateTime($MergedSetRecord->du= e_date), -size =3D> 25}), +# CGI::checkbox() . +# CGI::input({ -value =3D> $self->formatDateTime($MergedSetRecord->an= swer_date), -size =3D> 25}), +# ]) +# ); +# } + return ''; +} + +sub checkDates {=20 + my $self =3D shift; + my $setRecord =3D shift; + my $setID =3D shift; + my $r =3D $self->r; + my %dates =3D (); + my $error_undefined_override =3D 0; + my $numerical_date=3D0; + my $error =3D 0; + foreach my $field (@{DATE_FIELDS_ORDER()}) { # check that override dat= es can be parsed and are not blank + $dates{$field} =3D $setRecord->$field; + if (defined $r->param("set.$setID.$field.override") ){ + eval{ $numerical_date =3D $self->parseDateTime($r->param("set.$setID.= $field"))}; + unless( $@ ) { + $dates{$field}=3D$numerical_date; + } else { + $self->addbadmessage(" * Badly defined time for set $set= ID $field. No date changes made:<br/>$@"); + $error =3D 1; + } + } + =09 + + } + return {%dates,error=3D>1} if $error; # no point in going on if the = dates can't be parsed. +=09 + my ($open_date, $due_date, $answer_date) =3D map { $dates{$_} } @{DATE_= FIELDS_ORDER()}; + + if ($answer_date < $due_date || $answer_date < $open_date) { =09 + $self->addbadmessage("Answers cannot be made available until on or aft= er the due date in set $setID!"); + $error =3D 1; + } +=09 + if ($due_date < $open_date) { + $self->addbadmessage("Answers cannot be due until on or after the open= date in set $setID!"); + $error =3D 1; + } +=09 + # make sure the dates are not more than 10 years in the future + my $curr_time =3D time; + my $seconds_per_year =3D 31_556_926; + my $cutoff =3D $curr_time + $seconds_per_year*10; + if ($open_date > $cutoff) { + $self->addbadmessage("Error: open date cannot be more than 10 years fr= om now in set $setID"); + $error =3D 1; + } + if ($due_date > $cutoff) { + $self->addbadmessage("Error: due date cannot be more than 10 years fro= m now in set $setID"); + $error =3D 1; + } + if ($answer_date > $cutoff) { + $self->addbadmessage("Error: answer date cannot be more than 10 years = from now in set $setID"); + $error =3D 1; + } +=09 +=09 + if ($error) { + $self->addbadmessage("No date changes were saved!"); + } + return {%dates,error=3D>$error}; +} + +sub DBFieldTable { + my ($self, $GlobalRecord, $UserRecord, $MergedRecord, $recordType, $rec= ordID, $fieldsRef,$rh_fieldLabels) =3D @_; +=09 + return CGI::div({class =3D> "ResultsWithError"}, "No record exists for = $recordType $recordID") unless defined $GlobalRecord; +=09 + my $r =3D $self->r; + my @fields =3D @$fieldsRef; + my @results; + foreach my $field (@fields) { + my $globalValue =3D $GlobalRecord->$field; + my $userValue =3D defined $UserRecord ? $UserRecord->$field : $globalV= alue; + my $mergedValue =3D defined $MergedRecord ? $MergedRecord->$field : $= globalValue; + push @results,=20 + [$rh_fieldLabels->{$field}, + defined $UserRecord ?=20 + CGI::checkbox({ + type =3D> "checkbox", + name =3D> "$recordType.$recordID.$field.override", + label =3D> "", + value =3D> $field, + checked =3D> $r->param("$recordType.$recordID.$field.override") || = ($mergedValue ne $globalValue ? 1 : 0) + }) : "", + defined $UserRecord ?=20 + (CGI::input({ -name=3D>"$recordType.$recordID.$field", + -value =3D> $userValue ? $self->formatDateTime($userV= alue) : "",=20 + -size =3D> 25}) + ) : "", + $self->formatDateTime($globalValue), =09 + ] + =09 + } + + my @table; + foreach my $row (@results) { + push @table, CGI::Tr(CGI::td({-align =3D> "center"}, $row)); + } +=09 + return (CGI::start_table({border =3D> 0}), @table, CGI::end_table()); +} + +1; |
From: Mike G. v. a. <we...@ma...> - 2005-12-26 22:06:28
|
Log Message: ----------- The major change is to replace Sets assigned to user by UserDetail.pm. (Originally written by Rob Van Dam and completed by Mike Gage.) It has undergone a significant amount of testing, but has not yet been used in a course. We can back out of these changes before creating a release if problems are found. Modified Files: -------------- webwork-modperl/lib/WeBWorK/ContentGenerator/Instructor: Index.pm ProblemSetDetail.pm UserList.pm Revision Data ------------- Index: ProblemSetDetail.pm =================================================================== RCS file: /webwork/cvs/system/webwork-modperl/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm,v retrieving revision 1.30 retrieving revision 1.31 diff -Llib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm -Llib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm -u -r1.30 -r1.31 --- lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm +++ lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm @@ -1062,12 +1062,12 @@ courseID => $courseID, setID => $setID)); my $editSetsAssignedToUserURL = $self->systemLink( $urlpath->newFromModule( - "WeBWorK::ContentGenerator::Instructor::SetsAssignedToUser", + "WeBWorK::ContentGenerator::Instructor::UserDetail", courseID => $courseID, userID => $editForUser[0])) if $forOneUser; my $setDetailPage = $urlpath -> newFromModule($urlpath->module, courseID => $courseID, setID => $setID); - my $setDetailURL = $self->systemLink($setDetailPage,authen=>0); + my $setDetailURL = $self->systemLink($setDetailPage); my $userCountMessage = CGI::a({href=>$editUsersAssignedToSetURL}, $self->userCountMessage($setUserCount, $userCount)); @@ -1083,10 +1083,10 @@ my @userLinks = (); foreach my $userID (@editForUser) { my $u = $db->getUser($userID); - my $line = $u->last_name.", ".$u->first_name." ".$u->user_id." "; + my $line = $u->last_name.", ".$u->first_name." (".$u->user_id."). Assigned to "; my $editSetsAssignedToUserURL = $self->systemLink( $urlpath->newFromModule( - "WeBWorK::ContentGenerator::Instructor::SetsAssignedToUser", + "WeBWorK::ContentGenerator::Instructor::UserDetail", courseID => $courseID, userID => $u->user_id)); $line .= CGI::a({href=>$editSetsAssignedToUserURL}, $self->setCountMessage($db->countUserSets($u->user_id), $setCount)); Index: UserList.pm =================================================================== RCS file: /webwork/cvs/system/webwork-modperl/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm,v retrieving revision 1.74 retrieving revision 1.75 diff -Llib/WeBWorK/ContentGenerator/Instructor/UserList.pm -Llib/WeBWorK/ContentGenerator/Instructor/UserList.pm -u -r1.74 -r1.75 --- lib/WeBWorK/ContentGenerator/Instructor/UserList.pm +++ lib/WeBWorK/ContentGenerator/Instructor/UserList.pm @@ -549,7 +549,11 @@ print CGI::p("Showing ", scalar @Users, " out of ", scalar @allUserIDs, " users."); print CGI::p("If a password field is left blank, the student's current password will be maintained.") if $passwordMode; - + if ($editMode) { + + + print CGI::p('<b>Click</b> on the login name to <b>edit individual problem set data</b>, (e.g. due dates) for these students.'); + } $self->printTableHTML(\@Users, \@PermissionLevels, \%prettyFieldNames, editMode => $editMode, passwordMode => $passwordMode, @@ -1497,7 +1501,7 @@ params => {effectiveUser => $User->user_id} ); - my $setsAssignedToUserURL = $self->systemLink($urlpath->new(type=>'instructor_sets_assigned_to_user', + my $setsAssignedToUserURL = $self->systemLink($urlpath->new(type=>'instructor_user_detail', args=>{courseID => $courseName, userID => $User->user_id }), @@ -1556,9 +1560,20 @@ } } # User ID (edit mode) or Assigned Sets (otherwise) - if ($editMode or $passwordMode) { + if ( $passwordMode) { # straight user ID push @tableCells, CGI::div({class=>$statusClass}, $User->user_id); + } elsif ($editMode) { + # straight user ID + my $userDetailPage = $urlpath->new(type =>'instructor_user_detail', + args =>{ + courseID => $courseName, + userID => $User->user_id, #FIXME eventually this should be a list?? + } + ); + my $userDetailUrl = $self->systemLink($userDetailPage,params =>{}); + push @tableCells, CGI::a({href=>$userDetailUrl}, $User->user_id); + } else { # "edit sets assigned to user" link #push @tableCells, CGI::a({href=>$setsAssignedToUserURL}, "Edit sets"); Index: Index.pm =================================================================== RCS file: /webwork/cvs/system/webwork-modperl/lib/WeBWorK/ContentGenerator/Instructor/Index.pm,v retrieving revision 1.50 retrieving revision 1.51 diff -Llib/WeBWorK/ContentGenerator/Instructor/Index.pm -Llib/WeBWorK/ContentGenerator/Instructor/Index.pm -u -r1.50 -r1.51 --- lib/WeBWorK/ContentGenerator/Instructor/Index.pm +++ lib/WeBWorK/ContentGenerator/Instructor/Index.pm @@ -80,7 +80,7 @@ defined param $r "sets_assigned_to_user" and do { if ($nusers == 1) { - $module = "${ipfx}::SetsAssignedToUser"; + $module = "${ipfx}::UserDetail"; $args{userID} = $firstUserID; $params{fromTools} = 1; } else { @@ -363,11 +363,11 @@ ), CGI::Tr({class=>"ButtonRow"}, [ CGI::td([ - CGI::submit("sets_assigned_to_user", "View/edit")." all sets for one <b>user</b>", + CGI::submit("sets_assigned_to_user", "View/edit")." all sets for one <b>user</b>(set dates, scores)", CGI::submit("users_assigned_to_set", "View/edit")." all users for one <b>set</b>", ]), CGI::td([ - CGI::submit("edit_users", "Edit"). " selected <b>users</b>", + CGI::submit("edit_users", "Edit"). " class list data for selected <b>users</b>", CGI::submit("edit_sets", "Edit"). " one <b>set</b>" . " ". "or ".CGI::submit("prob_lib","add problems")." to one <b>set</b>", ]), |
From: Mike G. v. a. <we...@ma...> - 2005-12-26 22:03:25
|
Log Message: ----------- Improvements to the help displayed for each page. Modified Files: -------------- webwork-modperl/htdocs/helpFiles: InstructorUserList.html instructor_links.html no_help.html Revision Data ------------- Index: InstructorUserList.html =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /webwork/cvs/system/webwork-modperl/htdocs/helpFiles/Instructor= UserList.html,v retrieving revision 1.1 retrieving revision 1.2 diff -Lhtdocs/helpFiles/InstructorUserList.html -Lhtdocs/helpFiles/Instru= ctorUserList.html -u -r1.1 -r1.2 --- htdocs/helpFiles/InstructorUserList.html +++ htdocs/helpFiles/InstructorUserList.html @@ -1,4 +1,7 @@ -<html> +<!DOCTYPE html + PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + <!-- ########################################################################= ######## # WeBWorK Online Homework Delivery System @@ -16,14 +19,89 @@ # Artistic License for more details. ########################################################################= ######## --> +<html xmlns=3D"http://www.w3.org/1999/xhtml" lang=3D"en-US"> <head> -<title>User List Help Page</title> +<title>Class List Editor Help Page</title> </head> <h3>Class List Editor Help Page</h3> <body> -<p>Only one of the five actions may be taken at a time. After filling ou= t the options to the action the "Take Action" button must be=20 -pressed to do the action. After one action is completed another may be d= one.</p> -<p>The first option changes how many student's are shown below in the ta= ble.</p> +<blockquote> +<p> +From this page you can <strong>add new students</strong>, to <strong>edi= t</strong> the class list data (names, email addresses, recitation, secti= on +permission levels and enrollment status), to <strong>change passwords</s= trong>, to <strong>export</strong> (save) +class lists for back-up or use in another course. You can also delete st= udents from the class roster, but this cannot be undone. +</p> +<p> +This page gives access to information about the student, independ of the= homework sets +assigned to them. +</p> +<p> +To perform an action first click the radio button next to desired action= then click the "Take Action!" button. +</p> + + +<h4>How to:</h4> +<dl> + <dt>Restrict or sort the students displayed</dt> + <dd>When the class is very large not all students will be displayed. = Using the first action on this page you can show only the students from a= given recitation or from a given section, or only students whose login o= r last name fits a pattern match. The second action will sort the student= s currently being displayed. You can also sort the displayed students by= clicking on the active links at the top of each column.</dd> + + <dt>Edit class list data</dt> + <dd>You can edit the class list data for a single student by clicking = on the pencil icon next to their login name. To edit several students at= once click on the "Select" checkbox next to their names, click on the ra= dio button for editing selected users and then click "Take Action!". You = can also edit all visible users (those students currently being displayed= ) or even all users in the course although this last option might take a = long time to load for a large class. </dd> + <dd> The login name cannot be changed. (It is the primary key for the = student's data.) If you make a mistake in the login name at the beginning= of the course (before any work has been done) then it is best to simply = add a new student with the correct entry and drop the student with the ba= d login name. (See drop and delete students below.)</dd>=09 + <dt>Add a few students to the course.</dt> + <dd> Click the "Add x student(s)" radio button and then click "Take ac= tion". This will take you to a new page where the data can be entered for= one or more students. It is also possible to assign the student to one = or more problem sets as they are being entered: simply select the homewor= k sets from the list below the data entry table. Use 'command' or 'contro= l' click to select more than one homework set.</dd> +=09 + <dt>Add many students to a course from a class list.</dt> + <dd>This is most easily done by importing a class list. The class lis= t can be uploaded from your workstation to the server using the File Mana= ger page. The class list must be a file ending in .lst and must have a s= pecific <a href=3D"http://webhost.math.rochester.edu/webworkdocs/discuss/= msgReader$59#2397">format</a>. Once the file has been uploaded to the se= rver the file will appear in the import action pop-up list (5th action). = demoCourse.lst is available for most courses and adds the "practice users= " which activate guest logins to the class list .</dd> + + <dt>Add a TA or an instructor (change permission level of user)</dt> + <dd>This is done by first entering the user as a student and then chan= ging the permission level of the user. First edit the user by clicking on= the pencil next to their name (or using the technique above for several = users), then change their permssion level -- an entry blank at the far ri= ght of the screen, you may have to scroll to see it. The permission leve= ls are + <ul> + <li>Guest: -5</li> + <li>Student: 0</li> + <li>Proctor: 2</li> + <li>TA: 5</li> + <li>Instructor: 10</li> + </ul></dd> + + <dt> Drop student from the course</dt> + <dd> To drop a student or students, select them for editing as describ= ed above and then set the pop-up list to enrolled,drop, or audit. Droppe= d students cannot log in to the course, are not assigned new homework set= s and are not sent e-mail. They can be re-enrolled simply by changing th= eir status back to enrolled. No data is lost, any homework sets assigned= before they were dropped are restored unchanged. </dd> + <dt>Delete a student from a course</dt> + <dd>This should be done cautiously. Once a student is deleted from a = course their data is lost forever and cannot be recovered. They can be a= dded to the course as a new student, but all of their homework set assign= ments and homework has been permanently deleted. </dd> + <dt> Assign sets to one student</dt> + <dd> To assign one or more sets to an individual student click in the= column "Assigned Sets" in the student's row. This will take you to a pa= ge where you can assign and unassign homework sets and change the due dat= es for homework on an individual basis.</dd> + <dt>Change the due date for one student</dt> + <dd>Click on the column "Assigned Sets" in the student's row. This wil= l take you to a page where you can assign and unassign homework sets and = change the due dates for homework on an individual basis.</dd> + <dt> "Act as" a student</dt> + <dd>Clicking on the login name link in a student's row allows you to v= iew the student's version of the homework (rather than your own) so that = you can more easily answer student questions about homework problems. (A = "acting as xxx" alert will appear in the upper right corner of each windo= w while you are acting as a student.) You can submit the answers (which w= ill NOT be recorded) to check that the computer is grading the problem co= rrectly. You will also be able to view past answers submitted by the stu= dent for each problem. To stop acting in the student's role click the "St= op acting" link in the upper right corner of the window. </dd> + <dt> Change the grades on a homework set for one student. </dt> + <dd>Click first in the "Assigned Sets" column in the student's row. T= his will take you to a new page where you will click on the link to the h= omework set where the grade change is to be made. (The grade for each pr= oblem is listed as "status" on this third page).</dd> + <dt>Extend the number of attempts allowed a student on a given problem<= /dt> + <dd>Click first in the "Assigned Sets" column in the student's row. T= his will take you to a new page where you will click on the link to the h= omework set where the grade change is to be made. </dd> + <dt>Assign sets to many students</dt> + <dd>This is done from the "Hmwrk Sets Editor" or from the "Instructor= Tools" page if you wish to assign a homework set to all students or a la= rge group of students (e.g. a section).</dd> + <dt>Change dates for a homework set for the whole class.</dt> + <dd>This is done from the "Hmwrk Sets Editor" or from the "Instructor= Tools" page.</dd> + <dt>Change the grading on a homework set for an entire class.</dt> + <dd>You might want to do this if you want to give full credit to every= one on a particular problem that was not worded correctly, or wasn't work= ing properly. This is done from the "Hmwk sets editor" page or the "Instr= uctor tools" page.</dd> + <dt>Change the number of atttempts allowed on a problem.</dt> + <dd>This is done from the "Hmwk sets editor" page or the "Instructor t= ools" page.</dd> +</dl> + +<p> +Many of these editing activities can also be done more quickly from the = "Instructor tools" page where students and homework sets can be selected = simultaneously. The Instructor Tools page is useful for quick editing of = one or two students. The initial setup of the class can be done best from= this page. +Importing and +exporting class lists can only be done from this page. Deleting students= can only be done from this page. +</p> +<h4>Review of column functions:</h4> +<ul> + <li>Clicking on any active link at the top of the column sorts the page= by that column. You can do lexigraphic sorts: click on "First name" then= "Last name" to sort by last name, sorting those with the same last name = by their first name.</li> + <li>The <strong>login name</strong> column links allow you to "act as" = a student.</li> + <li>The <strong>pencil</strong> in the login column allows you to edit = that student's data.</li> + <li>The <strong>Assigned sets</strong> column (x/y) indicates that x se= ts out of y sets avaiable have been assigned to this student. Click this = link to assign or unassign sets to this student, to adjust due dates, or = to adjust the grades on a homework set for a student.</li> + <li>Clicking the <strong>e-mail address</strong> link will bring up you= r standard email application so that you can send email to the student. = This works even if the student has been dropped from the course. To send= email to an entire class or to merge grades with the email message use t= he "Email" page link in the left margin.</li> +</ul> =20 +</blockquote> </body> </html> Index: instructor_links.html =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /webwork/cvs/system/webwork-modperl/htdocs/helpFiles/instructor= _links.html,v retrieving revision 1.2 retrieving revision 1.3 diff -Lhtdocs/helpFiles/instructor_links.html -Lhtdocs/helpFiles/instruct= or_links.html -u -r1.2 -r1.3 --- htdocs/helpFiles/instructor_links.html +++ htdocs/helpFiles/instructor_links.html @@ -24,45 +24,49 @@ <title>Instructor Links Help Page</title> </head> <body> +<h3>Instructor Links Help Page</h3> <dl> <dt>Instructor Tools</dt> <dd>Quick access to many instructor tools, including=20 - <strong>Reset passwords</strong> and=20 - <strong>Act as user</strong> (student).=20 + <strong>Reset passwords</strong>,=20 + <strong>Act as student</strong>,=20 + <strong>Assign individual sets</strong> + and <strong>Edit individual due dates</strong>.=20 Beginners may find it easier to use the "Class List Editor", "Hmwk Sets Editor" = =20 - and "Library Browser" at first.</dd> + at first.</dd> <dt>Class List Editor</dt> <dd>Edit class roster data. Add students, edit student data, drop=20 students from class, import students from a classlist, and give=20 - user professor privileges. To reset passwords use "Instructor=20 - Tools"</dd> + user professor privileges. Access to individual homework sets</dd> <dt>Hmwk Sets Editor</dt> - <dd>Change homework set due dates, create new sets from a set=20 - definition file, - create new sets, make sets visible/invisible,=20 - score homework sets.</dd> + <dd>Edit homework sets for entire class. Change homework set due dates= , create new sets from a set=20 + definition file, create new homework sets, make sets visible/invis= ible,=20 + score homework sets. Assign homework sets to the class.</dd> <dt>Library Browser</dt> <dd>Choose problems from a library and add them to a homework set.</dd> - <dt>Set Assigner</dt> - <dd>Assign all chosen homework sets to all chosen students.</dd> <dt>Statistics</dt> - <dd>View statistics of students' performance on homework.</dd> + <dd>View statistics of students' performance on homework either by ind= ividual or by set.</dd> <dt>Student Progress</dt> - <dd>Progress for individual students</dd> + <dd>View details of student perofrmance either by individual or by set= .</dd> <dt>Scoring Tools</dt> <dd>Score one or more sets. This can also be done from the "Hmwk=20 - Sets Editor"</dd> + Sets Editor" or from the "Instructor Tools", but the "Scoring Tools" p= age + allows control over parameters.</dd> <dt>Email</dt> <dd>Send email to students.</dd> <dt>File Transfer</dt> <dd>Upload, download and delete text files, including scoring=20 spread sheets, set definition files, class list spread sheets, and "PG" problems.</dd> + <dt>Course configuration</dt> + <dd>Allows configuration of certain parameters, such as permission lev= els, + default display mode for equations, and email feedback behavior, on a = course by course basis.</dd> </dl> =20 - +Click the icon <a href=3D"instructor_links.html"><img src=3D"/webwork2_f= iles/images/question_mark.png"></a> for +page and item specific help (if it is available). =20 =20 </body> </html> Index: no_help.html =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /webwork/cvs/system/webwork-modperl/htdocs/helpFiles/no_help.ht= ml,v retrieving revision 1.1 retrieving revision 1.2 diff -Lhtdocs/helpFiles/no_help.html -Lhtdocs/helpFiles/no_help.html -u -= r1.1 -r1.2 --- htdocs/helpFiles/no_help.html +++ htdocs/helpFiles/no_help.html @@ -1 +1,34 @@ -Sorry, there is no help for this item. +<!DOCTYPE html + PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<!-- +########################################################################= ######## +# WeBWorK Online Homework Delivery System +# Copyright =A9 2000-2003 The WeBWorK Project, http://openwebwork.sf.net= / +# $CVSHeader$ +#=20 +# This program is free software; you can redistribute it and/or modify i= t under +# the terms of either: (a) the GNU General Public License as published b= y the +# Free Software Foundation; either version 2, or (at your option) any la= ter +# version, or (b) the "Artistic License" which comes with this package. +#=20 +# This program is distributed in the hope that it will be useful, but WI= THOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or = FITNESS +# FOR A PARTICULAR PURPOSE. See either the GNU General Public License o= r the +# Artistic License for more details. +########################################################################= ######## +--> +<html xmlns=3D"http://www.w3.org/1999/xhtml" lang=3D"en-US"> +<head> +<title>No Help Page</title> +</head> + +<body> +<p>There is no specific help for this item. =20 +Click on 'Help' in the left margin +for more general information. +</p> +</body> +</html> + + |
From: Gavin L. v. a. <we...@ma...> - 2005-12-22 18:54:43
|
Log Message: ----------- Gateway update: correct handling of gateway data input from def file. Modified Files: -------------- webwork2/lib/WeBWorK/ContentGenerator/Instructor: ProblemSetList.pm Revision Data ------------- Index: ProblemSetList.pm =================================================================== RCS file: /webwork/cvs/system/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm,v retrieving revision 1.86 retrieving revision 1.87 diff -Llib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm -Llib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm -u -r1.86 -r1.87 --- lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm +++ lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm @@ -1412,16 +1412,15 @@ $newSetRecord->answer_date($answerDate); $newSetRecord->published(DEFAULT_PUBLISHED_STATE); - # gateway/version data. I'm not sure why I'm bothering to put these - # in a conditional. in that we return '' for missing gateway data, - # it should just keep all of these values null for non-versioned/ - # non-gateway sets - $newSetRecord->assignment_type($assignmentType) if ( $assignmentType ); - $newSetRecord->attempts_per_version($attemptsPerVersion) if ( $attemptsPerVersion ); - $newSetRecord->time_interval($timeInterval) if ( $timeInterval ); - $newSetRecord->versions_per_interval($versionsPerInterval) if ( $versionsPerInterval ); - $newSetRecord->version_time_limit($versionTimeLimit) if ( $versionTimeLimit ); - $newSetRecord->problem_randorder($problemRandOrder) if ( $problemRandOrder ); + # gateway/version data. these should are all initialized to '' + # by readSetDef, so for non-gateway/versioned sets they'll just + # be stored as null + $newSetRecord->assignment_type($assignmentType); + $newSetRecord->attempts_per_version($attemptsPerVersion); + $newSetRecord->time_interval($timeInterval); + $newSetRecord->versions_per_interval($versionsPerInterval); + $newSetRecord->version_time_limit($versionTimeLimit); + $newSetRecord->problem_randorder($problemRandOrder); #create the set eval {$db->addGlobalSet($newSetRecord)}; @@ -1544,19 +1543,10 @@ $screenHeaderFile =~ s/(.*?)\s*$/$1/; #remove trailing white space ##################################################################### - # Gateway/version variable cleanup - - $assignmentType =~ s/(.*?)\s*/$1/; # remove trailing - $attemptsPerVersion =~ s/(.*?)\s*/$1/; # white space - $timeInterval =~ s/(.*?)\s*/$1/; - $versionsPerInterval =~ s/(.*?)\s*/$1/; - $versionTimeLimit =~ s/(.*?)\s*/$1/; - $problemRandOrder =~ s/(.*?)\s*/$1/; - - # convert times into seconds + # Gateway/version variable cleanup: convert times into seconds $timeInterval = WeBWorK::Utils::timeToSec( $timeInterval ) if ( $timeInterval ); - $versionTimeLimit = WeBWorK::Utils::timeToSec( $versionTimeLimit ) + $versionTimeLimit = WeBWorK::Utils::timeToSec($versionTimeLimit) if ( $versionTimeLimit ); ##################################################################### |
From: Gavin L. v. a. <we...@ma...> - 2005-12-22 18:53:54
|
Log Message: ----------- Gateway update: correct handling of gateway data when editing sets. Modified Files: -------------- webwork2/lib/WeBWorK/ContentGenerator/Instructor: ProblemSetDetail.pm Revision Data ------------- Index: ProblemSetDetail.pm =================================================================== RCS file: /webwork/cvs/system/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm,v retrieving revision 1.29 retrieving revision 1.30 diff -Llib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm -Llib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm -u -r1.29 -r1.30 --- lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm +++ lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm @@ -149,7 +149,7 @@ name => "Test Time Limit (sec)", type => "edit", size => "4", - override => "all", + override => "any", labels => { "" => 0 }, # I'm not sure this is quite right }, time_interval => { @@ -164,6 +164,7 @@ type => "edit", size => "3", override => "all", + labels => { "" => 0 }, # labels => { "" => 1 }, }, problem_randorder => { @@ -260,11 +261,24 @@ # gateway data fields are included only if the set is a gateway if ( $globalRecord->assignment_type() =~ /gateway/ ) { - $gwoutput = "\n<!-- begin gwoutput table -->\n" . CGI::start_table({border => 0, cellpadding => 1}); - foreach my $gwfield ( @{ GATEWAY_SET_FIELD_ORDER() } ) { - $gwoutput .= CGI::Tr({}, CGI::td({}, [$self->FieldHTML($userID, $setID, $problemID, $globalRecord, $userRecord, $gwfield)])); + my $gwhdr = "\n<!-- begin gwoutput table -->\n"; + my $nF = 0; + + foreach my $gwfield ( @{ GATEWAY_SET_FIELD_ORDER() } ) { + my @fieldData = + ($self->FieldHTML($userID, $setID, $problemID, + $globalRecord, $userRecord, + $gwfield)); + if ( @fieldData && $fieldData[1] ne '' ) { + $nF = @fieldData if ( @fieldData > $nF ); + $gwoutput .= CGI::Tr({}, CGI::td({}, [@fieldData])); } - $gwoutput .= CGI::end_table() . "\n<!-- end gwoutput table -->\n"; + } + $gwhdr .= CGI::Tr({},CGI::td({colspan=>$nF}, + CGI::em("Gateway parameters"))) + if ( $nF ); + $gwoutput = "$gwhdr$gwoutput\n" . + "<!-- end gwoutput table -->\n"; } } @@ -284,7 +298,7 @@ } # this is a rather artifical addition to include gateway fields, which we # only want to show for gateways - $output .= CGI::Tr({}, CGI::td({colspan => '4'}, $gwoutput)) . "\n" + $output .= "$gwoutput\n" if ( $field eq 'assignment_type' && $globalRecord->assignment_type() =~ /gateway/ ); } |
From: Gavin L. v. a. <we...@ma...> - 2005-12-22 18:53:20
|
Log Message: ----------- Gateway update: fix typo. Modified Files: -------------- webwork2/lib/WeBWorK/ContentGenerator: GatewayQuiz.pm Revision Data ------------- Index: GatewayQuiz.pm =================================================================== RCS file: /webwork/cvs/system/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm,v retrieving revision 1.16 retrieving revision 1.17 diff -Llib/WeBWorK/ContentGenerator/GatewayQuiz.pm -Llib/WeBWorK/ContentGenerator/GatewayQuiz.pm -u -r1.16 -r1.17 --- lib/WeBWorK/ContentGenerator/GatewayQuiz.pm +++ lib/WeBWorK/ContentGenerator/GatewayQuiz.pm @@ -1099,7 +1099,7 @@ # my $elapsed = sprintf("%4.2f",($endTime - # $set->open_date)/60); my $elapsed = - int(($endTime - set->open_date)/0.6 + 0.5)/100; + int(($endTime - $set->open_date)/0.6 + 0.5)/100; # we assume that allowed is an even number of minutes my $allowed = ($set->due_date - $set->open_date)/60; $scoreRecordedMessage[$i] = "Your score was not " . @@ -1198,7 +1198,8 @@ my $attemptScore = 0; if ( $submitAnswers || $checkAnswers ) { foreach my $pg ( @pg_results ) { -# to get the current result, we need to go through the parts of the problem +# to get the current result, we need to go through the parts of each problem +# (is there a better way of doing this?) FIXME: factor in problem weight foreach ( @{$pg->{flags}->{ANSWER_ENTRY_ORDER}} ) { $attemptScore += $pg->{answers}->{$_}->{score}; } @@ -1323,6 +1324,7 @@ print CGI::startform({-name=>"gwtimer", -method=>"POST", -action=>$r->uri}); print CGI::hidden({-name=>"gwpagetimeleft", -value=>$timeLeft}), "\n"; + print CGI::strong("Time Remaining:"), "\n"; print CGI::textfield({-name=>'gwtime', -default=>0, -size=>8}), CGI::strong("min:sec"), CGI::br(), "\n"; @@ -1335,11 +1337,10 @@ print CGI::end_div(); } -# this is a brutal hack to get a URL that won't require a proctor login if -# we've submitted a proctored test for the last time. above we've reset the +# this is a hack to get a URL that won't require a proctor login if we've +# submitted a proctored test for the last time. above we've reset the # assignment_type in this case, so we'll use that to decide if we should -# give a path to an unproctored test. note that this substitution leaves -# unproctored test URLs unchanged +# give a path to an unproctored test. my $action = $r->uri(); $action =~ s/proctored_quiz_mode/quiz_mode/ if ( $set->assignment_type() eq 'gateway' ); @@ -1347,8 +1348,8 @@ print CGI::startform({-name=>"gwquiz", -method=>"POST", -action=>$action}), $self->hidden_authen_fields, $self->hidden_proctor_authen_fields; -# FIXME RETURNTO -# this is a horrible hack to try and let us use a javascript link to +# FIXME +# this is a hack to try and let us use a javascript link to # trigger previews print CGI::hidden({-name=>'previewHack', -value=>''}), CGI::br(); # and the text for the link |
From: Gavin L. v. a. <we...@ma...> - 2005-12-22 18:53:04
|
Log Message: ----------- Gateway update: revise display of versioned and non-versioned sets. Now all regular sets are sorted to the top of the list, with gateway tests at the bottom. Use view_proctored_tests parameter to decide if proctored tests should be hidden. Now uses new listUserSets and listUserSetVersions routines from DB. 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.64 retrieving revision 1.65 diff -Llib/WeBWorK/ContentGenerator/ProblemSets.pm -Llib/WeBWorK/ContentGenerator/ProblemSets.pm -u -r1.64 -r1.65 --- lib/WeBWorK/ContentGenerator/ProblemSets.pm +++ lib/WeBWorK/ContentGenerator/ProblemSets.pm @@ -133,11 +133,15 @@ my $hardcopyPage = $urlpath->newFromModule("WeBWorK::ContentGenerator::Hardcopy", courseID => $courseName); my $actionURL = $self->systemLink($hardcopyPage, authen => 0); # no authen info for form action +# we have to get sets and versioned sets separately my @setIDs = $db->listUserSets($effectiveUser); + my @vSetIDs = $db->listUserSetVersions($effectiveUser); my @userSetIDs = map {[$effectiveUser, $_]} @setIDs; + my @vUserSetIDs = map {[$effectiveUser, /(.*),v\d+$/, $_]} @vSetIDs; debug("Begin collecting merged sets"); my @sets = $db->getMergedSets( @userSetIDs ); + my @vSets = (@vSetIDs) ? $db->getMergedVersionedSets(@vUserSetIDs) : (); debug("Begin fixing merged sets"); @@ -160,15 +164,21 @@ # differently, so check for those here debug("Begin set-type check"); my $existVersions = 0; + my @gwSets = (); + my @nonGWsets = (); foreach ( @sets ) { if ( defined( $_->assignment_type() ) && $_->assignment_type() =~ /gateway/ ) { $existVersions = 1; - last; + push( @gwSets, $_ ) + if ( $_->assignment_type() !~ /proctored/ || + $authz->hasPermissions($user,"view_proctored_tests") ); + } else { + push( @nonGWsets, $_ ); } } -# for gateways we change the default sort order if it isn't sent in - $sort = 'name' if ( $existVersions && ! $r->param("sort") ); + +# set sort method $sort = "status" unless $sort eq "status" or $sort eq "name"; # now set the headers for the table @@ -203,8 +213,19 @@ debug("Begin sorting merged sets"); - @sets = sortByName("set_id", @sets) if $sort eq "name"; - @sets = sort byUrgency @sets if $sort eq "status"; + if ( $sort eq 'name' ) { + @nonGWsets = sortByName("set_id", @nonGWsets); + @gwSets = sortByName("set_id", @gwSets); + } elsif ( $sort eq 'status' ) { + @nonGWsets = sort byUrgency @nonGWsets; + @gwSets = sort byUrgency @gwSets; + } +# we sort set versions by name; this at least in part relies on versions +# being finished by the time they show up on the list here. + @vSets = sortByName("set_id", @vSets); + +# put together a complete list of sorted sets to consider + @sets = (@nonGWsets, @gwSets, @vSets); debug("End preparing merged sets"); |
From: Gavin L. v. a. <we...@ma...> - 2005-12-22 18:51:20
|
Log Message: ----------- Gateway update: reflect use of listUserSets to list non-versioned sets Modified Files: -------------- webwork2/lib/WeBWorK/ContentGenerator: ProblemSet.pm Revision Data ------------- Index: ProblemSet.pm =================================================================== RCS file: /webwork/cvs/system/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm,v retrieving revision 1.68 retrieving revision 1.69 diff -Llib/WeBWorK/ContentGenerator/ProblemSet.pm -Llib/WeBWorK/ContentGenerator/ProblemSet.pm -u -r1.68 -r1.69 --- lib/WeBWorK/ContentGenerator/ProblemSet.pm +++ lib/WeBWorK/ContentGenerator/ProblemSet.pm @@ -128,10 +128,10 @@ my $courseID = $urlpath->arg("courseID"); my $user = $r->param('user'); my $eUserID = $r->param("effectiveUser"); - my @allsetIDs = sortByName(undef, $db->listUserSets($eUserID)); - # exclude versioned set IDs from the listing of global sets - my @setIDs = grep { $_ !~ /,v\d+$/ } @allsetIDs; - + +# note that listUserSets does not list versioned sets + my @setIDs = sortByName(undef, $db->listUserSets($eUserID)); + # do not show unpublished siblings unless user is allowed to view unpublished sets, and # exclude gateway tests unless ($authz->hasPermissions($user, "view_unpublished_sets") ) { |
From: Gavin L. v. a. <we...@ma...> - 2005-12-22 18:50:35
|
Log Message: ----------- Gateway update: use listUserSets and listUserSetVersions to show grades for all sets. Modified Files: -------------- webwork2/lib/WeBWorK/ContentGenerator: Grades.pm Revision Data ------------- Index: Grades.pm =================================================================== RCS file: /webwork/cvs/system/webwork2/lib/WeBWorK/ContentGenerator/Grades.pm,v retrieving revision 1.20 retrieving revision 1.21 diff -Llib/WeBWorK/ContentGenerator/Grades.pm -Llib/WeBWorK/ContentGenerator/Grades.pm -u -r1.20 -r1.21 --- lib/WeBWorK/ContentGenerator/Grades.pm +++ lib/WeBWorK/ContentGenerator/Grades.pm @@ -210,7 +210,11 @@ die "record for user $studentName not found" unless $studentRecord; my $root = $ce->{webworkURLs}->{root}; - my @setIDs = sort $db->listUserSets($studentName); +# listUserSets() excludes versioned sets, which we probably want to +# list here, so we also get the versioned sets + my @setIDs = sort(( $db->listUserSets($studentName), + $db->listUserSetVersions($studentName) )); + my $fullName = join("", $studentRecord->first_name," ", $studentRecord->last_name); my $effectiveUser = $studentRecord->user_id(); my $act_as_student_url = "$root/$courseName/?user=".$r->param("user"). |
From: Gavin L. v. a. <we...@ma...> - 2005-12-22 18:49:39
|
Log Message: ----------- Gateway update: - correct error check in deleteUserSet to allow deletion of set versions - change countUserSets to only count non-versioned sets - add countUserSetVersions to count versioned sets - change listUserSets to not list versioned sets - add listUserSetVersions to list versioned sets These should resolve bug #894. Modified Files: -------------- webwork2/lib/WeBWorK: DB.pm Revision Data ------------- Index: DB.pm =================================================================== RCS file: /webwork/cvs/system/webwork2/lib/WeBWorK/DB.pm,v retrieving revision 1.67 retrieving revision 1.68 diff -Llib/WeBWorK/DB.pm -Llib/WeBWorK/DB.pm -u -r1.67 -r1.68 --- lib/WeBWorK/DB.pm +++ lib/WeBWorK/DB.pm @@ -1300,7 +1300,23 @@ croak "countUserSets: argument 1 must contain a user_id" unless defined $userID; - return $self->{set_user}->count($userID, undef); +# don't count versioned sets. I think this is the correct behavior... + my $n = $self->{set_user}->count($userID, undef); + my $nv = $self->countUserSetVersions($userID); + return $n - $nv; +} + +sub countUserSetVersions { +# return the total number of versioned sets associated with the user + my ($self, $userID) = @_; + + croak "countUserSetVersions: requires 1 argument" + unless @_ == 2; + croak "countUserSetVersions: argument 1 must contain a user_id" + unless defined $userID; + + my @versionedSetList = $self->listUserSetVersions($userID); + return scalar(@versionedSetList); } sub listUserSets { @@ -1311,8 +1327,22 @@ croak "listUserSets: argument 1 must contain a user_id" unless defined $userID; - return map { $_->[1] } # extract set_id - $self->{set_user}->list($userID, undef); + # the following specifically excludes versioned sets, so that + # this behaves as non-gateway code expects + return( grep !/,v\d+$/, ( map { $_->[1] } # extract set_id + $self->{set_user}->list($userID, undef) ) ); +} + +sub listUserSetVersions { + my ($self, $userID) = @_; + + croak "listUserSetVersions: requires 1 argument" + unless @_ == 2; + croak "listUserSetVersions: argument 1 must contain a user_id" + unless defined $userID; + + return( grep /,v\d+$/, ( map { $_->[1] } # extract set_id + $self->{set_user}->list($userID, undef) ) ); } # the code from addUserSet() is duplicated in large part following in @@ -1481,8 +1511,8 @@ sub deleteUserSet { my ($self, $userID, $setID, $skipVersionDel) = @_; - croak "getUserSet: requires 2 arguments" - unless @_ == 3; + croak "getUserSet: requires 2 or 3 arguments" + unless @_ == 3 or @_ == 4; croak "getUserSet: argument 1 must contain a user_id" unless defined $userID or caller eq __PACKAGE__; croak "getUserSet: argument 2 must contain a set_id" @@ -1540,7 +1570,7 @@ # we just get all sets for the user and figure out which of them # look like the sid. - my @allSetIDs = $self->listUserSets( $uid ); + my @allSetIDs = $self->listUserSetVersions( $uid ); my @setIDs = sort( grep { /^$sid,v\d+$/ } @allSetIDs ); my $lastSetID = $setIDs[-1]; # I think this should be defined, unless the set hasn't been assigned to |
From: Gavin L. v. a. <we...@ma...> - 2005-12-22 18:46:48
|
Log Message: ----------- Gateway update: restore runtimer() to gateway.template (though for some reason it no longer likes the onload() handler in the body tag?). add nocache headers to try and avoid pernicious use of the back button. correct javascript timer to avoid negative times. Modified Files: -------------- webwork2/conf/templates/math: gateway.template Revision Data ------------- Index: gateway.template =================================================================== RCS file: /webwork/cvs/system/webwork2/conf/templates/math/gateway.template,v retrieving revision 1.2 retrieving revision 1.3 diff -Lconf/templates/math/gateway.template -Lconf/templates/math/gateway.template -u -r1.2 -r1.3 --- conf/templates/math/gateway.template +++ conf/templates/math/gateway.template @@ -3,6 +3,8 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> +<meta http-equiv="Pragma" content="no-cache"/> +<meta http-equiv="expires" content="Wed, 21 Dec 2005 00:00:01 GMT"/> <link rel="stylesheet" type="text/css" media="All" href="<!--#url type="webwork" name="htdocs"-->/css/math.css"/> <!-- [gateway] since the left-side menus are gone, don't indent the main content area --> <link rel="stylesheet" type="text/css" media="All" href="<!--#url type="webwork" name="htdocs"-->/css/gateway.css"/> @@ -33,12 +35,12 @@ var theTime = -1; // -1 before we've initialized var alerted = -1; // -1 = no alert set; 1 = 1st alert set // this shouldn't really be needed - function runtimer() { // aesthetically this is displeasing: we're assuming that the // ContentGenerator will put the appropriate form elements in that // page for us to manipulate. even with error checking, it seems sort // of odd. + if ( document.gwtimer == null ) { // no timer return; } else { @@ -78,6 +80,9 @@ } function toMinSec(t) { // convert to min:sec + if ( t < 0 ) { // don't deal with negative times + t = 0; + } mn = Math.floor(t/60); sc = t - 60*mn; if ( mn < 10 && mn > -1 ) { @@ -88,6 +93,11 @@ } return mn + ":" + sc; } + +// for some reason putting this as an onload event in the body tag +// isn't working. so start the timer here; the 500ms delay is to be +// sure that the timer form fields have loaded +setTimeout("runtimer()",500); </script> </head> <body bgcolor="white"> |
From: Gavin L. v. a. <we...@ma...> - 2005-12-22 18:45:17
|
Log Message: ----------- Gateway update: change $gatewayGracePeriod Modified Files: -------------- webwork2/conf: global.conf.dist Revision Data ------------- Index: global.conf.dist =================================================================== RCS file: /webwork/cvs/system/webwork2/conf/global.conf.dist,v retrieving revision 1.160 retrieving revision 1.161 diff -Lconf/global.conf.dist -Lconf/global.conf.dist -u -r1.160 -r1.161 --- conf/global.conf.dist +++ conf/global.conf.dist @@ -621,7 +621,7 @@ # Option for gateway tests; $gatewayGracePeriod is the time in seconds # after the official due date during which we'll still grade the test -$gatewayGracePeriod = 150; +$gatewayGracePeriod = 120; ################################################################################ # PG subsystem options |
From: Sam H. v. a. <we...@ma...> - 2005-12-22 05:29:26
|
Log Message: ----------- i've been playing with a docbook version of the installation manual. converting the twiki installation manual is too time-consuming for it to be ready for 2.1.4, so this can just sit here until 2.1.5 or later. Added Files: ----------- webwork2/doc/docbook/install: Installing-WeBWorK.xml Revision Data ------------- --- /dev/null +++ doc/docbook/install/Installing-WeBWorK.xml @@ -0,0 +1,155 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" +"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [ +<!ENTITY WW "WeBWorK"> +]> +<article> + <articleinfo> + <title>Installing WeBWorK</title> + <author><firstname>Sam</firstname><surname>Hathaway</surname></author> + <copyright><year>2005</year><holder>The WeBWorK Project</holder></copyright> + </articleinfo> + <section id="intro"> + <title>Introduction</title> + <para>FiXME: purpose of this article, assumptions, etc.</para> + </section> + <section id="sysreq"> + <title>System Requirements</title> + <para>&WW; requires several software packages to run. The installation procedure varies depending on your operating system.</para> + <section id="os"> + <title>Operating System</title> + <para>&WW; runs on most POSIX-compliant operating systems. It has been tested on FreeBSD, Linux, Solaris, Mac OS X.</para> + </section> + <section id="perl"> + <title>Perl</title> + <para>&WW; requires Perl 5.6 or higher and several of the core modules included in the Perl distribution.</para> + <itemizedlist> + <listitem><simpara><ulink type="http" url="http://perl.org/">Perl web site</ulink></simpara></listitem> + <listitem><simpara><ulink type="http" url="http://packages.debian.org/perl">Debian package perl</ulink></simpara></listitem> + </itemizedlist> + <para>The following non-core Perl modules are also required. All are available from <ulink type="http" url="http://cpan.org/">CPAN</ulink>, and many OS vendors provide packages of these modules. To see if <replaceable>Module</replaceable> is installed on your system, run <command>perl -M<replaceable>Module</replaceable> -e 'print "installed!\n"'</command>. To install <replaceable>Module</replaceable> from CPAN, run <command>perl -MCPAN -e "install <replaceable>Module</replaceable>"</command>.</para> + <segmentedlist> + <title>Required Perl Modules</title> + <?dbhtml list-presentation="table"?> + <segtitle>Module</segtitle> + <segtitle>Debian package</segtitle> + <seglistitem> + <seg>Apache::Request</seg> + <seg><ulink type="http" url="http://packages.debian.org/libapache-request-perl">libapache-request-perl</ulink></seg> + </seglistitem> + <seglistitem> + <seg>Data::UUID</seg> + <seg>not available<footnote><para>The package <ulink type="http" url="http://packages.debian.org/libossp-uuid-perl">libossp-uuid-perl</ulink> provides a clone of Data::UUID that alledgedly has the same interface. It has not been tested with &WW;</para></footnote></seg> + </seglistitem> + <seglistitem> + <seg>String::ShellQuote</seg> + <seg><ulink type="http" url="http://packages.debian.org/libstring-shellquote-perl">libstring-shellquote-perl</ulink></seg> + </seglistitem> + <seglistitem> + <seg>DateTime</seg> + <seg><ulink type="http" url="http://packages.debian.org/libdatetime-perl">libdatetime-perl</ulink></seg> + </seglistitem> + <seglistitem> + <seg>Date::Format</seg> + <seg><ulink type="http" url="http://packages.debian.org/libtimedate-perl">libtimedate-perl</ulink></seg> + </seglistitem> + <seglistitem> + <seg>Date::Parse</seg> + <seg><ulink type="http" url="http://packages.debian.org/libtimedate-perl">libtimedate-perl</ulink></seg> + </seglistitem> + <seglistitem> + <seg>GD</seg> + <seg><ulink type="http" url="http://packages.debian.org/libgd-gd2-perl">libgd-gd2-perl</ulink></seg> + </seglistitem> + <seglistitem> + <seg>Mail::Sender</seg> + <seg><ulink type="http" url="http://packages.debian.org/libmail-sender-perl">libmail-sender-perl</ulink></seg> + </seglistitem> + <seglistitem> + <seg>SOAP::Lite</seg> + <seg><ulink type="http" url="http://packages.debian.org/libsoap-lite-perl">libsoap-lite-perl</ulink></seg> + </seglistitem> + <seglistitem> + <seg>Time::HiRes</seg> + <seg><ulink type="http" url="http://packages.debian.org/libtime-hires-perl">libtime-hires-perl</ulink></seg> + </seglistitem> + <seglistitem> + <seg>XML::Parser</seg> + <seg><ulink type="http" url="http://packages.debian.org/libxml-parser-perl">libxml-parser-perl</ulink></seg> + </seglistitem> + <seglistitem> + <seg>XML::Parser::EasyTree</seg> + <seg>not available</seg> + </seglistitem> + <seglistitem> + <seg>XML::Writer</seg> + <seg><ulink type="http" url="http://packages.debian.org/libxml-writer-perl">libxml-writer-perl</ulink></seg> + </seglistitem> + <seglistitem> + <seg>DBI</seg> + <seg><ulink type="http" url="http://packages.debian.org/libdbi-perl">libdbi-perl</ulink></seg> + </seglistitem> + <seglistitem> + <seg>DBD::mysql</seg> + <seg><ulink type="http" url="http://packages.debian.org/libdbd-mysql-perl">libdbd-mysql-perl</ulink></seg> + </seglistitem> + </segmentedlist> + </section> + <section id="apache"> + <title>Apache 1.3</title> + <para>&WW; requires Apache 1.3.x and the <literal>mod_alias</literal> module.</para> + <itemizedlist> + <listitem><simpara><ulink type="http" url="http://httpd.apache.org/">Apache web site</ulink></simpara></listitem> + <listitem><simpara><ulink type="http" url="http://packages.debian.org/apache">Debian package apache</ulink></simpara></listitem> + </itemizedlist> + </section> + <section id="modperl"> + <title>mod_perl</title> + <para>&WW; is a mod_perl application and requires mod_perl 1.x. If compiling mod_perl from source, use the <envar>EVERYTHING=1</envar> flag to enable all mod_perl features. Most vendors compile their mod_perl packages with this setting enabled.</para> + <itemizedlist> + <listitem><simpara><ulink type="http" url="http://perl.apache.org/">mod_perl web site</ulink></simpara></listitem> + <listitem><simpara><ulink type="http" url="http://packages.debian.org/libapache-mod-perl">Debian package libapache-mod-perl</ulink></simpara></listitem> + </itemizedlist> + </section> + <section id="mysql"> + <title>MySQL</title> + <para>&WW; stores its data in a MySQL database. &WW; has been tested with MySQL 3 and 4. It should work with MySQL 5 as well. The MySQL server can be on the same machine as &WW; or on a remote machine. You will need the <command>mysql</command> client to create the &WW; database.</para> + <itemizedlist> + <listitem><simpara><ulink type="http" url="http://mysql.com/">MySQL web site</ulink></simpara></listitem> + <listitem><simpara><ulink type="http" url="http://packages.debian.org/mysql-server">Debian package mysql-server</ulink></simpara></listitem> + </itemizedlist> + </section> + <section id="latex"> + <title>LaTeX</title> + <para>&WW; uses LaTeX for generating hardcopy output and displaying mathematics graphically. Any standard LaTeX distribution that provides the commands <command>latex</command> and <command>pdflatex</command> should work. &WW; has been tested with teTeX.</para> + <itemizedlist> + <listitem><simpara><ulink type="http" url="http://tug.org/tetex/">teTeX web site</ulink></simpara></listitem> + <listitem><simpara>Debian packages <ulink type="http" url="http://packages.debian.org/tetex-bin">tetex-bin</ulink> and <ulink type="http" url="http://packages.debian.org/tetex-extra">tetex-extra</ulink></simpara></listitem> + </itemizedlist> + </section> + <section id="netpbm"> + <title>Netpbm</title> + <para>&WW; requires Netpbm, an image manipulation library, to convert images among the GIF, PNG, and EPS formats.</para> + <itemizedlist> + <listitem><simpara><ulink type="http" url="http://netpbm.sf.net/">Netpbm web site</ulink></simpara></listitem> + <listitem><simpara>Debian package <ulink type="http" url="http://packages.debian.org/netpbm">netpbm</ulink></simpara></listitem> + </itemizedlist> + </section> + <section id="dvipng"> + <title>dvipng</title> + <para>&WW; uses dvipng to display mathematics graphically. It is only required if you wish to use the <literal>images</literal> display mode. &WW; is initially configured to work with dvipng 1.0 or greater, but can be reconfigured to work with dvipng 0.8 or 0.9. dvipng requires the <filename>preview.sty</filename> file from the preview-latex package.</para> + <itemizedlist> + <listitem><simpara><ulink type="http" url="http://dvipng.sf.net/">dvipng web site</ulink></simpara></listitem> + <listitem><simpara>Debian packages <ulink type="http" url="http://packages.debian.org/dvipng">dvipng</ulink> and <ulink type="http" url="http://packages.debian.org/preview-latex-style">preview-latex-style</ulink></simpara></listitem> + </itemizedlist> + </section> + <section id="tth"> + <title>tth</title> + <para>&WW; uses TtH to display mathematics as formatted HTML. It is only required if you wish to use the <literal>formatted-text</literal> display mode.</para> + <itemizedlist> + <listitem><simpara><ulink type="http" url="http://hutchinson.belmont.ma.us/tth/">TtH web site</ulink></simpara></listitem> + <listitem><simpara>Debian package <ulink type="http" url="http://packages.debian.org/tth">tth</ulink></simpara></listitem> + </itemizedlist> + </section> + </section> +</article> \ No newline at end of file |
From: Sam H. v. a. <we...@ma...> - 2005-12-22 05:27:42
|
Update of /webwork/cvs/system/webwork2/doc/docbook/install In directory devel.webwork.rochester.edu:/home/sh002i/work/webwork2_HEAD/doc/docbook/install Log Message: Directory /webwork/cvs/system/webwork2/doc/docbook/install added to the repository |
From: Sam H. v. a. <we...@ma...> - 2005-12-22 05:27:42
|
Update of /webwork/cvs/system/webwork2/doc/docbook In directory devel.webwork.rochester.edu:/home/sh002i/work/webwork2_HEAD/doc/docbook Log Message: Directory /webwork/cvs/system/webwork2/doc/docbook added to the repository |
From: dpvc v. a. <we...@ma...> - 2005-12-22 02:46:14
|
Log Message: ----------- Fixed some problems with alignment in Firefox 1.5 (will be part of 3.1 release, but that is being held up for the moment). Modified Files: -------------- webwork-modperl/htdocs/jsMath: jsMath.js Revision Data ------------- Index: jsMath.js =================================================================== RCS file: /webwork/cvs/system/webwork-modperl/htdocs/jsMath/jsMath.js,v retrieving revision 1.20 retrieving revision 1.21 diff -Lhtdocs/jsMath/jsMath.js -Lhtdocs/jsMath/jsMath.js -u -r1.20 -r1.21 --- htdocs/jsMath/jsMath.js +++ htdocs/jsMath/jsMath.js @@ -70,7 +70,7 @@ jsMath = { - version: "3.0", // change this if you edit the file + version: "3.0-ww", // change this if you edit the file document: document, // the document loading jsMath window: window, // the window of the of loading document @@ -90,7 +90,8 @@ '.typeset': 'font-family: serif; font-style: normal; font-weight: normal', 'div.typeset': 'text-align: center; margin: 1em 0px;', - 'span.typeset': '', + 'span.typeset': 'text-align: left', + '.typeset span': 'text-align: left', // needed for Firefox 1.5 '.typeset .normal': 'font-family: serif; font-style: normal; font-weight: normal', @@ -2426,8 +2427,6 @@ if (y != "none") { if (Math.abs(y) < .0001) {y = 0} html = '<span style="position: absolute; ' - + 'width:'+jsMath.HTML.Em(w)+'; ' // for Firefox 1.5 - + 'height:'+jsMath.HTML.Em(H)+'; ' // for Firefox 1.5 + 'top:'+jsMath.HTML.Em(y)+'; left: 0em;">' + html + ' ' // space normalizes line height in script styles + '</span>'; |
From: Gavin L. v. a. <we...@ma...> - 2005-12-21 23:27:55
|
Log Message: ----------- Gateway update: deal with missing problem groups in gateway tests slightly more gracefully. Modified Files: -------------- webwork2/lib/WeBWorK/ContentGenerator: Instructor.pm Revision Data ------------- Index: Instructor.pm =================================================================== RCS file: /webwork/cvs/system/webwork2/lib/WeBWorK/ContentGenerator/Instructor.pm,v retrieving revision 1.52 retrieving revision 1.53 diff -Llib/WeBWorK/ContentGenerator/Instructor.pm -Llib/WeBWorK/ContentGenerator/Instructor.pm -u -r1.52 -r1.53 --- lib/WeBWorK/ContentGenerator/Instructor.pm +++ lib/WeBWorK/ContentGenerator/Instructor.pm @@ -199,6 +199,23 @@ # get list of problems in group my @problemList = $db->listGlobalProblems($problemGroupName); + # sanity check: if the group set hasn't been defined or doesn't + # actually contain problems (oops), then we can't very well assign + # this problem to the user. we could go on and assign all other + # problems, but that results in a partial set. so we die here if + # this happens. philosophically we're requiring that the instructor + # set up the sets correctly or have to deal with the carnage after- + # wards. I'm not sure that this is the best long-term solution. + # FIXME: this means that we may have created a set version that + # doesn't have any problems. this is bad. but it's hard to see + # where else to deal with it---fixing the problem requires checking + # at the set version-creation level that all the problems in the + # set are well defined. FIXME + die("Error in set version creation: no problems are available " . + "in problem group $problemGroupName. Set " . + $userSet->set_id . " has been created for $userID, but " . + "does not contain the right problems.\n") if (! @problemList); + my $nProb = @problemList; my $whichProblem = int(rand($nProb)); |
From: Gavin L. v. a. <we...@ma...> - 2005-12-21 23:27:14
|
Log Message: ----------- Gateway update: fix a number of quiet bugs - deal with sets having no problems - add grace period read from conf file when determining test time expiration - retain consistent current time throughout processing - improved messages for tests running over time - add score and time messages to finished sets - save version_last_attempt_time for submitted sets that run over time Modified Files: -------------- webwork2/lib/WeBWorK/ContentGenerator: GatewayQuiz.pm Revision Data ------------- Index: GatewayQuiz.pm =================================================================== RCS file: /webwork/cvs/system/webwork2/lib/WeBWorK/ContentGenerator/GatewayQuiz.pm,v retrieving revision 1.15 retrieving revision 1.16 diff -Llib/WeBWorK/ContentGenerator/GatewayQuiz.pm -Llib/WeBWorK/ContentGenerator/GatewayQuiz.pm -u -r1.15 -r1.16 --- lib/WeBWorK/ContentGenerator/GatewayQuiz.pm +++ lib/WeBWorK/ContentGenerator/GatewayQuiz.pm @@ -122,21 +122,27 @@ $submitAnswers) = @_; my $authz = $self->r->authz; + my $timeNow = ( defined($self->{timeNow}) ) ? $self->{timeNow} : time(); + # get the sag time after the due date in which we'll still grade the test + my $grace = $self->{ce}->{gatewayGracePeriod}; + my $submitTime = ( defined($Set->version_last_attempt_time()) && $Set->version_last_attempt_time() ) ? - $Set->version_last_attempt_time() : time(); + $Set->version_last_attempt_time() : $timeNow; if ($User->user_id ne $EffectiveUser->user_id) { return $authz->hasPermissions($User->user_id, "record_answers_when_acting_as_student"); } + if (before($Set->open_date, $submitTime)) { return $authz->hasPermissions($User->user_id, "record_answers_before_open_date"); - } elsif (between($Set->open_date, $Set->due_date, $submitTime)) { + } elsif (between($Set->open_date, ($Set->due_date + $grace), $submitTime)) { # gateway change here; we look at maximum attempts per version, not for the set, # to determine the number of attempts allowed # $addOne allows us to count the current submission - my $addOne = defined( $submitAnswers ) ? $submitAnswers : 0; + my $addOne = ( defined( $submitAnswers ) && $submitAnswers ) ? + 1 : 0; my $max_attempts = $Set->attempts_per_version(); my $attempts_used = $Problem->num_correct+$Problem->num_incorrect+$addOne; if ($max_attempts == -1 or $attempts_used < $max_attempts) { @@ -144,7 +150,7 @@ } else { return $authz->hasPermissions($User->user_id, "record_answers_after_open_date_without_attempts"); } - } elsif (between($Set->due_date, $Set->answer_date, $submitTime)) { + } elsif (between(($Set->due_date + $grace), $Set->answer_date, $submitTime)) { return $authz->hasPermissions($User->user_id, "record_answers_after_due_date"); } elsif (after($Set->answer_date, $submitTime)) { return $authz->hasPermissions($User->user_id, "record_answers_after_answer_date"); @@ -161,19 +167,24 @@ my ($self, $User, $PermissionLevel, $EffectiveUser, $Set, $Problem, $submitAnswers) = @_; my $authz = $self->r->authz; + + my $timeNow = ( defined($self->{timeNow}) ) ? $self->{timeNow} : time(); + # get the sag time after the due date in which we'll still grade the test + my $grace = $self->{ce}->{gatewayGracePeriod}; my $submitTime = ( defined($Set->version_last_attempt_time()) && $Set->version_last_attempt_time() ) ? - $Set->version_last_attempt_time() : time(); + $Set->version_last_attempt_time() : $timeNow; if (before($Set->open_date, $submitTime)) { return $authz->hasPermissions($User->user_id, "check_answers_before_open_date"); - } elsif (between($Set->open_date, $Set->due_date, $submitTime)) { + } elsif (between($Set->open_date, ($Set->due_date + $grace), $submitTime)) { # gateway change here; we look at maximum attempts per version, not for the set, # to determine the number of attempts allowed # $addOne allows us to count the current submission - my $addOne = defined( $submitAnswers ) ? $submitAnswers : 0; + my $addOne = (defined( $submitAnswers ) && $submitAnswers) ? + 1 : 0; my $max_attempts = $Set->attempts_per_version(); my $attempts_used = $Problem->num_correct+$Problem->num_incorrect+$addOne; @@ -182,7 +193,7 @@ } else { return $authz->hasPermissions($User->user_id, "check_answers_after_open_date_without_attempts"); } - } elsif (between($Set->due_date, $Set->answer_date, $submitTime)) { + } elsif (between(($Set->due_date + $grace), $Set->answer_date, $submitTime)) { return $authz->hasPermissions($User->user_id, "check_answers_after_due_date"); } elsif (after($Set->answer_date, $submitTime)) { return $authz->hasPermissions($User->user_id, "check_answers_after_answer_date"); @@ -192,9 +203,9 @@ # Helper functions for calculating times # gateway change here: we allow an optional additional argument to use as the # time to check rather than time() -sub before { return (@_==2) ? $_[1] <= $_[0] : time <= $_[0] } -sub after { return (@_==2) ? $_[1] >= $_[0] : time >= $_[0] } -sub between { my $t = (@_==3) ? $_[2] : time; return $t > $_[0] && $t < $_[1] } +sub before { return (@_==2) ? $_[1] < $_[0] : time < $_[0] } +sub after { return (@_==2) ? $_[1] > $_[0] : time > $_[0] } +sub between { my $t = (@_==3) ? $_[2] : time; return $t >= $_[0] && $t <= $_[1] } ################################################################################ # output utilities @@ -402,7 +413,7 @@ # this is a horrible hack to allow use of a javascript link to trigger # the preview of the page: set previewAnswers to yes if either the -# "previewAnswers" or "previewhack" inputs are set +# "previewAnswers" or "previewHack" inputs are set my $prevOr = $r->param('previewAnswers') || $r->param('previewHack'); $r->param('previewAnswers', $prevOr) if ( defined( $prevOr ) ); @@ -444,10 +455,11 @@ if ( ( $r->param("previewAnswers") || $r->param("checkAnswers") || $r->param("submitAnswers") ) && ! $requestedVersion ); -# FIXME should we be more subtle than just die()ing here? c.f. Problem.pm -# $self->{invalidSet} FIXME (also, if getMergedSet() returns undef for -# sets not assigned to users, why does Problem.pm resort to the logic -# (grep /^$setName/, $db->listUserSets($effectiveUserName)) == 0)? +# FIXME should we be more subtle than just die()ing here? c.f. Problem.pm, +# which sets $self->{invalidSet} and lets body() deal with it. for +# gateways I think we need to die() or skip the version creation +# conditional, or else we could get user versions of an unpublished +# set. FIXME die( "Invalid set $setName requested" ) if ( ! ( $tmplSet->published || $authz->hasPermissions($userName,"view_unpublished_sets") ) ); @@ -513,12 +525,17 @@ # version exceeds the number of attempts per version. (among other # things,) the number of attempts is a property of the problem, so # get a problem to check that. note that for a gateway/quiz all -# problems will have the same number of attempts. -# note that this might not be defined, if the set hasn't been versioned +# problems will have the same number of attempts. This means that if +# the set doesn't have any problems we're up a creek, so check for that +# here and bail if it's the case + my @setPNum = $db->listUserProblems($EffectiveUser->user_id, $setName); + die("Set $setName contains no problems.") if ( ! @setPNum ); + +# the Problem here might not be defined, if the set hasn't been versioned # to the user yet--this gets fixed when we assign the setVersion my $Problem = $db->getMergedVersionedProblem($EffectiveUser->user_id, - $setName, $setVersionName, 1); + $setName, $setVersionName, $setPNum[0]); # FIXME: is there any case where $maxAttemptsPerVersion shouldn't be # finite? For the moment we don't deal with this here FIXME @@ -548,6 +565,8 @@ # limitation like "one version per hour", and we can set it to two sets # per 12 hours for most "2ce daily" type applications my $timeNow = time(); + my $grace = $ce->{gatewayGracePeriod}; + my $currentNumVersions = 0; # this is the number of versions in the last # time interval my $totalNumVersions = 0; @@ -567,7 +586,6 @@ #################################### my $versionIsOpen = 0; # can we do anything to this version? - $timeNow -= 5; # be safe with $timeNow if ( $isOpen && ! $isClosed ) { # this makes sense, really @@ -581,7 +599,7 @@ ( ( $currentNumAttempts >= $maxAttemptsPerVersion || - $timeNow >= $set->due_date ) + $timeNow >= $set->due_date + $grace ) && ( ! $versionsPerInterval || @@ -632,9 +650,9 @@ "maximum number\nallowed."; } elsif ( $currentNumAttempts < $maxAttemptsPerVersion && - $timeNow < $set->due_date() ) { + $timeNow < $set->due_date() + $grace ) { - if ( between($set->open_date(), $set->due_date(), $timeNow) ) { + if ( between($set->open_date(), $set->due_date() + $grace, $timeNow) ) { $versionIsOpen = 1; } else { $versionIsOpen = 0; # redundant; default is 0 @@ -662,7 +680,7 @@ $authz->hasPermissions($effectiveUserName, "record_answers_when_acting_as_student") ) ) { - if ( between($set->open_date(), $set->due_date(), $timeNow) ) { + if ( between($set->open_date(), $set->due_date() + $grace, $timeNow) ) { $versionIsOpen = 1; } else { $versionIsOpen = 0; # redundant; default is 0 @@ -698,6 +716,8 @@ $self->{isOpen} = $isOpen; $self->{isClosed} = $isClosed; $self->{versionIsOpen} = $versionIsOpen; + + $self->{timeNow} = $timeNow; #################################### # form processing @@ -896,7 +916,9 @@ my $user = $r->param('user'); my $effectiveUser = $r->param('effectiveUser'); - my $timeNow = time(); +# report everything with the same time that we started with + my $timeNow = $self->{timeNow}; + my $grace = $ce->{gatewayGracePeriod}; ######################################### # preliminary error checking and output @@ -1067,9 +1089,23 @@ "recorded because you have no attempts " . "remaining on this set version."; } elsif ( ! $self->{versionIsOpen} ) { + my $endTime = ( $set->version_last_attempt_time ) ? + $set->version_last_attempt_time : $timeNow; + if ( $endTime > $set->due_date && + $endTime < $set->due_date + $grace ) { + $endTime = $set->due_date; + } +# sprintf forces two decimals, which we don't like +# my $elapsed = sprintf("%4.2f",($endTime - +# $set->open_date)/60); + my $elapsed = + int(($endTime - set->open_date)/0.6 + 0.5)/100; + # we assume that allowed is an even number of minutes + my $allowed = ($set->due_date - $set->open_date)/60; $scoreRecordedMessage[$i] = "Your score was not " . "recorded because you have exceeded the time " . - "limit for this test."; + "limit for this test. (Time taken: $elapsed min;" . + " allowed: $allowed min.)"; } else { $scoreRecordedMessage[$i] = "Your score was not " . "recorded."; @@ -1109,26 +1145,29 @@ } } # end loop through problems -# warn("in submitanswers conditional\n"); - } # end if submitAnswers conditional debug("end answer processing"); -# additional set-level database manipulation: this is all for versioned -# sets/gateway tests -# we want to save the time that a set was submitted, and for proctored -# tests we want to reset the assignment type after a set is submitted -# for the last time so that it's possible to look at it later without -# getting proctor authorization - if ( ( $submitAnswers && $will{recordAnswers} ) || +# additional set-level database manipulation: we want to save the time +# that a set was submitted, and for proctored tests we want to reset +# the assignment type after a set is submitted for the last time so +# that it's possible to look at it later without getting proctor +# authorization + if ( ( $submitAnswers && + ( $will{recordAnswers} || + ( ! $set->version_last_attempt_time() && + $timeNow > $set->due_date + $grace ) ) ) || ( ! $can{recordAnswersNextTime} && $set->assignment_type() eq 'proctored_gateway' ) ) { -# warn("in put set conditional\n"); - my $setName = $set->set_id(); - if ( $submitAnswers && $will{recordAnswers} ) { +# save the submission time if we're recording the answer, or if the +# first submission occurs after the due_date + if ( $submitAnswers && + ( $will{recordAnswers} || + ( ! $set->version_last_attempt_time() && + $timeNow > $set->due_date + $grace ) ) ) { $set->version_last_attempt_time( $timeNow ); } if ( ! $can{recordAnswersNextTime} && @@ -1144,61 +1183,135 @@ # output #################################### - my $overallScore = -1; # is there a total score we should be reporting? +# figure out score on this attempt, and recorded score for the set, if any + my $recordedScore = 0; my $totPossible = 0; - if ( $submitAnswers ) { - $overallScore = 0; - foreach ( @pg_results ) { - $overallScore += $_->{state}->{recorded_score}; -# FIXME we need to worry about weight, both for score and total possible -# $totPossible += $_->value; - $totPossible++; +# foreach ( @pg_results ) { + foreach ( @problems ) { +# FIXME: this requires all problems to have weight 1 + $totPossible++; +# $recordedScore += $_->{state}->{recorded_score} +# if ( defined( $_->{state}->{recorded_score} ) ); + $recordedScore += $_->{status} if ( defined( $_->status ) ); + } + + my $attemptScore = 0; + if ( $submitAnswers || $checkAnswers ) { + foreach my $pg ( @pg_results ) { +# to get the current result, we need to go through the parts of the problem + foreach ( @{$pg->{flags}->{ANSWER_ENTRY_ORDER}} ) { + $attemptScore += $pg->{answers}->{$_}->{score}; + } } } - if ( $overallScore > -1 ) { +# we want to print elapsed and allowed times; allowed is easy (we assume +# this is an even number of minutes) + my $allowed = ($set->due_date - $set->open_date)/60; +# elapsed is a little harder; we're counting to the last submission +# time, or to the current time if the test hasn't been submitted, and if the +# submission fell in the grace period round it to the due_date + my $exceededAllowedTime = 0; + my $endTime = ( $set->version_last_attempt_time ) ? + $set->version_last_attempt_time : $timeNow; + if ( $endTime > $set->due_date && $endTime < $set->due_date + $grace ) { + $endTime = $set->due_date; + } elsif ( $endTime > $set->due_date ) { + $exceededAllowedTime = 1; + } + my $elapsed = int(($endTime - $set->open_date)/0.6 + 0.5)/100; + + if ( $submitAnswers ) { my $divClass = ''; - my $ansRecorded = 1; my $recdMsg = ''; foreach ( @scoreRecordedMessage ) { if ( $_ ne 'Your score on this problem was recorded.' ) { - $ansRecorded = 0; $recdMsg = $_; last; } } - if ( $ansRecorded ) { - $divClass = 'ResultsWithoutError'; - $recdMsg = "Your score on this test was recorded."; - } else { + if ( $recdMsg ) { $divClass = 'ResultsWithError'; -# inherit saved value from above $recdMsg = "Your score on this test was NOT recorded. " . $recdMsg; + } else { + $divClass = 'ResultsWithoutError'; + $recdMsg = "Your score on this test was recorded."; } - print CGI::div({class=>"$divClass"}, - CGI::strong("Score on this attempt (test number " . - "$versionNumber) = " . - "$overallScore / $totPossible"), - CGI::br(), - CGI::strong("$recdMsg")),"\n\n"; + print CGI::start_div({class=>"$divClass"}); + print CGI::strong("Your score on this attempt (test number " . + "$versionNumber) is $attemptScore / " . + "$totPossible"), CGI::br(); + if ( $will{recordAnswers} ) { # then this is a counted submission + print CGI::strong("Time taken: $elapsed min (allowed: $allowed)"), + CGI::br(); + } + print CGI::strong("$recdMsg"), CGI::br() if ( $recdMsg ); + print CGI::end_div(); + } elsif ( $checkAnswers ) { + print CGI::start_div({class=>"gwMessage"}); + print "Your score on this (checked, not recorded) submission " . + "is $attemptScore / $totPossible", CGI::end_div(); } if ( ! $can{recordAnswersNextTime} ) { -# if we can't record answers any more, then we're finished with this set -# version. print the appropriate message to that effect. - print CGI::start_div({class=>"gwMessage"}); - my $mesg = ( $requestedVersion ) ? '' : - ", because you have used all available attempts on it or " . - "because its time limit has expired.\n" . - "To attempt the set again, please try again after the time " . - "limit between versions has expired.\n"; - print CGI::p(CGI::strong("Note: this set version (number " . - "$versionNumber) can no longer be submitted for a" . - " grade"),"\n",$mesg,"\n", - "You may, however, check your answers to see what you did" . - " right or wrong."), "\n\n"; - print CGI::end_div(); +# if we can't record answers any more, then we want to add any message about +# that, note if there's a recorded score, and be sure to flag any tests that +# are overtime. (it's worth the effort to be careful about labeling tests +# this way mainly so that when students print a test and bring it in we know +# what's going on.) + + my $timemsg = ''; + +# if the test was submitted, just check to see if we should make a note about +# the recorded score and time taken + if ( $submitAnswers ) { + if ( $recordedScore ne $attemptScore || ! $will{recordAnswers} ) { + print CGI::start_div({class=>"gwMessage"}); + if ( $recordedScore ne $attemptScore ) { + print CGI::strong("Your recorded score on this test " . + "is $recordedScore / $totPossible."); + } elsif ( ! $will{recordAnswers} ) { + print CGI::strong("Time taken: $elapsed min (allowed: " . + "$allowed)"); + } + print CGI::end_div(); + } + +# otherwise, go through more convoluted logic + } else { + # first case: the test isn't submitted, but it's out of time. + if ( ! $set->version_last_attempt_time && $exceededAllowedTime ) { + print CGI::start_div({class=>'ResultsWithError'}); + print CGI::strong("You have exceeded the allowed time on " . + "this test ($allowed min; elapsed time " . + "is $elapsed min)."), CGI::br(); + + # second case: it has been submitted, and the score is zero, possibly + # because it's over time + } elsif ( $set->version_last_attempt_time && $exceededAllowedTime && + $recordedScore == 0 ) { + print CGI::start_div({class=>'gwMessage'}); + print CGI::strong("Your recorded score on this test is " . + "0 / $totPossible (possibly because you " . + "exceeded the allowed time on the test). " . + "Time taken: $elapsed min (allowed: " . + "$allowed)"), CGI::br(); + + # last case: we can't record answers, so if it's not submitted we must + # be out of time (the first case), which means the last case is that + # it's been submitted and we are either out of time or out of attempts + } else { + print CGI::start_div({class=>'gwMessage'}); + print CGI::strong("Your recorded score on this test is " . + "$recordedScore / $totPossible. " . + "Time taken: $elapsed min (allowed: " . + "$allowed)"), CGI::br(); + } + print "The test (which is number $versionNumber) may no " . + "longer be submitted for a grade, but you may still " . + "check your answers.", CGI::end_div(); + } } else { @@ -1206,11 +1319,11 @@ # FIXME: We need to drop this out gracefully if there isn't! # set up a timer my $timeLeft = $set->due_date() - $timeNow; # this is in seconds - print CGI::start_div({class=>"gwTiming"}); + print CGI::start_div({class=>"gwTiming"}),"\n"; print CGI::startform({-name=>"gwtimer", -method=>"POST", - -action=>$r->uri}), "\n"; + -action=>$r->uri}); print CGI::hidden({-name=>"gwpagetimeleft", -value=>$timeLeft}), "\n"; - print CGI::strong("Time Remaining:"); + print CGI::strong("Time Remaining:"), "\n"; print CGI::textfield({-name=>'gwtime', -default=>0, -size=>8}), CGI::strong("min:sec"), CGI::br(), "\n"; print CGI::endform(); @@ -1220,13 +1333,6 @@ "complete this test.\n")); } print CGI::end_div(); -# print CGI::strong("Time Remaining: -# scalar(localtime($set->open_date())), -# CGI::br(),"\nTime limit : ", -# ($set->version_time_limit()/60), -# " minutes (must be completed by: ", -# scalar(localtime($set->due_date())), ")", CGI::br(), -# "The current time is ", scalar(localtime())), "\n\n"; } # this is a brutal hack to get a URL that won't require a proctor login if |
From: Gavin L. v. a. <we...@ma...> - 2005-12-21 23:24:16
|
Log Message: ----------- Gateway update: add a gateway.css style file for gateway styles Added Files: ----------- webwork2/htdocs/css: gateway.css Revision Data ------------- --- /dev/null +++ htdocs/css/gateway.css @@ -0,0 +1,60 @@ +/******************/ +/* gateway styles */ +/******************/ + +/* update margins to reflect missing left column */ +#breadcrumbs { margin-left: .5em } +#content { margin-left: .5em } +#footer { margin-left: .5em } + +div.gwMessage { background-color:#dddddd; color: black; } +div.gwTiming { + background-color:#ddddff; + color: black; + margin-top: 10px; + margin-bottom: 0px; +} +div.gwWarning { background-color:#ffffdd; color: black; } + +span.resultsWithError { background-color: #ffcccc; color: black; } +span.resultsWithoutError { background-color: #66ff99; color: black; } +div.gwCorrect { background-color: #66ff99; color: black; } +div.gwIncorrect { background-color: #ff9999; color: black; } + +div.gwProblem { + clear: both; + background-color: #E0E0E0; + color: black; + padding: 3px; + border: solid black 1px; +} +div.gwSoln { +/* background-color: #e0e0ff; */ + background-color: transparent; + color: black; +/* padding: 2px; */, +/* border: dashed black 1px; */ +} +div.gwSoln b { color: navy; } + +p.gwPreview { + font-size: smaller; + text-align: right; + margin-top: 0px; + margin-bottom: 0px; +} + +table.gwAttemptResults { + border-width: 0px; +} +table.gwAttemptResults td.label { + font-weight: bold; + background-color: transparent; + color: navy; +} +table.gwAttemptResults td.output { + padding: 2px; + border: solid black 1px; + background-color: #eeeeee; +} + |
From: Gavin L. v. a. <we...@ma...> - 2005-12-21 23:23:28
|
Log Message: ----------- Gateway update: add gateway.css stylesheet to gateway template Modified Files: -------------- webwork2/conf/templates/math: gateway.template Revision Data ------------- Index: gateway.template =================================================================== RCS file: /webwork/cvs/system/webwork2/conf/templates/math/gateway.template,v retrieving revision 1.1 retrieving revision 1.2 diff -Lconf/templates/math/gateway.template -Lconf/templates/math/gateway.template -u -r1.1 -r1.2 --- conf/templates/math/gateway.template +++ conf/templates/math/gateway.template @@ -5,12 +5,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <link rel="stylesheet" type="text/css" media="All" href="<!--#url type="webwork" name="htdocs"-->/css/math.css"/> <!-- [gateway] since the left-side menus are gone, don't indent the main content area --> -<style type="text/css"> - #breadcrumbs { margin-left: .5em } - #content { margin-left: .5em } - #footer { margin-left: .5em } - -</style> +<link rel="stylesheet" type="text/css" media="All" href="<!--#url type="webwork" name="htdocs"-->/css/gateway.css"/> <title><!--#path style="text" text=" : " textonly="1"--></title> <!--#head--> <script language="javascript" type="text/javascript"> |
From: Gavin L. v. a. <we...@ma...> - 2005-12-21 23:22:14
|
Log Message: ----------- Gateway update: add view_proctored_tests permission level and gateway_grace_period parameter to global.conf. view_proctored_tests will be used to determine if proctored tests by default appear in a students' problem_set_list. gateway_grace_period is the time after the actual time limit for the set that we will still grade it. Modified Files: -------------- webwork2/conf: global.conf.dist Revision Data ------------- Index: global.conf.dist =================================================================== RCS file: /webwork/cvs/system/webwork2/conf/global.conf.dist,v retrieving revision 1.159 retrieving revision 1.160 diff -Lconf/global.conf.dist -Lconf/global.conf.dist -u -r1.159 -r1.160 --- conf/global.conf.dist +++ conf/global.conf.dist @@ -493,6 +493,7 @@ change_email_address => "student", proctor_quiz => "proctor", + view_proctored_tests => "ta", view_multiple_sets => "ta", view_unopened_sets => "ta", @@ -618,6 +619,10 @@ # password. Come to think of it, why do we even have this?! #$debugPracticeUser = "practice666"; +# Option for gateway tests; $gatewayGracePeriod is the time in seconds +# after the official due date during which we'll still grade the test +$gatewayGracePeriod = 150; + ################################################################################ # PG subsystem options ################################################################################ |
From: Sam H. v. a. <we...@ma...> - 2005-12-21 18:13:25
|
Log Message: ----------- don't need this anymore Removed Files: ------------- webwork2/doc: webwork2.0pr1-errata Revision Data ------------- --- doc/webwork2.0pr1-errata +++ /dev/null @@ -1,10 +0,0 @@ -The location of the documentation about what to add to your Apache config is -non-obvious. It is located in lib/Apache/WeBWorK.pm. - -The Apache config documentation is missing the line - use lib '/opt/webwork/pglib'; -which should immediately follow the line - use lib '/opt/webwork/lib'; - -Line 86 of the file lib/WeBWorK/ContentGenerator/ProblemSet.pm should read - my $effectiveUser = $cldb->getUser($r->param("effectiveUser")); |
From: Sam H. v. a. <we...@ma...> - 2005-12-19 20:22:03
|
Log Message: ----------- make links() work better with new template, emit "courses" link even when not logged in. Modified Files: -------------- webwork2/lib/WeBWorK: ContentGenerator.pm Revision Data ------------- Index: ContentGenerator.pm =================================================================== RCS file: /webwork/cvs/system/webwork2/lib/WeBWorK/ContentGenerator.pm,v retrieving revision 1.160 retrieving revision 1.161 diff -Llib/WeBWorK/ContentGenerator.pm -Llib/WeBWorK/ContentGenerator.pm -u -r1.160 -r1.161 --- lib/WeBWorK/ContentGenerator.pm +++ lib/WeBWorK/ContentGenerator.pm @@ -73,7 +73,7 @@ ce => $r->ce(), # these three are here for db => $r->db(), # backward-compatability authz => $r->authz(), # with unconverted CGs - noContent => undef, # this should get clobbered at some point + noContent => undef, # FIXME this should get clobbered at some point }; bless $self, $class; return $self; @@ -495,7 +495,7 @@ my $urlpath = $r->urlpath; # we don't currently have any links to display if the user's not logged in. this may change, though. - return "" unless $authen and $authen->was_verified; + #return "" unless $authen->was_verified; # grab some interesting data from the request my $courseID = $urlpath->arg("courseID"); @@ -505,15 +505,17 @@ my $problemID = $urlpath->arg("problemID"); # it's possible that the setID and the problemID are invalid, since they're just taken from the URL path info - if (defined $setID and $db->getUserSet($eUserID, $setID)) { - if (defined $problemID and $db->getUserProblem($eUserID, $setID, $problemID)) { - # both set and poblem exist -- do nothing + if ($authen->was_verified) { + if (defined $setID and $db->getUserSet($eUserID, $setID)) { + if (defined $problemID and $db->getUserProblem($eUserID, $setID, $problemID)) { + # both set and poblem exist -- do nothing + } else { + $problemID = undef; + } } else { + $setID = undef; $problemID = undef; } - } else { - $setID = undef; - $problemID = undef; } # old method -- get rid of this after a while @@ -588,135 +590,137 @@ my %systemlink_args; $systemlink_args{params} = \%params if %params; - if (exists $ce->{webworkURLs}{bugReporter} and $ce->{webworkURLs}{bugReporter} ne "" - and $authz->hasPermissions($userID, "report_bugs")) { - print CGI::start_ul(); - print CGI::li(CGI::a({style=>"font-size:larger", href=>$ce->{webworkURLs}{bugReporter}}, "Report bugs")); - print CGI::end_ul(); - } - - #print CGI::start_ul(); - #print CGI::start_li(); # Courses - #print &$makelink("${pfx}Home", text=>"Courses", systemlink_args=>{authen=>0}); + print CGI::start_ul(); + print CGI::start_li(); # Courses + print &$makelink("${pfx}Home", text=>"Courses", systemlink_args=>{authen=>0}); if (defined $courseID) { #print CGI::start_ul(); #print CGI::start_li(); # $courseID #print CGI::strong(CGI::span({class=>"active"}, $courseID)); - print CGI::start_ul(); - print CGI::start_li(); # Homework Sets - print &$makelink("${pfx}ProblemSets", text=>"Homework Sets", urlpath_args=>{%args}, systemlink_args=>\%systemlink_args); - - if (defined $setID) { - print CGI::start_ul(); - print CGI::start_li(); # $setID - print &$makelink("${pfx}ProblemSet", text=>"$setID", urlpath_args=>{%args,setID=>$setID}, systemlink_args=>\%systemlink_args); - # FIXME i think we only want this if the problem set is not a gateway quiz - if (defined $problemID) { - print CGI::start_ul(); - print CGI::start_li(); # $problemID - print &$makelink("${pfx}Problem", text=>"Problem $problemID", urlpath_args=>{%args,setID=>$setID,problemID=>$problemID}, systemlink_args=>\%systemlink_args); - - print CGI::end_li(); # end $problemID - print CGI::end_ul(); - } - print CGI::end_li(); # end $setID - print CGI::end_ul(); - } - print CGI::end_li(); # end Homework Sets - - if ($authz->hasPermissions($userID, "change_password") or $authz->hasPermissions($userID, "change_email_address")) { - print CGI::li(&$makelink("${pfx}Options", urlpath_args=>{%args}, systemlink_args=>\%systemlink_args)); - } - - print CGI::li(&$makelink("${pfx}Grades", urlpath_args=>{%args}, systemlink_args=>\%systemlink_args)); - - if ($authz->hasPermissions($userID, "access_instructor_tools")) { - $pfx .= "Instructor::"; - - print CGI::start_li(); # Instructor Tools - print &$makelink("${pfx}Index", urlpath_args=>{%args}, systemlink_args=>\%systemlink_args); + if ($authen->was_verified) { print CGI::start_ul(); + print CGI::start_li(); # Homework Sets + print &$makelink("${pfx}ProblemSets", text=>"Homework Sets", urlpath_args=>{%args}, systemlink_args=>\%systemlink_args); - print CGI::li(&$makelink("${pfx}UserList", urlpath_args=>{%args}, systemlink_args=>\%systemlink_args)); - - print CGI::start_li(); # Homework Set Editor - print &$makelink("${pfx}ProblemSetList", urlpath_args=>{%args}, systemlink_args=>\%systemlink_args); if (defined $setID) { print CGI::start_ul(); print CGI::start_li(); # $setID - print &$makelink("${pfx}ProblemSetDetail", text=>"$setID", urlpath_args=>{%args,setID=>$setID}, systemlink_args=>\%systemlink_args); - + print &$makelink("${pfx}ProblemSet", text=>"$setID", urlpath_args=>{%args,setID=>$setID}, systemlink_args=>\%systemlink_args); + # FIXME i think we only want this if the problem set is not a gateway quiz if (defined $problemID) { print CGI::start_ul(); - print CGI::li(&$makelink("${pfx}PGProblemEditor", text=>"$problemID", urlpath_args=>{%args,setID=>$setID,problemID=>$problemID}, systemlink_args=>\%systemlink_args)); + print CGI::start_li(); # $problemID + print &$makelink("${pfx}Problem", text=>"Problem $problemID", urlpath_args=>{%args,setID=>$setID,problemID=>$problemID}, systemlink_args=>\%systemlink_args); + + print CGI::end_li(); # end $problemID print CGI::end_ul(); } - print CGI::end_li(); # end $setID print CGI::end_ul(); } - print CGI::end_li(); # end Homework Set Editor + print CGI::end_li(); # end Homework Sets + + if ($authz->hasPermissions($userID, "change_password") or $authz->hasPermissions($userID, "change_email_address")) { + print CGI::li(&$makelink("${pfx}Options", urlpath_args=>{%args}, systemlink_args=>\%systemlink_args)); + } - print CGI::li(&$makelink("${pfx}SetMaker", text=>"Library Browser", urlpath_args=>{%args}, systemlink_args=>\%systemlink_args)); + print CGI::li(&$makelink("${pfx}Grades", urlpath_args=>{%args}, systemlink_args=>\%systemlink_args)); - print CGI::start_li(); # Stats - print &$makelink("${pfx}Stats", urlpath_args=>{%args}, systemlink_args=>\%systemlink_args); - if ($userID ne $eUserID or defined $setID) { + if ($authz->hasPermissions($userID, "access_instructor_tools")) { + $pfx .= "Instructor::"; + + print CGI::start_li(); # Instructor Tools + print &$makelink("${pfx}Index", urlpath_args=>{%args}, systemlink_args=>\%systemlink_args); print CGI::start_ul(); - if ($userID ne $eUserID) { - print CGI::li(&$makelink("${pfx}Stats", text=>"$eUserID", urlpath_args=>{%args,statType=>"student",userID=>$eUserID}, systemlink_args=>\%systemlink_args)); - } + + print CGI::li(&$makelink("${pfx}UserList", urlpath_args=>{%args}, systemlink_args=>\%systemlink_args)); + + print CGI::start_li(); # Homework Set Editor + print &$makelink("${pfx}ProblemSetList", urlpath_args=>{%args}, systemlink_args=>\%systemlink_args); if (defined $setID) { - print CGI::li(&$makelink("${pfx}Stats", text=>"$setID", urlpath_args=>{%args,statType=>"set",setID=>$setID}, systemlink_args=>\%systemlink_args)); + print CGI::start_ul(); + print CGI::start_li(); # $setID + print &$makelink("${pfx}ProblemSetDetail", text=>"$setID", urlpath_args=>{%args,setID=>$setID}, systemlink_args=>\%systemlink_args); + + if (defined $problemID) { + print CGI::start_ul(); + print CGI::li(&$makelink("${pfx}PGProblemEditor", text=>"$problemID", urlpath_args=>{%args,setID=>$setID,problemID=>$problemID}, systemlink_args=>\%systemlink_args)); + print CGI::end_ul(); + } + + print CGI::end_li(); # end $setID + print CGI::end_ul(); } - print CGI::end_ul(); - } - print CGI::end_li(); # end Stats - - print CGI::start_li(); # Student Progress - print &$makelink("${pfx}StudentProgress", urlpath_args=>{%args}, systemlink_args=>\%systemlink_args); - if ($userID ne $eUserID or defined $setID) { - print CGI::start_ul(); - if ($userID ne $eUserID) { - print CGI::li(&$makelink("${pfx}StudentProgress", text=>"$eUserID", urlpath_args=>{%args,statType=>"student",userID=>$eUserID}, systemlink_args=>\%systemlink_args)); + print CGI::end_li(); # end Homework Set Editor + + print CGI::li(&$makelink("${pfx}SetMaker", text=>"Library Browser", urlpath_args=>{%args}, systemlink_args=>\%systemlink_args)); + + print CGI::start_li(); # Stats + print &$makelink("${pfx}Stats", urlpath_args=>{%args}, systemlink_args=>\%systemlink_args); + if ($userID ne $eUserID or defined $setID) { + print CGI::start_ul(); + if ($userID ne $eUserID) { + print CGI::li(&$makelink("${pfx}Stats", text=>"$eUserID", urlpath_args=>{%args,statType=>"student",userID=>$eUserID}, systemlink_args=>\%systemlink_args)); + } + if (defined $setID) { + print CGI::li(&$makelink("${pfx}Stats", text=>"$setID", urlpath_args=>{%args,statType=>"set",setID=>$setID}, systemlink_args=>\%systemlink_args)); + } + print CGI::end_ul(); } - if (defined $setID) { - print CGI::li(&$makelink("${pfx}StudentProgress", text=>"$setID", urlpath_args=>{%args,statType=>"set",setID=>$setID}, systemlink_args=>\%systemlink_args)); + print CGI::end_li(); # end Stats + + print CGI::start_li(); # Student Progress + print &$makelink("${pfx}StudentProgress", urlpath_args=>{%args}, systemlink_args=>\%systemlink_args); + if ($userID ne $eUserID or defined $setID) { + print CGI::start_ul(); + if ($userID ne $eUserID) { + print CGI::li(&$makelink("${pfx}StudentProgress", text=>"$eUserID", urlpath_args=>{%args,statType=>"student",userID=>$eUserID}, systemlink_args=>\%systemlink_args)); + } + if (defined $setID) { + print CGI::li(&$makelink("${pfx}StudentProgress", text=>"$setID", urlpath_args=>{%args,statType=>"set",setID=>$setID}, systemlink_args=>\%systemlink_args)); + } + print CGI::end_ul(); + } + print CGI::end_li(); # end Student Progress + + if ($authz->hasPermissions($userID, "score_sets")) { + print CGI::li(&$makelink("${pfx}Scoring", urlpath_args=>{%args}, systemlink_args=>\%systemlink_args)); + } + + if ($authz->hasPermissions($userID, "send_mail")) { + print CGI::li(&$makelink("${pfx}SendMail", urlpath_args=>{%args}, systemlink_args=>\%systemlink_args)); } + + if ($authz->hasPermissions($userID, "manage_course_files")) { + print CGI::li(&$makelink("${pfx}FileManager", urlpath_args=>{%args}, systemlink_args=>\%systemlink_args)); + } + + if ($authz->hasPermissions($userID, "manage_course_files")) { + print CGI::li(&$makelink("${pfx}Config", urlpath_args=>{%args}, systemlink_args=>\%systemlink_args)); + } + print CGI::end_ul(); - } - print CGI::end_li(); # end Student Progress - - if ($authz->hasPermissions($userID, "score_sets")) { - print CGI::li(&$makelink("${pfx}Scoring", urlpath_args=>{%args}, systemlink_args=>\%systemlink_args)); - } - - if ($authz->hasPermissions($userID, "send_mail")) { - print CGI::li(&$makelink("${pfx}SendMail", urlpath_args=>{%args}, systemlink_args=>\%systemlink_args)); - } - - if ($authz->hasPermissions($userID, "manage_course_files")) { - print CGI::li(&$makelink("${pfx}FileManager", urlpath_args=>{%args}, systemlink_args=>\%systemlink_args)); - } - - if ($authz->hasPermissions($userID, "manage_course_files")) { - print CGI::li(&$makelink("${pfx}Config", urlpath_args=>{%args}, systemlink_args=>\%systemlink_args)); - } + print CGI::end_li(); # end Instructor Tools + } # /* access_instructor_tools */ print CGI::end_ul(); - print CGI::end_li(); # end Instructor Tools - } - - print CGI::end_ul(); + } # /* was_verified */ #print CGI::end_li(); # end $courseID #print CGI::end_ul(); - } + } # /* defined $courseID */ - #print CGI::end_li(); # end Courses - #print CGI::end_ul(); + print CGI::end_li(); # end Courses + print CGI::end_ul(); + + if (exists $ce->{webworkURLs}{bugReporter} and $ce->{webworkURLs}{bugReporter} ne "" + and $authz->hasPermissions($userID, "report_bugs")) { + print CGI::start_ul(); + print CGI::li(CGI::a({style=>"font-size:larger", href=>$ce->{webworkURLs}{bugReporter}}, "Report bugs")); + print CGI::end_ul(); + } return ""; } |
From: Sam H. v. a. <we...@ma...> - 2005-12-19 20:21:38
|
Log Message: ----------- make siblings() work better with new template Modified Files: -------------- webwork2/lib/WeBWorK/ContentGenerator: Problem.pm ProblemSet.pm Revision Data ------------- Index: Problem.pm =================================================================== RCS file: /webwork/cvs/system/webwork2/lib/WeBWorK/ContentGenerator/Problem.pm,v retrieving revision 1.190 retrieving revision 1.191 diff -Llib/WeBWorK/ContentGenerator/Problem.pm -Llib/WeBWorK/ContentGenerator/Problem.pm -u -r1.190 -r1.191 --- lib/WeBWorK/ContentGenerator/Problem.pm +++ lib/WeBWorK/ContentGenerator/Problem.pm @@ -697,9 +697,9 @@ my $eUserID = $r->param("effectiveUser"); my @problemIDs = sort { $a <=> $b } $db->listUserProblems($eUserID, $setID); - print CGI::start_ul({class=>"LinksMenu"}); - print CGI::start_li(); - print CGI::span({style=>"font-size:larger"}, "Problems"); + #print CGI::start_ul({class=>"LinksMenu"}); + #print CGI::start_li(); + #print CGI::span({style=>"font-size:larger"}, "Problems"); print CGI::start_ul(); foreach my $problemID (@problemIDs) { @@ -713,8 +713,8 @@ } print CGI::end_ul(); - print CGI::end_li(); - print CGI::end_ul(); + #print CGI::end_li(); + #print CGI::end_ul(); return ""; } Index: ProblemSet.pm =================================================================== RCS file: /webwork/cvs/system/webwork2/lib/WeBWorK/ContentGenerator/ProblemSet.pm,v retrieving revision 1.67 retrieving revision 1.68 diff -Llib/WeBWorK/ContentGenerator/ProblemSet.pm -Llib/WeBWorK/ContentGenerator/ProblemSet.pm -u -r1.67 -r1.68 --- lib/WeBWorK/ContentGenerator/ProblemSet.pm +++ lib/WeBWorK/ContentGenerator/ProblemSet.pm @@ -141,9 +141,9 @@ ( defined($gs->published()) ? $gs->published() : 1 )} @setIDs; } - print CGI::start_ul({class=>"LinksMenu"}); - print CGI::start_li(); - print CGI::span({style=>"font-size:larger"}, "Homework Sets"); + #print CGI::start_ul({class=>"LinksMenu"}); + #print CGI::start_li(); + #print CGI::span({style=>"font-size:larger"}, "Homework Sets"); print CGI::start_ul(); # FIXME: setIDs contain no info on published/unpublished so unpublished sets are still printed @@ -170,8 +170,8 @@ #debug("Begin printing sets from getMergedSets()"); print CGI::end_ul(); - print CGI::end_li(); - print CGI::end_ul(); + #print CGI::end_li(); + #print CGI::end_ul(); return ""; } |
From: Sam H. v. a. <we...@ma...> - 2005-12-19 03:45:44
|
Log Message: ----------- removed cruft Modified Files: -------------- webwork2/lib/WeBWorK: Authen.pm Authz.pm webwork2/lib/WeBWorK/ContentGenerator: Home.pm Revision Data ------------- Index: Authz.pm =================================================================== RCS file: /webwork/cvs/system/webwork2/lib/WeBWorK/Authz.pm,v retrieving revision 1.23 retrieving revision 1.24 diff -Llib/WeBWorK/Authz.pm -Llib/WeBWorK/Authz.pm -u -r1.23 -r1.24 --- lib/WeBWorK/Authz.pm +++ lib/WeBWorK/Authz.pm @@ -155,6 +155,13 @@ my $ce = $r->ce; my $db = $r->db; + # this may need to be changed if we get other permission level data sources + return 0 unless defined $db; + + # this may need to be changed if we want to control what unauthenticated users + # can do with the permissions system + return 0 unless defined $userID and $userID ne ""; + my $PermissionLevel; my $cachedUserID = $self->{userID}; Index: Authen.pm =================================================================== RCS file: /webwork/cvs/system/webwork2/lib/WeBWorK/Authen.pm,v retrieving revision 1.48 retrieving revision 1.49 diff -Llib/WeBWorK/Authen.pm -Llib/WeBWorK/Authen.pm -u -r1.48 -r1.49 --- lib/WeBWorK/Authen.pm +++ lib/WeBWorK/Authen.pm @@ -110,6 +110,12 @@ # This block is here so we can "last" out of it when we've # decided whether we're going to succeed or fail. + # no database means no user/password/permission records + unless ($db) { + $failWithoutError = 1; + last VERIFY; + } + if ($login_practice_user) { # ignore everything else, find an unused practice user my $found = 0; @@ -298,7 +304,7 @@ # neither a key or a password were supplied. $error = "You must enter a password." - } + } # /* VERIFY */ # check for multiply defined users my @test_users = $r->param("user"); Index: Home.pm =================================================================== RCS file: /webwork/cvs/system/webwork2/lib/WeBWorK/ContentGenerator/Home.pm,v retrieving revision 1.12 retrieving revision 1.13 diff -Llib/WeBWorK/ContentGenerator/Home.pm -Llib/WeBWorK/ContentGenerator/Home.pm -u -r1.12 -r1.13 --- lib/WeBWorK/ContentGenerator/Home.pm +++ lib/WeBWorK/ContentGenerator/Home.pm @@ -29,9 +29,6 @@ use WeBWorK::Utils qw(readFile readDirectory); use WeBWorK::Utils::CourseManagement qw/listCourses/; -#sub loginstatus { "" } -#sub links { "" } -#sub options { "" }; sub info { my ($self) = @_; my $r = $self->r; |