#!/usr/local/bin/python # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # C Y B E R C H A I R V E R S I O N 4 # # # # Copyright (c) University of Twente, The Netherlands # # http://www.utwente.nl # # Author: Richard van de Stadt (cyberchair@borbala.com) # # Department of Computer Science # # TRESE Group (http://trese.cs.utwente.nl) # # and # # Borbala Online Conference Services # # http://www.borbala.com # # # # A demo system has been installed at http://www.cyberchair.org # # # # This program is free software. It is part of CyberChair, a system to # # manage online submissions and reviews. You can redistribute it and/or # # modify it under the terms of the GNU General Public License as published # # by the Free Software Foundation; either version 2 of the License, or (at # # your option) any later version. This copyright text must stay in this file. # # Please send modifications you make to cyberchair@cs.utwente.nl, so that # # others may profit from them. # # # # If you use CyberChair, it would be nice if you mention its use on your # # conference or workshop website and in the proceedings. Please send a copy # # of the proceedings to: # # # # University of Twente # # Department of Computer Science # # Richard R. van de Stadt # # P.O. Box 217 or Drienerlolaan 5 # # 7500 AE Enschede 7522 NB Enschede # # The Netherlands # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # This version of CyberChair was created on Mon May 19 17:59:51 2003 # by request of Adam Stephens (unixadmin@ilrt.org) from # Organization: University of Bristol # Conference of workshop: The 2003 UK Workshop on Computational Intelligence # (UKCI2003) # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # @(#) June, 2003 # Script modified to expand reviewer's HTML form. # # @(#) Feb 16, 1999 # This script shows a review form of a given reviewer for a given paper. # The review is shown as a webtable # import cgi, string, sys, re sys.path.append('/usr/local/projects/ukci/adm') import traceback from generic import header, footer, get_paperreviewers, get_reviewerinfo, get_review, openforread, checkserver, runningFromCommandLine from constantsNew import conferencename from reviewfieldnames import * from generic import reviewExists from constantsNew import reviewersdir, maintaineremail from generic import openforwrite from revinfodatafieldnames import * from datafieldnames import * def showGeneralReviewInfo(reviewer, reviewernr, title, CP, paperno): #, evaluationversion): from generic import getReviewModifyTime s = '' #print '' #print '' #print '' s = s + '' s = s + '' s = s + '' s = s + '' s = s + '' s = s + '' s = s + '' s = s + '' s = s + '
General Review Information
Version' + str(evaluationversion) + '
Reviewer' + reviewer + '
Last update' + getReviewModifyTime(paperno,reviewernr) + '
Paper Number' + str(paperno) + '
Title' + title + '
' return s def showClassification (v): s = '1 - Classification:' if v == '0': s = s + '[Not filled in]' return s s = s + v + ': ' if v == 'A': s = s + 'Accept for oral presentation' elif v == 'B': s = s + 'Accept for poster presentation' elif v == 'C': s = s + 'Borderline (the paper has pros and cons)' elif v == 'D': s = s + 'Reject' s = s + '' return s def showExpertise(v): s = "2 - Reviewer's Expertise:" if v == '0': s = s + '[Not filled in]' return s s = s + v + ': ' if v == 'X': s = s + ' I am an expert' elif v == 'Y': s = s + 'I am knowledgeable in the area, though not an expert' elif v == 'Z': s = s + 'I am not an expert. My evaluation is that of an informed outsider' s = s + '' return s #def showFitoo(v): # if v == '0': v = '[Not filled in]' # return '3 - OO: ' + v + '' #change from '97: mainfields stored in a file - this is more reusable #now only the file 'mainfieldsfilename' can be changed, instead of #changing this method every year. #def showMainfield(vv): # s = '4 - Main Field(s):' # if vv == '0' or vv == '': # s = s + '[Not filled in]' # return s # vvlist = string.split(vv, ' ') # from constantsNew import mainfieldsfilename # mainfieldsfile = openforread(mainfieldsfilename) # mainfieldslist = mainfieldsfile.readlines() # s = s + '' # return s #def showContributiontype(v): # s = '3 - RELEVANCE: ' # if v == '0': # s = s + '[Not filled in]' # return s # s = s + v + ': ' # if v == '1': s = s + 'Excellent' # elif v == '2': s = s + 'Good' # elif v == '3': s = s + 'Fair' # elif v == '3': s = s + 'Weak' # elif v == '3': s = s + 'Poor' # s = s + '' # return s def showRelevance(v): s = '3 - Relevance: ' if v == '0': s = s + '[Not filled in]' return s s = s + v + ': ' if v == 'A': s = s + 'Excellent' elif v == 'B': s = s + 'Good' elif v == 'C': s = s + 'Fair' elif v == 'D': s = s + 'Weak' elif v == 'E': s = s + 'Poor' s = s + '' return s def showSignificance(v): s = '4 - Significance: ' if v == '0': s = s + '[Not filled in]' return s s = s + v + ': ' if v == 'A': s = s + 'Excellent' elif v == 'B': s = s + 'Good' elif v == 'C': s = s + 'Fair' elif v == 'D': s = s + 'Weak' elif v == 'E': s = s + 'Poor' s = s + '' return s def showSoundness(v): s = '5 - Soundness: ' if v == '0': s = s + '[Not filled in]' return s s = s + v + ': ' if v == 'A': s = s + 'Excellent' elif v == 'B': s = s + 'Good' elif v == 'C': s = s + 'Fair' elif v == 'D': s = s + 'Weak' elif v == 'E': s = s + 'Poor' s = s + '' return s def showPresentation(v): s = '6 - Presentation: ' if v == '0': s = s + '[Not filled in]' return s s = s + v + ': ' if v == 'A': s = s + 'Excellent' elif v == 'B': s = s + 'Good' elif v == 'C': s = s + 'Fair' elif v == 'D': s = s + 'Weak' elif v == 'E': s = s + 'Poor' s = s + '' return s def showReadability(v): s = '7 - Readability: ' if v == '0': s = s + '[Not filled in]' return s s = s + v + ': ' if v == 'A': s = s + 'Excellent' elif v == 'B': s = s + 'Good' elif v == 'C': s = s + 'Fair' elif v == 'D': s = s + 'Weak' elif v == 'E': s = s + 'Poor' s = s + '' return s def showReviewForm(review): s = '' s = s + showClassification(review[c_classification]) s = s + showExpertise(review[c_expertise]) #s = s + showFitoo(review[c_fittheme]) #s = s + showMainfield(review[c_mainfield]) #s = s + showContributiontype(review[c_contributiontype]) s = s + showRelevance(review[c_relevance]) s = s + showSignificance(review[c_significance]) s = s + showSoundness(review[c_soundness]) s = s + showPresentation(review[c_presentation]) s = s + showReadability(review[c_readability]) s = s + showSummary(review[c_summary]) s = s + showPCComment(review[c_commentpc]) # s = s + showAuthorComment(review[c_commentauthor]) # s = s + showFavourAgainst(review[c_favour_against]) # s = s + showCoReviewers(review[c_coreviewers]) s = s + '
' return s def subTabNl(s): tab = 8 * ' ' s1 = re.sub('<', '<', s) s2 = re.sub('>', '>', s1) s3 = re.sub('\015\012','
', s2) s4 = re.sub(' ', '
', s3) s5 = re.sub('\011', tab, s4) s6 = re.sub(' ', tab, s5) s7 = re.sub('\012', '
', s6) s8 = re.sub('"', '"', s7) #added 23 Nov 1999 return s8 def showSummary(v): v = subTabNl(v) if v == '0': v = '[Not filled in]' return '8 - Further comments, advice or explanations:

