| … | |
… | |
| 25 | my $userName = $r->param("user"); |
25 | my $userName = $r->param("user"); |
| 26 | my $effectiveUserName = $r->param("effectiveUser"); |
26 | my $effectiveUserName = $r->param("effectiveUser"); |
| 27 | |
27 | |
| 28 | my $user = $db->getUser($userName); |
28 | my $user = $db->getUser($userName); |
| 29 | my $effectiveUser = $db->getUser($effectiveUserName); |
29 | my $effectiveUser = $db->getUser($effectiveUserName); |
| 30 | my $set = $db->getGlobalUserSet($effectiveUserName, $setName); |
30 | my $set = $db->getMergedSet($effectiveUserName, $setName); |
| 31 | my $permissionLevel = $db->getPermissionLevel($userName)->permission(); |
31 | my $permissionLevel = $db->getPermissionLevel($userName)->permission(); |
| 32 | |
32 | |
| 33 | $self->{userName} = $userName; |
33 | $self->{userName} = $userName; |
| 34 | $self->{user} = $user; |
34 | $self->{user} = $user; |
| 35 | $self->{effectiveUser} = $effectiveUser; |
35 | $self->{effectiveUser} = $effectiveUser; |
| … | |
… | |
| 77 | |
77 | |
| 78 | print CGI::strong("Problem Sets"), CGI::br(); |
78 | print CGI::strong("Problem Sets"), CGI::br(); |
| 79 | |
79 | |
| 80 | my $effectiveUser = $self->{r}->param("effectiveUser"); |
80 | my $effectiveUser = $self->{r}->param("effectiveUser"); |
| 81 | my @sets; |
81 | my @sets; |
| 82 | push @sets, $db->getGlobalUserSet($effectiveUser, $_) |
82 | push @sets, $db->getMergedSet($effectiveUser, $_) |
| 83 | foreach ($db->listUserSets($effectiveUser)); |
83 | foreach ($db->listUserSets($effectiveUser)); |
| 84 | # foreach my $set (sort { $a->open_date <=> $b->open_date } @sets) { |
84 | # foreach my $set (sort { $a->open_date <=> $b->open_date } @sets) { |
| 85 | # FIXME only experience will tell us the best sorting procedure |
85 | # FIXME only experience will tell us the best sorting procedure |
| 86 | # due_date seems right for students, but alphabetically is more useful for professors. |
86 | # due_date seems right for students, but alphabetically is more useful for professors. |
| 87 | |
87 | |
| … | |
… | |
| 109 | my $db = $self->{db}; |
109 | my $db = $self->{db}; |
| 110 | |
110 | |
| 111 | return "" unless $self->{isOpen}; |
111 | return "" unless $self->{isOpen}; |
| 112 | |
112 | |
| 113 | my $effectiveUser = $db->getUser($r->param("effectiveUser")); |
113 | my $effectiveUser = $db->getUser($r->param("effectiveUser")); |
| 114 | my $set = $db->getGlobalUserSet($effectiveUser->user_id, $setName); |
114 | my $set = $db->getMergedSet($effectiveUser->user_id, $setName); |
| 115 | my $psvn = $set->psvn(); |
115 | my $psvn = $set->psvn(); |
| 116 | |
116 | |
| 117 | my $screenSetHeader = $set->problem_header || $ce->{webworkFiles}->{screenSnippets}->{setHeader}; |
117 | my $screenSetHeader = $set->problem_header || $ce->{webworkFiles}->{screenSnippets}->{setHeader}; |
| 118 | my $displayMode = $ce->{pg}->{options}->{displayMode}; |
118 | my $displayMode = $ce->{pg}->{options}->{displayMode}; |
| 119 | |
119 | |
| … | |
… | |
| 175 | CGI::th("Attempts"), |
175 | CGI::th("Attempts"), |
| 176 | CGI::th("Remaining"), |
176 | CGI::th("Remaining"), |
| 177 | CGI::th("Status"), |
177 | CGI::th("Status"), |
| 178 | ); |
178 | ); |
| 179 | |
179 | |
| 180 | my $set = $db->getGlobalUserSet($effectiveUser, $setName); |
180 | my $set = $db->getMergedSet($effectiveUser, $setName); |
| 181 | my @problemNumbers = $db->listUserProblems($effectiveUser, $setName); |
181 | my @problemNumbers = $db->listUserProblems($effectiveUser, $setName); |
| 182 | foreach my $problemNumber (sort { $a <=> $b } @problemNumbers) { |
182 | foreach my $problemNumber (sort { $a <=> $b } @problemNumbers) { |
| 183 | my $problem = $db->getGlobalUserProblem($effectiveUser, $setName, $problemNumber); |
183 | my $problem = $db->getMergedProblem($effectiveUser, $setName, $problemNumber); |
| 184 | print $self->problemListRow($set, $problem); |
184 | print $self->problemListRow($set, $problem); |
| 185 | } |
185 | } |
| 186 | |
186 | |
| 187 | print CGI::end_table(); |
187 | print CGI::end_table(); |
| 188 | |
188 | |