OpenReview
  • Overview
    • OpenReview Documentation
  • Reports
    • Conferences
      • OpenReview NeurIPS 2021 Summary Report
      • OpenReview ECCV 2020 Summary Report
  • Getting Started
    • Frequently Asked Questions
      • I accidentally withdrew a submission, what do I do?
      • How do I add a Program Chair to my venue?
      • When will I be able to withdraw my submission?
      • I want to delete my withdrawn or desk-rejected paper, what do I do?
      • An author of a submission cannot access their own paper, what is the problem?
      • What should I do if I find a vulnerability in OpenReview?
      • How can I report a bug or request a feature?
      • What is the difference between due date (duedate) and expiration date (expdate)?
      • Will Reviewers be notified of their Assignments?
      • What is the max file size for uploads?
      • Why are the "rating" and "confidence" fields in my PC Console wrong?
      • What should I do if my question is not answered here?
      • My Profile is "Limited". What does that mean?
      • What field types are supported in the forms?
      • How do I recruit reviewers?
      • How do I obtain a letter of proof for my services as a reviewer?
      • How do I complete my tasks?
      • Can I automatically transfer my Expertise Selection to another venue?
      • Why does it take two weeks to moderate my profile?
      • What do the different 'status' values mean in the message logs?
      • I am an Independent Researcher, how do I sign up?
      • How do I locate the date a submission is made public?
      • I am a reviewer but I can't access my assigned submissions, what do I do?
      • Reviewers for my venue cannot see their assigned submissions, what should I do?
      • I am a reviewer and I don't have papers for Expertise Selection, what do I do?
      • How do I upload a publication with a license that is not listed?
      • I didn't receive a password reset email, what do I do?
      • How do I add/change an author of my submission after the deadline?
      • How do I find a venue id?
      • Why can't I update my DBLP link?
    • Using the API
      • Installing and Instantiating the Python client
      • Objects in OpenReview
        • Introduction to Groups
        • Introduction to Profiles
        • Introduction to Notes
    • Hosting a venue on OpenReview
      • Creating your Venue Instance
      • Navigating your Venue Pages
      • Customizing your submission form
      • Enabling Supplementary Material Upload
      • Changing your submission deadline
      • Enabling an Abstract Registration Deadline
    • Creating an OpenReview Profile
      • Signing up for OpenReview
      • Resending an activation link
      • Expediting Profile Activation
      • Add or remove a name from your profile
      • Add or remove an email address from your profile
      • Finding your profile ID
      • Entering Institutional Data
      • Importing papers from DBLP
      • Manually adding a publication to your profile
      • Finding and adding a Semantic Scholar URL to your profile
      • Finding and adding your ACL Anthology URL to your profile
      • Merging Profiles
    • Customizing Forms
    • Using the New Forum Page
    • Live Chat on the Forum Page
  • Workflows
    • Example Workflow
    • ARR Commitment Venues
    • Exercises for workflow chairs
      • Prerequisites
      • Exercise: Posting LLM generated reviews
  • How-To Guides
    • Modifying Venue Homepages
      • How to customize your venue homepage
      • How to modify the homepage layout to show decision tabs
    • Managing Groups
      • How to Recruit and Remind Recruited Reviewers
      • How to have multiple Reviewer or Area Chair groups
      • How to Add and Remove Members from a Group
      • Publication Chairs
      • How to Copy Members from One Group to Another
    • Workflow
      • How to create, change, and delete notes
      • How to test your venue workflow
      • How to support different tracks for a venue
      • How to Make Submissions Available Before the Submission Deadline
      • How to Change the Expiration Date of the Submission Invitation
      • Desk Reject Submissions that are Missing PDFs
      • How to begin the Review Stage while Submissions are Open
      • How to Change Who can Access Submissions After the Deadline
      • How to Enable Commenting on Submissions
      • How to Set a Custom Deadline for Withdrawals
      • How to Enable an Ethics Review Stage
      • How to Hide Submission Fields from Reviewers
      • How to modify the Review, Meta Review, and Decision Forms
      • How to release reviews
      • How to Enable the Rebuttal Period
      • How to Undo a Paper Withdrawal
      • How to enable Camera Ready Revision Upload for accepted papers
      • How to make papers public after decisions are made
      • How to enable bidding for Senior Area Chair Assignment
      • How to release the identities of authors of accepted papers only
      • How to enable the Review Revision Stage
    • Paper Matching and Assignment
      • How to Compute Conflicts Between Users
      • How to Post a Custom Conflict
      • How to create your own Conflict Policy
      • How to Bid on Submissions
      • How to add/remove bids programmatically
      • How to do manual assignments
      • How to do automatic assignments
        • How to setup paper matching by calculating affinity scores and conflicts
        • How to run a paper matching
        • How to modify the proposed assignments
        • How to deploy the proposed assignments
        • How to modify assignments after deployment
      • How to enable Reviewer Reassignment for Area Chairs
      • How to Sync Manual and Automatic Assignments
      • How to Compute Affinity Scores
      • How to Undo Deployed Assignments
      • How to Modify Reviewer Assignments as an Area Chair
      • How to Get all Assignments for a User
      • How to Update Custom Max Papers for Reviewers or ACs
      • How to Make Assignments using Subject Areas
    • Communication
      • How to send messages through the UI
      • How to customize emails sent through OpenReview
      • How to send messages with the python client
      • How to Send Decision Notifications Using the UI
      • How to view messages sent through OpenReview
      • How to email the authors of accepted submissions
      • How to get email adresses
    • Submissions, comments, reviews, and decisions
      • How to add formatting to reviews or comments
      • How to submit a Review Revision
      • How to add formulas or use mathematical notation
      • How to edit a submission after the deadline - Authors
      • How to upload paper decisions in bulk
      • How to hide/reveal fields
      • Update camera-ready PDFs after the deadline expires
    • Data Retrieval and Modification
      • How to get edges for Conflicts, Assignments, Custom Max Papers, and more
      • How to check the API version of a venue
      • How to create a custom submission export
      • How to Get Profiles and Their Relations
      • How to Get All the Reviews that I have written and their Corresponding Submissions
      • How to Export All Reviews into a CSV
      • How to Get All Venues
      • How to Retrieve Data for ACM Proceedings
      • How to Get Reviewer Ratings
      • How to Get All Profiles
      • How to Get all Notes (for submissions, reviews, rebuttals, etc)
      • Data Retrieval for API 1 Venues
  • Reference
    • API V1
      • OpenAPI definition
      • Entities
        • Edge
          • Fields
        • Note
          • Fields
        • Invitation
    • API V2
      • OpenAPI definition
      • Entities
        • Edge
          • Fields
        • Group
          • Fields
        • Note
          • Fields
        • Invitation
          • Types and Structure
          • Fields
          • Specifiers
          • Dollar Sign Notation
        • Edit
          • Fields
          • Inference
        • Profile
          • Fields
    • Stages
      • Revision
      • Registration Stage
      • Bid Stage
      • Review Stage
      • Rebuttal Stage
      • Meta Review Stage
      • Decision Stage
      • Comment Stage
      • Submission Revision Stage
      • Post Submission Stage
      • Post Decision Stage
      • Ethics Review Stage
    • Default Forms
      • Default Submission Form
      • Default Registration Form
      • Default Comment Form
      • Default Review Form
      • Default Rebuttal Form
      • Default Meta Review Form
      • Default Decision Form
      • Default Decision Notification
      • Default Ethics Review Form
    • OpenReview TeX
      • Common Issues with LaTeX Code Display
      • OpenReview TeX support
    • Mental Model on Blind Submissions and Revisions
