| … | |
… | |
| 47 | # |
47 | # |
| 48 | # FIXME: this table is heinously out of date |
48 | # FIXME: this table is heinously out of date |
| 49 | # |
49 | # |
| 50 | ############################################################ |
50 | ############################################################ |
| 51 | |
51 | |
|
|
52 | # FIXME: what is this? |
| 52 | sub templateName { |
53 | sub templateName { |
| 53 | "problem"; |
54 | "problem"; |
| 54 | } |
55 | } |
| 55 | |
56 | |
| 56 | sub pre_header_initialize { |
57 | sub pre_header_initialize { |
| … | |
… | |
| 59 | my $courseEnv = $self->{ce}; |
60 | my $courseEnv = $self->{ce}; |
| 60 | my $db = $self->{db}; |
61 | my $db = $self->{db}; |
| 61 | my $userName = $r->param('user'); |
62 | my $userName = $r->param('user'); |
| 62 | my $effectiveUserName = $r->param('effectiveUser'); |
63 | my $effectiveUserName = $r->param('effectiveUser'); |
| 63 | my $key = $r->param('key'); |
64 | my $key = $r->param('key'); |
| 64 | my $user = $db->getUser($userName); |
65 | |
|
|
66 | my $user = $db->getUser($userName); # checked |
|
|
67 | die "record for user $userName (real user) does not exist." |
|
|
68 | unless defined $user; |
|
|
69 | |
| 65 | my $effectiveUser = $db->getUser($effectiveUserName); |
70 | my $effectiveUser = $db->getUser($effectiveUserName); # checked |
|
|
71 | die "record for user $effectiveUserName (effective user) does not exist." |
|
|
72 | unless defined $effectiveUser; |
|
|
73 | |
|
|
74 | my $PermissionLevel = $db->getPermissionLevel($userName); # checked |
|
|
75 | die "permission level record for user $userName does not exist (but the user does? odd...)" |
|
|
76 | unless defined $PermissionLevel; |
| 66 | my $permissionLevel = $db->getPermissionLevel($userName)->permission(); |
77 | my $permissionLevel = $PermissionLevel->permission; |
| 67 | |
78 | |
| 68 | # obtain the merged set for $effectiveUser |
79 | # obtain the merged set for $effectiveUser |
| 69 | my $set = $db->getMergedSet($effectiveUserName, $setName); |
80 | my $set = $db->getMergedSet($effectiveUserName, $setName); # checked |
| 70 | |
81 | |
| 71 | # obtain the merged problem for $effectiveUser |
82 | # obtain the merged problem for $effectiveUser |
| 72 | my $problem = $db->getMergedProblem($effectiveUserName, $setName, $problemNumber); |
83 | my $problem = $db->getMergedProblem($effectiveUserName, $setName, $problemNumber); # checked |
| 73 | |
84 | |
| 74 | my $editMode = $r->param("editMode"); |
85 | my $editMode = $r->param("editMode"); |
| 75 | |
86 | |
| 76 | if ($permissionLevel > 0 and defined $editMode) { |
87 | if ($permissionLevel > 0 and defined $editMode) { |
| 77 | # professors are allowed to fabricate sets and problems not |
88 | # professors are allowed to fabricate sets and problems not |
| … | |
… | |
| 80 | |
91 | |
| 81 | # if that is not yet defined obtain the global set, convert |
92 | # if that is not yet defined obtain the global set, convert |
| 82 | # it to a user set, and add fake user data |
93 | # it to a user set, and add fake user data |
| 83 | unless (defined $set) { |
94 | unless (defined $set) { |
| 84 | my $userSetClass = $db->{set_user}->{record}; |
95 | my $userSetClass = $db->{set_user}->{record}; |
| 85 | $set = global2user($userSetClass, |
96 | my $globalSet = $db->getGlobalSet($setName); # checked |
| 86 | $db->getGlobalSet($setName)); |
97 | # if the global set doesn't exist either, bail! |
| 87 | die "Set $setName does not exist" |
98 | die "Set $setName does not exist" |
| 88 | unless defined $set; |
99 | unless defined $set; |
|
|
100 | $set = global2user($userSetClass, $globalSet); |
| 89 | $set->psvn(0); |
101 | $set->psvn(0); |
| 90 | } |
102 | } |
| 91 | |
103 | |
| 92 | # if that is not yet defined obtain the global problem, |
104 | # if that is not yet defined obtain the global problem, |
| 93 | # convert it to a user problem, and add fake user data |
105 | # convert it to a user problem, and add fake user data |
| 94 | unless (defined $problem) { |
106 | unless (defined $problem) { |
| 95 | my $userProblemClass = $db->{problem_user}->{record}; |
107 | my $userProblemClass = $db->{problem_user}->{record}; |
| 96 | $problem = global2user($userProblemClass, |
|
|
| 97 | $db->getGlobalProblem($setName,$problemNumber)); |
108 | my $globalProblem = $db->getGlobalProblem($setName, $problemNumber); # checked |
|
|
109 | # if the global problem doesn't exist either, bail! |
| 98 | die "Problem $problemNumber in set $setName does not exist" |
110 | die "Problem $problemNumber in set $setName does not exist" |
| 99 | unless defined $problem; |
111 | unless defined $problem; |
|
|
112 | $problem = global2user($userProblemClass, $globalProblem); |
| 100 | $problem->user_id($effectiveUserName); |
113 | $problem->user_id($effectiveUserName); |
| 101 | $problem->problem_seed(0); |
114 | $problem->problem_seed(0); |
| 102 | $problem->status(0); |
115 | $problem->status(0); |
| 103 | $problem->attempted(0); |
116 | $problem->attempted(0); |
| 104 | $problem->last_answer(""); |
117 | $problem->last_answer(""); |
| … | |
… | |
| 450 | # if answers were submitted: |
463 | # if answers were submitted: |
| 451 | my $scoreRecordedMessage; |
464 | my $scoreRecordedMessage; |
| 452 | if ($submitAnswers) { |
465 | if ($submitAnswers) { |
| 453 | # get a "pure" (unmerged) UserProblem to modify |
466 | # get a "pure" (unmerged) UserProblem to modify |
| 454 | # this will be undefined if the problem has not been assigned to this user |
467 | # this will be undefined if the problem has not been assigned to this user |
| 455 | my $pureProblem = $db->getUserProblem($problem->user_id, $problem->set_id, $problem->problem_id); |
468 | my $pureProblem = $db->getUserProblem($problem->user_id, $problem->set_id, $problem->problem_id); # checked |
| 456 | if (defined $pureProblem) { |
469 | if (defined $pureProblem) { |
| 457 | # store answers in DB for sticky answers |
470 | # store answers in DB for sticky answers |
| 458 | my %answersToStore; |
471 | my %answersToStore; |
| 459 | my %answerHash = %{ $pg->{answers} }; |
472 | my %answerHash = %{ $pg->{answers} }; |
| 460 | $answersToStore{$_} = $self->{formFields}->{$_} #$answerHash{$_}->{original_student_ans} -- this may have been modified for fields with multiple values. Don't use it!! |
473 | $answersToStore{$_} = $self->{formFields}->{$_} #$answerHash{$_}->{original_student_ans} -- this may have been modified for fields with multiple values. Don't use it!! |
| … | |
… | |
| 853 | } else { |
866 | } else { |
| 854 | $summary .= "At least one of the above answers is NOT correct."; |
867 | $summary .= "At least one of the above answers is NOT correct."; |
| 855 | } |
868 | } |
| 856 | } |
869 | } |
| 857 | #FIXME there must be a better way to force refresh. |
870 | #FIXME there must be a better way to force refresh. |
| 858 | my $refresh_warning = 'Hold down shift and click "refresh" or "reload" to update answer preview images.'; |
871 | #my $refresh_warning = 'Hold down shift and click "refresh" or "reload" to update answer preview images.'; |
| 859 | return CGI::table({-class=>"attemptResults"}, CGI::Tr(\@tableRows)) . |
872 | #return CGI::table({-class=>"attemptResults"}, CGI::Tr(\@tableRows)) . |
| 860 | CGI::div({style=>'color:red; font-size:10pt'},$refresh_warning) . |
873 | #CGI::div({style=>'color:red; font-size:10pt'},$refresh_warning) . |
| 861 | ($showSummary ? CGI::p({class=>'emphasis'},$summary) : ""); |
874 | #($showSummary ? CGI::p({class=>'emphasis'},$summary) : ""); |
|
|
875 | # ... this has been fixed by equation caching. |
|
|
876 | return |
|
|
877 | CGI::table({-class=>"attemptResults"}, CGI::Tr(\@tableRows)) |
|
|
878 | . ($showSummary ? CGI::p({class=>'emphasis'},$summary) : ""); |
| 862 | } |
879 | } |
| 863 | sub nbsp { |
880 | sub nbsp { |
| 864 | my $str = shift; |
881 | my $str = shift; |
| 865 | ($str =~/\S/) ? $str : ' ' ; # returns non-breaking space for empty strings |
882 | ($str =~/\S/) ? $str : ' ' ; # returns non-breaking space for empty strings |
| 866 | # tricky cases: $str =0; |
883 | # tricky cases: $str =0; |