Parent Directory
|
Revision Log
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 |