Powered by GitBook
On this page
  • 1. Posting (Creating) a Note
  • Quickstart: Posting a submission with Python
  • QuickStart: Posting a Support Request Form With Python
  • 2. Editing Notes
  • Quickstart: Update the readers of a note or field
  • 3. Deleting Notes and fields
  • Quickstart: Remove a field from a submission
  • Quickstart: Posting, editing, and deleting a test review

Was this helpful?

Export as PDF
  1. How-To Guides
  2. Workflow

How to create, change, and delete notes

Jump to:

  • Quickstart: posting a test submission

  • Quickstart: changing readers

  • Quickstart: posting and deleting test reviews

  • Quickstart: deleting fields

1. Posting (Creating) a Note

To post a new Note, create a Note object with required fields, then use client_v2.post_note_edit().

Required fields include:

  • invitation: the invitation ID defining the note type (e.g., a submission, review, comment)

  • forum: the ID of the main submission this note belongs to (for replies)

  • signatures: who is posting (usually a profile ID)

  • readers: who can read this note

  • writers: who can modify the note

  • content: a dictionary of the note content fields (title, authors, review text, etc.)

Quickstart: Posting a submission with Python

Posting a submission with Python is typically reserved for testing venue workflows and changes.

PCs and Reviewers that are also authors of test submissions will be conflicted later on in the process. We recommend using test author profiles for the submission process.

