diff --git a/openreview/arr/arr.py b/openreview/arr/arr.py index aec01a931..cd114d9c5 100644 --- a/openreview/arr/arr.py +++ b/openreview/arr/arr.py @@ -588,6 +588,13 @@ def get_meta_invitation_id(self): def get_submission_id(self): return self.venue.get_submission_id() + def get_post_submission_id(self): + return self.venue.get_post_submission_id() + + def get_preprint_post_submission_id(self): + submission_name = self.submission_stage.name if self.submission_stage else self.venue.submission_stage.name + return self.get_invitation_id(f'Preprint_Post_{submission_name}') + def get_pc_submission_revision_id(self): return self.venue.get_pc_submission_revision_id() @@ -796,7 +803,40 @@ def recruit_reviewers(self, # For stage invitations, pass value to inner venue objects def create_submission_stage(self): - stage_value = self.venue.create_submission_stage() + self.invitation_builder.set_submission_invitation() + if self.venue.iThenticate_plagiarism_check: + self.invitation_builder.set_iThenticate_plagiarism_check_invitation() + self.invitation_builder.set_withdrawal_invitation() + self.invitation_builder.set_desk_rejection_invitation() + self.invitation_builder.set_post_submission_invitation() + self.invitation_builder.set_preprint_post_submission_invitation() + self.invitation_builder.set_pc_submission_revision_invitation() + self.invitation_builder.set_submission_reviewer_group_invitation() + self.invitation_builder.set_submission_message_invitation() + if self.use_area_chairs: + self.invitation_builder.set_submission_area_chair_group_invitation() + if self.use_senior_area_chairs: + self.invitation_builder.set_submission_senior_area_chair_group_invitation() + if self.expertise_selection_stage: + self.invitation_builder.set_expertise_selection_invitations() + + if self.submission_stage.second_due_date: + stage = self.submission_stage + submission_revision_stage = openreview.stages.SubmissionRevisionStage( + name=f'Full_{stage.name}', + start_date=stage.exp_date, + due_date=stage.second_due_date, + additional_fields=stage.second_deadline_additional_fields if stage.second_deadline_additional_fields else stage.additional_fields, + remove_fields=stage.second_deadline_remove_fields if stage.second_deadline_remove_fields else stage.remove_fields, + only_accepted=False, + multiReply=True, + allow_author_reorder=stage.author_reorder_after_first_deadline, + allow_license_edition=True, + source={'venueid': self.get_submission_venue_id()} + ) + self.invitation_builder.set_submission_revision_invitation(submission_revision_stage) + self.invitation_builder.set_submission_deletion_invitation(submission_revision_stage) + invitation = self.client.get_invitation(self.get_submission_id()) invitation.preprocess = self.invitation_builder.get_process_content('process/submission_preprocess.py') invitation.process = invitation.process + self.invitation_builder.get_process_content('process/submission_process_extension.py') @@ -809,10 +849,10 @@ def create_submission_stage(self): replacement=False, invitation=invitation ) - return stage_value def create_post_submission_stage(self): - return self.venue.create_post_submission_stage() + self.invitation_builder.set_post_submission_invitation() + self.invitation_builder.set_preprint_post_submission_invitation() def create_submission_revision_stage(self): self.venue.submission_revision_stage = self.submission_revision_stage diff --git a/openreview/arr/helpers.py b/openreview/arr/helpers.py index e445552be..cbab204e3 100644 --- a/openreview/arr/helpers.py +++ b/openreview/arr/helpers.py @@ -36,8 +36,6 @@ arr_metareview_license_task, arr_metareview_license_task_forum, arr_metareview_rating_content, - hide_fields_from_public, - hide_fields, arr_submitted_author_forum, arr_submitted_author_content, arr_delay_notification_content, @@ -148,12 +146,6 @@ class ARRWorkflow(object): "order": 14, "required": False }, - "preprint_release_submission_date": { - "description": "When should submissions be copied over and the opt-in papers be revealed to the public? This should be done several hours (12+ hours) after the submission deadline.", - "value-regex": "^[0-9]{4}\\/([1-9]|0[1-9]|1[0-2])\\/([1-9]|0[1-9]|[1-2][0-9]|3[0-1])(\\s+)?((2[0-3]|[01][0-9]|[0-9]):[0-5][0-9])?(\\s+)?$", - "order": 15, - "required": False - }, "setup_sae_ae_assignment_date": { "description": "When will both SAE and AE assignments be deployed? This must happen after both assignments are deployed to give SAEs access to the AE assignments.", "value-regex": "^[0-9]{4}\\/([1-9]|0[1-9]|1[0-2])\\/([1-9]|0[1-9]|[1-2][0-9]|3[0-1])(\\s+)?((2[0-3]|[01][0-9]|[0-9]):[0-5][0-9])?(\\s+)?$", @@ -416,64 +408,6 @@ class ARRWorkflow(object): } - @staticmethod - def _build_preprint_release_edit(client, venue, builder, request_form): - venue_id = venue.id - submission_stage = venue.submission_stage - - submission_id = submission_stage.get_submission_id(venue) - - hidden_field_names = hide_fields_from_public - committee_members = venue.get_committee(number='${{4/id}/number}', with_authors=True) - note_content = { f: { 'readers': committee_members } for f in hidden_field_names} - - # Always hide authors and authorids - author_readers = [venue_id, venue.get_authors_id(number='${{4/id}/number}')] - note_content['authors'] = { 'readers': author_readers } - note_content['authorids'] = { 'readers': author_readers } - for field in hide_fields: - note_content[field] = { 'readers': author_readers } - - edit = { - 'signatures': [venue_id], - 'readers': [venue_id, venue.get_authors_id('${{2/note/id}/number}')], - 'writers': [venue_id], - 'note': { - 'id': { - 'param': { - 'withInvitation': submission_id, - 'optional': True - } - }, - 'odate': { - 'param': { - 'range': [ 0, 9999999999999 ], - 'optional': True, - 'deletable': True - } - }, - 'signatures': [ venue.get_authors_id('${{2/id}/number}') ], - 'readers': ['everyone'], - 'writers': [venue_id, venue.get_authors_id('${{2/id}/number}')], - } - } - - note_content['_bibtex'] = { - 'value': { - 'param': { - 'type': 'string', - 'maxLength': 200000, - 'input': 'textarea', - 'optional': True - } - } - } - - if note_content: - edit['note']['content'] = note_content - - return {'edit': edit} - @staticmethod def _extend_desk_reject_verification(client, venue, builder, request_form): venue.invitation_builder.set_verification_flag_invitation() @@ -608,15 +542,6 @@ def __init__(self, client_v2, venue, configuration_note, request_form_id, suppor request_form = self.client.get_note(request_form_id) self.workflow_stages = [ - ARRStage( - type=ARRStage.Type.PROCESS_INVITATION, - required_fields=['preprint_release_submission_date'], - super_invitation_id=f"{self.venue_id}/-/Preprint_Release_{venue.submission_stage.name}", - stage_arguments={}, - start_date=self.configuration_note.content.get('preprint_release_submission_date'), - process='process/preprint_release_submission_process.py', - build_edit=ARRWorkflow._build_preprint_release_edit - ), ARRStage( type=ARRStage.Type.PROCESS_INVITATION, required_fields=['setup_shared_data_date', 'previous_cycle'], diff --git a/openreview/arr/invitation.py b/openreview/arr/invitation.py index e533e32d3..c23e4cb9d 100644 --- a/openreview/arr/invitation.py +++ b/openreview/arr/invitation.py @@ -209,18 +209,144 @@ def set_preferred_emails_invitation(self): def set_submission_invitation(self): return self.venue_invitation_builder.set_submission_invitation() + def set_post_submission_invitation(self, source=None): + if source is None: + source = { + 'venueid': self.venue.get_submission_venue_id(), + 'content':{ + 'preprint': 'no' + } + } + + return self.venue_invitation_builder.set_post_submission_invitation( + source=source + ) + + def set_preprint_post_submission_invitation(self): + if self.venue.is_template_related_workflow(): + return + + venue_id = self.venue_id + submission_stage = self.venue.submission_stage + submission_id = submission_stage.get_submission_id(self.venue) + invitation_id = self.venue.get_preprint_post_submission_id() + source = { + 'venueid': self.venue.get_submission_venue_id(), + 'content': { + 'preprint': 'yes' + } + } + post_submission_cdate = tools.datetime_millis(submission_stage.exp_date) if submission_stage.exp_date else None + number_param = '${{4/id}/number}' + authors_id = self.venue.get_authors_id(number_param) + hidden_field_names = submission_stage.get_hidden_field_names() + note_content = { + field: { + 'readers': [venue_id, authors_id] + } for field in hidden_field_names + } + committee_readers = [ + self.venue.get_program_chairs_id(), + self.venue.get_senior_area_chairs_id(number_param), + self.venue.get_area_chairs_id(number_param), + self.venue.get_reviewers_id(number_param), + authors_id + ] + + existing_invitation = tools.get_invitation(self.client, invitation_id) + if existing_invitation and 'content' in existing_invitation.edit['note']: + for field, value in existing_invitation.edit['note']['content'].items(): + if field not in hidden_field_names and 'readers' in value: + note_content[field] = { + 'readers': { + 'param': { + 'const': { + 'delete': True + } + } + } + } + + for field in hide_fields_from_public: + note_content[field] = { + 'readers': committee_readers + } + + note_content['_bibtex'] = { + 'value': { + 'param': { + 'type': 'string', + 'maxLength': 200000, + 'input': 'textarea', + 'optional': True, + 'deletable': True + } + } + } + + invitation = Invitation( + id=invitation_id, + invitees=[venue_id], + signatures=[venue_id], + readers=[venue_id], + writers=[venue_id], + cdate=post_submission_cdate, + date_processes=[{ + 'dates': ["#{4/cdate}", self.update_date_string], + 'script': self.get_process_content('../venue/process/post_submission_process.py') + }], + content={ + 'source': { + 'value': source + } + }, + edit={ + 'signatures': [venue_id], + 'readers': [venue_id, self.venue.get_authors_id('${{2/note/id}/number}')], + 'writers': [venue_id], + 'note': { + 'id': { + 'param': { + 'withInvitation': submission_id, + 'optional': True + } + }, + 'odate': { + 'param': { + 'range': [0, 9999999999999], + 'optional': True, + 'deletable': True + } + }, + 'signatures': [self.venue.get_authors_id('${{2/id}/number}')], + 'readers': ['everyone'], + 'writers': [venue_id, self.venue.get_authors_id('${{2/id}/number}')], + 'content': note_content + } + } + ) + + self.save_invitation(invitation, replacement=False) + return invitation + def set_submission_deletion_invitation(self, submission_revision_stage): return self.venue_invitation_builder.set_submission_deletion_invitation(submission_revision_stage) - def set_post_submission_invitation(self): - return self.venue_invitation_builder.set_post_submission_invitation() - def set_submission_change_invitation(self, name, activation_date): return self.venue_invitation_builder.set_submission_change_invitation(name, activation_date) def set_pc_submission_revision_invitation(self): return self.venue_invitation_builder.set_pc_submission_revision_invitation() + def set_submission_message_invitation(self): + return self.venue_invitation_builder.set_submission_message_invitation() + + def set_iThenticate_plagiarism_check_invitation(self): + return self.venue_invitation_builder.set_iThenticate_plagiarism_check_invitation() + + def set_submission_deletion_invitation(self, submission_revision_stage): + return self.venue_invitation_builder.set_submission_deletion_invitation(submission_revision_stage) + def set_review_invitation(self): return self.venue_invitation_builder.set_review_invitation() diff --git a/openreview/arr/process/preprint_release_submission_process.py b/openreview/arr/process/preprint_release_submission_process.py deleted file mode 100644 index acf006eda..000000000 --- a/openreview/arr/process/preprint_release_submission_process.py +++ /dev/null @@ -1,108 +0,0 @@ -def process(client, invitation): - - domain = client.get_group(invitation.domain) - venue_id = domain.id - submission_venue_id = domain.content['submission_venue_id']['value'] - venue_name = domain.content['title']['value'] - meta_invitation_id = domain.content['meta_invitation_id']['value'] - program_chairs_id = domain.content['program_chairs_id']['value'] - authors_name = domain.content['authors_name']['value'] - submission_name = domain.content['submission_name']['value'] - reviewers_name = domain.content['reviewers_name']['value'] - reviewers_submitted_name = domain.content['reviewers_submitted_name']['value'] - area_chairs_name = domain.content['area_chairs_name']['value'] - senior_area_chairs_name = domain.content['senior_area_chairs_name']['value'] - - - client_v1=openreview.Client( - baseurl=openreview.tools.get_base_urls(client)[0], - token=client.token - ) - - now = openreview.tools.datetime_millis(datetime.datetime.now()) - cdate = invitation.cdate - - if cdate > now: - ## invitation is in the future, do not process - print('invitation is not yet active', cdate) - return - - def post_submission_edit(submission): - - updated_note = openreview.api.Note( - id=submission.id, - odate = now, - content = { - '_bibtex': { - 'value': openreview.tools.generate_bibtex( - note=submission, - venue_fullname=venue_name, - year=str(datetime.datetime.now().year), - url_forum=submission.forum, - paper_status='under review', - anonymous=True - ) - } - } - ) - - client.post_note_edit( - invitation=invitation.id, - note=updated_note, - signatures=[venue_id] - ) - - paper_link = submission.content.get('previous_URL', {}).get('value') - wants_new_reviewers = submission.content['reassignment_request_reviewers']['value'].startswith('Yes') - # If previous submission, change reader set to include previous reviewers submitted group - if paper_link: - content = None - paper_forum = paper_link.split('?id=')[-1] - arr_submission_v1 = openreview.tools.get_note(client_v1, paper_forum) - arr_submission_v2 = openreview.tools.get_note(client, paper_forum) - append = [ f"{venue_id}/{submission_name}{submission.number}/{reviewers_name}/{reviewers_submitted_name}" ] - remove = [ f"{venue_id}/{submission_name}{submission.number}/{reviewers_name}" ] - - if arr_submission_v1: - v1_domain = arr_submission_v1.invitation.split('/-/')[0] - if not wants_new_reviewers: - append.append(f"{v1_domain}/Paper{arr_submission_v1.number}/{reviewers_name}/{reviewers_submitted_name}") - - content = { - 'explanation_of_revisions_PDF': { - 'readers': { - 'append': append, - 'remove': remove - } - } - } - if arr_submission_v2: - v2_domain = arr_submission_v2.domain - if not wants_new_reviewers: - append.append(f"{v2_domain}/{submission_name}{arr_submission_v2.number}/{reviewers_name}/{reviewers_submitted_name}") - - content = { - 'explanation_of_revisions_PDF': { - 'readers': { - 'append': append, - 'remove': remove - } - } - } - - if content is not None: - client.post_note_edit( - invitation=meta_invitation_id, - readers=[venue_id], - writers=[venue_id], - signatures=[venue_id], - note=openreview.api.Note( - id=submission.id, - content=content - ) - ) - - ## Release the submissions to the public when the value for preprint is yes - submissions = [s for s in client.get_all_notes(content= { 'venueid': submission_venue_id }, domain=venue_id) if s.content.get('preprint', {}).get('value') == 'yes'] - print(f'update {len(submissions)} submissions') - openreview.tools.concurrent_requests(post_submission_edit, submissions, desc='post_submission_edit') \ No newline at end of file diff --git a/openreview/venue/invitation.py b/openreview/venue/invitation.py index d2c3fdcf5..5177a6fd8 100644 --- a/openreview/venue/invitation.py +++ b/openreview/venue/invitation.py @@ -399,7 +399,7 @@ def set_submission_deletion_invitation(self, submission_revision_stage): self.save_invitation(expire_invitation, replacement=True) return invitation - def set_post_submission_invitation(self): + def set_post_submission_invitation(self, source=None): if self.venue.is_template_related_workflow(): return @@ -465,6 +465,13 @@ def set_post_submission_invitation(self): } ) + if source: + submission_invitation.content = { + 'source': { + 'value': source + } + } + note_content['_bibtex'] = { 'value': { 'param': { diff --git a/tests/test_arr_venue_v2.py b/tests/test_arr_venue_v2.py index 790d96d3a..63353d787 100644 --- a/tests/test_arr_venue_v2.py +++ b/tests/test_arr_venue_v2.py @@ -279,6 +279,7 @@ def test_august_cycle(self, client, openreview_client, helpers, test_client, req assert openreview_client.get_invitation('aclweb.org/ACL/ARR/2023/August/Reviewers/-/Expertise_Selection') post_submission_invitation = openreview_client.get_invitation('aclweb.org/ACL/ARR/2023/August/-/Post_Submission') + preprint_post_submission_invitation = openreview_client.get_invitation('aclweb.org/ACL/ARR/2023/August/-/Preprint_Post_Submission') assert 'TLDR' in post_submission_invitation.edit['note']['content'] assert 'preprint' in post_submission_invitation.edit['note']['content'] assert 'existing_preprints' in post_submission_invitation.edit['note']['content'] @@ -286,6 +287,8 @@ def test_august_cycle(self, client, openreview_client, helpers, test_client, req assert 'consent_to_share_submission_details' in post_submission_invitation.edit['note']['content'] assert 'Association_for_Computational_Linguistics_-_Blind_Submission_License_Agreement' in post_submission_invitation.edit['note']['content'] assert 'preprint_status' in post_submission_invitation.edit['note']['content'] + assert post_submission_invitation.content['source']['value'] == {'venueid': 'aclweb.org/ACL/ARR/2023/August/Submission', 'content': {'preprint': 'no'}} + assert preprint_post_submission_invitation.content['source']['value'] == {'venueid': 'aclweb.org/ACL/ARR/2023/August/Submission', 'content': {'preprint': 'yes'}} request_page(selenium, 'http://localhost:3030/group?id=aclweb.org/ACL/ARR/2023/August', pc_client, wait_for_element='header') header_div = selenium.find_element(By.ID, 'header') @@ -363,6 +366,7 @@ def test_august_cycle(self, client, openreview_client, helpers, test_client, req helpers.await_queue_edit(client, invitation=f'openreview.net/Support/-/Request{request_form_note.number}/Revision') post_submission_invitation = openreview_client.get_invitation('aclweb.org/ACL/ARR/2023/August/-/Post_Submission') + preprint_post_submission_invitation = openreview_client.get_invitation('aclweb.org/ACL/ARR/2023/August/-/Preprint_Post_Submission') assert 'TLDR' in post_submission_invitation.edit['note']['content'] assert 'preprint' in post_submission_invitation.edit['note']['content'] assert 'existing_preprints' in post_submission_invitation.edit['note']['content'] @@ -370,6 +374,8 @@ def test_august_cycle(self, client, openreview_client, helpers, test_client, req assert 'consent_to_share_submission_details' in post_submission_invitation.edit['note']['content'] assert 'Association_for_Computational_Linguistics_-_Blind_Submission_License_Agreement' in post_submission_invitation.edit['note']['content'] assert 'preprint_status' in post_submission_invitation.edit['note']['content'] + assert post_submission_invitation.content['source']['value'] == {'venueid': 'aclweb.org/ACL/ARR/2023/August/Submission', 'content': {'preprint': 'no'}} + assert preprint_post_submission_invitation.content['source']['value'] == {'venueid': 'aclweb.org/ACL/ARR/2023/August/Submission', 'content': {'preprint': 'yes'}} assert 'Emergency_Score' in openreview_client.get_group('aclweb.org/ACL/ARR/2023/August/Program_Chairs').web assert 'reviewers_invite_assignment_id' in openreview_client.get_group('aclweb.org/ACL/ARR/2023/August/Program_Chairs').web @@ -683,7 +689,7 @@ def test_june_cycle(self, client, openreview_client, helpers, test_client): 'reassignment_request_reviewers': { 'value': 'This is not a resubmission' }, 'software': {'value': '/pdf/' + 'p' * 40 +'.zip' }, 'data': {'value': '/pdf/' + 'p' * 40 +'.zip' }, - 'preprint': { 'value': 'yes'}, + 'preprint': { 'value': 'no'}, 'preprint_status': { 'value': 'There is no non-anonymous preprint and we do not intend to release one. (this option is binding)'}, 'existing_preprints': { 'value': 'existing_preprints' }, 'preferred_venue': { 'value': 'ACL' }, @@ -1367,7 +1373,7 @@ def test_submission_preprocess(self, client, openreview_client, test_client, hel 'reassignment_request_reviewers': { 'value': 'This is not a resubmission' }, 'software': {'value': '/pdf/' + 'p' * 40 +'.zip' }, 'data': {'value': '/pdf/' + 'p' * 40 +'.zip' }, - 'preprint': { 'value': 'yes'}, + 'preprint': { 'value': 'no'}, 'preprint_status': { 'value': 'There is no non-anonymous preprint and we do not intend to release one. (this option is binding)'}, 'existing_preprints': { 'value': 'existing_preprints' }, 'preferred_venue': { 'value': 'ACL' }, @@ -2426,6 +2432,9 @@ def _generate_valid_content(i, domains, submission): note.content['authors']['value'].append('SAC ARROne') note.content['authorids']['value'].append('~SAC_ARROne1') + if i == 4: + note.content['reassignment_request_reviewers']['value'] = 'No, I want the same set of reviewers from our previous submission (subject to their availability)' + if i == 6: ## Remove resubmission information from content del note.content['previous_URL'] del note.content['explanation_of_revisions_PDF'] @@ -2666,81 +2675,6 @@ def test_post_submission(self, client, openreview_client, helpers, test_client, assert 'readers' not in submission.content['authors'] assert 'readers' not in submission.content['authorids'] - ## release preprint submissions - pc_client.post_note( - openreview.Note( - content={ - 'preprint_release_submission_date': (openreview.tools.datetime.datetime.now() - datetime.timedelta(minutes=2)).strftime('%Y/%m/%d %H:%M') - }, - invitation=f'openreview.net/Support/-/Request{request_form.number}/ARR_Configuration', - forum=request_form.id, - readers=['aclweb.org/ACL/ARR/2023/August/Program_Chairs', 'openreview.net/Support'], - referent=request_form.id, - replyto=request_form.id, - signatures=['~Program_ARRChair1'], - writers=[], - ) - ) - - helpers.await_queue() - helpers.await_queue_edit(openreview_client, 'aclweb.org/ACL/ARR/2023/August/-/Preprint_Release_Submission-0-1', count=1) - ## Assert released preprints have hidden authors and authorids - ## check index 3 and 5 (even paper numbers) specifically - ## check index 4 has no author readers since they were not released - - submissions = pc_client_v2.get_notes(invitation='aclweb.org/ACL/ARR/2023/August/-/Submission', sort='number:asc') - assert 'everyone' in submissions[3].readers - assert 'readers' in submissions[3].content['authors'] - assert 'readers' in submissions[3].content['authorids'] - assert submissions[3].content['authors']['readers'] == [ - 'aclweb.org/ACL/ARR/2023/August', - f"aclweb.org/ACL/ARR/2023/August/Submission4/Authors" - ] - assert submissions[3].content['authorids']['readers'] == [ - 'aclweb.org/ACL/ARR/2023/August', - f"aclweb.org/ACL/ARR/2023/August/Submission4/Authors" - ] - assert submissions[3].content['justification_for_author_changes']['readers'] == [ - 'aclweb.org/ACL/ARR/2023/August', - f"aclweb.org/ACL/ARR/2023/August/Submission4/Authors" - ] - assert submissions[3].content['preprint_status']['readers'] == [ - 'aclweb.org/ACL/ARR/2023/August', - f"aclweb.org/ACL/ARR/2023/August/Submission4/Authors" - ] - assert submissions[3].content['preferred_venue']['readers'] == [ - 'aclweb.org/ACL/ARR/2023/August', - f"aclweb.org/ACL/ARR/2023/August/Submission4/Authors" - ] - - - assert 'readers' not in submissions[4].content['authors'] - assert 'readers' not in submissions[4].content['authorids'] - - assert 'everyone' in submissions[5].readers - assert 'readers' in submissions[5].content['authors'] - assert 'readers' in submissions[5].content['authorids'] - assert submissions[5].content['authors']['readers'] == [ - 'aclweb.org/ACL/ARR/2023/August', - f"aclweb.org/ACL/ARR/2023/August/Submission6/Authors" - ] - assert submissions[5].content['authorids']['readers'] == [ - 'aclweb.org/ACL/ARR/2023/August', - f"aclweb.org/ACL/ARR/2023/August/Submission6/Authors" - ] - assert submissions[5].content['justification_for_author_changes']['readers'] == [ - 'aclweb.org/ACL/ARR/2023/August', - f"aclweb.org/ACL/ARR/2023/August/Submission6/Authors" - ] - assert submissions[5].content['preprint_status']['readers'] == [ - 'aclweb.org/ACL/ARR/2023/August', - f"aclweb.org/ACL/ARR/2023/August/Submission6/Authors" - ] - assert submissions[5].content['preferred_venue']['readers'] == [ - 'aclweb.org/ACL/ARR/2023/August', - f"aclweb.org/ACL/ARR/2023/August/Submission6/Authors" - ] - ## close the submissions now = datetime.datetime.now() due_date = now - datetime.timedelta(days=1) @@ -2779,6 +2713,7 @@ def test_post_submission(self, client, openreview_client, helpers, test_client, helpers.await_queue() helpers.await_queue_edit(openreview_client, 'aclweb.org/ACL/ARR/2023/August/-/Post_Submission-0-1', count=2) + helpers.await_queue_edit(openreview_client, 'aclweb.org/ACL/ARR/2023/August/-/Preprint_Post_Submission-0-1', count=2) withdrawal_invitation = pc_client_v2.get_invitation('aclweb.org/ACL/ARR/2023/August/-/Withdrawal') assert withdrawal_invitation.edit['invitation']['edit']['note']['content'] == arr_withdrawal_content @@ -2845,30 +2780,12 @@ def test_post_submission(self, client, openreview_client, helpers, test_client, assert submissions[0].content['consent_to_share_data']['readers'] == ['aclweb.org/ACL/ARR/2023/August', 'aclweb.org/ACL/ARR/2023/August/Submission1/Authors'] assert 'readers' not in submissions[0].content['software'] assert 'readers' not in submissions[0].content['previous_URL'] - assert 'readers' not in submissions[0].content['explanation_of_revisions_PDF'] assert 'readers' not in submissions[0].content['reassignment_request_area_chair'] assert 'readers' not in submissions[0].content['reassignment_request_reviewers'] assert 'readers' not in submissions[0].content['justification_for_not_keeping_action_editor_or_reviewers'] - - ## release preprint submissions - pc_client.post_note( - openreview.Note( - content={ - 'preprint_release_submission_date': (openreview.tools.datetime.datetime.now() + datetime.timedelta(seconds=5)).strftime('%Y/%m/%d %H:%M') - }, - invitation=f'openreview.net/Support/-/Request{request_form.number}/ARR_Configuration', - forum=request_form.id, - readers=['aclweb.org/ACL/ARR/2023/August/Program_Chairs', 'openreview.net/Support'], - referent=request_form.id, - replyto=request_form.id, - signatures=['~Program_ARRChair1'], - writers=[], - ) - ) - # Release them again - helpers.await_queue() - helpers.await_queue_edit(openreview_client, 'aclweb.org/ACL/ARR/2023/August/-/Preprint_Release_Submission-0-1', count=2) + ## Refresh submissions to see the preprint release changes + submissions = pc_client_v2.get_notes(invitation='aclweb.org/ACL/ARR/2023/August/-/Submission', sort='number:asc') request_page(selenium, 'http://localhost:3030/group?id=aclweb.org/ACL/ARR/2023/August', None, wait_for_element='header') @@ -2898,7 +2815,6 @@ def test_post_submission(self, client, openreview_client, helpers, test_client, assert submissions[0].content['preprint_status']['readers'] == ['aclweb.org/ACL/ARR/2023/August', 'aclweb.org/ACL/ARR/2023/August/Submission1/Authors'] assert 'readers' not in submissions[0].content['software'] assert 'readers' not in submissions[0].content['previous_URL'] - assert 'readers' not in submissions[0].content['explanation_of_revisions_PDF'] assert 'readers' not in submissions[0].content['reassignment_request_area_chair'] assert 'readers' not in submissions[0].content['reassignment_request_reviewers'] assert 'readers' not in submissions[0].content['justification_for_not_keeping_action_editor_or_reviewers'] @@ -2914,6 +2830,16 @@ def test_post_submission(self, client, openreview_client, helpers, test_client, assert submissions[1].content['Association_for_Computational_Linguistics_-_Blind_Submission_License_Agreement']['readers'] == ['aclweb.org/ACL/ARR/2023/August', 'aclweb.org/ACL/ARR/2023/August/Submission2/Authors'] assert submissions[1].content['preprint_status']['readers'] == ['aclweb.org/ACL/ARR/2023/August', 'aclweb.org/ACL/ARR/2023/August/Submission2/Authors'] + # Assert authors and authorids are only readable by authors + assert set(submissions[1].content['authors']['readers']) == { + 'aclweb.org/ACL/ARR/2023/August', + 'aclweb.org/ACL/ARR/2023/August/Submission2/Authors' + } + assert set(submissions[1].content['authorids']['readers']) == { + 'aclweb.org/ACL/ARR/2023/August', + 'aclweb.org/ACL/ARR/2023/August/Submission2/Authors' + } + assert set(submissions[1].content['software']['readers']) == { "aclweb.org/ACL/ARR/2023/August/Program_Chairs", "aclweb.org/ACL/ARR/2023/August/Submission2/Senior_Area_Chairs", @@ -2935,13 +2861,6 @@ def test_post_submission(self, client, openreview_client, helpers, test_client, "aclweb.org/ACL/ARR/2023/August/Submission2/Reviewers", "aclweb.org/ACL/ARR/2023/August/Submission2/Authors" } - assert set(submissions[1].content['explanation_of_revisions_PDF']['readers']) == { - "aclweb.org/ACL/ARR/2023/August/Program_Chairs", - "aclweb.org/ACL/ARR/2023/August/Submission2/Senior_Area_Chairs", - "aclweb.org/ACL/ARR/2023/August/Submission2/Area_Chairs", - "aclweb.org/ACL/ARR/2023/August/Submission2/Reviewers/Submitted", - "aclweb.org/ACL/ARR/2023/August/Submission2/Authors" - } assert set(submissions[1].content['reassignment_request_area_chair']['readers']) == { "aclweb.org/ACL/ARR/2023/August/Program_Chairs", "aclweb.org/ACL/ARR/2023/August/Submission2/Senior_Area_Chairs", @@ -2974,8 +2893,36 @@ def test_post_submission(self, client, openreview_client, helpers, test_client, "aclweb.org/ACL/ARR/2023/August/Submission2/Authors" } + assert submissions[3].readers == ['everyone'] + assert 'readers' in submissions[3].content['authors'] + assert 'readers' in submissions[3].content['authorids'] + assert submissions[3].content['authors']['readers'] == [ + 'aclweb.org/ACL/ARR/2023/August', + f"aclweb.org/ACL/ARR/2023/August/Submission4/Authors" + ] + assert submissions[3].content['authorids']['readers'] == [ + 'aclweb.org/ACL/ARR/2023/August', + f"aclweb.org/ACL/ARR/2023/August/Submission4/Authors" + ] + assert submissions[3].content['justification_for_author_changes']['readers'] == [ + 'aclweb.org/ACL/ARR/2023/August', + f"aclweb.org/ACL/ARR/2023/August/Submission4/Authors" + ] + assert submissions[3].content['preprint_status']['readers'] == [ + 'aclweb.org/ACL/ARR/2023/August', + f"aclweb.org/ACL/ARR/2023/August/Submission4/Authors" + ] + assert submissions[3].content['preferred_venue']['readers'] == [ + 'aclweb.org/ACL/ARR/2023/August', + f"aclweb.org/ACL/ARR/2023/August/Submission4/Authors" + ] + + assert 'everyone' not in submissions[4].readers + assert submissions[5].readers is not None assert submissions[5].readers == ['everyone'] + assert 'readers' in submissions[5].content['authors'] + assert 'readers' in submissions[5].content['authorids'] assert submissions[5].content['authors']['readers'] == [ 'aclweb.org/ACL/ARR/2023/August', 'aclweb.org/ACL/ARR/2023/August/Submission6/Authors' @@ -2984,6 +2931,18 @@ def test_post_submission(self, client, openreview_client, helpers, test_client, 'aclweb.org/ACL/ARR/2023/August', 'aclweb.org/ACL/ARR/2023/August/Submission6/Authors' ] + assert submissions[5].content['justification_for_author_changes']['readers'] == [ + 'aclweb.org/ACL/ARR/2023/August', + f"aclweb.org/ACL/ARR/2023/August/Submission6/Authors" + ] + assert submissions[5].content['preprint_status']['readers'] == [ + 'aclweb.org/ACL/ARR/2023/August', + f"aclweb.org/ACL/ARR/2023/August/Submission6/Authors" + ] + assert submissions[5].content['preferred_venue']['readers'] == [ + 'aclweb.org/ACL/ARR/2023/August', + f"aclweb.org/ACL/ARR/2023/August/Submission6/Authors" + ] # Post comment as PCs for the first submission comment_edit = pc_client_v2.post_note_edit( @@ -4023,36 +3982,6 @@ def test_resubmission_and_track_matching_data(self, client, openreview_client, h # Check that Reviewers/Previous groups are created for resubmissions - # Check that explanation_of_revisions_PDF readers are set correctly for resubmissions - submissions_after_matching = pc_client_v2.get_notes(invitation='aclweb.org/ACL/ARR/2023/August/-/Submission', sort='number:asc') - submission_2 = submissions_after_matching[1] - submission_3 = submissions_after_matching[2] - - assert set(submission_2.content['explanation_of_revisions_PDF']['readers']) == { - "aclweb.org/ACL/ARR/2023/August/Program_Chairs", - "aclweb.org/ACL/ARR/2023/August/Submission2/Senior_Area_Chairs", - "aclweb.org/ACL/ARR/2023/August/Submission2/Area_Chairs", - "aclweb.org/ACL/ARR/2023/August/Submission2/Reviewers", - "aclweb.org/ACL/ARR/2023/August/Submission2/Authors" - } - - assert set(submission_3.content['explanation_of_revisions_PDF']['readers']) == { - "aclweb.org/ACL/ARR/2023/August/Program_Chairs", - "aclweb.org/ACL/ARR/2023/August/Submission3/Senior_Area_Chairs", - "aclweb.org/ACL/ARR/2023/August/Submission3/Area_Chairs", - "aclweb.org/ACL/ARR/2023/August/Submission3/Reviewers/Submitted", - "aclweb.org/ACL/ARR/2023/August/Submission3/Authors" - } - - # Verify that previous reviewers can access explanation_of_revisions_PDF field - # reviewer_client_1 (~Reviewer_ARROne1) was a previous reviewer for submission 2 - openreview_client.add_members_to_group('aclweb.org/ACL/ARR/2023/August/Submission2/Reviewers', '~Reviewer_ARROne1') - submission_2_as_reviewer_1 = reviewer_client_1.get_note(submission_2.id) - assert 'explanation_of_revisions_PDF' in submission_2_as_reviewer_1.content - assert 'value' in submission_2_as_reviewer_1.content['explanation_of_revisions_PDF'] - assert len(submission_2_as_reviewer_1.content['explanation_of_revisions_PDF']['value']) > 0 - - def test_sae_ae_assignments(self, client, openreview_client, helpers, test_client, request_page, selenium): pc_client=openreview.Client(username='pc@aclrollingreview.org', password=helpers.strong_password) @@ -4169,6 +4098,26 @@ def test_sae_ae_assignments(self, client, openreview_client, helpers, test_clien august_venue.set_assignments(assignment_title='reviewer-assignments', committee_id='aclweb.org/ACL/ARR/2023/August/Reviewers', overwrite=True, enable_reviewer_reassignment=True) + submissions_after_reviewer_deployment = pc_client_v2.get_notes(invitation='aclweb.org/ACL/ARR/2023/August/-/Submission', sort='number:asc') + submission_2 = submissions_after_reviewer_deployment[1] + submission_3 = submissions_after_reviewer_deployment[2] + + assert set(submission_2.content['explanation_of_revisions_PDF']['readers']) == { + "aclweb.org/ACL/ARR/2023/August/Program_Chairs", + "aclweb.org/ACL/ARR/2023/August/Submission2/Senior_Area_Chairs", + "aclweb.org/ACL/ARR/2023/August/Submission2/Area_Chairs", + "aclweb.org/ACL/ARR/2023/August/Submission2/Reviewers", + "aclweb.org/ACL/ARR/2023/August/Submission2/Authors" + } + + assert set(submission_3.content['explanation_of_revisions_PDF']['readers']) == { + "aclweb.org/ACL/ARR/2023/August/Program_Chairs", + "aclweb.org/ACL/ARR/2023/August/Submission3/Senior_Area_Chairs", + "aclweb.org/ACL/ARR/2023/August/Submission3/Area_Chairs", + "aclweb.org/ACL/ARR/2023/August/Submission3/Reviewers/Submitted", + "aclweb.org/ACL/ARR/2023/August/Submission3/Authors" + } + pc_client.post_note( openreview.Note( content={