| … | |
… | |
| 17 | use base qw(WeBWorK::ContentGenerator); |
17 | use base qw(WeBWorK::ContentGenerator); |
| 18 | use Apache::Constants qw(:common); |
18 | use Apache::Constants qw(:common); |
| 19 | use CGI qw(); |
19 | use CGI qw(); |
| 20 | use WeBWorK::ContentGenerator; |
20 | use WeBWorK::ContentGenerator; |
| 21 | |
21 | |
|
|
22 | sub initialize { |
|
|
23 | my $self = shift; |
|
|
24 | my $courseEnvironment = $self->{courseEnvironment}; |
|
|
25 | |
|
|
26 | # Open a database connection that we can use for the rest of |
|
|
27 | # the content generation. |
|
|
28 | |
|
|
29 | my $wwdb = new WeBWorK::DB::WW $courseEnvironment; |
|
|
30 | $self->{wwdb} = $wwdb; |
|
|
31 | } |
|
|
32 | |
|
|
33 | sub path { |
|
|
34 | my ($self, $setName, $args) = @_; |
|
|
35 | $setName =~ s/^set//; |
|
|
36 | |
|
|
37 | |
|
|
38 | my $ce = $self->{courseEnvironment}; |
|
|
39 | my $root = $ce->{webworkURLs}->{root}; |
|
|
40 | my $courseName = $ce->{courseName}; |
|
|
41 | return $self->pathMacro($args, |
|
|
42 | "Home" => "$root", |
|
|
43 | $courseName => "$root/$courseName", |
|
|
44 | $setName => "", |
|
|
45 | ); |
|
|
46 | } |
|
|
47 | |
|
|
48 | sub siblings { |
|
|
49 | my ($self, $setName) = @_; |
|
|
50 | $setName =~ s/^set//; |
|
|
51 | |
|
|
52 | my $ce = $self->{courseEnvironment}; |
|
|
53 | my $root = $ce->{webworkURLs}->{root}; |
|
|
54 | my $courseName = $ce->{courseName}; |
|
|
55 | |
|
|
56 | my $wwdb = $self->{wwdb}; |
|
|
57 | my $user = $self->{r}->param("user"); |
|
|
58 | my @sets; |
|
|
59 | push @sets, $wwdb->getSet($user, $_) foreach ($wwdb->getSets($user)); |
|
|
60 | foreach my $set (sort { $a->open_date <=> $b->open_date } @sets) { |
|
|
61 | if (time >= $set->open_date) { |
|
|
62 | print CGI::a({-href=>"$root/$courseName/".$set->id."/?" |
|
|
63 | . $self->url_authen_args}, $set->id), CGI::br(); |
|
|
64 | } else { |
|
|
65 | print $set->id, CGI::br(); |
|
|
66 | } |
|
|
67 | } |
|
|
68 | } |
|
|
69 | |
| 22 | sub title { |
70 | sub title { |
| 23 | my ($self, $problem_set) = @_; |
71 | my ($self, $setName) = @_; |
|
|
72 | $setName =~ s/^set//; |
|
|
73 | |
|
|
74 | return $setName; |
|
|
75 | } |
|
|
76 | |
|
|
77 | sub body { |
|
|
78 | my ($self, $setName) = @_; |
|
|
79 | $setName =~ s/^set//; |
| 24 | my $r = $self->{r}; |
80 | my $r = $self->{r}; |
| 25 | my $courseEnvironment = $self->{courseEnvironment}; |
81 | my $courseEnvironment = $self->{courseEnvironment}; |
| 26 | my $user = $r->param('user'); |
82 | my $user = $r->param('user'); |
| 27 | |
83 | my $wwdb = $self->{wwdb}; |
| 28 | return "Problem set $problem_set for $user"; |
84 | |
|
|
85 | print CGI::start_table(); |
|
|
86 | print CGI::Tr( |
|
|
87 | CGI::th("Name"), |
|
|
88 | CGI::th("Attempts"), |
|
|
89 | CGI::th("Remaining"), |
|
|
90 | CGI::th("Status"), |
|
|
91 | ); |
|
|
92 | |
|
|
93 | my $set = $wwdb->getSet($user, $setName); |
|
|
94 | my @problemNumbers = $wwdb->getProblems($user, $setName); |
|
|
95 | foreach my $problemNumber (sort { $a <=> $b } @problemNumbers) { |
|
|
96 | my $problem = $wwdb->getProblem($user, $setName, $problemNumber); |
|
|
97 | print $self->problemListRow($set, $problem); |
|
|
98 | } |
|
|
99 | |
|
|
100 | print CGI::end_table(); |
|
|
101 | |
|
|
102 | return ""; |
| 29 | } |
103 | } |
| 30 | |
104 | |
| 31 | sub body { |
105 | sub problemListRow($$$) { |
| 32 | my ($self, $problem_set) = @_; |
106 | my $self = shift; |
| 33 | my $r = $self->{r}; |
107 | my $set = shift; |
| 34 | my $courseEnvironment = $self->{courseEnvironment}; |
108 | my $problem = shift; |
| 35 | my $user = $r->param('user'); |
|
|
| 36 | |
109 | |
| 37 | print CGI->startform({-method=>"POST", -action=>$r->uri."prob2/"}); |
110 | my $name = $problem->id; |
| 38 | print $self->hidden_authen_fields; |
111 | my $interactiveURL = "prob$name/?" . $self->url_authen_args; |
| 39 | print CGI->input({-type=>"submit", -value=>"Do Problem 2"}); |
112 | my $interactive = CGI::a({-href=>$interactiveURL}, "Problem $name"); |
| 40 | print CGI->endform(); |
113 | my $attempts = $problem->num_correct + $problem->num_incorrect; |
| 41 | ""; |
114 | my $remaining = $problem->max_attempts < 0 |
|
|
115 | ? "unlimited" |
|
|
116 | : $problem->max_attempts - $attempts; |
|
|
117 | my $status = $problem->status * 100 . "%"; |
|
|
118 | |
|
|
119 | return CGI::Tr(CGI::td([ |
|
|
120 | $interactive, |
|
|
121 | $attempts, |
|
|
122 | $remaining, |
|
|
123 | $status, |
|
|
124 | ])); |
| 42 | } |
125 | } |
| 43 | |
126 | |
| 44 | 1; |
127 | 1; |