' + v + '' def showPCComment(v): v = subTabNl(v) if v == '0': v = '[Not filled in]' return '9 - Comments for the PC (not shown to authors):

' + v + '' def showAuthorComment(v): v = subTabNl(v) if v == '0': v = '[Not filled in]' return '6 - Comments for the authors:

' + v + '' def showFavourAgainst(v): v = subTabNl(v) if v == '0': v = '[Not filled in]' return '7 - Points in favour or against:

' + v + '' def showCoReviewers(v): v = subTabNl(v) if v == '0': v = '[Not filled in]' return '8 - Co-reviewer(s):

' + v + '' # function checkreviewerpaper checks if the reviewer is allowed # to review the specified paper # def checkreviewerpaper(aRefNr, aPaperNr): from constantsNew import paperreviewersfilename lines_lst = get_paperreviewers(paperreviewersfilename) result = 0 for a_line in lines_lst: lst = string.split(a_line) if (aPaperNr == int(lst[0])): #if this is the record with the papernumber if str(aRefNr) in lst[1:]: result = 1 return result def handleRequest(refnr, papernr): from generic import getKeys from genReviewers import getpapernrstoreview from generic import getPaperInfoByNr, getReviewerName from constantsNew import revinfofieldseparator # searchnrref = int(refnr) - 1 # reviewerslist_s = get_reviewerinfo() # reviewer_data = string.split(reviewerslist_s[searchnrref], revinfofieldseparator) # reviewername = reviewer_data[rev_firstname] + ' '+ reviewer_data[rev_lastname] reviewername = getReviewerName(refnr) S = '' if reviewExists(papernr, refnr): #print papernr, refnr #useful in case a wrong review is submitted by email paperdata = getPaperInfoByNr(papernr) papertitle = paperdata[a_title] paperauthors = paperdata[a_CPnfirst] + ' ' + paperdata[a_CPnlast] review = get_review(papernr, refnr) S = S + '' S = S + showGeneralReviewInfo(reviewername, refnr, papertitle, paperauthors, papernr) #, evalnr) S = S + showReviewForm(review) S = S + '
' if S == None: S = '' #Seems not to help to not get 'None' return S def copyreview(sourceRev, targetRev, pNr): import os from shutil import copyfile sourceFile = reviewersdir + sourceRev + '/p' + pNr + 'r' + sourceRev + '.html' if os.path.exists(sourceFile): targetFile = reviewersdir + str(targetRev) + '/p' + pNr + 'r' + sourceRev + '.html' copyfile (sourceFile, targetFile) #This is called from genRevPaperOverview.py if a reviewer's own review exists #It copies other reviewers' reviews to this reviewers' dir. def copyReviewFilesForThisReviewer (rNr, pNr): from generic import getPapRevs revs = getPapRevs(pNr) for rev in revs: if int(rev) <> int(rNr): if reviewExists (pNr, rNr): copyreview (rev, rNr, pNr) # from, to, nr #Called after submission of a review. This writes the review in the #reviewers' dir, so that it can be copied by other reviewers when they #submit their review, and their paperOverview frame is regenerated. #Maybe the review should be copied to other reviewers' dirs, in case # they don't refresh their paper pages. def writeReview(rNr, pNr): reviewFile = reviewersdir + rNr + '/p' + pNr + 'r' + rNr + '.html' rvF = openforwrite (reviewFile) rvF.lock('w|') header(conferencename + " Paper Review", rvF) reviewtext = handleRequest(rNr, pNr) print reviewtext #for the feedback on screen rvF.write (reviewtext) #<-- hier gaat soms wat mis rvF.lock('u') footer(rvF) #now call spreadreviews? #spreadreviews(rNr, pNr) #distribute this review (same as copyReviewFilesForThisReviewer, but #spreadreviews is push, while copyReviewFilesForThisReviewer is pull. I don't know which is #better, or should they be done both, which might be conflicting? def main (): header(conferencename + " Paper Review") rfcl = runningFromCommandLine() if not rfcl: checkserver() try: if type(sys.argv[1]) <> type (int): refnr = string.atoi(sys.argv[1]) else: refnr = sys.argv[1] if type(sys.argv[2]) <> type (int): papernr = string.atoi(sys.argv[2]) else: papernr = sys.argv[2] except (IndexError), s: print 'Error: Not enough arguments given' footer () sys.exit(0) if checkreviewerpaper(refnr, papernr) == 0: print '

You are not allowed to look at this review.' footer() sys.exit() print handleRequest(refnr, papernr) footer() if __name__ == '__main__': try: sys.stderr = sys.stdout main () except: if sys.exc_type <> SystemExit: print '

Exception raised:

' print '

'
			print 'Please send this output to ' + maintaineremail
			traceback.print_exc(file=sys.stdout)
			print '
'