Skip to content

Commit

Permalink
ARR: fix several issues (#2212)
Browse files Browse the repository at this point in the history
* enable SAC tab with paper status

* customize assignment urls

* update description

* use above instead of below

* enable reviewer assignment in the paper status tab

* fix test

* support multiple research areas

* check ARR instances

* check if ddate is instance of int and not delete: true

* use arr hide fields in the submission stage

* reduce count
  • Loading branch information
melisabok authored Jun 27, 2024
1 parent 390a47d commit f9a732d
Show file tree
Hide file tree
Showing 13 changed files with 240 additions and 239 deletions.
3 changes: 2 additions & 1 deletion openreview/arr/arr.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
from openreview.arr.helpers import (
setup_arr_invitations
)
from openreview.stages.arr_content import hide_fields

SHORT_BUFFER_MIN = 30
LONG_BUFFER_DAYS = 10
Expand Down Expand Up @@ -133,6 +134,7 @@ def copy_to_venue(self):
self.venue.source_submissions_query_mapping = self.source_submissions_query_mapping
self.venue.sac_paper_assignments = self.sac_paper_assignments

self.submission_stage.hide_fields = self.submission_stage.hide_fields + hide_fields
self.venue.submission_stage = self.submission_stage
self.venue.review_stage = self.review_stage
self.venue.bid_stages = self.bid_stages
Expand Down Expand Up @@ -423,7 +425,6 @@ def recruit_reviewers(self,

# For stage invitations, pass value to inner venue objects
def create_submission_stage(self):
self.venue.submission_stage = self.submission_stage
stage_value = self.venue.create_submission_stage()
invitation = self.client.get_invitation(self.get_submission_id())
invitation.preprocess = self.invitation_builder.get_process_content('process/submission_preprocess.py')
Expand Down
2 changes: 1 addition & 1 deletion openreview/arr/process/emergency_load_preprocess.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,4 @@ def process(client, edit, invitation):
if not emergency_load:
raise openreview.OpenReviewException('You have agreed to emergency reviewing, please enter the additional load that you want to be assigned.')
if not research_area:
raise openreview.OpenReviewException('You have agreed to emergency reviewing, please enter your closest relevant research area.')
raise openreview.OpenReviewException('You have agreed to emergency reviewing, please enter your closest relevant research areas.')
263 changes: 118 additions & 145 deletions openreview/arr/process/emergency_load_process.py
Original file line number Diff line number Diff line change
@@ -1,179 +1,152 @@
def process(client, edit, invitation):
import time

if "No" in edit.note.content['emergency_reviewing_agreement']:
return

domain = client.get_group(invitation.domain)
venue_id = domain.id
submission_venue_id = domain.content['submission_venue_id']['value']
meta_invitation_id = domain.content['meta_invitation_id']['value']
venue_name = domain.content['title']['value']

CONFERENCE_ID = domain.id
SAC_ID = domain.content['senior_area_chairs_id']['value']
AC_ID = domain.content['area_chairs_id']['value']
REV_ID = domain.content['reviewers_id']['value']
user = client.get_profile(edit.signatures[0]).id
role = invitation.id.split('/-/')[0]

print('Clear existing emergency edges...')

client.delete_edges(
invitation=f"{role}/-/Emergency_Load",
head=role,
tail=user,
wait_to_finish=True,
soft_delete=True
)
client.delete_edges(
invitation=f"{role}/-/Emergency_Area",
head=role,
tail=user,
wait_to_finish=True,
soft_delete=True
)

registered_loads = client.get_edges(invitation=f"{role}/-/Registered_Load", tail=user)

client.delete_edges(
invitation=f"{role}/-/Registered_Load",
head=role,
tail=user,
wait_to_finish=True,
soft_delete=True
)
client.delete_edges(
invitation=f"{role}/-/Emergency_Score",
tail=user,
wait_to_finish=True,
soft_delete=True
)

if isinstance(edit.note.ddate, int) or "No" in edit.note.content['emergency_reviewing_agreement']:

if not registered_loads:
print('No registered load, nothing to do')
return

print('Emergency agreement was deleted, restore original load')

edge_readers = [CONFERENCE_ID]
inv_role = invitation.id.split('/')[-3]
role = None
for venue_role in [SAC_ID, AC_ID, REV_ID]:
if f"/{inv_role}" in venue_role:
role = venue_role
if venue_role == AC_ID:
edge_readers += [SAC_ID]
elif venue_role == REV_ID:
edge_readers += [SAC_ID, AC_ID]

if not role:
raise openreview.OpenReviewException('Invalid role for emergency edges')
edge_readers += [user]

deployed_label = [
note for note in client.get_all_notes(invitation=f"{role}/-/Assignment_Configuration") if 'Deploy' in note.content['status']['value']
][0].content['title']['value']
aggregate_score_edges = client.get_all_edges(invitation=f"{role}/-/Aggregate_Score", label=deployed_label, tail=user)
emergency_score_edges = client.get_all_edges(invitation=f"{role}/-/Emergency_Score", label=deployed_label, tail=user)

if edit.note.ddate:
reg_edges = client.get_all_edges(invitation=f"{role}/-/Registered_Load", tail=user)
if len(reg_edges) <= 0:
repost_load = 0
else:
repost_load = reg_edges[0].weight
client.delete_edges(
invitation=f"{role}/-/Custom_Max_Papers",
head=role,
tail=user,
wait_to_finish=True,
soft_delete=True
)
client.delete_edges(
invitation=f"{role}/-/Emergency_Load",
head=role,
tail=user,
wait_to_finish=True,
soft_delete=True
)
client.delete_edges(
invitation=f"{role}/-/Emergency_Area",
head=role,
tail=user,
wait_to_finish=True,
soft_delete=True
)
client.delete_edges(
invitation=f"{role}/-/Registered_Load",
head=role,
tail=user,
wait_to_finish=True,
soft_delete=True
)
client.delete_edges(
invitation=f"{role}/-/Emergency_Score",
tail=user,
wait_to_finish=True,
soft_delete=True
)

client.post_edge(
openreview.api.Edge(
invitation=f"{role}/-/Custom_Max_Papers",
readers=edge_readers,
writers=[CONFERENCE_ID],
signatures=[CONFERENCE_ID],
signatures=[venue_id],
head=role,
tail=user,
weight=repost_load
weight=registered_loads[0].weight if registered_loads else 0
)
)
return

cmp_edges = client.get_all_edges(invitation=f"{role}/-/Custom_Max_Papers", tail=user)
if len(cmp_edges) <= 0:
original_load = 0
else:
original_load = cmp_edges[0].weight
emergency_load = edit.note.content.get('emergency_load', {}).get('value', 0)
print('Emergency agreement was accepted, update emergency loads')

edge_invitation_ids = [
f"{role}/-/Custom_Max_Papers",
f"{role}/-/Registered_Load",
f"{role}/-/Emergency_Load",
f"{role}/-/Emergency_Area",
]

edge_values = [
{
'head': role,
'tail': user,
'weight': emergency_load + original_load
},
{
'head': role,
'tail': user,
'weight': original_load
},
{
'head': role,
'tail': user,
'weight': emergency_load
}
]
area_value = None
if 'research_area' in edit.note.content:
area_value = {
'head': role,
'tail': user,
'label': edit.note.content.get('research_area', {}).get('value', 'N/A')
}
edge_values.append(area_value)
original_loads = registered_loads if registered_loads else client.get_edges(invitation=f"{role}/-/Custom_Max_Papers", tail=user)
original_load = original_loads[0].weight if original_loads else 0
emergency_load = edit.note.content.get('emergency_load', {}).get('value', 0)

for inv_id, edge_val in zip(edge_invitation_ids, edge_values):
if edge_val is None:
continue
client.delete_edges(
invitation=f"{role}/-/Custom_Max_Papers",
head=role,
tail=user,
wait_to_finish=True,
soft_delete=True
)

client.delete_edges(
invitation=inv_id,
head=edge_val['head'],
tail=edge_val['tail'],
wait_to_finish=True,
soft_delete=True
client.post_edge(
openreview.api.Edge(
invitation=f"{role}/-/Custom_Max_Papers",
signatures=[venue_id],
head=role,
tail=user,
weight=emergency_load + original_load
)
)

client.post_edge(
openreview.api.Edge(
invitation=inv_id,
readers=edge_readers,
writers=[CONFERENCE_ID],
signatures=[CONFERENCE_ID],
**edge_val
)
client.post_edge(
openreview.api.Edge(
invitation=f"{role}/-/Registered_Load",
signatures=[venue_id],
head=role,
tail=user,
weight=original_load
)
)

edges_to_post = []
for edge in aggregate_score_edges:
edges_to_post.append(openreview.api.Edge(
invitation=f"{role}/-/Emergency_Score",
readers=edge.readers,
writers=edge.writers,
nonreaders=edge.nonreaders,
signatures=edge.signatures,
head=edge.head,
tail=edge.tail,
weight=edge.weight
))
client.post_edge(
openreview.api.Edge(
invitation=f"{role}/-/Emergency_Load",
signatures=[venue_id],
head=role,
tail=user,
weight=emergency_load
)
)

client.delete_edges(
invitation=f"{role}/-/Emergency_Score",
label=deployed_label,
tail=user,
wait_to_finish=True,
soft_delete=True
)
openreview.tools.post_bulk_edges(client, edges_to_post)
if 'research_area' in edit.note.content:
areas = edit.note.content['research_area']['value']
print('Update emergency areas', areas)
for area in areas:
client.post_edge(
openreview.api.Edge(
invitation=f"{role}/-/Emergency_Area",
signatures=[venue_id],
head=role,
tail=user,
label=area
)
)

emergency_score_edges = client.get_all_edges(invitation=f"{role}/-/Emergency_Score", tail=user)

## Post emergency score edges if they don't exist
if len(emergency_score_edges) == 0:
print('Create emergency score edges...')
deployed_label = [
note for note in client.get_all_notes(invitation=f"{role}/-/Assignment_Configuration") if 'Deployed' in note.content['status']['value']
][0].content['title']['value']
aggregate_score_edges = client.get_all_edges(invitation=f"{role}/-/Aggregate_Score", label=deployed_label, tail=user)

edges_to_post = []
for edge in aggregate_score_edges:
edges_to_post.append(openreview.api.Edge(
invitation=f"{role}/-/Emergency_Score",
readers=edge.readers,
writers=edge.writers,
nonreaders=edge.nonreaders,
signatures=edge.signatures,
head=edge.head,
tail=edge.tail,
weight=edge.weight
))

openreview.tools.post_bulk_edges(client, edges_to_post)

## Delete availability, assume they can review more than resubmissions
client.delete_edges(
Expand Down
2 changes: 2 additions & 0 deletions openreview/arr/webfield/programChairsWebfield.js
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,8 @@ return {
messageSubmissionReviewersInvitationId: domain.content.reviewers_message_submission_id?.value,
messageAreaChairsInvitationId: domain.content.area_chairs_message_id?.value,
messageReviewersInvitationId: domain.content.reviewers_message_id?.value,
messageSeniorAreaChairsInvitationId: domain.content.meta_invitation_id?.value,
sacDirectPaperAssignment: domain.content.sac_paper_assignments?.value,
submissionVenueId: domain.content.submission_venue_id?.value,
withdrawnVenueId: domain.content.withdrawn_venue_id?.value,
deskRejectedVenueId: domain.content.desk_rejected_venue_id?.value,
Expand Down
Loading

0 comments on commit f9a732d

Please sign in to comment.