Notes on using OpenReview (written after the event)

OpenReview is a free conference management system. The default workflow is a little different from what is common in theoretical computer science venues, such as provided by easychair and hotcrp. But we found it was quite easy to adapt it. Moreover OpenReview provides free email support, and a Python API so that you can tailor things quite considerably and fairly easily. Here are some notes from the ACT 2023 PC chairs in case they are useful for future events.

We used OpenReview in single-blind mode (PC members do see author names).

Do get in touch with Sam Staton if anything is unclear.

Main differences compared to familiar workflows

Record of Python experience

Our experience was with OpenReview v1. A couple of points to note.

Connecting:

import openreview
client = openreview.Client(baseurl='https://api.openreview.net', username='redacted', password='redacted')

Download all paper pdfs:

for note in notes:
    if(note.content.get("pdf")):
        f = client.get_attachment(note.id,'pdf')
        with open(f'./act2023papers/paper{note.number}.pdf','wb') as op: 
            op.write(f)

Extract a tab-separated list of papers and bids:

print(client.get_edges_count(invitation='AppliedCategoryTheory.org/ACT/2023/Conference/Reviewers/-/Bid'))
papers = openreview.tools.iterget_notes(
    client, 
	invitation='AppliedCategoryTheory.org/ACT/2023/Conference/-/Submission',
    )
for p in papers:
    bids = openreview.tools.iterget_edges(
        client,
		invitation='AppliedCategoryTheory.org/ACT/2023/Conference/Reviewers/-/Bid',
        head=p.id
        )
    for b in bids:
        print(p.content['title'],"\t",b.head,"\t",b.tail,"\t",b.label)

Extract a tab-separated list of papers and conflicts-of-interest

papers = openreview.tools.iterget_notes(
    client,
    invitation='AppliedCategoryTheory.org/ACT/2023/Conference/-/Submission',
    )
for p in papers:
    conflicts = openreview.tools.iterget_edges(
        client,
        invitation='AppliedCategoryTheory.org/ACT/2023/Conference/Reviewers/-/Conflict',
        head=p.id
        )
    print(p.number,"\t",p.content['title'],"\t",p.content['authors'],"\t",[c.tail for c in conflicts if c.weight==-1 ])

Delete a conflict of interest

edges = client.get_edges(invitation = 'AppliedCategoryTheory.org/ACT/2023/Conference/Reviewers/-/Conflict',head='paperid',tail='~userid1')
for edge in edges:
    print(edge)
    edge.ddate = 1664467200000
    client.post_edge(edge)

Add a conflict of interest

# add conflict
client.post_edge(openreview.Edge(
   invitation = 'AppliedCategoryTheory.org/ACT/2023/Conference/Reviewers/-/Conflict',
   label = "Custom Conflict", 
   weight = -1, 
   head = "paperid", 
   tail = "~userid1",
   signatures = [
"AppliedCategoryTheory.org/ACT/2023/Conference"
    ],
   readers = [
    "AppliedCategoryTheory.org/ACT/2023/Conference",
      "~userid1"
   ],
   writers = [
    "AppliedCategoryTheory.org/ACT/2023/Conference"
]))

(We first extracted the list of known COIs, put it on a google sheet, asked PC members to annotate corrections on the google sheet, and then updated the system using the add/remove scripts above. We could have done this entirely automatically, but there were sufficiently few changes that we just added/removed them one by one using the above two scripts, and anyway it doesn’t hurt to double-check COI changes.)

Extract a tab-separated list of papers and authors who are on the PC

papers = openreview.tools.iterget_notes(
    client,
    invitation='AppliedCategoryTheory.org/ACT/2023/Conference/-/Submission',
    )

for p in papers:
    conflicts = openreview.tools.iterget_edges(
        client,
        invitation='AppliedCategoryTheory.org/ACT/2023/Conference/Reviewers/-/Conflict',
        head=p.id
        )
    authorcois =list(set(p.content['authorids']) & set([c.tail for c in conflicts if c.weight==-1 ]))
    if authorcois != []:
        print(p.number,"\t",p.content['title'],"\t",authorcois)

Extract a list of the authors on the PC.

papers = openreview.tools.iterget_notes(
    client,
    invitation='AppliedCategoryTheory.org/ACT/2023/Conference/-/Submission',
    )
authorsOnPc = []
for p in papers:
    conflicts = openreview.tools.iterget_edges(
        client,
        invitation='AppliedCategoryTheory.org/ACT/2023/Conference/Reviewers/-/Conflict',
        head=p.id
        )
    authorsOnPc += list(set(p.content['authorids']) & set([c.tail for c in conflicts if c.weight==-1 ]))

print(sort(set(authorsOnPc)))

Website based on a bootstrap design by Hartmut Eilers and Eric Koskinen.