1: # The LON-CAPA response handler
2: #
3: # various response type definitons response definition
4: #
5: # YEAR=2000
6: # 9/14,9/19,11/21,11/22 Guy Albertelli
7: # 11/23,11/24,11/28 Gerd Kortemeyer
8: # 11/28,11/29,12/4,12/11,12/19,12/28 Guy Albertelli
9: # YEAR=2001
10: # 1/8,1/10,1/19,1/22,2/7,2/19,4/4,4/7,4/16,5/4,5/31,6/2,6/29 Guy Albertelli
11: # 7/10,7/13,8/3
12: # 8/4 Gerd Kortemeyer
13: # 8/5,8/6 Guy Albertelli
14: # 8/6 Scott Harrison
15:
16: package Apache::response;
17: use strict;
18:
19: # ======================================================================= BEGIN
20: sub BEGIN {
21: &Apache::lonxml::register('Apache::response',('responseparam',
22: 'caparesponse',
23: 'numericalresponse',
24: 'stringresponse',
25: 'radiobuttonresponse',
26: 'optionresponse',
27: 'imageresponse',
28: 'essayresponse'));
29: }
30:
31: # ======================================= Start response (return scalar string)
32: sub start_response {
33: my ($parstack,$safeeval) = @_;
34: my $id = &Apache::lonxml::get_param('id',$parstack,$safeeval);
35: if ($id eq '') { $id = $Apache::lonxml::curdepth; }
36: push (@Apache::inputtags::response,$id);
37: push (@Apache::inputtags::responselist,$id);
38: @Apache::inputtags::inputlist = ();
39: return $id;
40: }
41:
42: # ================================================================ End response
43: sub end_response {
44: pop @Apache::inputtags::response;
45: @Apache::inputtags::inputlist = ();
46: return '';
47: }
48:
49: # =========================================================== Set random number
50: # used by response to set the non-safe space random number generator to
51: # something that is stable and unique based on the part number and response
52: # number
53: sub setrandomnumber {
54: my $rndseed = &Apache::lonnet::rndseed();
55: &Apache::lonxml::debug("randseed $rndseed");
56: # $rndseed = unpack("%32i",$rndseed);
57: $rndseed = $rndseed
58: +(&Apache::lonnet::numval($Apache::inputtags::part) << 10);
59: if (defined($Apache::inputtags::response['-1'])) {
60: $rndseed = $rndseed
61: +&Apache::lonnet::numval($Apache::inputtags::response['-1']);
62: }
63: srand($rndseed);
64: &Apache::lonxml::debug("randseed $rndseed");
65: return '';
66: }
67:
68: # ================================= write meta parameter (return scalar string)
69: sub meta_parameter_write {
70: my ($name,$type,$default,$display) = @_;
71: return '<parameter part="'.$Apache::inputtags::part.
72: '" name="'.$name.
73: '" type="'.$type.
74: '" default="'.$default.
75: '" display="'.$display.
76: ' [Part: '.$Apache::inputtags::part.']"></parameter>'.
77: "\n";
78: }
79:
80: # =================================== write meta package (return scalar string)
81: sub meta_package_write {
82: my $name=shift;
83: return '<parameter part="'.$Apache::inputtags::part.
84: '" package="'.$name.'"></parameter>'.
85: "\n";
86: }
87:
88: # ==================================== write meta stores (return scalar string)
89: sub meta_stores_write {
90: my ($name,$type,$display)=@_;
91: return '<stores part="'.$Apache::inputtags::part.
92: '" name="'.$name.
93: '" type="'.$type.
94: '" display="'.$display.
95: ' [Part: '.$Apache::inputtags::part.']"></stores>'.
96: "\n";
97: }
98:
99: # ============================ write meta mandatory part (return scalar string)
100: sub mandatory_part_meta {
101: #
102: # Autogenerate metadata for mandatory
103: # input (from RAT or lonparmset) and
104: # output (to lonspreadsheet)
105: # of each part
106: #
107: return
108: # &meta_parameter_write('opendate','date_start','',
109: # 'Opening Date').
110: # &meta_parameter_write('duedate','date_end','',
111: # 'Due Date').
112: # &meta_parameter_write('answerdate','date_start','',
113: # 'Show Answer Date').
114: # &meta_parameter_write('weight','int_zeropos','',
115: # 'Available Points').
116: # &meta_parameter_write('maxtries','int_pos','',
117: # 'Maximum Number of Tries').
118: &meta_package_write('part');
119: &meta_stores_write('solved','string',
120: 'Problem Status').
121: &meta_stores_write('tries','int_zeropos',
122: 'Number of Attempts').
123: &meta_stores_write('awarded','float',
124: 'Partial Credit Factor');
125: #
126: # Note: responseid-specific data 'submission' and 'awarddetail'
127: # not available to spreadsheet -> skip here
128: #
129: }
130:
131: sub check_for_previous {
132: my ($curresponse,$partid,$id) = @_;
133: my %previous;
134: $previous{'used'} = 0;
135: foreach my $key (reverse(sort(keys(%Apache::lonhomework::history)))) {
136: if ($key =~ /resource\.$partid\.$id\.submission/) {
137: &Apache::lonxml::debug("Trying $key");
138: my $pastresponse=$Apache::lonhomework::history{$key};
139: if ($pastresponse eq $curresponse) {
140: $previous{'used'} = 1;
141: my $history;
142: if ( $key =~ /^(\d+):/ ) {
143: $history=$1;
144: $previous{'award'} = $Apache::lonhomework::history{
145: "$history:resource.$partid.$id.awarddetail"};
146: $previous{'last'} = '0';
147: } else {
148: $previous{'award'} = $Apache::lonhomework::history{
149: "resource.$partid.$id.awarddetail"};
150: $previous{'last'} = '1';
151: }
152: if (! $previous{'award'} ) { $previous{'award'} = 'UNKNOWN';}
153: &Apache::lonxml::debug(
154: "got a match :$previous{'award'}:$previous{'used'}:");
155: last;
156: }
157: }
158: }
159: return %previous;
160: }
161:
162: # ================================== Start capa response (return scalar string)
163: sub start_caparesponse {
164: require Apache::caparesponse;
165: import Apache::caparesponse;
166: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
167: # print "\n<br />\nsimple caparesponse\n";
168: return &Apache::caparesponse::start_caparesponse($target,$token,$tagstack,
169: $parstack,$parser,
170: $safeeval,$style);
171: }
172:
173: # ================================ Start string response (return scalar string)
174: sub start_stringresponse {
175: require Apache::caparesponse;
176: import Apache::caparesponse;
177: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
178: return &Apache::caparesponse::start_stringresponse($target,$token,
179: $tagstack,$parstack,
180: $parser,$safeeval,
181: $style);
182: }
183:
184: # ============================= Start numerical response (return scalar string)
185: sub start_numericalresponse {
186: require Apache::caparesponse;
187: import Apache::caparesponse;
188: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
189: return &Apache::caparesponse::start_numericalresponse
190: ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style);
191: }
192:
193: # ========================== Start radio button response (return scalar string)
194: sub start_radiobuttonresponse {
195: require Apache::radiobuttonresponse;
196: import Apache::radiobuttonresponse;
197: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
198: return &Apache::radiobuttonresponse::start_radiobuttonresponse(
199: $target,$token,$tagstack,$parstack,$parser,$safeeval,$style);
200: }
201:
202: # ================================ Start option response (return scalar string)
203: sub start_optionresponse {
204: require Apache::optionresponse;
205: import Apache::optionresponse;
206: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
207: return &Apache::optionresponse::start_optionresponse(
208: $target,$token,$tagstack,$parstack,$parser,$safeeval,$style);
209: }
210:
211: # ================================= Start image response (return scalar string)
212: sub start_imageresponse {
213: require Apache::imageresponse;
214: import Apache::imageresponse;
215: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
216: return &Apache::imageresponse::start_imageresponse(
217: $target,$token,$tagstack,$parstack,$parser,$safeeval,$style);
218: }
219:
220: # ================================= Start essay response (return scalar string)
221: sub start_essayresponse {
222: require Apache::essayresponse;
223: import Apache::essayresponse;
224: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
225: return &Apache::essayresponse::start_essayresponse(
226: $target,$token,$tagstack,$parstack,$parser,$safeeval,$style);
227: }
228:
229: # ================================= Start param response (return scalar string)
230: sub start_responseparam {
231: my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
232: if ($target eq 'grade' || $target eq 'web') {
233: my $default = &Apache::lonxml::get_param('default',$parstack,
234: $safeeval);
235: my $name = &Apache::lonxml::get_param('name',$parstack,$safeeval);
236: &Apache::lonxml::debug("looking for resource.".
237: $Apache::inputtags::part.".$name");
238: my $value = &Apache::lonnet::EXT("resource.$Apache::inputtags::part".
239: ".$name");
240: &Apache::lonxml::debug("$name has value :$value: and default :".
241: "$default:");
242: if ($value eq '' || $value eq 'con_lost') {
243: &Apache::lonxml::debug("defaulting");
244: $Apache::inputtags::params{$name}=$default;
245: } else {
246: &Apache::lonxml::debug("using value");
247: $Apache::inputtags::params{$name}=$value;
248: }
249: return '';
250: } elsif ($target eq 'meta') {
251: return &meta_parameter_write($token->[2]->{'name'},
252: $token->[2]->{'type'},
253: $token->[2]->{'default'},
254: $token->[2]->{'description'});
255: } elsif ($target eq 'edit') {
256: my $result .= &Apache::edit::tag_start($target,$token,
257: &Apache::lonxml::description($token));
258: $result .= &Apache::edit::text_arg('Name:','name',$token).
259: &Apache::edit::text_arg('Type:','type',$token).
260: &Apache::edit::text_arg('Description:','description',
261: $token).
262: &Apache::edit::text_arg('Default:','default',$token).
263: "</td></tr>";
264: $result .= &Apache::edit::end_table;
265: return $result;
266: } elsif ($target eq 'modified') {
267: my $result;
268: my $constructtag = &Apache::edit::get_new_args($token,$parstack,
269: $safeeval,'name','type',
270: 'description','default');
271: if ($constructtag) {
272: $result = &Apache::edit::rebuild_tag($token);
273: $result .= &Apache::edit::handle_insert();
274: }
275: return $result;
276:
277: } else {
278: return '';
279: }
280: }
281:
282: # ========================================================== End response param
283: sub end_responseparam {
284: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
285: if ($target eq 'edit') { return ('','no'); }
286: return '';
287: }
288:
289: 1;
290:
291: __END__
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>