#create the submission note
venue_id = test_venue_id
author_ids_or_emails = [ "~Author_One1",'email@mail.com']
your_id = "~PC_ID1"
i = 1
test_pdf_path = './data/paper.pdf'
note = openreview.api.Note(
        license = 'CC BY-SA 4.0',
        content = {
            'title': { 'value': 'Paper title ' + str(i) },
            'abstract': { 'value': 'This is an abstract ' + str(i) },
            'authorids': { 'value': author_ids_or_emails },
            'authors': { 'value': author_ids_or_emails},
            'keywords': { 'value': ['machine learning', 'nlp'] },
            'pdf': {'value': '/pdf/' + 'p' * 40 +'.pdf' },
        }
    )
#url = client.put_attachment(test_pdf_path, f'{venue_id}/-/Submission', 'pdf')
#note.content['pdf'] = url

#post the note
note = openreview_client.post_note_edit(
    invitation=f"{venue_id}/-/Submission",
    signatures=[your_id],
    readers=[venue_id] + author_ids_or_emails,
    writers = [venue_id] + author_ids_or_emails,
    note=note
)

QuickStart: Posting a Support Request Form With Python

While a support request form can most easily be submitted through the UI, some venues that have multiple deadlines a year and need to submit multiple venue requests with the same settings may find it easier to do this programmatically through the API. While most notes are posted with the API2 client, this note must be posted with the API 1 client.

#change the settings below
program_chair_emails = ['pc_email1@mail.com','pc_email2@mail.com']
content = {
        "title": "My test venue",
        "Official Venue Name": "My test venue", 
        "Abbreviated Venue Name": "MTV", 
        "Official Website URL": "mtv.com", 
        "program_chair_emails": program_chair_emails, 
        "contact_email": "pc@venue.org", 
        "Area Chairs (Metareviewers)": "Yes, our venue has Area Chairs",
        "Paper Matching": [
            "Reviewer Bid Scores", 
            "OpenReview Affinity"
        ],
        "Venue Start Date": "2022/05/01",
        "Author and Reviewer Anonymity": "Double-blind",
        "reviewer_identity": [
            "Assigned Area Chair"
        ],
        "submission_readers": "All program committee (all reviewers, all area chairs, all senior area chairs if applicable)",
        "venue_organizer_agreement":['OpenReview natively supports a wide variety of reviewing workflow configurations. However, if we want significant reviewing process customizations or experiments, we will detail these requests to the OpenReview staff at least three months in advance.',
  'We will ask authors and reviewers to create an OpenReview Profile at least two weeks in advance of the paper submission deadlines.',
  'When assembling our group of reviewers and meta-reviewers, we will only include email addresses or OpenReview Profile IDs of people we know to have authored publications relevant to our venue.  (We will not solicit new reviewers using an open web form, because unfortunately some malicious actors sometimes try to create "fake ids" aiming to be assigned to review their own paper submissions.)',
  "We acknowledge that, if our venue's reviewing workflow is non-standard, or if our venue is expecting more than a few hundred submissions for any one deadline, we should designate our own Workflow Chair, who will read the OpenReview documentation and manage our workflow configurations throughout the reviewing process.",
  'We acknowledge that OpenReview staff work Monday-Friday during standard business hours US Eastern time, and we cannot expect support responses outside those times.  For this reason, we recommend setting submission and reviewing deadlines Monday through Thursday.',
  'We will treat the OpenReview staff with kindness and consideration.']
    }
    
