[system] / trunk / webwork2 / lib / WeBWorK / ContentGenerator / Instructor / ProblemSetEditor.pm Repository:
ViewVC logotype

View of /trunk/webwork2/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetEditor.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1005 - (download) (as text) (annotate)
Wed Jun 4 00:34:56 2003 UTC (9 years, 11 months ago) by malsyned
File size: 5676 byte(s)
I split the instructor's Problem List editor off into a seperate page,
and added links to that page from a few others.
-Dennis

    1 package WeBWorK::ContentGenerator::Instructor::ProblemSetEditor;
    2 use base qw(WeBWorK::ContentGenerator::Instructor);
    3 
    4 =head1 NAME
    5 
    6 WeBWorK::ContentGenerator::Instructor::ProblemSetEditor - Edit a set definition list
    7 
    8 =cut
    9 
   10 use strict;
   11 use warnings;
   12 use CGI qw();
   13 use WeBWorK::DB::Record::Problem;
   14 use WeBWorK::Utils qw(readFile formatDateTime parseDateTime list2hash readDirectory max);
   15 
   16 our $rowheight = 20;  #controls the length of the popup menus.
   17 our $libraryName;  #library directory name
   18 
   19 use constant SET_FIELDS => [qw(open_date due_date answer_date set_header problem_header)];
   20 use constant PROBLEM_FIELDS =>[qw(source_file value max_attempts)];
   21 use constant PROBLEM_USER_FIELDS => [qw(problem_seed status num_correct num_incorrect)];
   22 
   23 sub getSetName {
   24   my ($self, $pathSetName) = @_;
   25   if (ref $pathSetName eq "HASH") {
   26     $pathSetName = undef;
   27   }
   28   return $pathSetName;
   29 }
   30 
   31 # One wrinkle here: if $override is undefined, do the global thing, otherwise, it's truth value determines the checkbox.
   32 sub setRowHTML {
   33   my ($description, $fieldName, $fieldValue, $size, $override, $overrideValue) = @_;
   34 
   35   my $attributeHash = {type=>"text", name=>$fieldName, value=>$fieldValue};
   36   $attributeHash->{size} = $size if defined $size;
   37 
   38   my $html = CGI::td({}, [$description, CGI::input($attributeHash)]);
   39 
   40   if (defined $override) {
   41     $attributeHash->{name}="${fieldName}_override";
   42     $attributeHash->{value}=($override ? $overrideValue : "" );
   43 
   44     $html .= CGI::td({}, [
   45       CGI::checkbox({
   46         type=>"checkbox",
   47         name=>"override",
   48         label=>"override with:",
   49         value=>$fieldName,
   50         checked=>($override ? 1 : 0)
   51       }),
   52       CGI::input($attributeHash)
   53     ]);
   54   }
   55 
   56   return $html;
   57 
   58 }
   59 
   60 sub title {
   61   my ($self, @components) = @_;
   62   return "Problem Set Editor - ".$self->{ce}->{courseName}." : ".$self->getSetName(@components);
   63 }
   64 
   65 # Initialize does all of the form processing.  It's extensive, and could probably be cleaned up and
   66 # consolidated with a little abstraction.
   67 sub initialize {
   68   my ($self, @components) = @_;
   69   my $r = $self->{r};
   70   my $db = $self->{db};
   71   my $ce = $self->{ce};
   72   my $setName = $self->getSetName(@components);
   73   my $setRecord = $db->getGlobalSet($setName);
   74   my @editForUser = $r->param('editForUser');
   75   # some useful booleans
   76   my $forUsers = scalar(@editForUser);
   77   my $forOneUser = $forUsers == 1;
   78 
   79   # build a quick lookup table
   80   my %overrides = list2hash $r->param('override');
   81 
   82   # The set form was submitted
   83   if (defined($r->param('submit_set_changes'))) {
   84     foreach (@{SET_FIELDS()}) {
   85       if (defined($r->param($_))) {
   86         if (m/_date$/) {
   87           $setRecord->$_(parseDateTime($r->param($_)));
   88         } else {
   89           $setRecord->$_($r->param($_));
   90         }
   91       }
   92     }
   93     $db->putGlobalSet($setRecord);
   94     if ($forOneUser) {
   95 
   96       my $userSetRecord = $db->getUserSet($editForUser[0], $setName);
   97       foreach my $field (@{SET_FIELDS()}) {
   98         if (defined $r->param("${field}_override")) {
   99           if (exists $overrides{$field}) {
  100             if ($field =~ m/_date$/) {
  101               $userSetRecord->$field(parseDateTime($r->param("${field}_override")));
  102             } else {
  103               $userSetRecord->$field($r->param("${field}_override"));
  104             }
  105           } else {
  106             $userSetRecord->$field(undef);
  107           }
  108 
  109           $db->putUserSet($userSetRecord);
  110         }
  111       }
  112     }
  113   }
  114 }
  115 
  116 
  117 sub body {
  118   my ($self, @components) = @_;
  119   my $r = $self->{r};
  120   my $db = $self->{db};
  121   my $ce = $self->{ce};
  122   my $courseName = $ce->{courseName};
  123   my $setName = $self->getSetName(@components);
  124   my $setRecord = $db->getGlobalSet($setName);
  125   my @editForUser = $r->param('editForUser');
  126   # some useful booleans
  127   my $forUsers = scalar(@editForUser);
  128   my $forOneUser = $forUsers == 1;
  129 
  130   ## Set Form ##
  131   my $userSetRecord;
  132   my %overrideArgs;
  133   if ($forOneUser) {
  134     $userSetRecord = $db->getUserSet($editForUser[0], $setName);
  135     foreach my $field (@{SET_FIELDS()}) {
  136       $overrideArgs{$field} = [defined $userSetRecord->$field, ($field =~ /_date$/ ? formatDateTime($userSetRecord->$field) : $userSetRecord->$field)];
  137     }
  138   } else {
  139     foreach my $field (@{SET_FIELDS()}) {
  140       $overrideArgs{$field} = [undef, undef];
  141     }
  142   }
  143 
  144   print CGI::h2({}, "Set Data"), "\n";
  145   print CGI::start_form({method=>"post", action=>$r->uri}), "\n";
  146   print CGI::table({},
  147     CGI::Tr({}, [
  148       setRowHTML("Open Date:", "open_date", formatDateTime($setRecord->open_date), undef, @{$overrideArgs{open_date}})."\n",
  149       setRowHTML("Due Date:", "due_date", formatDateTime($setRecord->due_date), undef, @{$overrideArgs{due_date}})."\n",
  150       setRowHTML("Answer Date:", "answer_date", formatDateTime($setRecord->answer_date), undef, @{$overrideArgs{answer_date}})."\n",
  151       setRowHTML("Set Header:", "set_header", $setRecord->set_header, undef, @{$overrideArgs{set_header}})."\n",
  152       setRowHTML("Problem Header:", "problem_header", $setRecord->problem_header, undef, @{$overrideArgs{problem_header}})."\n"
  153     ])
  154   );
  155 
  156   print $self->hiddenEditForUserFields(@editForUser);
  157   print $self->hidden_authen_fields;
  158   print CGI::input({type=>"submit", name=>"submit_set_changes", value=>"Save Set"});
  159   print CGI::end_form();
  160 
  161   my $problemCount = $db->listGlobalProblems($setName);
  162   print CGI::h2({}, "Problems"), "\n";
  163   print CGI::p({}, "This set contains $problemCount problem" . ($problemCount == 1 ? "" : "s").".");
  164   print CGI::a({href=>$r->uri."problems/?".$self->url_authen_args}, "Edit the list of problems in this set");
  165 
  166   my $userCount = $db->listUsers;
  167   my $usersOfSet = $db->listSetUsers($setName);
  168   print CGI::h2({}, "Users"), "\n";
  169   print CGI::p({}, "This set is assigned to ".$self->userCountMessage($usersOfSet, $userCount).".");
  170   print CGI::a({href=>$r->uri."users/?".$self->url_authen_args}, "Determine who this set is assigned to");
  171 
  172   return "";
  173 }
  174 
  175 1;

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9