| … | |
… | |
| 83 | name => "Opens", |
83 | name => "Opens", |
| 84 | type => "edit", |
84 | type => "edit", |
| 85 | size => "26", |
85 | size => "26", |
| 86 | override => "any", |
86 | override => "any", |
| 87 | labels => { |
87 | labels => { |
| 88 | 0 => "None Specified", |
88 | #0 => "None Specified", |
| 89 | "" => "None Specified", |
89 | "" => "None Specified", |
| 90 | }, |
90 | }, |
| 91 | }, |
91 | }, |
| 92 | due_date => { |
92 | due_date => { |
| 93 | name => "Answers Due", |
93 | name => "Answers Due", |
| 94 | type => "edit", |
94 | type => "edit", |
| 95 | size => "26", |
95 | size => "26", |
| 96 | override => "any", |
96 | override => "any", |
| 97 | labels => { |
97 | labels => { |
| 98 | 0 => "None Specified", |
98 | #0 => "None Specified", |
| 99 | "" => "None Specified", |
99 | "" => "None Specified", |
| 100 | }, |
100 | }, |
| 101 | }, |
101 | }, |
| 102 | answer_date => { |
102 | answer_date => { |
| 103 | name => "Answers Available", |
103 | name => "Answers Available", |
| 104 | type => "edit", |
104 | type => "edit", |
| 105 | size => "26", |
105 | size => "26", |
| 106 | override => "any", |
106 | override => "any", |
| 107 | labels => { |
107 | labels => { |
| 108 | 0 => "None Specified", |
108 | #0 => "None Specified", |
| 109 | "" => "None Specified", |
109 | "" => "None Specified", |
| 110 | }, |
110 | }, |
| 111 | }, |
111 | }, |
| 112 | published => { |
112 | published => { |
| 113 | name => "Visible to Students", |
113 | name => "Visible to Students", |
| … | |
… | |
| 206 | |
206 | |
| 207 | my $output = CGI::start_table({border => 0, cellpadding => 1}); |
207 | my $output = CGI::start_table({border => 0, cellpadding => 1}); |
| 208 | if ($forUsers) { |
208 | if ($forUsers) { |
| 209 | $output .= CGI::Tr( |
209 | $output .= CGI::Tr( |
| 210 | CGI::th({colspan=>"2"}, " "), |
210 | CGI::th({colspan=>"2"}, " "), |
| 211 | CGI::th({colspan=>"1"}, "Individual set dates"), |
211 | CGI::th({colspan=>"1"}, "User Values"), |
| 212 | CGI::th({}, "Class set dates"), |
212 | CGI::th({}, "Class values"), |
| 213 | ); |
213 | ); |
| 214 | } |
214 | } |
| 215 | |
215 | |
| 216 | foreach my $field (@fieldOrder) { |
216 | foreach my $field (@fieldOrder) { |
| 217 | my %properties = %{ FIELD_PROPERTIES()->{$field} }; |
217 | my %properties = %{ FIELD_PROPERTIES()->{$field} }; |
| … | |
… | |
| 272 | $globalValue = (defined($globalValue)) ? ($labels{$globalValue || ""} || $globalValue) : ""; |
272 | $globalValue = (defined($globalValue)) ? ($labels{$globalValue || ""} || $globalValue) : ""; |
| 273 | my $userValue = $userRecord->{$field}; |
273 | my $userValue = $userRecord->{$field}; |
| 274 | $userValue = (defined($userValue)) ? ($labels{$userValue || ""} || $userValue) : ""; |
274 | $userValue = (defined($userValue)) ? ($labels{$userValue || ""} || $userValue) : ""; |
| 275 | |
275 | |
| 276 | if ($field =~ /_date/) { |
276 | if ($field =~ /_date/) { |
| 277 | $globalValue = $self->formatDateTime($globalValue) if $globalValue; |
277 | $globalValue = $self->formatDateTime($globalValue) if defined $globalValue && $globalValue ne $labels{""}; |
| 278 | $userValue = $self->formatDateTime($userValue) if $userValue; |
278 | $userValue = $self->formatDateTime($userValue) if defined $userValue && $userValue ne $labels{""}; |
| 279 | } |
279 | } |
| 280 | |
280 | |
| 281 | # check to make sure that a given value can be overridden |
281 | # check to make sure that a given value can be overridden |
| 282 | my %canOverride = map { $_ => 1 } (@{ PROBLEM_FIELDS() }, @{ SET_FIELDS() }); |
282 | my %canOverride = map { $_ => 1 } (@{ PROBLEM_FIELDS() }, @{ SET_FIELDS() }); |
| 283 | my $check = $canOverride{$field}; |
283 | my $check = $canOverride{$field}; |
| … | |
… | |
| 317 | return (($forUsers && $edit && $check) ? CGI::checkbox({ |
317 | return (($forUsers && $edit && $check) ? CGI::checkbox({ |
| 318 | type => "checkbox", |
318 | type => "checkbox", |
| 319 | name => "$recordType.$recordID.$field.override", |
319 | name => "$recordType.$recordID.$field.override", |
| 320 | label => "", |
320 | label => "", |
| 321 | value => $field, |
321 | value => $field, |
| 322 | checked => $r->param("$recordType.$recordID.$field.override") || ($userValue ne "" ? 1 : 0), |
322 | checked => $r->param("$recordType.$recordID.$field.override") || ($userValue ne ($labels{""} || "") ? 1 : 0), |
| 323 | }) : "", |
323 | }) : "", |
| 324 | $properties{name}, |
324 | $properties{name}, |
| 325 | $inputType, |
325 | $inputType, |
| 326 | $forUsers ? " $globalValue" : "", |
326 | $forUsers ? " $globalValue" : "", |
| 327 | ); |
327 | ); |
| … | |
… | |
| 516 | ##################################################################### |
516 | ##################################################################### |
| 517 | |
517 | |
| 518 | my ($open_date, $due_date, $answer_date); |
518 | my ($open_date, $due_date, $answer_date); |
| 519 | my $error = 0; |
519 | my $error = 0; |
| 520 | if (defined $r->param('submit_changes')) { |
520 | if (defined $r->param('submit_changes')) { |
|
|
521 | my @names = ("open_date", "due_date", "answer_date"); |
|
|
522 | |
|
|
523 | my %dates = map { $_ => $r->param("set.$setID.$_") } @names; |
|
|
524 | %dates = map { |
|
|
525 | my $unlabel = $undoLabels{$_}->{$dates{$_}}; |
|
|
526 | $_ => defined $unlabel ? $setRecord->$_ : $self->parseDateTime($dates{$_}) |
|
|
527 | } @names; |
| 521 | |
528 | |
| 522 | my $od_param = $r->param("set.$setID.open_date"); |
529 | ($open_date, $due_date, $answer_date) = map { $dates{$_} } @names; |
| 523 | my $dd_param = $r->param("set.$setID.due_date"); |
|
|
| 524 | my $ad_param = $r->param("set.$setID.answer_date"); |
|
|
| 525 | #my $setRecord = $db->getGlobalSet($setID); # already fetched above --sam |
|
|
| 526 | |
|
|
| 527 | $open_date = $od_param ? $self->parseDateTime($od_param) : $setRecord->open_date; |
|
|
| 528 | $due_date = $dd_param ? $self->parseDateTime($dd_param) : $setRecord->due_date; |
|
|
| 529 | $answer_date = $ad_param ? $self->parseDateTime($ad_param) : $setRecord->answer_date; |
|
|
| 530 | |
530 | |
| 531 | if ($answer_date < $due_date || $answer_date < $open_date) { |
531 | if ($answer_date < $due_date || $answer_date < $open_date) { |
| 532 | $self->addbadmessage("Answers cannot be made available until on or after the due date!"); |
532 | $self->addbadmessage("Answers cannot be made available until on or after the due date!"); |
| 533 | $error = $r->param('submit_changes'); |
533 | $error = $r->param('submit_changes'); |
| 534 | } |
534 | } |
| … | |
… | |
| 555 | if ($forUsers) { |
555 | if ($forUsers) { |
| 556 | my @userRecords = $db->getUserSets(map { [$_, $setID] } @editForUser); |
556 | my @userRecords = $db->getUserSets(map { [$_, $setID] } @editForUser); |
| 557 | foreach my $record (@userRecords) { |
557 | foreach my $record (@userRecords) { |
| 558 | foreach my $field ( @{ SET_FIELDS() } ) { |
558 | foreach my $field ( @{ SET_FIELDS() } ) { |
| 559 | next unless canChange($forUsers, $field); |
559 | next unless canChange($forUsers, $field); |
| 560 | |
|
|
| 561 | my $override = $r->param("set.$setID.$field.override"); |
560 | my $override = $r->param("set.$setID.$field.override"); |
|
|
561 | |
| 562 | if (defined $override && $override eq $field) { |
562 | if (defined $override && $override eq $field) { |
| 563 | |
563 | |
| 564 | my $param = $r->param("set.$setID.$field"); |
564 | my $param = $r->param("set.$setID.$field"); |
| 565 | $param = $properties{$field}->{default} || "" unless defined $param && $param ne ""; |
565 | $param = $properties{$field}->{default} || "" unless defined $param && $param ne ""; |
|
|
566 | my $unlabel = $undoLabels{$field}->{$param}; |
|
|
567 | $param = $unlabel if defined $unlabel; |
| 566 | $param = $undoLabels{$field}->{$param} || $param; |
568 | # $param = $undoLabels{$field}->{$param} || $param; |
| 567 | if ($field =~ /_date/) { |
569 | if ($field =~ /_date/) { |
| 568 | $param = $self->parseDateTime($param); |
570 | $param = $self->parseDateTime($param) unless defined $unlabel; |
| 569 | } |
571 | } |
| 570 | $record->$field($param); |
572 | $record->$field($param); |
| 571 | } else { |
573 | } else { |
| 572 | $record->$field(undef); |
574 | $record->$field(undef); |
| 573 | } |
575 | } |
|
|
576 | |
| 574 | } |
577 | } |
| 575 | $db->putUserSet($record); |
578 | $db->putUserSet($record); |
| 576 | } |
579 | } |
| 577 | } else { |
580 | } else { |
| 578 | foreach my $field ( @{ SET_FIELDS() } ) { |
581 | foreach my $field ( @{ SET_FIELDS() } ) { |
| 579 | next unless canChange($forUsers, $field); |
582 | next unless canChange($forUsers, $field); |
| 580 | |
583 | |
| 581 | my $param = $r->param("set.$setID.$field"); |
584 | my $param = $r->param("set.$setID.$field"); |
| 582 | $param = $properties{$field}->{default} || "" unless defined $param && $param ne ""; |
585 | $param = $properties{$field}->{default} || "" unless defined $param && $param ne ""; |
| 583 | $param = $undoLabels{$field}->{$param} || $param; |
586 | my $unlabel = $undoLabels{$field}->{$param}; |
|
|
587 | $param = $unlabel if defined $unlabel; |
| 584 | if ($field =~ /_date/) { |
588 | if ($field =~ /_date/) { |
| 585 | $param = $self->parseDateTime($param); |
589 | $param = $self->parseDateTime($param) unless defined $unlabel; |
| 586 | } |
590 | } |
| 587 | $setRecord->$field($param); |
591 | $setRecord->$field($param); |
| 588 | } |
592 | } |
| 589 | $db->putGlobalSet($setRecord); |
593 | $db->putGlobalSet($setRecord); |
| 590 | } |
594 | } |
| … | |
… | |
| 617 | my $override = $r->param("problem.$problemID.$field.override"); |
621 | my $override = $r->param("problem.$problemID.$field.override"); |
| 618 | if (defined $override && $override eq $field) { |
622 | if (defined $override && $override eq $field) { |
| 619 | |
623 | |
| 620 | my $param = $r->param("problem.$problemID.$field"); |
624 | my $param = $r->param("problem.$problemID.$field"); |
| 621 | $param = $properties{$field}->{default} || "" unless defined $param && $param ne ""; |
625 | $param = $properties{$field}->{default} || "" unless defined $param && $param ne ""; |
| 622 | $param = $undoLabels{$field}->{$param} || $param; |
626 | my $unlabel = $undoLabels{$field}->{$param}; |
|
|
627 | $param = $unlabel if defined $unlabel; |
| 623 | $changed ||= changed($record->$field, $param); |
628 | $changed ||= changed($record->$field, $param); |
| 624 | $record->$field($param); |
629 | $record->$field($param); |
| 625 | } else { |
630 | } else { |
| 626 | $changed ||= changed($record->$field, undef); |
631 | $changed ||= changed($record->$field, undef); |
| 627 | $record->$field(undef); |
632 | $record->$field(undef); |
| … | |
… | |
| 632 | foreach my $field ( @{ USER_PROBLEM_FIELDS() } ) { |
637 | foreach my $field ( @{ USER_PROBLEM_FIELDS() } ) { |
| 633 | next unless canChange($forUsers, $field); |
638 | next unless canChange($forUsers, $field); |
| 634 | |
639 | |
| 635 | my $param = $r->param("problem.$problemID.$field"); |
640 | my $param = $r->param("problem.$problemID.$field"); |
| 636 | $param = $properties{$field}->{default} || "" unless defined $param && $param ne ""; |
641 | $param = $properties{$field}->{default} || "" unless defined $param && $param ne ""; |
| 637 | $param = $undoLabels{$field}->{$param} || $param; |
642 | my $unlabel = $undoLabels{$field}->{$param}; |
|
|
643 | $param = $unlabel if defined $unlabel; |
| 638 | $changed ||= changed($record->$field, $param); |
644 | $changed ||= changed($record->$field, $param); |
| 639 | $record->$field($param); |
645 | $record->$field($param); |
| 640 | } |
646 | } |
| 641 | $db->putUserProblem($record) if $changed; |
647 | $db->putUserProblem($record) if $changed; |
| 642 | } |
648 | } |
| … | |
… | |
| 650 | foreach my $field ( @{ PROBLEM_FIELDS() } ) { |
656 | foreach my $field ( @{ PROBLEM_FIELDS() } ) { |
| 651 | next unless canChange($forUsers, $field); |
657 | next unless canChange($forUsers, $field); |
| 652 | |
658 | |
| 653 | my $param = $r->param("problem.$problemID.$field"); |
659 | my $param = $r->param("problem.$problemID.$field"); |
| 654 | $param = $properties{$field}->{default} || "" unless defined $param && $param ne ""; |
660 | $param = $properties{$field}->{default} || "" unless defined $param && $param ne ""; |
| 655 | $param = $undoLabels{$field}->{$param} || $param; |
661 | my $unlabel = $undoLabels{$field}->{$param}; |
|
|
662 | $param = $unlabel if defined $unlabel; |
| 656 | $changed ||= changed($problemRecord->$field, $param); |
663 | $changed ||= changed($problemRecord->$field, $param); |
| 657 | $problemRecord->$field($param); |
664 | $problemRecord->$field($param); |
| 658 | } |
665 | } |
| 659 | $db->putGlobalProblem($problemRecord) if $changed; |
666 | $db->putGlobalProblem($problemRecord) if $changed; |
| 660 | |
667 | |
| … | |
… | |
| 682 | foreach my $field ( keys %useful ) { |
689 | foreach my $field ( keys %useful ) { |
| 683 | next unless canChange($forUsers, $field); |
690 | next unless canChange($forUsers, $field); |
| 684 | |
691 | |
| 685 | my $param = $r->param("problem.$problemID.$field"); |
692 | my $param = $r->param("problem.$problemID.$field"); |
| 686 | $param = $properties{$field}->{default} || "" unless defined $param && $param ne ""; |
693 | $param = $properties{$field}->{default} || "" unless defined $param && $param ne ""; |
| 687 | $param = $undoLabels{$field}->{$param} || $param; |
694 | my $unlabel = $undoLabels{$field}->{$param}; |
|
|
695 | $param = $unlabel if defined $unlabel; |
| 688 | $changed ||= changed($record->$field, $param); |
696 | $changed ||= changed($record->$field, $param); |
| 689 | $record->$field($param); |
697 | $record->$field($param); |
| 690 | } |
698 | } |
| 691 | $db->putUserProblem($record) if $changed; |
699 | $db->putUserProblem($record) if $changed; |
| 692 | } |
700 | } |
| … | |
… | |
| 707 | # Mark the specified problems as correct for all users |
715 | # Mark the specified problems as correct for all users |
| 708 | foreach my $problemID ($r->param('markCorrect')) { |
716 | foreach my $problemID ($r->param('markCorrect')) { |
| 709 | my @userProblemIDs = map { [$_, $setID, $problemID] } ($forUsers ? @editForUser : $db->listProblemUsers($setID, $problemID)); |
717 | my @userProblemIDs = map { [$_, $setID, $problemID] } ($forUsers ? @editForUser : $db->listProblemUsers($setID, $problemID)); |
| 710 | my @userProblemRecords = $db->getUserProblems(@userProblemIDs); |
718 | my @userProblemRecords = $db->getUserProblems(@userProblemIDs); |
| 711 | foreach my $record (@userProblemRecords) { |
719 | foreach my $record (@userProblemRecords) { |
| 712 | $self->addbadmessage($record->user_id); |
|
|
| 713 | if (defined $record && ($record->status eq "" || $record->status < 1)) { |
720 | if (defined $record && ($record->status eq "" || $record->status < 1)) { |
| 714 | $record->status(1); |
721 | $record->status(1); |
| 715 | $record->attempted(1); |
722 | $record->attempted(1); |
| 716 | $db->putUserProblem($record); |
723 | $db->putUserProblem($record); |
| 717 | } |
724 | } |