def get_number_of_questions(server=None, pwd=None): """Contact server for number of questions.""" if server and ":" in server: s, p = server.split(":") msgr = ScanMessenger(s, port=p) else: msgr = ScanMessenger(server) msgr.start() if not pwd: pwd = getpass.getpass("Please enter the 'scanner' password:"******"scanner", pwd) except PlomExistingLoginException: print( "You appear to be already logged in!\n\n" " * Perhaps a previous session crashed?\n" " * Do you have another scanner-script running,\n" " e.g., on another computer?\n\n" 'In order to force-logout the existing authorisation run "plom-scan clear"' ) exit(-1) spec = msgr.get_spec() msgr.closeUser() msgr.stop() return spec["numberOfQuestions"]
def uploadTPages(bundleDir, skip_list, server=None, password=None): """Upload the test pages to the server. Skips pages-image with orders in the skip-list (ie the page number within the bundle.pdf) Bundle must already be created. We will upload the files and then send a 'please trigger an update' message to the server. """ if server and ":" in server: s, p = server.split(":") msgr = ScanMessenger(s, port=p) else: msgr = ScanMessenger(server) msgr.start() # get the password if not specified if password is None: try: pwd = getpass.getpass("Please enter the 'scanner' password:"******"ERROR", error) else: pwd = password # get started try: msgr.requestAndSaveToken("scanner", pwd) except PlomExistingLoginException: print( "You appear to be already logged in!\n\n" " * Perhaps a previous session crashed?\n" " * Do you have another scanner-script running,\n" " e.g., on another computer?\n\n" 'In order to force-logout the existing authorisation run "plom-scan clear" or "plom-hwscan clear"' ) exit(10) spec = msgr.get_spec() numberOfPages = spec["numberOfPages"] if not bundleDir.is_dir(): raise ValueError("should've been a directory!") files = [] # Look for pages in decodedPages for ext in PlomImageExts: files.extend( sorted((bundleDir / "decodedPages").glob("t*.{}".format(ext)))) TUP = sendTestFiles(msgr, bundleDir.name, files, skip_list) # we do not automatically replace any missing test-pages, since that is a serious issue for tests, and should be done only by manager. updates = msgr.triggerUpdateAfterTUpload() # close down messenger msgr.closeUser() msgr.stop() return [TUP, updates]
def verifiedComplete(server=None, password=None): if server and ":" in server: s, p = server.split(":") msgr = ScanMessenger(s, port=p) else: msgr = ScanMessenger(server) msgr.start() # get the password if not specified if password is None: try: pwd = getpass.getpass("Please enter the 'scanner' password:"******"ERROR", error) else: pwd = password # get started try: msgr.requestAndSaveToken("scanner", pwd) except PlomExistingLoginException: print( "You appear to be already logged in!\n\n" " * Perhaps a previous session crashed?\n" " * Do you have another scanner-script running,\n" " e.g., on another computer?\n\n" 'In order to force-logout the existing authorisation run "plom-hwscan clear"' ) exit(10) # grab number of questions - so we can work out what is missing spec = msgr.get_spec() numberOfQuestions = spec["numberOfQuestions"] msgr.closeUser() msgr.stop() hwByQ = defaultdict(list) for fn in glob.glob("submittedHWByQ/*.pdf"): IDQ = IDQorIDorBad(fn) if len(IDQ) == 3: sid, q = IDQ[1:] hwByQ[sid].append([fn, q]) # return fileNames belonging to complete homeworks validFiles = [] for sid in hwByQ: if len(hwByQ[sid]) == numberOfQuestions: validFiles += [x[0] for x in hwByQ[sid]] return validFiles
def processBitmaps(bundle, server=None, password=None): examsScannedNow = defaultdict(list) if server and ":" in server: s, p = server.split(":") scanMessenger = ScanMessenger(s, port=p) else: scanMessenger = ScanMessenger(server) scanMessenger.start() # get the password if not specified if password is None: try: pwd = getpass.getpass("Please enter the 'scanner' password:"******"ERROR", error) exit(1) else: pwd = password # get started try: scanMessenger.requestAndSaveToken("scanner", pwd) except PlomExistingLoginException: print( "You appear to be already logged in!\n\n" " * Perhaps a previous session crashed?\n" " * Do you have another scanner-script running,\n" " e.g., on another computer?\n\n" 'In order to force-logout the existing authorisation run "plom-scan clear"' ) exit(10) spec = scanMessenger.get_spec() scanMessenger.closeUser() scanMessenger.stop() decodeQRs(bundle / "pageImages") checkQRsValid(bundle, spec, examsScannedNow) validateQRsAgainstSpec(spec, examsScannedNow) moveScansIntoPlace(examsScannedNow)
def checkStatus(server=None, pwd=None): if server and ":" in server: s, p = server.split(":") msgr = ScanMessenger(s, port=p) else: msgr = ScanMessenger(server) msgr.start() if not pwd: pwd = getpass.getpass("Please enter the 'scanner' password:"******"scanner", pwd) except PlomExistingLoginException as e: print( "You appear to be already logged in!\n\n" " * Perhaps a previous session crashed?\n" " * Do you have another scanner-script running,\n" " e.g., on another computer?\n\n" 'In order to force-logout the existing authorisation run "plom-scan clear"' ) exit(10) spec = msgr.get_spec() ST = msgr.getScannedTests( ) # returns pairs of [page,version] - only display pages UT = msgr.getUnusedTests() IT = msgr.getIncompleteTests() msgr.closeUser() msgr.stop() print("Test papers unused: [{}]".format(format_int_list_with_runs(UT))) print("Scanned tests in the system:") for t in ST: scannedTPages = [] scannedHWPages = [] for x in ST[t]: if x[0][0] == "t": # is a test page = "t.p" p = int(x[0].split(".")[1]) scannedTPages.append(p) elif x[0][0] == "h": # is a hw page = "h.q.o" q = int(x[0].split(".")[1]) if q not in scannedHWPages: scannedHWPages.append(q) print("\t{}: testPages [{}] hwPages [{}]".format( t, format_int_list_with_runs(scannedTPages), format_int_list_with_runs(scannedHWPages), )) print("Number of scanned tests in the system: {}".format(len(ST))) print("Incomplete scans - listed with their missing pages: ") for t in IT: missingPagesT = [] missingPagesH = [] for x in IT[t]: # each entry is [page, version, scanned?] if x[0][0] == "t": # is a test page p = int(x[0].split(".")[1]) if x[2] is False: missingPagesT.append(p) elif x[0][0] == "h": # is a w page q = int(x[0].split(".")[1]) if x[2] is False: missingPagesH.append(q) print("\t{}: t[{}] h[{}]".format( t, format_int_list_with_runs(missingPagesT), format_int_list_with_runs(missingPagesH), ))
def uploadLPages(bundle_name, skip_list, student_id, server=None, password=None): """Upload the hw pages to the server. lpages uploaded to given student_id. Skips pages-image with orders in the skip-list (ie the page number within the bundle.pdf) Bundle must already be created. We will upload the files and then send a 'please trigger an update' message to the server. """ if server and ":" in server: s, p = server.split(":") msgr = ScanMessenger(s, port=p) else: msgr = ScanMessenger(server) msgr.start() # get the password if not specified if password is None: try: pwd = getpass.getpass("Please enter the 'scanner' password:"******"ERROR", error) else: pwd = password # get started try: msgr.requestAndSaveToken("scanner", pwd) except PlomExistingLoginException: print( "You appear to be already logged in!\n\n" " * Perhaps a previous session crashed?\n" " * Do you have another scanner-script running,\n" " e.g., on another computer?\n\n" 'In order to force-logout the existing authorisation run "plom-hwscan clear"' ) exit(10) spec = msgr.get_spec() numberOfPages = spec["numberOfPages"] file_list = [] # files are sitting in "bundles/submittedLoose/<bundle_name>" os.chdir(os.path.join("bundles", "submittedLoose", bundle_name)) # Look for pages in pageImages for ext in PlomImageExts: file_list.extend( sorted(glob(os.path.join("pageImages", "*.{}".format(ext))))) LUP = sendLFiles(msgr, file_list, skip_list, student_id, bundle_name) updates = msgr.triggerUpdateAfterLUpload() # go back to original dir os.chdir("..") os.chdir("..") os.chdir("..") # close down messenger msgr.closeUser() msgr.stop() return [LUP, updates]