support_request = openreview.Note(
    invitation = 'OpenReview.net/Support/-/Request_Form', 
    readers = ["OpenReview.net/Support"] + program_chair_emails,
    writers = ["OpenReview.net/Support"] + program_chair_emails,
    content = content,
    signatures = [
        <your_profile_id>
    ]
)
client_v1.post_note(support_request)

2. Editing Notes

Editing notes in API2 is done the same way as creating notes, by posting a note edit with new values for the fields.

Quickstart: Update the readers of a note or field

One common edit to make in bulk to notes is updating the readers of a note. This can be done in the UI for common configurations, but if your venue needs further fine-grained control over readership (for example custom tracks, groups, etc), then you can use the Python Client to change the readers of any subset of notes programmatically. The following script will change the readers of a note or field within a note to the new list.

#venue_id
venue_id = "<VENUE_ID>"
note_type = 'Official_Review' #Taken from the last part of the note invitation. Could replace with "Rebuttal", "Decision", "Metareview"
new_readers = ["<LIST_OF_NEW_READERS>"]  # options are 1) ['everyone'] or 2) list of either group names ("Program_Chairs") or Submission + Group Name ("Submission Authors").
field_to_change = None #use None to change readers of the note, or use the field name to change the readers of a field

#set up invitations
edit_invitation = f'{venue_id}/-/Edit' 
submission_invitation = f'{venue_id}/-/Submission'

#get a list of notes to edit (in this case all reviews)
submissions = client_v2.get_notes(invitation=submission_invitation,details = 'replies')
#reviews to edit
reviews=[openreview.api.Note.from_json(reply) for s in submissions for reply in s.details['replies'] if f'{venue_id}/Submission{s.number}/-/{note_type}' in reply['invitations']]
print(len(reviews))
notes_to_change = reviews

#change the readers of the notes
for note_to_change in notes_to_change:
    submission_number = client_v2.get_note(note_to_change.forum).number
    note_content = note_to_change.content
    if new_readers == ['everyone']:

         note_readers = ['everyone']

    else:
        #parse the new_readers:
        group_ids = []
        for g in new_readers:
            if g.startswith('Submission'):
                group_name = g.split(' ')[1]
                new_reader_group = client_v2.get_group(f'{venue_id}/Submission{submission_number}/{group_name}').id
                group_ids.append(new_reader_group)
            else:
                new_reader_group = client_v2.get_group(venue_id + '/' + g)
                group_ids.append(new_reader_group.id)
        #parse the new_readers:
        if field_to_change == None:
            note_readers = list(set(group_ids + note_to_change.signatures + [venue_id]))
        else:
            note_content[field_to_change]['readers'] = list(set(group_ids + note_to_change.signatures + [venue_id]))
        
    client_v2.post_note_edit(invitation=edit_invitation,
            signatures=[venue_id],
            note=openreview.api.Note(
                id=note_to_change.id,
                readers=note_readers,
                content=note_content
            )
        )

3. Deleting Notes and fields

