Annotation of loncom/homework/inputtags.pm, revision 1.41
1.41 ! harris41 1: # The LON-CAPA input tags
! 2: #
! 3: # Input definitions.
! 4: #
! 5: # YEAR=2000
! 6: # 7/25,9/11,9/19,10/2,10/11,11/21,11/28,12/1,12/4,12/8,12/11 Guy Albertelli
! 7: # 12/12 Guy Albertelli
! 8: # 12/12 Gerd Kortemeyer
! 9: # 12/12,12/15,12/21 Guy Albertelli
! 10: # YEAR=2001
! 11: # 1/4,1/5,1/6,1/10,1/15,1/24,2/19 Guy Albertelli
1.1 albertel 12:
13: package Apache::inputtags;
14: use strict;
15:
1.41 ! harris41 16: # ======================================================================= BEGIN
1.1 albertel 17: sub BEGIN {
1.41 ! harris41 18: &Apache::lonxml::register('Apache::inputtags',
! 19: ('textarea','textline','datasubmission'));
1.1 albertel 20: }
21:
1.41 ! harris41 22: # ======================================================= Initialize input tags
1.1 albertel 23: sub initialize_inputtags {
1.41 ! harris41 24: # list of current input ids
! 25: @Apache::inputtags::input = ();
! 26: # list of all input ids seen in this problem
! 27: @Apache::inputtags::inputlist = ();
! 28: # list of all current response ids
! 29: @Apache::inputtags::response = ();
! 30: # list of all response ids seen in this problem
! 31: @Apache::inputtags::responselist = ();
! 32: # list of whether or not a specific response was previously used
! 33: @Apache::inputtags::previous = ();
! 34: # id of current part, 0 means no part is current (inside <problem> only
! 35: $Apache::inputtags::part = '';
! 36: # list of problem date statuses, the first element is for <problem>
! 37: #if there is a second element it is for the current <part>
! 38: @Apache::inputtags::status = ();
! 39: #hash of defined params for the current response
! 40: %Apache::inputtags::params = ();
1.1 albertel 41: }
42:
1.41 ! harris41 43: # ========================================== Start input (return scalar string)
1.14 albertel 44: sub start_input {
1.41 ! harris41 45: my ($parstack,$safeeval) = @_;
! 46: my $id = &Apache::lonxml::get_param('id',$parstack,$safeeval);
! 47: if ($id eq '') { $id = $Apache::lonxml::curdepth; }
! 48: push (@Apache::inputtags::input,$id);
! 49: push (@Apache::inputtags::inputlist,$id);
! 50: return $id;
1.14 albertel 51: }
52:
1.41 ! harris41 53: # =================================================================== End input
1.14 albertel 54: sub end_input {
1.41 ! harris41 55: pop @Apache::inputtags::input;
! 56: return '';
1.14 albertel 57: }
58:
1.41 ! harris41 59: # ====================================== Start text area (return scalar string)
1.6 albertel 60: sub start_textarea {
1.41 ! harris41 61: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
! 62: my $result = "";
! 63: my $id = &start_input($parstack,$safeeval);
! 64: if ($target eq 'web') {
! 65: my $oldresponse = $Apache::lonhomework::history{'resource.'.
! 66: $Apache::inputtags::part.'.'.
! 67: $Apache::inputtags::response['-1'].'.submission'};
! 68: my $cols = &Apache::lonxml::get_param('cols',$parstack,$safeeval);
! 69: if ( $cols eq '') { $cols = 80; }
! 70: my $rows = &Apache::lonxml::get_param('rows',$parstack,$safeeval);
! 71: if ( $rows eq '') { $rows = 10; }
! 72: $result= '<textarea name="HWVAL'.$Apache::inputtags::response['-1'].
! 73: '" '."rows=\"$rows\" cols=\"$cols\">".$oldresponse;
! 74: if ($oldresponse ne '') {
! 75: #get rid of any startup text if the user has already responded
! 76: &Apache::lonxml::get_all_text("/textarea",$$parser[$#$parser]);
! 77: }
1.30 albertel 78: }
1.41 ! harris41 79: return $result;
1.6 albertel 80: }
81:
1.41 ! harris41 82: # ======================================== End text area (return scalar string)
1.6 albertel 83: sub end_textarea {
1.41 ! harris41 84: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
! 85: if ($target eq 'web') {
! 86: return "</textarea>";
! 87: }
! 88: &end_input;
! 89: return '';
1.6 albertel 90: }
91:
1.41 ! harris41 92: # ====================================== Start text line (return scalar string)
1.1 albertel 93: sub start_textline {
1.41 ! harris41 94: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
! 95: my $result = "";
! 96: if ($target eq 'web') {
! 97: my $size = &Apache::lonxml::get_param('size',$parstack,$safeeval);
! 98: if ($size eq '') { $size=20; }
! 99: my $oldresponse = $Apache::lonhomework::history{'resource.'.
! 100: $Apache::inputtags::part.'.'.
! 101: $Apache::inputtags::response['-1'].'.submission'};
! 102: $result = '<input type="text" name="HWVAL'.
! 103: $Apache::inputtags::response['-1'].
! 104: '" value="'.$oldresponse.'" size="'.$size.'" />';
! 105: }
! 106: if ($target eq 'edit') {
! 107: $result .= &Apache::edit::tag_start($target,$token,
! 108: &Apache::lonxml::description($token));
! 109: $result .= &Apache::edit::text_arg('Size:','size',$token,'5').
! 110: '</td></tr>';
! 111: $result .= &Apache::edit::end_table;
! 112: }
! 113: if ($target eq 'modified') {
! 114: my $constructtag = &Apache::edit::get_new_args($token,$parstack,
! 115: $safeeval,'size');
! 116: if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
! 117: }
! 118: return $result;
1.1 albertel 119: }
120:
1.41 ! harris41 121: # =============================================================== End text line
1.1 albertel 122: sub end_textline {
1.41 ! harris41 123: my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
! 124: if ($target eq 'edit') { return ('','no'); }
! 125: return "";
1.1 albertel 126: }
127:
1.41 ! harris41 128: # ======================================================= Start data submission
1.6 albertel 129: sub start_datasubmission {
1.41 ! harris41 130: return '';
1.6 albertel 131: }
132:
1.41 ! harris41 133: # ========================================================= End data submission
1.6 albertel 134: sub end_datasubmission {
1.41 ! harris41 135: my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
! 136: if ( $target == 'web' ) {
! 137: return '<input type="submit" name="submit" value="Submit All Data" />';
! 138: }
! 139: return '';
1.9 albertel 140: }
141:
1.41 ! harris41 142: # ============================================================= Finalize awards
1.9 albertel 143: sub finalizeawards {
1.41 ! harris41 144: my $result='';
! 145: my $award;
! 146: if ($#_ == '-1') { $result = "NO_RESPONSE"; }
! 147: if ($result eq '' ) {
! 148: foreach $award (@_) { if ($award eq '') {$result='MISSING_ANSWER';
! 149: last;}}
! 150: }
! 151: if ($result eq '' ) {
! 152: foreach $award (@_) { if ($award eq 'ERROR') {$result='ERROR'; last;}}
! 153: }
! 154: if ($result eq '' ) {
! 155: foreach $award (@_) { if ($award eq 'NO_RESPONSE') {
! 156: $result='NO_RESPONSE'; last;} }
! 157: }
! 158: if ($result eq '' ) {
! 159: foreach $award (@_) {
! 160: if ($award eq 'UNIT_FAIL' ||
! 161: $award eq 'NO_UNIT' ||
! 162: $award eq 'UNIT_NOTNEEDED') {
! 163: $result=$award; last;
! 164: }
! 165: }
! 166: }
! 167: if ($result eq '' ) {
! 168: foreach $award (@_) {
! 169: if ($award eq 'WANTED_NUMERIC' ||
! 170: $award eq 'BAD_FORMULA') {$result=$award; last;}
! 171: }
! 172: }
! 173: if ($result eq '' ) {
! 174: foreach $award (@_) { if ($award eq 'SIG_FAIL') {
! 175: $result=$award; last;} }
! 176: }
! 177: if ($result eq '' ) {
! 178: foreach $award (@_) { if ($award eq 'INCORRECT') {$result=$award;
! 179: last;} }
! 180: }
! 181: if ($result eq '' ) {
! 182: foreach $award (@_) { if ($award eq 'SUBMITTED') {$result=$award;
! 183: last;} }
! 184: }
! 185: if ($result eq '' ) {
! 186: foreach $award (@_) { if ($award eq 'APPROX_ANS') {$result=$award;
! 187: last;} }
! 188: }
! 189: if ($result eq '' ) { $result='EXACT_ANS'; }
! 190: return $result;
1.9 albertel 191: }
192:
1.41 ! harris41 193: # ====================================== Decide output (return 3 element array)
1.10 albertel 194: sub decideoutput {
1.41 ! harris41 195: my ($award,$solved,$previous)=@_;
! 196: my $message='';
! 197: my $button=0;
! 198: my $previousmsg;
! 199:
! 200: if ($previous) { $previousmsg='You have entered that answer before'; }
! 201:
! 202: if ($solved =~ /^correct/) {
! 203: $message = "<b>You are correct.</b> Your receipt is ".
! 204: &Apache::lonnet::receipt;
! 205: $button=0;
! 206: $previousmsg='';
! 207: } elsif ($solved =~ /^excused/) {
! 208: $message = "<b>You are excused from the problem.</b>";
! 209: $button=0;
! 210: $previousmsg='';
! 211: } elsif ($award eq 'EXACT_ANS' || $award eq 'APPROX_ANS' ) {
! 212: if ($solved =~ /^incorrect/ || $solved eq '') {
! 213: $message = "Incorrect";
! 214: $button=1;
! 215: } else {
! 216: $message = "<b>You are correct.</b> Your receipt is ".
! 217: &Apache::lonnet::receipt;
! 218: $button=0;
! 219: $previousmsg='';
! 220: }
! 221: } elsif ($award eq 'NO_RESPONSE') {
! 222: $message = '';
! 223: $button=1;
! 224: } elsif ($award eq 'MISSING_ANSWER') {
! 225: $message = 'Some parts were not submitted';
! 226: $button = 1;
! 227: } elsif ($award eq 'WANTED_NUMERIC') {
! 228: $message = "This question expects a numeric answer";
! 229: $button=1;
! 230: } elsif ($award eq 'SIG_FAIL') {
! 231: $message = "Please adjust significant figures.";# you provided %s significant figures";
! 232: $button=1;
! 233: } elsif ($award eq 'UNIT_FAIL') {
! 234: $message = "Units incorrect."; #Computer reads units as %s";
! 235: $button=1;
! 236: } elsif ($award eq 'UNIT_NOTNEEDED') {
! 237: $message = "Only a number required.";# Computer reads units of %s";
! 238: $button=1;
! 239: } elsif ($award eq 'NO_UNIT') {
! 240: $message = "Units required";
! 241: $button=1;
! 242: } elsif ($award eq 'BAD_FORMULA') {
! 243: $message = "Unable to understand formula";
! 244: $button=1;
! 245: } elsif ($award eq 'INCORRECT') {
! 246: $message = "Incorrect";
! 247: $button=1;
! 248: } elsif ($award eq 'SUBMITTED') {
! 249: $message = "Your submission has been recorded.";
! 250: $button=1;
1.37 albertel 251: } else {
1.41 ! harris41 252: $message = "Unknown message: $award";
! 253: $button=1;
! 254: }
! 255: return ($button,$message,$previousmsg);
1.12 albertel 256: }
257:
1.41 ! harris41 258: # ============================================================== Set grade data
1.12 albertel 259: sub setgradedata {
1.41 ! harris41 260: my ($award,$id,$previously_used) = @_;
! 261: # if the student already has it correct, don't modify the status
! 262: if ( $Apache::lonhomework::history{"resource.$id.solved"} !~ /^correct/ ) {
! 263: #handle assignment of tries and solved status
! 264: if ( $award eq 'APPROX_ANS' || $award eq 'EXACT_ANS' ) {
! 265: $Apache::lonhomework::results{"resource.$id.tries"} =
! 266: $Apache::lonhomework::history{"resource.$id.tries"} + 1;
! 267: $Apache::lonhomework::results{"resource.$id.solved"} =
! 268: 'correct_by_student';
! 269: $Apache::lonhomework::results{"resource.$id.awarded"} = '1';
! 270: } elsif ( $award eq 'INCORRECT' ) {
! 271: $Apache::lonhomework::results{"resource.$id.tries"} =
! 272: $Apache::lonhomework::history{"resource.$id.tries"} + 1;
! 273: $Apache::lonhomework::results{"resource.$id.solved"} =
! 274: 'incorrect_attempted';
! 275: } elsif ( $award eq 'SUBMITTED' ) {
! 276: $Apache::lonhomework::results{"resource.$id.tries"} =
! 277: $Apache::lonhomework::history{"resource.$id.tries"} + 1;
! 278: $Apache::lonhomework::results{"resource.$id.solved"} =
! 279: 'ungraded_attempted';
! 280: } elsif ( $award eq 'NO_RESPONSE' ) {
! 281: return '';
! 282: } else {
! 283: $Apache::lonhomework::results{"resource.$id.solved"} =
! 284: 'incorrect_attempted';
! 285: }
! 286:
! 287: # check if this was a previous submission if it was delete the
! 288: # unneeded data and update the previously_used attribute
! 289: if ( $previously_used eq 'PREVIOUSLY_USED') {
! 290: delete($Apache::lonhomework::results{"resource.$id.tries"});
! 291: $Apache::lonhomework::results{"resource.$id.previous"} = '1';
! 292: } elsif ( $previously_used eq 'PREVIOUSLY_LAST') {
! 293: #delete all data as they student didn't do anything
! 294: foreach my $key (keys(%Apache::lonhomework::results)) {
! 295: if ($key =~ /^resource\.$id\./) {
! 296: &Apache::lonxml::debug("Removing $key");
! 297: delete($Apache::lonhomework::results{$key});
! 298: }
! 299: }
! 300: #and since they didn't do anything we were never here
! 301: return '';
! 302: } else {
! 303: $Apache::lonhomework::results{"resource.$id.previous"} = '0';
! 304: }
1.40 albertel 305: }
1.41 ! harris41 306: $Apache::lonhomework::results{"resource.$id.award"} = $award;
1.10 albertel 307: }
308:
1.41 ! harris41 309: # ======================================================================= Grade
1.9 albertel 310: sub grade {
1.41 ! harris41 311: my ($target) = @_;
! 312: my $id = $Apache::inputtags::part;
! 313: my $response = '';
! 314: if ( defined $ENV{'form.submitted'}) {
! 315: my @awards = ();
! 316: foreach $response (@Apache::inputtags::responselist) {
! 317: &Apache::lonxml::debug("looking for response.$id.$response.".
! 318: "awarddetail");
! 319: my $value=$Apache::lonhomework::results{"resource.$id.$response.".
! 320: "awarddetail"};
! 321: if ( $value ne '' ) {
! 322: &Apache::lonxml::debug("keeping $value from $response for".
! 323: " $id");
! 324: push (@awards,$value);
! 325: } else {
! 326: &Apache::lonxml::debug("skipping $value from $response for".
! 327: " $id");
! 328: }
! 329: }
! 330: my $finalaward = &finalizeawards(@awards);
! 331: my $previously_used;
! 332: if ( $#Apache::inputtags::previous eq $#awards ) {
! 333: $previously_used = 'PREVIOUSLY_LAST';
! 334: foreach my $value (@Apache::inputtags::previous) {
! 335: if ($value eq 'PREVIOUSLY_USED' ) {
! 336: $previously_used = $value;
! 337: last;
! 338: }
! 339: }
! 340: }
! 341: &Apache::lonxml::debug("final award $finalaward, $previously_used");
! 342: &setgradedata($finalaward,$id,$previously_used);
! 343: }
! 344: return '';
1.1 albertel 345: }
346:
1.41 ! harris41 347: # ========================================= Grade status (return scalar string)
1.11 albertel 348: sub gradestatus {
1.41 ! harris41 349: my ($id) = @_;
! 350: my $showbutton = 1;
! 351: my $message = '';
! 352: my $trystr = '';
! 353: my $button = '';
! 354: my $previousmsg = '';
! 355:
! 356: my $status = $Apache::inputtags::status['-1'];
! 357: &Apache::lonxml::debug("gradestatus has :$status:");
! 358: if ( $status ne 'CLOSED' ) {
! 359: my $award = $Apache::lonhomework::history{"resource.$id.award"};
! 360: my $solved = $Apache::lonhomework::history{"resource.$id.solved"};
! 361: my $previous = $Apache::lonhomework::history{"resource.$id.previous"};
! 362: &Apache::lonxml::debug("Found Award |$award|$solved|");
! 363: if ( $award ne '' ) {
! 364: &Apache::lonxml::debug('Getting message');
! 365: ($showbutton,$message,$previousmsg) =
! 366: &decideoutput($award,$solved,$previous);
! 367: $message = "<td bgcolor=\"#aaffaa\">$message</td>";
! 368: if ($previousmsg) {
! 369: $previousmsg = "<td bgcolor=\"#ffaaaa\">$previousmsg</td>";
! 370: }
! 371: }
! 372: my $tries = $Apache::lonhomework::history{"resource.$id.tries"};
! 373: my $maxtries = &Apache::lonnet::EXT("resource.$id.maxtries");
! 374: &Apache::lonxml::debug("got maxtries of :$maxtries:");
! 375: if ( $tries eq '' ) { $tries = '0'; }
! 376: if ( $maxtries eq '' ) { $maxtries = '2'; }
! 377: if ( $maxtries eq 'con_lost' ) { $maxtries = '0'; }
! 378: if ( $showbutton ) {
! 379: $trystr = "<td>Tries $tries/$maxtries</td>";
! 380: }
! 381: if ( $status eq 'SHOW_ANSWER' || $status eq 'CANNOT_ANSWER') {
! 382: $showbutton = 0;}
! 383: if ( $showbutton ) {
! 384: $button = '<br /><input type="submit" name="submit" value='.
! 385: '"Submit All Answers" />';
! 386: }
! 387: }
! 388: my $output= $previousmsg.$message.$trystr;
! 389: if ($output =~ /^\s*$/) {
! 390: return $button;
! 391: } else {
! 392: return $button.'<table><tr>'.$previousmsg.$message.$trystr.
! 393: '</tr></table>';
! 394: }
1.11 albertel 395: }
1.41 ! harris41 396:
1.1 albertel 397: 1;
1.41 ! harris41 398:
1.1 albertel 399: __END__
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>