Annotation of capa/capa51/CapaTools/printstudent.1.2.tcl, revision 1.1.1.1

1.1       albertel    1: #!/usr/local/bin/tclsh7.6
                      2: # Script to print a single student's assignment
                      3: # By G. Albertelli II 1998
                      4: 
                      5: proc clearScreen {} {
                      6:     puts "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
                      7: }
                      8: clearScreen
                      9: puts "CAPA Printing script Ver 1.2"
                     10: after 1000
                     11: 
                     12: proc class { classname path args } {
                     13:     global classList
                     14:     set classList($classname.path) $path
                     15:     set classList($classname.sets) $args
                     16: }
                     17: 
                     18: proc config { var value args } {
                     19:     global config
                     20:     set config($var) $value
                     21: }
                     22: 
                     23: proc getSettings { classListVar configVar } {
                     24:     upvar $classListVar classList
                     25:     upvar $configVar config
                     26:     source printstudent.settings
                     27: }
                     28: 
                     29: proc saveSettings { } {
                     30:     global classList config
                     31:     if { [ catch { set fileId [open printstudent.settings "w"] } ] } {
                     32: 	puts "Unable to save settings. Please contact CAPA adminstrator."
                     33: 	quit "UnableToSaveSettings"
                     34:     }
                     35:     puts $fileId "# Settings file for printstudent.tcl\n#\n# set up the configuration options\n#\n# the used values are qzparse_command, latex_command, dvips_command, and\n# lpr_command\n\n"
                     36:     foreach value [array names config] {
                     37: 	puts $fileId "config $value \t\"$config($value)\""
                     38:     }
                     39: 
                     40:     puts $fileId "\n# List of classes, their path, and the sets that can be printed"
                     41:     set validClass ""
                     42:     foreach name [array names classList] {
                     43: 	if { ! [string match *.path $name] } { 
                     44: 	    lappend validClass [lindex [split $name .] 0]
                     45: 	}
                     46:     }
                     47:     set validClass [ lsort $validClass]
                     48:     foreach class $validClass {
                     49: 	puts $fileId "class $class  $classList($class.path) \t$classList($class.sets)"
                     50:     }
                     51:     close $fileId
                     52: }
                     53: 
                     54: proc getStringFromList { validStrings } {
                     55:     gets file0 aline
                     56:     set error [catch {set try [lindex $aline 0] } ]
                     57:     if { $error } { return "" }
                     58:     set found false
                     59:     foreach valid $validStrings {
                     60: 	set valid [string tolower $valid]
                     61: 	set try [ string tolower [ string trim $try ] ]
                     62: 	if { $valid == $try } {
                     63: 	    set found true
                     64: 	    break
                     65: 	}
                     66:     }
                     67:     if { $found } {
                     68: 	return $try
                     69:     } else {
                     70: 	return ""
                     71:     }
                     72: }
                     73: 
                     74: proc addClass { classVar } {
                     75:     upvar $classVar class
                     76:     
                     77:     clearScreen
                     78:     puts "Enter \"quit\" at any time to stop adding a class."
                     79:     set done 0
                     80:     while { ! $done } {
                     81: 	puts -nonewline "Please enter the name of the class you wish to add:"
                     82: 	flush file1
                     83: 	gets file0 aline
                     84: 	set class [lindex $aline 0]
                     85: 	if { $class == "quit" } { return quit }
                     86: 	puts "You entered $class, is this name correct? (y or n)"
                     87:         set finished [getStringFromList "yes y Y quit"]
                     88: 	if { $finished == "quit" } { return quit }
                     89: 	if { $finished != "" } { set done 1 }
                     90:     }
                     91:     set done 0
                     92:     while { ! $done } {
                     93: 	puts -nonewline "Please enter the path of $class:"
                     94: 	flush file1
                     95: 	gets file0 aline
                     96: 	set path [lindex $aline 0]
                     97: 	if { $path == "quit" } { return quit }
                     98: 	puts "You entered $path, is this path correct? (y or n)"
                     99:         set finished [getStringFromList "yes y Y quit"]
                    100: 	if { $finished == "quit" } { return quit }
                    101: 	if { $finished != "" } { set done 1 }
                    102:     }
                    103:     set done 0
                    104:     while { ! $done } {
                    105: 	puts "Please enter a space seperated list of valid set numbers for $class:"
                    106: 	gets file0 aline
                    107: 	set sets $aline
                    108: 	if { $sets == "quit" } { return quit }
                    109: 	puts "You entered $sets, is this list correct? (y or n)"
                    110:         set finished [getStringFromList "yes y Y quit"]
                    111: 	if { $finished == "quit" } { return quit }
                    112: 	if { $finished != "" } { set done 1 }
                    113:     }
                    114:     global classList
                    115:     set classList($class.sets) $sets
                    116:     set classList($class.path) $path
                    117:     saveSettings
                    118:     global machine
                    119:     logInformation Added $class $path "$sets" $machine
                    120:     set class ""
                    121: }
                    122: 
                    123: proc removeClass { classListVar classVar } {
                    124:     upvar $classListVar classList
                    125:     upvar $classVar class
                    126: 
                    127:     clearScreen
                    128:     set done 0
                    129:     while { ! $done } {
                    130: 	set validClass ""
                    131: 	foreach name [array names classList] {
                    132: 	    if { ! [string match *.path $name] } { 
                    133: 		lappend validClass [lindex [split $name .] 0]
                    134: 	    }
                    135: 	}
                    136: 	set validClass [ lsort $validClass]
                    137: 	puts "Valid classnames are: $validClass"
                    138: 	puts "Enter \"quit\" to stop removing a class."
                    139: 	puts -nonewline "Enter class name to remove:"
                    140: 	flush file1
                    141: 	set class [getStringFromList [concat $validClass quit] ]
                    142: 	if { $class == "quit" } { 
                    143: 	    set class ""
                    144: 	    return
                    145: 	}
                    146: 	if { $class != "" } { 
                    147: 	    puts "You entered $class, are you sure you wish to remove this class? (y or n)"
                    148: 	    set finished [getStringFromList "yes y Y quit"]
                    149: 	    if { $finished == "quit" } { return quit }
                    150: 	    if { $finished != "" } { set done 1 }
                    151: 	} else { 
                    152: 	    puts "Invalid classname"
                    153: 	}
                    154:     }
                    155:     if { $done } {
                    156: 	global classList 
                    157: 	global machine
                    158: 	logInformation Removed $class $classList($class.path) "$classList($class.sets)" $machine
                    159: 	catch { unset classList($class.path) }
                    160: 	catch { unset classList($class.sets) }
                    161: 	saveSettings
                    162:     }
                    163:     set class ""
                    164: }
                    165: 
                    166: proc getClass { classListVar classVar } {
                    167:     upvar $classListVar classList
                    168:     upvar $classVar class
                    169: 
                    170:     clearScreen
                    171:     set done 0
                    172:     while { ! $done } {
                    173: 	set validClass ""
                    174: 	foreach name [array names classList] {
                    175: 	    if { ! [string match *.path $name] } { 
                    176: 		lappend validClass [lindex [split $name .] 0]
                    177: 	    }
                    178: 	}
                    179: 	set validClass [ lsort $validClass]
                    180: 	puts "Valid classnames are: [lindex $validClass 0]"
                    181: 	foreach otherClass [lrange $validClass 1 end] {
                    182: 	    puts "                      $otherClass"
                    183: 	}
                    184: 	puts "Other commands available: new remove restart quit"
                    185: 	puts -nonewline "Enter class name to print:"
                    186: 	flush file1
                    187: 	set class [getStringFromList \
                    188: 		[concat $validClass new remove quit restart] ]
                    189: 	if       { $class == "new"     } { addClass class 
                    190: 	                                   clearScreen
                    191: 	} elseif { $class == "remove"  } { removeClass classList class 
                    192:                                            clearScreen
                    193: 	} elseif { $class == "quit"    } { quit "ClassEarlyOut" 
                    194: 	} elseif { $class == "restart" } { return restart 
                    195: 	} elseif { $class != ""        } { set done 1
                    196: 	} else   {                         puts "Invalid classname"
                    197: 	}
                    198:     }
                    199: }
                    200: 
                    201: proc addSet { class setVar } {
                    202:     upvar $setVar setWanted
                    203:     global classList 
                    204: 
                    205:     clearScreen
                    206:     set done 0
                    207:     puts "Enter \"quit\" at any time to stop changing set availability."
                    208:     while { ! $done } {
                    209: 	puts "Please enter a space seperated list of valid set numbers for $class:"
                    210: 	gets file0 aline
                    211: 	set sets $aline
                    212: 	if { $sets == "quit" } { return quit }
                    213: 	puts -nonewline "You entered $sets, which would have $class have set(s) $sets available, rather than set(s) $classList($class.sets).\n Is this correct? (y or n)"
                    214: 	flush file1
                    215:         set finished [getStringFromList "yes y Y quit"]
                    216: 	if { $finished == "quit" } { return quit }
                    217: 	if { $finished != "" } { set done 1 }
                    218:     }
                    219:     global classList
                    220:     global machine
                    221:     logInformation ChangedSets $class $classList($class.path) "\"$classList($class.sets)\" to \"$sets\"" $machine
                    222:     set classList($class.sets) $sets
                    223:     saveSettings
                    224:     return ""
                    225: }
                    226:     
                    227: proc getSet { classListVar class setVar } {
                    228:     upvar $classListVar classList
                    229:     upvar $setVar setWanted
                    230: 
                    231:     clearScreen
                    232:     set done 0
                    233:     while { ! $done } {
                    234: 	puts "Valid set numbers for $class are: $classList($class.sets) "
                    235: 	puts "Other commands available: new restart quit"
                    236: 	puts -nonewline "Enter set number to print:"
                    237: 	flush file1
                    238: 	set setWanted [getStringFromList \
                    239: 		[concat $classList($class.sets) new quit restart] ]
                    240: 	if       { $setWanted == "new"     } { addSet $class setWanted 
                    241:                                                clearScreen
                    242:         } elseif { $setWanted == "quit"    } { quit "SetEarlyOut" 
                    243: 	} elseif { $setWanted == "restart" } { return restart 
                    244:         } elseif { $setWanted != ""        } { set done 1
                    245: 	} else   {                             puts "Invalid setnumber."
                    246: 	}
                    247:     }
                    248: }
                    249: 
                    250: proc getStudentInfo { studentNumberVar } {
                    251:     upvar $studentNumberVar studentNumber
                    252:     global class set
                    253: 
                    254:     puts "Other commands available: restart quit"
                    255:     puts -nonewline "For class: $class, set $set, enter student number:"
                    256:     flush file1
                    257:     gets file0 aline
                    258:     catch { set studentNumber [lindex $aline 0]}
                    259:     if { $studentNumber == "quit" } { quit "StudentInfoEarlyOut" }
                    260:     if { $studentNumber == "restart" } { return restart }
                    261: }
                    262: 
                    263: proc verifyStudent { class set studentNumber } {
                    264:     if { [ catch { set fileId [open $class/classl "r" ] } ] } {
                    265: 	puts "Unable to find a classl file. This class may not be ready for printing right now."
                    266: 	quit "UnableToAccesClassl"
                    267:     }
                    268:     set result 0
                    269:     while { 1 } {
                    270: 	gets $fileId aline
                    271: 	if { [eof $fileId] } { break }
                    272: 	if { [string tolower $studentNumber] == [string tolower [ string range $aline 14 22] ] } {
                    273: 	    set result 1
                    274: 	    break
                    275: 	}
                    276:     }
                    277:     close $fileId
                    278:     return $result
                    279: }
                    280: 
                    281: proc printSet { class set studentnumber configVar } {
                    282:     upvar $configVar config
                    283:     
                    284:     puts "Parsing Set"
                    285:     if { [catch { eval "exec $config(qzparse_command) -c $class -Set $set -Stu $studentnumber -o [pwd]/printstudent.[pid].tex " } errorMsg ] } {
                    286: 	puts "Unable to prepare tex file: $errorMsg"
                    287: 	return failed
                    288:     } 
                    289:     puts "Creating Set description"
                    290:     if { [catch { eval "exec $config(latex_command) ./printstudent.[pid].tex < /dev/null " } errorMsg ] } {
                    291: 	puts "Unable to prepare dvi file: $errorMsg"
                    292: 	return failed
                    293:     }
                    294:     puts "Creating postscript file"
                    295:     if { [ catch { eval "exec $config(dvips_command) -o ./printstudent.[pid].ps ./printstudent.[pid].dvi < /dev/null >& /dev/null " } errorMsg ] } {
                    296: 	puts "Unable to prepare ps file: $errorMsg"
                    297: 	return failed
                    298:     }
                    299:     puts "Sending file to printer"
                    300:     if { [ catch { eval "exec $config(lpr_command) ./printstudent.[pid].ps < /dev/null " } errorMsg ] } {
                    301: 	puts "Unable to print ps file: $errorMsg"
                    302: 	return failed
                    303:     }
                    304:     return success
                    305: }
                    306: 
                    307: proc logInformation { result class set student args } {
                    308:     set fileId [open "printstudent.log" "a"]
                    309:     puts $fileId "$result $class $set $student $args [clock format [clock seconds] -format %m/%d/%Y-%H:%M:%S ]"
                    310:     close $fileId
                    311: }
                    312: 
                    313: proc cleanup {} {
                    314:     exec rm -f ./printstudent.[pid].ps ./printstudent.[pid].dvi ./printstudent.[pid].tex ./printstudent.[pid].aux ./printstudent.[pid].log
                    315: }
                    316: 
                    317: proc goAgain {} {
                    318:     puts "Would you like to print another assignment (y or n) ?"
                    319:     set setWanted [getStringFromList "yes y Y quit"]
                    320:     if { $setWanted != "" } { 	return 1
                    321:     } else { 	return 0
                    322:     }
                    323: }
                    324: 
                    325: proc quit { args } {
                    326:     global class set studentnumber machine
                    327:     logInformation $args $class $set $studentnumber $machine
                    328:     exit
                    329: }
                    330: 
                    331: set another 1
                    332: set class "unknown"
                    333: set set "unknown"
                    334: set studentnumber "unknown"
                    335: if { [ catch { set machine [lindex [exec /usr/bin/who -mM ] end ] } ] } {
                    336:     set machine "UnableToRunWho"
                    337: }
                    338: 
                    339: while { $another } {
                    340:     getSettings classList config
                    341:     if { "restart" == [getClass classList class] } { continue }
                    342:     if { "restart" == [getSet classList $class set] } { continue }
                    343:     clearScreen
                    344:     set done 0
                    345:     while { ! $done } {
                    346: 	if { "restart" == [getStudentInfo studentnumber] } { 
                    347: 	    set studentnumber restart
                    348: 	    break
                    349: 	}
                    350: 	if { ! [set done [verifyStudent $classList($class.path) \
                    351: 		$set $studentnumber] ] } {
                    352: 	    puts "Student number: $studentnumber, does not appear to belong in the class- $class."
                    353: 	    logInformation "NotFound" $class $set $studentnumber $machine
                    354: 	}
                    355:     }
                    356:     if { $studentnumber == "restart" } { continue }
                    357:     logInformation [printSet $classList($class.path) $set \
                    358: 	    $studentnumber config] $class $set $studentnumber $machine
                    359:     cleanup
                    360:     set another [goAgain]
                    361: }
                    362: 
                    363: 
                    364: 
                    365: 
                    366: 
                    367: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>