| … | |
… | |
| 16 | use warnings; |
16 | use warnings; |
| 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 | use WeBWorK::ContentGenerator::Problem; |
|
|
22 | use WeBWorK::DB::WW; |
|
|
23 | use WeBWorK::DB::Classlist; |
| 21 | |
24 | |
| 22 | sub initialize { |
25 | sub initialize { |
| 23 | my $self = shift; |
26 | my $self = shift; |
| 24 | my $courseEnvironment = $self->{courseEnvironment}; |
27 | my $courseEnvironment = $self->{courseEnvironment}; |
| 25 | |
28 | |
| 26 | # Open a database connection that we can use for the rest of |
29 | # Open a database connection that we can use for the rest of |
| 27 | # the content generation. |
30 | # the content generation. |
| 28 | |
31 | |
| 29 | my $wwdb = new WeBWorK::DB::WW $courseEnvironment; |
32 | $self->{wwdb} = WeBWorK::DB::WW->new($courseEnvironment); |
| 30 | $self->{wwdb} = $wwdb; |
33 | $self->{cldb} = WeBWorK::DB::Classlist->new($courseEnvironment); |
| 31 | } |
34 | } |
| 32 | |
35 | |
| 33 | sub path { |
36 | sub path { |
| 34 | my ($self, $setName, $args) = @_; |
37 | my ($self, $setName, $args) = @_; |
| 35 | $setName =~ s/^set//; |
38 | $setName =~ s/^set//; |
| 36 | |
|
|
| 37 | |
39 | |
| 38 | my $ce = $self->{courseEnvironment}; |
40 | my $ce = $self->{courseEnvironment}; |
| 39 | my $root = $ce->{webworkURLs}->{root}; |
41 | my $root = $ce->{webworkURLs}->{root}; |
| 40 | my $courseName = $ce->{courseName}; |
42 | my $courseName = $ce->{courseName}; |
| 41 | return $self->pathMacro($args, |
43 | return $self->pathMacro($args, |
| … | |
… | |
| 50 | $setName =~ s/^set//; |
52 | $setName =~ s/^set//; |
| 51 | |
53 | |
| 52 | my $ce = $self->{courseEnvironment}; |
54 | my $ce = $self->{courseEnvironment}; |
| 53 | my $root = $ce->{webworkURLs}->{root}; |
55 | my $root = $ce->{webworkURLs}->{root}; |
| 54 | my $courseName = $ce->{courseName}; |
56 | my $courseName = $ce->{courseName}; |
| 55 | |
57 | |
|
|
58 | print CGI::strong("Problem Sets"), CGI::br(); |
|
|
59 | |
| 56 | my $wwdb = $self->{wwdb}; |
60 | my $wwdb = $self->{wwdb}; |
| 57 | my $user = $self->{r}->param("user"); |
61 | my $user = $self->{r}->param("user"); |
| 58 | my @sets; |
62 | my @sets; |
| 59 | push @sets, $wwdb->getSet($user, $_) foreach ($wwdb->getSets($user)); |
63 | push @sets, $wwdb->getSet($user, $_) foreach ($wwdb->getSets($user)); |
| 60 | foreach my $set (sort { $a->open_date <=> $b->open_date } @sets) { |
64 | foreach my $set (sort { $a->open_date <=> $b->open_date } @sets) { |
| … | |
… | |
| 72 | $setName =~ s/^set//; |
76 | $setName =~ s/^set//; |
| 73 | |
77 | |
| 74 | return $setName; |
78 | return $setName; |
| 75 | } |
79 | } |
| 76 | |
80 | |
|
|
81 | sub info { |
|
|
82 | # NOTE: info doesn't |
|
|
83 | my ($self, $setName) = @_; |
|
|
84 | $setName =~ s/^set//; |
|
|
85 | |
|
|
86 | my $r = $self->{r}; |
|
|
87 | my $ce = $self->{courseEnvironment}; |
|
|
88 | |
|
|
89 | my $wwdb = $self->{wwdb}; |
|
|
90 | my $cldb = $self->{cldb}; |
|
|
91 | my $user = $cldb->getUser($r->param("user")); |
|
|
92 | my $set = $wwdb->getSet($user->id, $setName); |
|
|
93 | my $psvn = $wwdb->getPSVN($user->id, $setName); |
|
|
94 | |
|
|
95 | my $screenSetHeader = $ce->{webworkFiles}->{screenSnippets}->{setHeader}; |
|
|
96 | my $displayMode = $ce->{pg}->{options}->{displayMode}; |
|
|
97 | |
|
|
98 | return "" unless defined $screenSetHeader and $screenSetHeader; |
|
|
99 | |
|
|
100 | # decide what to do about problem number |
|
|
101 | my $problem = WeBWorK::Problem->new( |
|
|
102 | id => 0, |
|
|
103 | set_id => $set->id, |
|
|
104 | login_id => $user->id, |
|
|
105 | source_file => $screenSetHeader, |
|
|
106 | # the rest of Problem's fields are not needed, i think |
|
|
107 | ); |
|
|
108 | |
|
|
109 | my $pg = WeBWorK::PG->new( |
|
|
110 | $ce, |
|
|
111 | $user, |
|
|
112 | $r->param('key'), |
|
|
113 | $set, |
|
|
114 | $problem, |
|
|
115 | $psvn, |
|
|
116 | {}, # no form fields! |
|
|
117 | { # translation options |
|
|
118 | displayMode => $displayMode, |
|
|
119 | showHints => 0, |
|
|
120 | showSolutions => 0, |
|
|
121 | processAnswers => 0, |
|
|
122 | }, |
|
|
123 | ); |
|
|
124 | |
|
|
125 | # handle translation errors |
|
|
126 | if ($pg->{flags}->{error_flag}) { |
|
|
127 | return WeBWorK::ContentGenerator::Problem::translationError( |
|
|
128 | $pg->{errors}, $pg->{body_text}); |
|
|
129 | } else { |
|
|
130 | return $pg->{body_text}; |
|
|
131 | } |
|
|
132 | } |
|
|
133 | |
| 77 | sub body { |
134 | sub body { |
| 78 | my ($self, $setName) = @_; |
135 | my ($self, $setName) = @_; |
| 79 | $setName =~ s/^set//; |
136 | $setName =~ s/^set//; |
| 80 | my $r = $self->{r}; |
137 | my $r = $self->{r}; |
| 81 | my $courseEnvironment = $self->{courseEnvironment}; |
138 | my $courseEnvironment = $self->{courseEnvironment}; |
| 82 | my $user = $r->param('user'); |
139 | my $user = $r->param('user'); |
| 83 | my $wwdb = $self->{wwdb}; |
140 | my $wwdb = $self->{wwdb}; |
| 84 | |
141 | |
| 85 | # *** *** *** *** |
142 | my $hardcopyURL = |
| 86 | # somewhere in here, we have to print the problem set header! |
143 | $courseEnvironment->{webworkURLs}->{root} . "/" |
| 87 | # *** *** *** *** |
144 | . $courseEnvironment->{courseName} . "/" |
|
|
145 | . "hardcopy/set$setName/?" . $self->url_authen_args; |
|
|
146 | print CGI::p(CGI::a({-href=>$hardcopyURL}, "Download a hardcopy"), |
|
|
147 | "of this problem set."); |
| 88 | |
148 | |
| 89 | print CGI::start_table(); |
149 | print CGI::start_table(); |
| 90 | print CGI::Tr( |
150 | print CGI::Tr( |
| 91 | CGI::th("Name"), |
151 | CGI::th("Name"), |
| 92 | CGI::th("Attempts"), |
152 | CGI::th("Attempts"), |
| … | |
… | |
| 118 | my $remaining = $problem->max_attempts < 0 |
178 | my $remaining = $problem->max_attempts < 0 |
| 119 | ? "unlimited" |
179 | ? "unlimited" |
| 120 | : $problem->max_attempts - $attempts; |
180 | : $problem->max_attempts - $attempts; |
| 121 | my $status = $problem->status * 100 . "%"; |
181 | my $status = $problem->status * 100 . "%"; |
| 122 | |
182 | |
| 123 | return CGI::Tr(CGI::td([ |
183 | return CGI::Tr(CGI::td({-nowrap=>1}, [ |
| 124 | $interactive, |
184 | $interactive, |
| 125 | $attempts, |
185 | $attempts, |
| 126 | $remaining, |
186 | $remaining, |
| 127 | $status, |
187 | $status, |
| 128 | ])); |
188 | ])); |