Deleting notes should be used with caution as most changes can be done by editing a note, and once deleted, changes can be difficult to recover. Typically, we recommend deleting notes only in the case of testing a venue workflow on the dev site. To delete a note, you would post a note edit that includes a value (in millisecond time) for the ddate field, which has a value of None by default. An example is below:


venue_id = '<VENUE ID>'
note_to_delete = client_v2.get_note('<NOTE_ID>')
time_now = openreview.tools.datetime_millis(dt.datetime.now()))
)

client_v2.post_note_edit(
    invitation=f'{VENUE ID}/-/Edit',
    signatures=note_to_delete.signatures,
    note=openreview.api.Note(
        id=note_to_delete.id,
        content=note_to_delete.content,
        ddate = time_now
        )

Quickstart: Remove a field from a submission

Removing fields from submissions should be done sparingly. Oftentimes, changing the readers of the field its sufficient (see above), but in the case that you want to remove a field entirely, you can use the approach below"

venue_id = "<YOUR_VENUE_ID>"
forum_id_to_change = '123dsavdf'
field_to_delete = 'keywords'
submission = client_v2.get_note(forum_id_to_change)
time_now = openreview.tools.datetime_millis(dt.datetime.now()))
)

edit_content = submission.content
edit_content[field_to_delete][['value']['ddate'] = time_now

client_v2.post_note_edit(invitation=f'{venue_id}/-/PC_Revision',
    signatures=[f'{venue_id}/Program_Chairs'],
    note=openreview.api.Note(
        id = submission.id,
        content = edit_content
    ))

Quickstart: Posting, editing, and deleting a test review

submission_number = '<SUBMISSION_NUMBER>'
venue_id = '<VENUE ID>'
invitation = client_v2.get_invitation(f'{venue_id}/Submission{submission_number}/-/Official_Review')

anon_groups = client_v2.get_groups(prefix=f'{test_venue_id}/Submission1/Reviewer_', signatory='~Reviewer_One1')
anon_group_id = anon_groups[0].id

review_edit = client_v2.post_note_edit(
    invitation=f'{test_venue_id}/Submission1/-/Official_Review',
    signatures=[anon_group_id],
    note=openreview.api.Note(
        content={
            'title': { 'value': 'Good paper, accept'},
            'review': { 'value': 'Excellent paper, accept'},
            'rating': { 'value': 10},
            'confidence': { 'value': 5},
        }
    )
#edit the review note
anon_groups = client_v2.get_groups(prefix=f'{test_venue_id}/Submission{submission_number}/Reviewer_', signatory='~Reviewer_One1')
anon_group_id = anon_groups[0].id
review_notes = client_v2.get_notes(
    invitation=f'{venue_id}/Submission{submission_number}/-/Official_Review',
    signatures=[anon_group_id]
)

# Assuming there's one review per reviewer
original_review = review_notes[0]

#Update the content of the review with the new content 
review_content = original_review.content
review_content['rating']['value'] = 6

# Step 2: Edit the review to update the rating
edited_review = client_v2.post_note_edit(
    invitation=f'{venue_id}/Submission1/-/Official_Review',
    signatures=[anon_group_id],
    note=openreview.api.Note(
        id=original_review.id,
        forum=original_review.forum,
        replyto=original_review.replyto,
        content=review_content
        
    )
)
# Assuming the first one is the one we want to delete
note_to_delete = review_notes[0]

# Step 2: Post a deletion edit - to delete the whole review
deleted_note = reviewer_client.post_note_edit(
    invitation=f'{test_venue_id}/Submission1/-/Official_Review',
    signatures=[anon_group_id],
    note=openreview.api.Note(
        id=note_to_delete.id,
        content=note_to_delete.content,
        ddate = openreview.tools.datetime_millis(dt.datetime.now()))
)

PreviousWorkflowNextHow to test your venue workflow

Last updated 4 days ago

Was this helpful?