#!/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 'General Review Information | '
#print 'Version | '
#print '' + str(evaluationversion) + ' | '
s = s + 'Reviewer | '
s = s + '' + reviewer + ' | '
s = s + 'Last update | '
s = s + '' + getReviewModifyTime(paperno,reviewernr) + ' | '
s = s + 'Paper Number | '
s = s + '' + str(paperno) + ' | '
s = s + 'Title | '
s = s + '' + title + ' | '
s = s + ' |
'
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 + ''
# for aMainfieldline in mainfieldslist:
# onemainfieldline = string.split (aMainfieldline,'#')
# mainfieldid = onemainfieldline[0]
# if mainfieldid in vvlist:
# mainfieldtext = onemainfieldline[1]
# if not string.find(mainfieldtext, 'Other'):
# mainfieldtext = 'Other'
# s = s + '- ' + mainfieldid + ': ' + mainfieldtext
# 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 '
'