Parent Directory
|
Revision Log
Revision 1533 - (view) (download) (as text)
| 1 : | sh002i | 1533 | #!/usr/bin/env perl |
| 2 : | sam | 2 | |
| 3 : | ## $Id$ | ||
| 4 : | |||
| 5 : | #################################################################### | ||
| 6 : | # Copyright @ 1995-1998 University of Rochester | ||
| 7 : | # All Rights Reserved | ||
| 8 : | #################################################################### | ||
| 9 : | |||
| 10 : | |||
| 11 : | ## This file is profChangeDates.pl | ||
| 12 : | ## It provides access to utilities for building, correcting and viewing problem sets | ||
| 13 : | ## | ||
| 14 : | |||
| 15 : | |||
| 16 : | gage | 8 | use lib '.'; use webworkInit; # WeBWorKInitLine |
| 17 : | sam | 2 | require 5.001; |
| 18 : | use strict; | ||
| 19 : | |||
| 20 : | |||
| 21 : | use Global; | ||
| 22 : | use Auth; | ||
| 23 : | use TimeLocal; | ||
| 24 : | use CGI qw(:standard); | ||
| 25 : | |||
| 26 : | |||
| 27 : | # Timing code | ||
| 28 : | use Benchmark; | ||
| 29 : | my $beginTime = new Benchmark; | ||
| 30 : | # end Timing code | ||
| 31 : | |||
| 32 : | # variables global to this file | ||
| 33 : | my ($setNumber,$setHeaderFileName,$probHeaderFileName,$dueDate,$openDate,$answerDate,$problemListref,$problemValueListref,$problemAttemptLimitListref); | ||
| 34 : | my (@problemList,@problemValueList,@problemAttemptLimitList); | ||
| 35 : | |||
| 36 : | apizer | 1322 | my $cgi = new CGI; |
| 37 : | my %inputs = $cgi->Vars(); | ||
| 38 : | sam | 2 | |
| 39 : | my ($classID, $fileName); | ||
| 40 : | |||
| 41 : | # establish environment for this script | ||
| 42 : | |||
| 43 : | my $Course = $inputs{'course'}; | ||
| 44 : | &Global::getCourseEnvironment($Course); | ||
| 45 : | |||
| 46 : | |||
| 47 : | my $cgiURL = getWebworkCgiURL($Course); | ||
| 48 : | my $courseScriptsDirectory = getCourseScriptsDirectory($Course); | ||
| 49 : | my $databaseDirectory = getCourseDatabaseDirectory($Course); | ||
| 50 : | my $htmlURL = getCourseHtmlURL($Course); | ||
| 51 : | my $scriptDirectory = getWebworkScriptDirectory($Course); | ||
| 52 : | my $templateDirectory = getCourseTemplateDirectory; | ||
| 53 : | |||
| 54 : | require "${scriptDirectory}$Global::DBglue_pl"; | ||
| 55 : | require "${scriptDirectory}$Global::FILE_pl"; | ||
| 56 : | require "${scriptDirectory}$Global::HTMLglue_pl"; | ||
| 57 : | apizer | 1316 | require "${scriptDirectory}$Global::classlist_DBglue_pl"; |
| 58 : | sam | 2 | |
| 59 : | my $updateMethod =$inputs{'updateMethod'}; | ||
| 60 : | |||
| 61 : | # log access | ||
| 62 : | &Global::log_info('', query_string); | ||
| 63 : | |||
| 64 : | &webDatePage; | ||
| 65 : | |||
| 66 : | # begin Timing code | ||
| 67 : | my $endTime = new Benchmark; | ||
| 68 : | &Global::logTimingInfo($beginTime,$endTime,"profChangeDates.pl",$inputs{'course'},$inputs{'course'}); | ||
| 69 : | # end Timing code | ||
| 70 : | exit; | ||
| 71 : | |||
| 72 : | #####################################END###################################### | ||
| 73 : | |||
| 74 : | sub webDatePage { | ||
| 75 : | # verify the identity of the user. | ||
| 76 : | my $keyFile = &Global::getCourseKeyFile($inputs{'course'}); | ||
| 77 : | &verify_key($inputs{'user'}, $inputs{'key'}, "$keyFile", $inputs{'course'}); | ||
| 78 : | my $permissionsFile = &Global::getCoursePermissionsFile($inputs{'course'}); | ||
| 79 : | my $permissions = &get_permissions($inputs{'user'}, $permissionsFile); | ||
| 80 : | if ($permissions != $Global::instructor_permissions ) { | ||
| 81 : | print "permissions = $permissions instructor_permissions= $Global::instructor_permissions\n"; | ||
| 82 : | print &html_NO_PERMISSION; | ||
| 83 : | exit(0); | ||
| 84 : | } | ||
| 85 : | |||
| 86 : | apizer | 1322 | |
| 87 : | sam | 2 | if ($inputs{'pCD'}==1) { |
| 88 : | print &htmlTOP("Change Open/Due/Answer Date: Page 2"); | ||
| 89 : | # print navigation buttons | ||
| 90 : | print qq! | ||
| 91 : | <A HREF="${cgiURL}profLogin.pl?user=$inputs{'user'}&key=$inputs{'key'}&course=$inputs{'course'}"> | ||
| 92 : | <IMG SRC="${Global::upImgUrl}" align="right" BORDER=1 ALT="[Up]"></A><p> | ||
| 93 : | !; | ||
| 94 : | $setNumber=$inputs{'setNo'}; | ||
| 95 : | &printForms($setNumber); | ||
| 96 : | print &htmlBOTTOM("profChangeDates.pl", \%inputs); | ||
| 97 : | } | ||
| 98 : | |||
| 99 : | else { | ||
| 100 : | |||
| 101 : | print &htmlTOP("Change Open/Due/Answer Date: Page 3"); | ||
| 102 : | # print navigation buttons | ||
| 103 : | print qq! | ||
| 104 : | <A HREF="${cgiURL}profLogin.pl?user=$inputs{'user'}&key=$inputs{'key'}&course=$inputs{'course'}"> | ||
| 105 : | <IMG SRC="${Global::upImgUrl}" align="right" BORDER=1 ALT="[Up]"></A><p> | ||
| 106 : | !; | ||
| 107 : | if ($inputs{'dateMode'} eq 'READWRITE') { | ||
| 108 : | &changeDates(); | ||
| 109 : | &sendBack; | ||
| 110 : | } | ||
| 111 : | else { | ||
| 112 : | print '<H2>Read only mode, no changes made </H2>'; | ||
| 113 : | print 'Go back and select Read/Write mode if you want to save changes.'; | ||
| 114 : | &sendBack; | ||
| 115 : | } | ||
| 116 : | print &htmlBOTTOM("profChangeDates.pl", \%inputs); | ||
| 117 : | } | ||
| 118 : | } | ||
| 119 : | |||
| 120 : | sub printForms { | ||
| 121 : | my ($setNumber) = @_; | ||
| 122 : | print qq!<FORM method="post" action="profChangeDates.pl">\n!; | ||
| 123 : | &printChangeOpenForm(&findOpenDateForSet($setNumber)); | ||
| 124 : | &printChangeDueForm( &findDueDateForSet($setNumber)); | ||
| 125 : | &printChangeAnswerForm(&findAnswerDateForSet($setNumber)); | ||
| 126 : | |||
| 127 : | &printChangeSetHeaderFileForm(&findSetHeaderFileForSet($setNumber)); | ||
| 128 : | &printChangeProbHeaderFileForm(&findProbHeaderFileForSet($setNumber)); | ||
| 129 : | |||
| 130 : | |||
| 131 : | print qq! | ||
| 132 : | <TABLE><TR>\n<TD> | ||
| 133 : | apizer | 885 | <input type=hidden name="dateMode" value="READWRITE">\n |
| 134 : | sam | 2 | </TD><TD> |
| 135 : | apizer | 885 | <input type=submit value="Make the Above Changes">\n |
| 136 : | sam | 2 | </TD></TR></TABLE>\n |
| 137 : | <input type=hidden name="pCD" value=2>\n | ||
| 138 : | <input type=hidden name="setNo" value=$setNumber>\n | ||
| 139 : | !; | ||
| 140 : | print &sessionKeyInputs(\%inputs); | ||
| 141 : | print "</FORM>\n"; | ||
| 142 : | |||
| 143 : | &printChangeProblemFileNamesForm(); | ||
| 144 : | |||
| 145 : | |||
| 146 : | } | ||
| 147 : | |||
| 148 : | |||
| 149 : | sub changeDates { | ||
| 150 : | my $newOpenDate=$inputs{'openDate'}; | ||
| 151 : | my $newDueDate=$inputs{'dueDate'}; | ||
| 152 : | my $newAnswerDate=$inputs{'ansDate'}; | ||
| 153 : | my $newSetHeaderFile = stripWhiteSpace($inputs{'setHeaderFile'}); | ||
| 154 : | my $newProbHeaderFile = stripWhiteSpace($inputs{'probHeaderFile'}); | ||
| 155 : | |||
| 156 : | my $time1 = &unformatDateAndTime($newOpenDate); | ||
| 157 : | my $time2 = &unformatDateAndTime($newDueDate); | ||
| 158 : | my $time3 = &unformatDateAndTime($newAnswerDate); | ||
| 159 : | if ($time2 < $time1 or $time3 < $time2) { | ||
| 160 : | &Global::error('Dates not in chronological order', "The open date: $newOpenDate, | ||
| 161 : | due date: $newDueDate, and answer date: $newAnswerDate must be in chronologicasl order."); | ||
| 162 : | } | ||
| 163 : | |||
| 164 : | my $setNumber=$inputs{'setNo'}; | ||
| 165 : | |||
| 166 : | changeDatesAndHeaderFiles($setNumber,$newOpenDate,$newDueDate,$newAnswerDate,$newSetHeaderFile,$newProbHeaderFile); | ||
| 167 : | |||
| 168 : | } | ||
| 169 : | |||
| 170 : | sub findOpenDateForSet { | ||
| 171 : | my ($setNumber) = @_; | ||
| 172 : | my (@probSetKeys)=&getAllProbSetKeysForSet($setNumber); | ||
| 173 : | &attachProbSetRecord($probSetKeys[0]); | ||
| 174 : | &detachProbSetRecord($probSetKeys[0]); | ||
| 175 : | &formatDateAndTime( &getOpenDate($probSetKeys[0])); | ||
| 176 : | } | ||
| 177 : | |||
| 178 : | sub printChangeOpenForm { | ||
| 179 : | my ( $prettyOldOpenDate) = @_; | ||
| 180 : | apizer | 1322 | |
| 181 : | sam | 2 | print <<EOF; |
| 182 : | <H3 ALIGN ="CENTER">Class Identification: $inputs{'course'}</H3> | ||
| 183 : | apizer | 1322 | Use this form to makes changes for all students in a course. To make changes |
| 184 : | sam | 2 | for an individual student go back and use "Examine or change individual problem set for:" |
| 185 : | |||
| 186 : | <HR SIZE =2> | ||
| 187 : | <H3> Change opening and closing dates for set number $setNumber</H3> | ||
| 188 : | Please enter the new dates in the following format:<BR>6/28/96 at | ||
| 189 : | 9:59 AM (June 28, 1996 at 9:59 AM)<p> | ||
| 190 : | |||
| 191 : | apizer | 1322 | Select the method you want to use. |
| 192 : | If you have given some students an extension and do not want to override those changes, select the second method. | ||
| 193 : | <br> | ||
| 194 : | Check the check box and select section(s) if you only want want to change dates for students in certain sections.<p> | ||
| 195 : | <INPUT TYPE=RADIO NAME='updateMethod' VALUE='all' > New dates for all (selected) students.<BR> | ||
| 196 : | sam | 2 | <INPUT TYPE=RADIO NAME='updateMethod' VALUE='some' CHECKED> |
| 197 : | apizer | 1316 | New dates only if the new date extends the student\'s current date. |
| 198 : | <BR> | ||
| 199 : | <INPUT TYPE='CHECKBOX' NAME='bySection' VALUE='1'> | ||
| 200 : | apizer | 1322 | |
| 201 : | Change dates only for students in these section(s): | ||
| 202 : | EOF | ||
| 203 : | # Current Sections list | ||
| 204 : | |||
| 205 : | print qq! <SELECT Name = 'selectedSections' Size =3 multiple>\n!; | ||
| 206 : | my @sorted_section_names = sort keys (%{getAllSections()}); | ||
| 207 : | for my $ind (@sorted_section_names) { | ||
| 208 : | print "<OPTION VALUE = \"$ind\">$ind\n"; | ||
| 209 : | } | ||
| 210 : | print qq!</SELECT>\n!; | ||
| 211 : | |||
| 212 : | print <<EOF; | ||
| 213 : | apizer | 1316 | <P> |
| 214 : | sam | 2 | |
| 215 : | The current openDate is | ||
| 216 : | apizer | 885 | ${prettyOldOpenDate}. |
| 217 : | sam | 2 | |
| 218 : | apizer | 885 | Make <input type="text" size=20 maxlength=20 name="openDate" |
| 219 : | value="$prettyOldOpenDate"> the new openDate.<p> | ||
| 220 : | sam | 2 | |
| 221 : | EOF | ||
| 222 : | } | ||
| 223 : | |||
| 224 : | sub findDueDateForSet { | ||
| 225 : | my (@probSetKeys)=&getAllProbSetKeysForSet($setNumber); | ||
| 226 : | &attachProbSetRecord($probSetKeys[0]); | ||
| 227 : | &detachProbSetRecord($probSetKeys[0]); | ||
| 228 : | &formatDateAndTime( &getDueDate($probSetKeys[0])); | ||
| 229 : | } | ||
| 230 : | |||
| 231 : | sub printChangeDueForm { | ||
| 232 : | my ( $prettyOldDueDate) = @_; | ||
| 233 : | print <<EOF; | ||
| 234 : | |||
| 235 : | |||
| 236 : | apizer | 885 | <p> The current DueDate is ${prettyOldDueDate}. |
| 237 : | sam | 2 | |
| 238 : | apizer | 885 | Make <input type="text" size=20 maxlength=20 name="dueDate" |
| 239 : | value="$prettyOldDueDate"> the new DueDate.<p> | ||
| 240 : | sam | 2 | |
| 241 : | EOF | ||
| 242 : | } | ||
| 243 : | |||
| 244 : | sub findAnswerDateForSet { | ||
| 245 : | my (@probSetKeys)=&getAllProbSetKeysForSet($setNumber); | ||
| 246 : | &attachProbSetRecord($probSetKeys[0]); | ||
| 247 : | &detachProbSetRecord($probSetKeys[0]); | ||
| 248 : | &formatDateAndTime( &getAnswerDate($probSetKeys[0])); | ||
| 249 : | } | ||
| 250 : | |||
| 251 : | sub printChangeAnswerForm { | ||
| 252 : | my ( $prettyOldAnswerDate) = @_; | ||
| 253 : | print <<EOF; | ||
| 254 : | |||
| 255 : | |||
| 256 : | apizer | 885 | <p> The current AnswerDate is ${prettyOldAnswerDate}. |
| 257 : | sam | 2 | |
| 258 : | apizer | 885 | Make <input type="text" size=20 maxlength=20 name="ansDate" |
| 259 : | value="$prettyOldAnswerDate"> the new AnswerDate.<p> | ||
| 260 : | sam | 2 | |
| 261 : | EOF | ||
| 262 : | } | ||
| 263 : | |||
| 264 : | sub changeDatesAndHeaderFiles { | ||
| 265 : | my ($setNumber,$newOpenDate,$newDueDate,$newAnswerDate,$newSetHeaderFileName,$newProbHeaderFileName) = @_; | ||
| 266 : | |||
| 267 : | apizer | 1322 | my $newOpenDateTime = &unformatDateAndTime($newOpenDate); |
| 268 : | my $newDueDateTime = &unformatDateAndTime($newDueDate); | ||
| 269 : | my $newAnswerDateTime = &unformatDateAndTime($newAnswerDate); | ||
| 270 : | sam | 2 | |
| 271 : | apizer | 1322 | my $oldOpenDateTime; |
| 272 : | my $oldDueDateTime; | ||
| 273 : | my $oldAnswerDateTime; | ||
| 274 : | sam | 2 | |
| 275 : | apizer | 1322 | my @probSetKeys=&getAllProbSetKeysForSet($setNumber); |
| 276 : | my $probSetKey; | ||
| 277 : | sam | 2 | |
| 278 : | apizer | 1322 | # |
| 279 : | # change Davide Cevone's selection method | ||
| 280 : | # | ||
| 281 : | my ($studentID, $section); | ||
| 282 : | my @sections = $cgi -> param('selectedSections'); | ||
| 283 : | my %selected_sections =(); | ||
| 284 : | foreach my $sec (@sections) { | ||
| 285 : | $selected_sections{$sec} = 1; | ||
| 286 : | } | ||
| 287 : | my $count = 0; | ||
| 288 : | |||
| 289 : | |||
| 290 : | sam | 2 | foreach $probSetKey (@probSetKeys) { |
| 291 : | &attachProbSetRecord($probSetKey); | ||
| 292 : | |||
| 293 : | apizer | 1316 | # |
| 294 : | apizer | 1322 | # DPVC -- check for selected sections. Further modified by AKP |
| 295 : | apizer | 1316 | # |
| 296 : | if ($inputs{'bySection'}) { | ||
| 297 : | $studentID = getStudentLogin($probSetKey); | ||
| 298 : | attachCLRecord($studentID); | ||
| 299 : | $section = CL_getClassSection($studentID); | ||
| 300 : | apizer | 1322 | unless ($selected_sections{$section}) { |
| 301 : | apizer | 1316 | next; |
| 302 : | } | ||
| 303 : | $count++; | ||
| 304 : | } | ||
| 305 : | # | ||
| 306 : | # End DPVC | ||
| 307 : | # | ||
| 308 : | |||
| 309 : | sam | 2 | if ($updateMethod eq 'all') { |
| 310 : | &putOpenDate($newOpenDateTime,$probSetKey); | ||
| 311 : | &putDueDate($newDueDateTime,$probSetKey); | ||
| 312 : | &putAnswerDate($newAnswerDateTime,$probSetKey); | ||
| 313 : | } | ||
| 314 : | else { | ||
| 315 : | $oldOpenDateTime = &getOpenDate($probSetKey); | ||
| 316 : | &putOpenDate($newOpenDateTime,$probSetKey) unless ($oldOpenDateTime > $newOpenDateTime); | ||
| 317 : | |||
| 318 : | $oldDueDateTime = &getDueDate($probSetKey); | ||
| 319 : | &putDueDate($newDueDateTime,$probSetKey) unless ($oldDueDateTime > $newDueDateTime); | ||
| 320 : | |||
| 321 : | $oldAnswerDateTime = &getAnswerDate($probSetKey); | ||
| 322 : | &putAnswerDate($newAnswerDateTime,$probSetKey) unless ($oldAnswerDateTime > $newAnswerDateTime); | ||
| 323 : | } | ||
| 324 : | &putSetHeaderFileName( $newSetHeaderFileName,$probSetKey); | ||
| 325 : | &putProbHeaderFileName( $newProbHeaderFileName,$probSetKey); | ||
| 326 : | |||
| 327 : | &detachProbSetRecord($probSetKey); | ||
| 328 : | } | ||
| 329 : | |||
| 330 : | print "<BR><BR>The new open date is now set to: $newOpenDate for all students\n"; | ||
| 331 : | print "except if their original open date was later than $newOpenDate\n" unless ($updateMethod eq 'all'); | ||
| 332 : | print "<HR><BR>\n"; | ||
| 333 : | |||
| 334 : | print "The new due date is now set to: $newDueDate for all students\n"; | ||
| 335 : | print "except if their original due date was later than $newDueDate\n" unless ($updateMethod eq 'all'); | ||
| 336 : | print "<HR><BR>\n"; | ||
| 337 : | |||
| 338 : | print "The new answer date is now set to: $newAnswerDate for all students\n"; | ||
| 339 : | print "except if their original answer date was later than $newAnswerDate\n" unless ($updateMethod eq 'all'); | ||
| 340 : | print "<HR><BR>\n"; | ||
| 341 : | |||
| 342 : | print "The new Paper HeaderFile is: $newSetHeaderFileName \n"; | ||
| 343 : | print "<HR><BR>\n"; | ||
| 344 : | |||
| 345 : | print "The new Screen HeaderFile is: $newProbHeaderFileName \n"; | ||
| 346 : | print "<HR><BR>\n"; | ||
| 347 : | |||
| 348 : | apizer | 1316 | # |
| 349 : | apizer | 1322 | # DPVC -- for when selected sections are used |
| 350 : | apizer | 1316 | # |
| 351 : | apizer | 1322 | print "<CENTER><B>The above changes have been made for $count students in the selected section(s).</B></CENTER><BR>\n<HR><BR>\n" |
| 352 : | apizer | 1316 | if ($inputs{'bySection'}); |
| 353 : | # | ||
| 354 : | # End DPVC | ||
| 355 : | # | ||
| 356 : | |||
| 357 : | sam | 2 | } |
| 358 : | |||
| 359 : | |||
| 360 : | |||
| 361 : | sub findSetHeaderFileForSet { | ||
| 362 : | my ($setNumber) = @_; | ||
| 363 : | my (@probSetKeys)=&getAllProbSetKeysForSet($setNumber); | ||
| 364 : | &attachProbSetRecord($probSetKeys[0]); | ||
| 365 : | my $setHeaderFileName = &getSetHeaderFileName($probSetKeys[0]); | ||
| 366 : | $setHeaderFileName; | ||
| 367 : | } | ||
| 368 : | sub findProbHeaderFileForSet { | ||
| 369 : | my ($setNumber) = @_; | ||
| 370 : | my (@probSetKeys)=&getAllProbSetKeysForSet($setNumber); | ||
| 371 : | &attachProbSetRecord($probSetKeys[0]); | ||
| 372 : | my $probHeaderFileName = &getProbHeaderFileName($probSetKeys[0]); | ||
| 373 : | $probHeaderFileName; | ||
| 374 : | } | ||
| 375 : | sub printChangeSetHeaderFileForm { | ||
| 376 : | my ( $oldSetHeaderFileName) = @_; | ||
| 377 : | $oldSetHeaderFileName = "" unless defined($oldSetHeaderFileName); | ||
| 378 : | print <<EOF; | ||
| 379 : | |||
| 380 : | <H3> Change the Paper and Screen HeaderFiles for set number $setNumber</H3> | ||
| 381 : | apizer | 885 | The current Paper HeaderFile is ${oldSetHeaderFileName}. |
| 382 : | sam | 2 | |
| 383 : | apizer | 885 | Make <input type="text" size=30 maxlength=50 name="setHeaderFile" |
| 384 : | value="$oldSetHeaderFileName"> the new SetHeaderFile.<p> | ||
| 385 : | sam | 2 | |
| 386 : | EOF | ||
| 387 : | } | ||
| 388 : | |||
| 389 : | sub printChangeProbHeaderFileForm { | ||
| 390 : | my ( $oldProbHeaderFileName) = @_; | ||
| 391 : | $oldProbHeaderFileName = "" unless defined $oldProbHeaderFileName; | ||
| 392 : | print <<EOF; | ||
| 393 : | |||
| 394 : | apizer | 885 | The current Screen HeaderFile is ${oldProbHeaderFileName}. |
| 395 : | sam | 2 | |
| 396 : | apizer | 885 | Make <input type="text" size=30 maxlength=50 name="probHeaderFile" |
| 397 : | value="$oldProbHeaderFileName"> the new ProbHeaderFile.<p> | ||
| 398 : | sam | 2 | |
| 399 : | EOF | ||
| 400 : | } | ||
| 401 : | |||
| 402 : | sub changeSetHeaderFile { | ||
| 403 : | my ($newSetHeaderFileName,$setNumber) = @_; | ||
| 404 : | my @probSetKeys=&getAllProbSetKeysForSet($setNumber); | ||
| 405 : | my $probSetKey; | ||
| 406 : | foreach $probSetKey (@probSetKeys){ | ||
| 407 : | &attachProbSetRecord($probSetKey); | ||
| 408 : | &deleteSetHeaderFileName($probSetKey); | ||
| 409 : | &putSetHeaderFileName( $newSetHeaderFileName,$probSetKey); | ||
| 410 : | &detachProbSetRecord($probSetKey); | ||
| 411 : | } | ||
| 412 : | &attachProbSetRecord($probSetKeys[0]); | ||
| 413 : | $newSetHeaderFileName = &getSetHeaderFileName($probSetKeys[0]); | ||
| 414 : | print "The new Paper HeaderFile is: $newSetHeaderFileName \n"; | ||
| 415 : | print "_"x80 . "\n"; | ||
| 416 : | &detachProbSetRecord($probSetKeys[0]); | ||
| 417 : | } | ||
| 418 : | sub changeProbHeaderFile { | ||
| 419 : | my ($newProbHeaderFileName,$setNumber) = @_; | ||
| 420 : | my @probSetKeys=&getAllProbSetKeysForSet($setNumber); | ||
| 421 : | my $probSetKey; | ||
| 422 : | foreach $probSetKey (@probSetKeys){ | ||
| 423 : | &attachProbSetRecord($probSetKey); | ||
| 424 : | &deleteProbHeaderFileName($probSetKey); | ||
| 425 : | &putProbHeaderFileName( $newProbHeaderFileName,$probSetKey); | ||
| 426 : | &detachProbSetRecord($probSetKey); | ||
| 427 : | } | ||
| 428 : | &attachProbSetRecord($probSetKeys[0]); | ||
| 429 : | $newProbHeaderFileName = &getProbHeaderFileName($probSetKeys[0]); | ||
| 430 : | print "The new Screen HeaderFile is: $newProbHeaderFileName \n"; | ||
| 431 : | print "_"x80 . "\n"; | ||
| 432 : | &detachProbSetRecord($probSetKeys[0]); | ||
| 433 : | } | ||
| 434 : | |||
| 435 : | |||
| 436 : | |||
| 437 : | sub sendBack { | ||
| 438 : | print <<EOF; | ||
| 439 : | <p> | ||
| 440 : | <A HREF="${cgiURL}profLogin.pl?user=$inputs{'user'}&key=$inputs{'key'}&course=$inputs{'course'}"> | ||
| 441 : | <IMG SRC="$Global::upImgUrl" BORDER=1></A> | ||
| 442 : | EOF | ||
| 443 : | } | ||
| 444 : | |||
| 445 : | |||
| 446 : | |||
| 447 : | sub printChangeProblemFileNamesForm { | ||
| 448 : | |||
| 449 : | jj | 535 | my $delete_cached_images = 0; ## if problems are deleted or reseeded, this will mess up |
| 450 : | sam | 2 | ## the chached latex2html image. We keep track of this so |
| 451 : | ## we can delete them. | ||
| 452 : | |||
| 453 : | # Update the database if needed | ||
| 454 : | if ( ( defined( $inputs{'FileNameEditMode'}) && $inputs{'FileNameEditMode'} eq "ReadWrite" ) | ||
| 455 : | || | ||
| 456 : | ( defined( $inputs{'AddNewProblem'}) && $inputs{'AddNewProblem'} eq "Add" ) ) | ||
| 457 : | { | ||
| 458 : | |||
| 459 : | # get list of changed problems submitted by the form | ||
| 460 : | my $i; | ||
| 461 : | my @changedProblems; | ||
| 462 : | foreach $i ( grep(/ProblemFileName/, keys %inputs) ) { | ||
| 463 : | |||
| 464 : | if ( $i =~ /^ProblemFileName(.+)$/ ) { | ||
| 465 : | push(@changedProblems, $1); | ||
| 466 : | } | ||
| 467 : | if ($inputs{'AddNewProblem'} eq "Add" ) { | ||
| 468 : | if ( $i =~ /^NewProblemFileName(.+)$/ ) { | ||
| 469 : | my $label = $1; | ||
| 470 : | # file name cannot be blank and cannot contain a question mark. | ||
| 471 : | if ($inputs{"NewProblemFileName$label"} =~/\w+/ && not $inputs{"NewProblemFileName$label"} =~/\?/) { | ||
| 472 : | push(@changedProblems, $label) ; | ||
| 473 : | $inputs{"ProblemFileName$label"}=$inputs{"NewProblemFileName$label"}; | ||
| 474 : | $inputs{"ProblemValue$label"}=$inputs{"NewProblemValue$label"}; | ||
| 475 : | } | ||
| 476 : | } | ||
| 477 : | } | ||
| 478 : | } | ||
| 479 : | |||
| 480 : | ############################## | ||
| 481 : | ### Later this program assumes that the problem numbers in @changedProblems are in ascending order, | ||
| 482 : | ### but the validity of this assumption depends on whether the hash %inputs | ||
| 483 : | ### preserves the order of the form variables; in particular, do the keys | ||
| 484 : | ### ProblemFileName1, ProblemFileName2, ..., ProblemFileName(N), NewProblemFileName(N+1), etc., | ||
| 485 : | ### occur in that order in the array keys %inputs . | ||
| 486 : | ### On harper.ucs.indiana.edu, which is a Sun running Sun OS 5.7, | ||
| 487 : | ### the keys do not necessarily occur in increasing order of the problem number. | ||
| 488 : | ### For short hashes, they do. But for long hashes, they usually do not, and that causes | ||
| 489 : | ### this program to fail. So we must have the line below to insure | ||
| 490 : | ### that @changedProblems is ordered in ascending order. | ||
| 491 : | ############################# | ||
| 492 : | @changedProblems = sort {$a <=> $b} @changedProblems; | ||
| 493 : | ############################### | ||
| 494 : | |||
| 495 : | |||
| 496 : | my $psvn; | ||
| 497 : | my @psvn = &getAllProbSetKeysForSet($setNumber); | ||
| 498 : | apizer | 153 | srand(time); |
| 499 : | sam | 2 | foreach $psvn (@psvn) { |
| 500 : | &attachProbSetRecord($psvn); | ||
| 501 : | my $num =1; | ||
| 502 : | apizer | 153 | # srand(time); ## Move this out of the loop as per Zig's suggestion. |
| 503 : | ## Otherwise many students get the same seed - AKP | ||
| 504 : | sam | 2 | foreach $i (@changedProblems) { |
| 505 : | |||
| 506 : | ## chech if we should delete cached l2h images | ||
| 507 : | jj | 496 | if ( (defined( $inputs{"problem{$i}ReSeed"}) and ($inputs{"problem{$i}ReSeed"} eq "on")) or |
| 508 : | (defined( $inputs{"problem{$i}Delete"}) and ($inputs{"problem{$i}Delete"} eq "on"))) { | ||
| 509 : | jj | 535 | $delete_cached_images = 1; |
| 510 : | sam | 2 | } |
| 511 : | |||
| 512 : | #ReadWrite | ||
| 513 : | #save seed (or define it) | ||
| 514 : | my $seed = &getProblemSeed($i,$psvn); | ||
| 515 : | unless (defined($seed) ){ | ||
| 516 : | print STDERR "profChangeDates.pl: Seed for problem $i is not defined<BR>"; | ||
| 517 : | $seed = int( rand(5000) ); | ||
| 518 : | } | ||
| 519 : | |||
| 520 : | #save | ||
| 521 : | my ($filename, $status, $attempted, $pvalue, $maxNumOfIncorrectAttempts); | ||
| 522 : | $filename = &getProblemFileName( $i,$psvn); | ||
| 523 : | $attempted = &getProblemAttempted( $i,$psvn); | ||
| 524 : | $status = &getProblemStatus( $i,$psvn); | ||
| 525 : | $pvalue = &getProblemValue( $i,$psvn); | ||
| 526 : | $maxNumOfIncorrectAttempts = &getProblemMaxNumOfIncorrectAttemps( $i,$psvn); | ||
| 527 : | |||
| 528 : | # delete problem names and values | ||
| 529 : | &deleteProblemFileName( $i,$psvn); | ||
| 530 : | &deleteProblemAttempted( $i,$psvn); | ||
| 531 : | &deleteProblemStatus( $i,$psvn); | ||
| 532 : | &deleteProblemValue( $i,$psvn); | ||
| 533 : | &deleteProblemMaxNumOfIncorrectAttemps( $i,$psvn); | ||
| 534 : | &deleteProblemSeed( $i,$psvn); | ||
| 535 : | # recreate problem using saved seed | ||
| 536 : | jj | 496 | unless (defined( $inputs{"problem{$i}Delete"}) && $inputs{"problem{$i}Delete"} eq "on" ) { |
| 537 : | sam | 2 | |
| 538 : | if ($inputs{"ProblemFileName$i"} =~ /\w+/) {$filename = stripWhiteSpace($inputs{"ProblemFileName$i"});} | ||
| 539 : | &putProblemFileName($filename , $num,$psvn); | ||
| 540 : | |||
| 541 : | if ($inputs{"ProblemAttempted$i"} =~ /\w+/) {$attempted = stripWhiteSpace($inputs{"ProblemAttempted$i"});} | ||
| 542 : | &putProblemAttempted($attempted, $num,$psvn); | ||
| 543 : | |||
| 544 : | if ($inputs{"ProblemStatus$i"} =~ /\w+/) {$status = stripWhiteSpace($inputs{"ProblemStatus$i"});} | ||
| 545 : | &putProblemStatus($status, $num,$psvn); | ||
| 546 : | |||
| 547 : | if ($inputs{"ProblemValue$i"} =~ /\w+/) {$pvalue = stripWhiteSpace($inputs{"ProblemValue$i"});} | ||
| 548 : | &putProblemValue($pvalue, $num,$psvn); | ||
| 549 : | |||
| 550 : | if ($inputs{"ProblemMaxNumOfIncorrectAttemps$i"} =~ /\w+/) {$maxNumOfIncorrectAttempts = stripWhiteSpace($inputs{"ProblemMaxNumOfIncorrectAttemps$i"});} | ||
| 551 : | &putProblemMaxNumOfIncorrectAttemps($maxNumOfIncorrectAttempts, $num,$psvn); | ||
| 552 : | |||
| 553 : | &putProblemSeed( $seed,$num,$psvn); | ||
| 554 : | |||
| 555 : | # Reseed if requested | ||
| 556 : | jj | 496 | if (( defined( $inputs{"problem{$i}ReSeed"}) && $inputs{"problem{$i}ReSeed"} eq "on") |
| 557 : | # But not if we are deleting | ||
| 558 : | and not ( defined( $inputs{"problem{$i}Delete"}) && $inputs{"problem{$i}Delete"} eq "on")) { | ||
| 559 : | sam | 2 | $seed = int( rand(5000) ); |
| 560 : | &putProblemSeed( $seed , $num,$psvn); | ||
| 561 : | print "Seed changed for problem number $num, psvn $psvn<BR>\n"; | ||
| 562 : | } | ||
| 563 : | $num++; | ||
| 564 : | } | ||
| 565 : | |||
| 566 : | |||
| 567 : | } | ||
| 568 : | &detachProbSetRecord($psvn); | ||
| 569 : | } | ||
| 570 : | } # end of updating database | ||
| 571 : | |||
| 572 : | jj | 496 | ## remove l2h images if necessary |
| 573 : | sam | 2 | |
| 574 : | jj | 535 | if ($delete_cached_images) { |
| 575 : | sam | 2 | my $l2hDir = getCoursel2hDirectory(); |
| 576 : | system ("rm -rf ${l2hDir}set$setNumber"); | ||
| 577 : | print "\n<BR>deleting Latex2html tmp files and the directory:<BR>\n"; | ||
| 578 : | print " ${l2hDir}set$setNumber<BR>"; | ||
| 579 : | jj | 535 | # Now delete dvipng images |
| 580 : | $l2hDir = getCourseTempDirectory()."png/"; | ||
| 581 : | system ("rm -rf ${l2hDir}$setNumber"); | ||
| 582 : | print "\n<BR>deleting dvipng tmp files and the directory:<BR>\n"; | ||
| 583 : | print " ${l2hDir}$setNumber<BR>\n"; | ||
| 584 : | sam | 2 | } |
| 585 : | |||
| 586 : | |||
| 587 : | # print a new form | ||
| 588 : | print qq!<HR NOSHADE>\n | ||
| 589 : | <FORM method="post" action="profChangeDates.pl"> | ||
| 590 : | !; | ||
| 591 : | print &sessionKeyInputs(\%inputs); | ||
| 592 : | if (defined( $inputs{"FileNameEditMode"}) && $inputs{"FileNameEditMode"} eq "ReadWrite") { | ||
| 593 : | apizer | 885 | print "<FONT COLOR='#ff00aa'> CHANGES SAVED FOR SET $setNumber</font><BR>"; |
| 594 : | sam | 2 | } elsif ( defined( $inputs{'AddNewProblem'}) && $inputs{'AddNewProblem'} eq "Add" ) { |
| 595 : | print "Problems added to SET $setNumber<BR>"; | ||
| 596 : | } elsif ( defined( $inputs{"FileNameEditMode"}) && $inputs{"FileNameEditMode"} eq "ReadOnly") { | ||
| 597 : | apizer | 885 | print "<FONT COLOR='#ff00aa'> ReadOnly mode -- <B>NO</B> CHANGES SAVED FOR SET $setNumber</font><BR>"; |
| 598 : | sam | 2 | } |
| 599 : | my @psvn = &getAllProbSetKeysForSet($setNumber); | ||
| 600 : | |||
| 601 : | print qq! | ||
| 602 : | <INPUT TYPE="HIDDEN" NAME="pCD" VALUE="1">\n | ||
| 603 : | <INPUT TYPE="HIDDEN" NAME="setNo" VALUE="$setNumber">\n | ||
| 604 : | |||
| 605 : | <H3>Change problem file names, status, etc. for set $setNumber:</H3>\n | ||
| 606 : | |||
| 607 : | <H4>If a Filename, "Attempted", "Status", "Value", or "MaxAttmp" cell is left blank, the corresponding | ||
| 608 : | apizer | 885 | individualized current values in the database will be maintained. If a value is |
| 609 : | entered, that value will be used for every student's problem.<p>\n | ||
| 610 : | Valid values for "Attempted" | ||
| 611 : | are: 0 (not attempted) or 1.<br>\n | ||
| 612 : | Valid values for "Status" are numbers in the range [0,1] where 0 represents | ||
| 613 : | no credit and 1 full crefit.<br>\n | ||
| 614 : | To give all students full credit for a problem, enter 1 in both the "Attempted" and "Status" cells. <br> | ||
| 615 : | Valid values for "Value" are | ||
| 616 : | non-negative decimal numbers with 1 (1 point) being the most common.<br>\n | ||
| 617 : | Valid values for "MaxAttmp" | ||
| 618 : | are -1 and non-negative integers where -1 means allow unlimited attempts.<p>\n | ||
| 619 : | To see the actual data for any student, go back and use | ||
| 620 : | "Modify set for Student:" | ||
| 621 : | sam | 2 | </H4>\n |
| 622 : | |||
| 623 : | apizer | 885 | <TABLE><TR><TD> |
| 624 : | <INPUT TYPE=RADIO NAME="FileNameEditMode" VALUE="ReadOnly" CHECKED>Disable "Save Problem Changes Below" button.\n | ||
| 625 : | </TD></TR><TR><TD> | ||
| 626 : | <INPUT TYPE=RADIO NAME="FileNameEditMode" VALUE="ReadWrite" >Enable "Save Problem Changes Below" button.\n | ||
| 627 : | </TD></TR><TR><TD> | ||
| 628 : | <INPUT TYPE=SUBMIT VALUE="Save Problem Changes Below"><p>\n | ||
| 629 : | </TD></TR></TABLE> | ||
| 630 : | |||
| 631 : | sam | 2 | <TABLE BORDER="1" CELLPADDING="1" CELLSPACING="2" >\n |
| 632 : | !; | ||
| 633 : | #Re-establish the order of problems from database -- they may have changed. | ||
| 634 : | my $psvn = $psvn[0]; | ||
| 635 : | my $Mode = defined($inputs{'mode'}) ? $inputs{'mode'} : "HTML"; | ||
| 636 : | my $User = $inputs{'user'}; | ||
| 637 : | my $Key = $inputs{'key'}; | ||
| 638 : | &attachProbSetRecord($psvn); | ||
| 639 : | my @problems = sort {$a <=> $b} &getAllProblemsForProbSetRecord($psvn); | ||
| 640 : | |||
| 641 : | |||
| 642 : | # print table listing problems | ||
| 643 : | my $i; | ||
| 644 : | foreach $i (@problems) { | ||
| 645 : | print "<TR>"; | ||
| 646 : | print &formatHeaderCell( qq! | ||
| 647 : | <A HREF="${Global::processProblem_CGI}?probSetKey=$psvn&probNum=$i&Mode=$Mode&course=$Course&user=$User&key=$Key" TARGET="VIEW_PROBLEM"> | ||
| 648 : | Problem $i</A> | ||
| 649 : | ! | ||
| 650 : | ); | ||
| 651 : | print &formatHeaderCell( "Attempted"); | ||
| 652 : | print &formatHeaderCell( "Status"); | ||
| 653 : | print &formatHeaderCell( "Value"); | ||
| 654 : | print &formatHeaderCell( "MaxAttmp"); | ||
| 655 : | print &formatHeaderCell( "Delete" ); | ||
| 656 : | print &formatHeaderCell( "ReSeed" ); | ||
| 657 : | print "</TR>"; | ||
| 658 : | |||
| 659 : | |||
| 660 : | print "<TR>"; | ||
| 661 : | |||
| 662 : | print &formatDataCell( "ProblemFileName$i" , &getProblemFileName($i,$psvn),"50" ); | ||
| 663 : | print &formatDataCell( "ProblemAttempted$i" , '' ,"1"); | ||
| 664 : | print &formatDataCell( "ProblemStatus$i" ,'' ,"5"); | ||
| 665 : | print &formatDataCell( "ProblemValue$i" ,'' ,"5"); | ||
| 666 : | print &formatDataCell( "ProblemMaxNumOfIncorrectAttemps$i" , '' ,"4"); | ||
| 667 : | jj | 496 | print & formatCheckboxButtonCell( "problem{$i}Delete", "5", ""); |
| 668 : | print & formatCheckboxButtonCell( "problem{$i}ReSeed", "5", ""); | ||
| 669 : | sam | 2 | |
| 670 : | print "</TR>"; | ||
| 671 : | |||
| 672 : | } | ||
| 673 : | |||
| 674 : | print qq! | ||
| 675 : | </TABLE>\n | ||
| 676 : | <HR NOSHADE> | ||
| 677 : | <H3>Add problem file names for set $setNumber</H3>\n | ||
| 678 : | Off <INPUT TYPE="RADIO" NAME="AddNewProblem" VALUE="Off" CHECKED> \n | ||
| 679 : | Add <INPUT TYPE="RADIO" NAME="AddNewProblem" VALUE="Add"> \n | ||
| 680 : | <INPUT TYPE=SUBMIT VALUE="Add File Names to Set"><p>\n | ||
| 681 : | <TABLE BORDER="1" CELLPADDING="1" CELLSPACING="2" >\n | ||
| 682 : | !; | ||
| 683 : | # print table new listing problems | ||
| 684 : | foreach $i (101,102) { | ||
| 685 : | print "<TR>"; | ||
| 686 : | print &formatHeaderCell( "New File $i"); | ||
| 687 : | print &formatHeaderCell( "Attempted"); | ||
| 688 : | print &formatHeaderCell( "Status"); | ||
| 689 : | print &formatHeaderCell( "Value"); | ||
| 690 : | print &formatHeaderCell( "MaxAttmp"); | ||
| 691 : | print "</TR>\n"; | ||
| 692 : | |||
| 693 : | |||
| 694 : | print "<TR>"; | ||
| 695 : | |||
| 696 : | print &formatDataCell( "NewProblemFileName$i" , " " ,"30" ); | ||
| 697 : | print &formatDataCell( "NewProblemAttempted$i" , "0" ,"1"); | ||
| 698 : | print &formatDataCell( "NewProblemStatus$i" , "0" ,"5"); | ||
| 699 : | print &formatDataCell( "NewProblemValue$i" , "1" ,"5"); | ||
| 700 : | print &formatDataCell( "ProblemMaxNumOfIncorrectAttemps$i" , "-1" ,"4"); | ||
| 701 : | |||
| 702 : | print "</TR>\n"; | ||
| 703 : | } | ||
| 704 : | print qq! | ||
| 705 : | </TABLE>\n | ||
| 706 : | |||
| 707 : | </FORM>\n | ||
| 708 : | !; | ||
| 709 : | apizer | 896 | |
| 710 : | print qq! | ||
| 711 : | <FONT COLOR='#ff00aa'> IMPORTANT.</font> You should also modify the set definition file for | ||
| 712 : | set $setNumber adding the new problem(s) at the end. Otherwise, if you later add new students | ||
| 713 : | to the course and rebuild set $setNumber, the new students will see only the old problems, not | ||
| 714 : | the new ones. | ||
| 715 : | !; | ||
| 716 : | sam | 2 | ############################################# |
| 717 : | # build a problem set | ||
| 718 : | ############################################# | ||
| 719 : | |||
| 720 : | print <<EOF; | ||
| 721 : | <P> | ||
| 722 : | <HR NOSHADE> | ||
| 723 : | <H4 ALIGN=LEFT> | ||
| 724 : | <img src="$Global::bluesquareImgUrl" border=1 alt=""> | ||
| 725 : | Build a problem set for $Course: | ||
| 726 : | </H4> | ||
| 727 : | EOF | ||
| 728 : | |||
| 729 : | print "<TD>", | ||
| 730 : | start_form('POST', "${Global::cgiWebworkURL}profBuildProblemSetPage.pl"), | ||
| 731 : | p,"\n", | ||
| 732 : | hidden('course'), "\n", | ||
| 733 : | hidden('user'), "\n", | ||
| 734 : | hidden('key'), "\n", | ||
| 735 : | submit("Enter Build Problem Set Page"), | ||
| 736 : | end_form, | ||
| 737 : | "</TD>", | ||
| 738 : | "You can build a problem set, edit a set definition file, etc."; | ||
| 739 : | |||
| 740 : | # delete an entire problem set | ||
| 741 : | print <<EOF; | ||
| 742 : | <P> | ||
| 743 : | <HR NOSHADE> | ||
| 744 : | <H4 ALIGN=LEFT><A HREF="${cgiURL}profDeleteProbSet.pl?user=$inputs{'user'}&key=$inputs{'key'}&course=$inputs{'course'}"> | ||
| 745 : | <IMG SRC="$Global::bluesquareImgUrl" | ||
| 746 : | BORDER=1 | ||
| 747 : | ALT=""> Delete a problem set in $Course</A> | ||
| 748 : | </H4> | ||
| 749 : | Remove an entire problem set from the database. | ||
| 750 : | Individual problems can be deleted from the set using the method 2. above. | ||
| 751 : | |||
| 752 : | EOF | ||
| 753 : | |||
| 754 : | } #DONE printChangeProblemFileNamesForm() | ||
| 755 : | |||
| 756 : | #sub printAddProblemFileNameForm { | ||
| 757 : | # | ||
| 758 : | # my @problems = ("new1","new2"); | ||
| 759 : | # | ||
| 760 : | ## updating will be done in printChangeProblemFileNamesForm() | ||
| 761 : | # | ||
| 762 : | ## print a new form | ||
| 763 : | # print qq!<HR NOSHADE>\n | ||
| 764 : | # <FORM method="post" action="profChangeDates.pl"> | ||
| 765 : | # !; | ||
| 766 : | # print &sessionKeyInputs(\%inputs); | ||
| 767 : | # print qq! | ||
| 768 : | # <INPUT TYPE="HIDDEN" NAME="pCD" VALUE="1">\n | ||
| 769 : | # <INPUT TYPE="HIDDEN" NAME="setNumber" VALUE="$setNumber">\n | ||
| 770 : | # <HR NOSHADE> | ||
| 771 : | # <H3>Add problem file names for set $setNumber</H3>\n | ||
| 772 : | # Off <INPUT TYPE="RADIO" NAME="AddNewProblem" VALUE="Off"><BR>\n | ||
| 773 : | # Add <INPUT TYPE="RADIO" NAME="AddNewProblem" VALUE="Add"><BR>\n | ||
| 774 : | # <INPUT TYPE=SUBMIT VALUE="Add New Problem"><p>\n | ||
| 775 : | # <TABLE BORDER="1" CELLPADDING="1" CELLSPACING="2" >\n | ||
| 776 : | # !; | ||
| 777 : | ## print table new listing problems | ||
| 778 : | # foreach $i ("9998") { | ||
| 779 : | # print "<TR>"; | ||
| 780 : | # print &formatHeaderCell( $i); | ||
| 781 : | # print &formatHeaderCell( "Value" ); | ||
| 782 : | # print "</TR>\n"; | ||
| 783 : | # | ||
| 784 : | # | ||
| 785 : | # print "<TR>"; | ||
| 786 : | # | ||
| 787 : | # print &formatDataCell( "NewProblemFileName$i" , "???" ,"30" ); | ||
| 788 : | # print &formatDataCell( "NewProblemValue$i" , "???" ,"5"); | ||
| 789 : | # | ||
| 790 : | # print "</TR>\n"; | ||
| 791 : | # } | ||
| 792 : | #print qq! | ||
| 793 : | # </TABLE>\n | ||
| 794 : | # | ||
| 795 : | # </FORM>\n | ||
| 796 : | # !; | ||
| 797 : | # } | ||
| 798 : | |||
| 799 : | sub formatDataRow { | ||
| 800 : | my ($pAitems,$size) =@_; | ||
| 801 : | my $out = "<TR>\n"; | ||
| 802 : | my $value; | ||
| 803 : | my $i; | ||
| 804 : | foreach $i (@$pAitems) { | ||
| 805 : | $value = eval "\$$i=&get$i($inputs{'psvn'})"; | ||
| 806 : | $out .= &formatDataCell($i,$value,$size); | ||
| 807 : | } | ||
| 808 : | $out .= "</TR>\n"; | ||
| 809 : | } | ||
| 810 : | sub formatHeaderRow { | ||
| 811 : | my ( $pAitems,$options) =@_; | ||
| 812 : | my $out = "<TR>\n"; | ||
| 813 : | my $i; | ||
| 814 : | foreach $i ( @$pAitems) { | ||
| 815 : | $out .= &formatHeaderCell($i,$options); | ||
| 816 : | } | ||
| 817 : | $out .= "</TR>\n"; | ||
| 818 : | } | ||
| 819 : | sub formatDataCell { | ||
| 820 : | my ($name,$value,$size) = @_; | ||
| 821 : | $value = "" unless defined($value); # this value is optional | ||
| 822 : | $size = "" unless defined($size); # this value is optional | ||
| 823 : | my $out = qq! | ||
| 824 : | <TD ALIGN=CENTER VALIGN=MIDDLE > | ||
| 825 : | <INPUT TYPE="TEXT" NAME="$name" VALUE="$value", SIZE=$size> | ||
| 826 : | </TD> | ||
| 827 : | !; | ||
| 828 : | $out; | ||
| 829 : | } | ||
| 830 : | jj | 496 | sub formatCheckboxButtonCell { |
| 831 : | my ($name,$size, $options) = @_; | ||
| 832 : | sam | 2 | $options = "" unless defined($options); |
| 833 : | my $out = qq! | ||
| 834 : | <TD ALIGN=CENTER VALIGN=MIDDLE > | ||
| 835 : | jj | 496 | <INPUT TYPE="CHECKBOX" NAME="$name" VALUE="on" SIZE="$size" $options> |
| 836 : | sam | 2 | </TD> |
| 837 : | !; | ||
| 838 : | $out; | ||
| 839 : | } | ||
| 840 : | sub formatHeaderCell { | ||
| 841 : | my ($item,$options) = @_; | ||
| 842 : | $options = "" unless defined($options); | ||
| 843 : | my $out = qq! | ||
| 844 : | <TH ALIGN=CENTER VALIGN=MIDDLE $options> | ||
| 845 : | $item | ||
| 846 : | </TH> | ||
| 847 : | !; | ||
| 848 : | |||
| 849 : | } |
| aubreyja at gmail dot com | ViewVC Help |
| Powered by ViewVC 1.0.9 |