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