--- trunk/webwork-modperl/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm 2004/03/04 21:05:58 1841 +++ trunk/webwork-modperl/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm 2004/03/23 22:59:53 1924 @@ -1,7 +1,7 @@ ################################################################################ # WeBWorK Online Homework Delivery System # Copyright © 2000-2003 The WeBWorK Project, http://openwebwork.sf.net/ -# $CVSHeader: webwork-modperl/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm,v 1.24 2004/01/25 18:20:14 gage Exp $ +# $CVSHeader: webwork-modperl/lib/WeBWorK/ContentGenerator/Instructor/PGProblemEditor.pm,v 1.25 2004/03/04 21:05:58 sh002i Exp $ # # This program is free software; you can redistribute it and/or modify it under # the terms of either: (a) the GNU General Public License as published by the @@ -30,181 +30,259 @@ use WeBWorK::Utils qw(readFile); use Apache::Constants qw(:common REDIRECT); +########################################################### +# This editor will edit problem files or set header files or files, such as course_info +# whose name is defined in the global.conf database +# +# Only files under the template directory ( or linked to this location) can be edited. +# +# The course information and problems are located in the course templates directory. +# Course information has the name defined by courseFiles->{course_info} +# +# Only files under the template directory ( or linked to this location) can be edited. +# +# editMode = temporaryFile (view the temp file defined by course_info.txt.user_name.tmp +# instead of the file course_info.txt) +# The editFileSuffix is "user_name.tmp" by default. It's definition should be moved to Instructor.pm #FIXME +########################################################### -our $libraryName; -our $rowheight; - -sub title { - my $self = shift; - #FIXME don't need the entire path ?? - return "Instructor Tools - PG Problem Editor "; -} - -sub header { #FIXME this should be moved up to ContentGenerator - my $self = shift; - return REDIRECT if $self->{noContent}; - my $r = $self->{r}; - $r->content_type('text/html'); - $r->send_http_header(); - return OK; -} - - ########################################################### - # This editor will edit problem files or set header files or files, such as course_info - # whose name is defined in the global.conf database - # - # Only files under the template directory ( or linked to this location) can be edited. - # - # The course information and problems are located in the course templates directory. - # Course information has the name defined by courseFiles->{course_info} - # - # Only files under the template directory ( or linked to this location) can be edited. - # - # editMode = temporaryFile (view the temp file defined by course_info.txt.user_name.tmp - # instead of the file course_info.txt) - # The editFileSuffix is "user_name.tmp" by default. It's definition should be moved to Instructor.pm #FIXME - ########################################################### +#our $libraryName; +#our $rowheight; sub pre_header_initialize { - my $self = shift; - #my ($setName, $problemNumber) = @_; - my $r = $self->{r}; - my $setName = $r->urlpath->arg("setID"); - my $problemNumber = $r->urlpath->arg("problemID"); - my $ce = $self->{ce}; - my $submit_button = $r->param('submit'); # obtain submit command from form - - ##################################################### - # Save problem to permanent or temporary file - # Then redirect for viewing - ##################################################### - if ( defined($submit_button) and ($submit_button eq 'Save' or $submit_button eq 'Refresh') ) { - - $self->saveFileChanges($setName,$problemNumber); # write the necessary files - # return file path for viewing problem - # in $self->{currentSourceFilePath} - # obtain the appropriate seed. - #redirect to view the problem - - my $hostname = $r->hostname(); - my $port = $r->get_server_port(); - my $uri = $r->uri; - my $courseName = $self->{ce}->{courseName}; - my $problemSeed = ($r->param('problemSeed')) ? $r->param('problemSeed') : ''; - my $displayMode = ($r->param('displayMode')) ? $r->param('displayMode') : ''; - my $viewURL = ''; - if ($self->{file_type} eq 'problem') { - # redirect to have problem read by Problem.pm - $viewURL = "http://$hostname:$port"; - $viewURL .= $ce->{webworkURLs}->{root}."/$courseName/$setName/$problemNumber/?"; - $viewURL .= $self->url_authen_args; - $viewURL .= "&displayMode=$displayMode&problemSeed=$problemSeed"; # optional displayMode and problemSeed overrides - if ($submit_button eq 'Save') { - $viewURL .= "&editMode=savedFile"; - } else { - $viewURL .= "&editMode=temporaryFile"; - } - $viewURL .= '&sourceFilePath='. $self->{currentSourceFilePath}; # path to pg text for viewing - # allows Problem.pg to recognize state - # of problem being viewed. - } elsif ($self->{file_type} eq 'set_header') { - # redirect set headers to ProblemList page - $viewURL = "http://$hostname:$port"; - $viewURL .= $ce->{webworkURLs}->{root}."/$courseName/$setName/?"; - $viewURL .= $self->url_authen_args; - $viewURL .= "&displayMode=$displayMode&problemSeed=$problemSeed"; # optional displayMode and problemSeed overrides - if ($submit_button eq 'Save') { - $viewURL .= "&editMode=savedFile"; - } else { - $viewURL .= "&editMode=temporaryFile"; - } - } elsif ($self->{file_type} eq 'course_info' ) { - $viewURL = "http://$hostname:$port"; - $viewURL .= $ce->{webworkURLs}->{root}."/$courseName/?"; - $viewURL .= $self->url_authen_args; - if ($submit_button eq 'Save') { - $viewURL .= "&editMode=savedFile"; - } else { - $viewURL .= "&editMode=temporaryFile"; - } + my ($self) = @_; + my $r = $self->r; + my $ce = $r->ce; + my $urlpath = $r->urlpath; + + my $submit_button = $r->param('submit'); # obtain submit command from form + + # Save problem to permanent or temporary file, then redirect for viewing + if (defined($submit_button) and ($submit_button eq 'Save' or $submit_button eq 'Refresh')) { + my $setName = $r->urlpath->arg("setID"); + my $problemNumber = $r->urlpath->arg("problemID"); + + # write the necessary files + # return file path for viewing problem in $self->{currentSourceFilePath} + # obtain the appropriate seed + $self->saveFileChanges($setName, $problemNumber); + + ##### calculate redirect URL based on file type ##### + + # get some information + #my $hostname = $r->hostname(); + #my $port = $r->get_server_port(); + #my $uri = $r->uri; + my $courseName = $urlpath->arg("courseID"); + my $problemSeed = ($r->param('problemSeed')) ? $r->param('problemSeed') : ''; + my $displayMode = ($r->param('displayMode')) ? $r->param('displayMode') : ''; + + my $viewURL = ''; + + # problems redirect to Problem.pm + $self->{file_type} eq 'problem' and do { + my $problemPage = $urlpath->newFromModule("WeBWorK::ContentGenerator::Problem", + courseID => $courseName, setID => $setName, problemID => $problemNumber); + $viewURL = $self->systemLink($problemPage, + params => { + displayMode => $displayMode, + problemSeed => $problemSeed, + editMode => ($submit_button eq "Save" ? "savedFile" : "temporaryFile"), + sourceFilePath => $self->{currentSourceFilePath}, + } + ); + }; + + # set headers redirect to ProblemSet.pm + $self->{file_type} eq 'set_header' and do { + my $problemSetPage = $urlpath->newFromModule("WeBWorK::ContentGenerator::ProblemSet", + courseID => $courseName, setID => $setName); + $viewURL = $self->systemLink($problemSetPage, + params => { + displayMode => $displayMode, + problemSeed => $problemSeed, + editMode => ($submit_button eq "Save" ? "savedFile" : "temporaryFile"), + } + ); + }; + + # course info redirects to ProblemSets.pm + $self->{file_type} eq 'course_info' and do { + my $problemSetsPage = $urlpath->newFromModule("WeBWorK::ContentGenerator::ProblemSets", + courseID => $courseName); + $viewURL = $self->systemLink($problemSetsPage, + params => { + editMode => ($submit_button eq "Save" ? "savedFile" : "temporaryFile"), + } + ); + }; + + if ($viewURL) { + $self->reply_with_redirect($viewURL); } else { - warn "PGProblemEditor does not have facilities for editing files with file_type ".$self->{file_type}; + die "Invalid file_type ", $self->{file_type}, " specified by saveFileChanges"; } - - $r->header_out(Location => $viewURL ); - $self->{noContent} = 1; # forces redirect - return; } - } sub initialize { - my $self = shift; - my $r = $self->{r}; + my ($self) = @_; + my $r = $self->r; + my $setName = $r->urlpath->arg("setID"); my $problemNumber = $r->urlpath->arg("problemID"); - $self -> saveFileChanges($setName, $problemNumber); + + # if we got to initialize(), then saveFileChanges was not called in pre_header_initialize(). + # therefore we call it here: + $self->saveFileChanges($setName, $problemNumber); +} +sub body { + my ($self) = @_; + my $r = $self->r; + my $db = $r->db; + my $ce = $r->ce; + + # Gathering info + my $editFilePath = $self->{problemPath}; # path to the permanent file to be edited + my $inputFilePath = $self->{inputFilePath}; # path to the file currently being worked with (might be a .tmp file) + + my $header = CGI::i("Editing problem: $inputFilePath"); + + ######################################################################### + # Find the text for the problem, either in the tmp file, if it exists + # or in the original file in the template directory + ######################################################################### + + my $problemContents = ${$self->{r_problemContents}}; + + ######################################################################### + # Format the page + ######################################################################### + + # Define parameters for textarea + # FIXME + # Should the seed be set from some particular user instance?? + # The mode list should be obtained from global.conf ultimately + my $rows = 20; + my $columns = 80; + my $mode_list = ['plainText','formattedText','images']; + my $displayMode = $self->{displayMode}; + my $problemSeed = $self->{problemSeed}; + my $uri = $r->uri; + + return CGI::p($header), + #CGI::start_form("POST",$r->uri,-target=>'_problem'), doesn't pass on the target parameter??? + # THIS IS BECAUSE TARGET IS NOT A PARAMETER OF