From: Mike G. v. a. <we...@ma...> - 2005-12-03 21:21:17
|
Log Message: ----------- Modifying messages given when editing set detail. Also changed the way blank problems are handled in editor. You can save as or save a copy as Modified Files: -------------- webwork-modperl/lib/WeBWorK/ContentGenerator: Instructor.pm webwork-modperl/lib/WeBWorK/ContentGenerator/Instructor: PGProblemEditor.pm ProblemSetDetail.pm Revision Data ------------- Index: Instructor.pm =================================================================== RCS file: /webwork/cvs/system/webwork-modperl/lib/WeBWorK/ContentGenerator/Instructor.pm,v retrieving revision 1.51 retrieving revision 1.52 diff -Llib/WeBWorK/ContentGenerator/Instructor.pm -Llib/WeBWorK/ContentGenerator/Instructor.pm -u -r1.51 -r1.52 --- lib/WeBWorK/ContentGenerator/Instructor.pm +++ lib/WeBWorK/ContentGenerator/Instructor.pm @@ -547,15 +547,15 @@ my $message; if ($count == 0) { - $message = CGI::em("no users"); + $message = CGI::em("no students"); } elsif ($count == $numUsers) { - $message = "all users"; + $message = "all students"; } elsif ($count == 1) { - $message = "1 user"; + $message = "1 student"; } elsif ($count > $numUsers || $count < 0) { $message = CGI::em("an impossible number of users: $count out of $numUsers"); } else { - $message = "$count users"; + $message = "$count students out of $numUsers"; } return $message; Index: PGProblemEditor.pm =================================================================== RCS file: /webwork/cvs/system/webwork-modperl/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm,v retrieving revision 1.63 retrieving revision 1.64 diff -Llib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm -Llib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm -u -r1.63 -r1.64 --- lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm +++ lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm @@ -113,7 +113,7 @@ # save_to_new_file # -use constant ACTION_FORMS => [qw(view add_problem make_local_copy save save_as revert)]; #[qw(view save save_as revert add_problem add_header make_local_copy)]; +use constant ACTION_FORMS => [qw(view add_problem make_local_copy save save_as revert)]; #[qw(view save save_as revert add_problem add_header make_local_copy)]; # permissions needed to perform a given action use constant FORM_PERMS => { @@ -122,10 +122,12 @@ make_local_copy => "modify_student_data", save => "modify_student_data", save_as => "modify_student_data", +# rename => "modify_student_data", revert => "modify_student_data", }; - +our $BLANKPROBLEM = 'blankProblem.pg'; +# use constant BLANKPROBLEM => 'blankProblem.pg'; # doesn't work because this constant needs to be used inside a match. sub pre_header_initialize { my ($self) = @_; my $r = $self->r; @@ -351,7 +353,10 @@ $self->addbadmessage("This file '$inputFilePath' is protected! ".CGI::br()."To edit this text you must either 'Make a local copy' of this problem, or use 'Save As' to save it to another file."); } - + if ($inputFilePath =~/$BLANKPROBLEM$/) { + $self->addbadmessage("This file '$inputFilePath' is a blank problem! ".CGI::br()."To edit this text you must + use 'Save As' to save it to another file."); + } } @@ -1142,8 +1147,10 @@ sub save_form { my ($self, $onChange, %actionParams) = @_; my $r => $self->r; - if (-w $self->{editFilePath}) { - return "Save"; + if ($self->{editFilePath} =~ /$BLANKPROBLEM$/ ) { + return ""; #Can't save blank problems without changing names + } elsif (-w $self->{editFilePath}) { + return "Save"; } else { return ""; #"Can't save -- No write permission"; } @@ -1251,7 +1258,14 @@ sub save_as_form { my ($self, $onChange, %actionParams) = @_; - return "Save as [TMPL]/".CGI::textfield(-name=>'action.save_as.target_file', -size=>40, -value=>""),; + my $sourceFilePath = $self->{editFilePath}; + my $templatesPath = $self->r->ce->{courseDirs}->{templates}; + $sourceFilePath =~ s|^$templatesPath/||; # make sure path relative to templates directory + + return "Save ". + CGI::popup_menu(-name=>'action.save_as.saveMode', -values=>['rename','save_a_copy'], + -default=>'rename',-labels=>{rename=>' as ',save_a_copy=>'a copy to'} + ). ": [TMPL]/".CGI::textfield(-name=>'action.save_as.target_file', -size=>40, -value=>$sourceFilePath),; } @@ -1265,13 +1279,13 @@ my $problemSeed = $self->{problemSeed}; my $do_not_save = 0; + my $saveMode = $actionParams->{'action.save_as.saveMode'}->[0] || ''; my $new_file_name = $actionParams->{'action.save_as.target_file'}->[0] || ''; $new_file_name =~ s/^\s*//; #remove initial and final white space $new_file_name =~ s/\s*$//; if ( $new_file_name !~ /\S/) { # need a non-blank file name # setting $self->{failure} stops saving and any redirects $do_not_save = 1; - warn "new file name is $new_file_name"; $self->addbadmessage(CGI::p("Please specify a file to save to.")); last ACTION_CASES; #stop processing } @@ -1309,10 +1323,26 @@ $self->{inputFilePath} = ''; } - unless ($do_not_save ) { - $self->new_saveFileChanges($outputFilePath, \$problemContents); + $self->new_saveFileChanges($outputFilePath, \$problemContents); + my $sourceFilePath = $outputFilePath; + my $templatesPath = $self->r->ce->{courseDirs}->{templates}; + $sourceFilePath =~ s|^$templatesPath/||; # make sure path relative to templates directory + + if ($saveMode eq 'rename') { #save to new file + my $problemRecord = $self->r->db->getGlobalProblem($setName,$problemNumber); + $problemRecord->source_file($new_file_name); + if ( $self->r->db->putGlobalProblem($problemRecord) ) { + $self->addgoodmessage("The current source file for problem $problemNumber has been renamed to [TMPL]/$sourceFilePath.") ; + } else { + $self->addbadmessage("Unable to change the source file path for set $setName, problem $problemNumber. Unknown error."); + } + } elsif ($saveMode eq 'save_a_copy') { + $self->addgoodmessage("A new local, editable, copy of this problem has been created at [TMPL]/$sourceFilePath.") ; + } else { + $self->addbadmessage("Don't recognize saveMode: |$saveMode|. Unknown error."); + } } my $edit_level = $self->r->param("edit_level") || 0; $edit_level++; @@ -1321,9 +1351,19 @@ # Set up redirect # The redirect gives the server time to detect that the new file exists. ################################################# - my $problemPage = $self->r->urlpath->newFromModule("WeBWorK::ContentGenerator::Instructor::PGProblemEditor", - courseID => $courseName, setID => 'Undefined_Set', problemID => 'Undefined_Set' - ); + my $problemPage; + if ($saveMode eq 'save_a_copy' ) { + $problemPage = $self->r->urlpath->newFromModule("WeBWorK::ContentGenerator::Instructor::PGProblemEditor", + courseID => $courseName, setID => 'Undefined_Set', problemID => 'Undefined_Set' + ); + } elsif ($saveMode eq 'rename') { + $problemPage = $self->r->urlpath->newFromModule("WeBWorK::ContentGenerator::Instructor::PGProblemEditor", + courseID => $courseName, setID => $setName, problemID => $problemNumber + ); + + } else { + $self->addbadmessage("Don't recognize saveMode: |$saveMode|. Unknown error."); + } my $viewURL = $self->systemLink($problemPage, params=>{ sourceFilePath => $outputFilePath, #The path relative to the templates directory is required. @@ -1465,7 +1505,25 @@ $self->reply_with_redirect($viewURL); } +sub rename_form { + my ($self, $onChange, %actionParams) = @_; + my $problemPath = $self->{editFilePath}; + my $templatesDir = $self->r->ce->{courseDirs}->{templates}; + #warn "problemPath $problemPath $templatesDir"; + $problemPath =~ s|^$templatesDir/||; + return join("", + "Rename problem file to : [TMPL]/".CGI::textfield(-name=>'action.rename.target_file', -size=>40, -value=>$problemPath), + CGI::hidden(-name=>'action.make_local_copy.source_file', -value=>$self->{editFilePath} ), + ); + +} + +sub rename_handler { + my ($self, $genericParams, $actionParams, $tableParams) = @_; + $actionParams->{'action.make_local_copy.target_file'}->[0] = $actionParams->{'action.rename.target_file'}->[0]; + make_local_copy_handler($self, $genericParams, $actionParams, $tableParams); +} 1; Index: ProblemSetDetail.pm =================================================================== RCS file: /webwork/cvs/system/webwork-modperl/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm,v retrieving revision 1.25 retrieving revision 1.26 diff -Llib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm -Llib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm -u -r1.25 -r1.26 --- lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm +++ lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm @@ -67,6 +67,9 @@ # 1 => "Yes", # 0 => "No", # }, + +use constant BLANKPROBLEM => 'blankProblem.pg'; + use constant FIELD_PROPERTIES => { # Set information set_header => { @@ -807,18 +810,28 @@ ##################################################################### if (defined($r->param("add_blank_problem") ) and $r->param("add_blank_problem") == 1) { my $targetProblemNumber = 1+ WeBWorK::Utils::max( $self->r->db->listGlobalProblems($setID)); + ################################################## + # make local copy of the blankProblem + ################################################## my $blank_file_path = $ce->{webworkFiles}->{screenSnippets}->{blankProblem}; - my $new_file_path = $ce->{courseDirs}->{templates}."/set$setID/blank.pg"; + my $problemContents = WeBWorK::Utils::readFile($blank_file_path); + my $new_file_path = "set$setID/".BLANKPROBLEM(); + my $fullPath = WeBWorK::Utils::surePathToFile($ce->{courseDirs}->{templates},'/'.$new_file_path); + local(*TEMPFILE); + open(TEMPFILE, ">$fullPath") or warn "Can't write to file $fullPath"; + print TEMPFILE $problemContents; + close(TEMPFILE); + ################################################# # Update problem record ################################################# my $problemRecord = $self->addProblemToSet( setName => $setID, - sourceFile => $blank_file_path, + sourceFile => $new_file_path, problemID => $targetProblemNumber, #added to end of set ); $self->assignProblemToAllSetUsers($problemRecord); - $self->addgoodmessage("Added $blank_file_path to ". $setID. " as problem $targetProblemNumber") ; + $self->addgoodmessage("Added $new_file_path to ". $setID. " as problem $targetProblemNumber") ; } # Sets the specified header to "" so that the default file will get used. @@ -966,7 +979,7 @@ unshift @unassignedUsers, $ID; } } - @editForUser = @assignedUsers; + @editForUser = sort @assignedUsers; $r->param("editForUser", \@editForUser); if (scalar @editForUser && scalar @unassignedUsers) { @@ -987,7 +1000,7 @@ my $userToShow = $forUsers ? $editForUser[0] : $userID; my $userCount = $db->listUsers(); - my $setCount = $db->listGlobalSets() if $forOneUser; + my $setCount = $db->listGlobalSets(); # if $forOneUser; my $setUserCount = $db->countSetUsers($setID); my $userSetCount = $db->countUserSets($editForUser[0]) if $forOneUser; @@ -1013,12 +1026,43 @@ $setCountMessage = "The user $editForUser[0] has been assigned " . $setCountMessage . "." if $forOneUser; if ($forUsers) { - print CGI::p("$userCountMessage Editing user-specific overrides for ". CGI::b(join ", ", @editForUser)); - if ($forOneUser) { - print CGI::p($setCountMessage); - } + ############################################## + # calculate links for the users being edited: + ############################################## + my @userLinks = (); + foreach my $userID (@editForUser) { + my $u = $db->getUser($userID); + my $line = $u->last_name.", ".$u->first_name." ".$u->user_id." "; + my $editSetsAssignedToUserURL = $self->systemLink( + $urlpath->newFromModule( + "WeBWorK::ContentGenerator::Instructor::SetsAssignedToUser", + courseID => $courseID, userID => $u->user_id)); + $line .= CGI::a({href=>$editSetsAssignedToUserURL}, + $self->setCountMessage($db->countUserSets($u->user_id), $setCount)); + unshift @userLinks,$line; + } + @userLinks = sort @userLinks; + + print CGI::table({border=>2,cellpadding=>10}, + CGI::Tr( + CGI::td([ + "Editing problem set ".CGI::strong($setID)." data for these individual students:".CGI::br(). + CGI::strong(join CGI::br(), @userLinks), + CGI::a({href=>$setDetailURL },"Edit set ".CGI::strong($setID)." data for ALL students assigned to this set."), + + ]) + ) + ); } else { - print CGI::p($userCountMessage); + print CGI::table({border=>2,cellpadding=>10}, + CGI::Tr( + CGI::td([ + "This set ".CGI::strong($setID)." is assigned to ".$self->userCountMessage($setUserCount, $userCount).'.' , + 'Edit '.CGI::a({href=>$editUsersAssignedToSetURL},'individual versions '). "of set $setID.", + + ]) + ) + ); } # handle renumbering of problems if necessary @@ -1319,15 +1363,14 @@ CGI::br(); print CGI::input({type=>"submit", name=>"submit_changes", value=>"Save Changes"}); print CGI::input({type=>"submit", name=>"handle_numbers", value=>"Reorder problems only"}) . "(Any unsaved changes will be lost.)"; - print CGI::p(<<HERE); + print CGI::p(<<EOF); Any time problem numbers are intentionally changed, the problems will always be renumbered consecutively, starting from one. When deleting problems, gaps will be left in the numbering unless the box above is checked. -HERE - print CGI::p("It is before the open date. You probably want to renumber the problems if you are deleting some from the middle.") if ($setRecord->open_date>time()); - print CGI::p("When changing problem numbers, we will move - the problem to be ", CGI::em("before"), " the chosen number."); +EOF + print CGI::p("It is before the open date. You probably want to renumber the problems if you are deleting some from the middle.") if ($setRecord->open_date>time()); + print CGI::p("When changing problem numbers, we will move the problem to be ", CGI::em("before"), " the chosen number."); } else { print CGI::p(CGI::b("This set doesn't contain any problems yet.")); @@ -1336,7 +1379,7 @@ my $editNewProblemPage = $urlpath->new(type => 'instructor_problem_editor_withset_withproblem', args => { courseID => $courseID, setID => $setID, problemID =>'new_problem' }); my $editNewProblemLink = $self->systemLink($editNewProblemPage, params => { make_local_copy => 1, file_type => 'blank_problem' }); - print CGI::p( CGI::a({href=>$editNewProblemLink},'Edit'). 'a new blank problem'); + print CGI::p( CGI::a({href=>$editNewProblemLink},'Edit'). ' a new blank problem'); print CGI::end_form(); |