Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
fc0e9e3
Migrate Record/Authorship_Claim invitations to author{} object format
carlosmondra Feb 7, 2026
289389e
Parse ORCID author names directly from JSON for correct name ordering
carlosmondra Feb 11, 2026
75ffe04
Merge branch 'master' into feature/new-dblp-invitation
xkopenreview Feb 19, 2026
39b3e3d
Merge branch 'master' into feature/new-dblp-invitation
melisabok Mar 30, 2026
5765e93
remove test
melisabok Mar 30, 2026
6a4de87
Merge branch 'master' into feature/new-dblp-invitation
melisabok Mar 30, 2026
61a1b80
await date process
melisabok Mar 31, 2026
4d3ac9f
Merge branch 'feature/new-dblp-invitation' of github.com:openreview/o…
melisabok Mar 31, 2026
104d31b
test search notes with new index
melisabok Apr 1, 2026
e4527b8
fix test
melisabok Apr 1, 2026
dd74449
avoid process function errors
melisabok Apr 1, 2026
9b0c392
Merge branch 'master' into feature/new-dblp-invitation
xkopenreview Apr 1, 2026
0fa0adb
fix consolelog
melisabok Apr 1, 2026
42d58d4
Merge branch 'feature/new-dblp-invitation' of github.com:openreview/o…
melisabok Apr 1, 2026
659e120
Merge branch 'master' into feature/new-dblp-invitation
xkopenreview Apr 3, 2026
28e2ef6
Merge branch 'master' into feature/new-dblp-invitation
melisabok Apr 6, 2026
7d1b9e4
fix invitations, and add validation
melisabok Apr 6, 2026
9c61f15
more validations
melisabok Apr 6, 2026
de71c05
change search term
melisabok Apr 6, 2026
2a0f39b
copilot feedback
melisabok Apr 7, 2026
45a3bbf
fix test
melisabok Apr 7, 2026
647deb5
fix typo
melisabok Apr 7, 2026
d394b0c
Merge branch 'master' into feature/new-dblp-invitation
melisabok Apr 15, 2026
4c2fd40
support name removal and replace authors field
melisabok Apr 16, 2026
a0b0535
Merge branch 'master' into feature/new-dblp-invitation
melisabok Apr 17, 2026
a381371
Merge branch 'master' into feature/new-dblp-invitation
melisabok Apr 23, 2026
678cc5f
Merge branch 'master' into feature/new-dblp-invitation
melisabok Apr 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
115 changes: 62 additions & 53 deletions openreview/profile/management.py
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,15 @@ def set_public_article_invitations(self):
}
}
},
'author_name': {
'order': 3,
'description': 'Enter the author name at the given index.',
'value': {
'param': {
'type': 'string',
}
}
},
},
'note': {
'id': {
Expand All @@ -304,21 +313,24 @@ def set_public_article_invitations(self):
}
},
'content': {
'authorids': {
'authors': {
'order': 2,
'value': {
'param': {
'const': {
'replace': {
'index': '${6/content/author_index/value}',
'value': '${6/content/author_id/value}'
'value': {
'fullname': '${7/content/author_name/value}',
'username': '${7/content/author_id/value}'
Comment thread
melisabok marked this conversation as resolved.
}
}
}
}
}
}
}
}
}
}
)
)
Expand All @@ -337,16 +349,16 @@ def set_public_article_invitations(self):
preprocess=self.get_process_content('process/author_coreference_pre_process.js'),
edit={
'readers': ['everyone'],
'signatures': {
'param': {
'signatures': {
'param': {
'items': [
{ 'prefix': '~.*', 'optional': True },
{ 'value': self.support_group_id, 'optional': True },
{ 'value': self.dblp_group_id, 'optional': True },
{ 'value': self.arxiv_group_id, 'optional': True },
{ 'value': self.orcid_group_id, 'optional': True }
]
}
}
},
'writers': [self.public_article_group_id],
'content': {
Expand All @@ -369,6 +381,15 @@ def set_public_article_invitations(self):
}
}
},
'author_name': {
'order': 3,
'description': 'Enter the author name at the given index.',
'value': {
'param': {
'type': 'string',
}
}
},
},
'note': {
'id': {
Expand All @@ -377,21 +398,24 @@ def set_public_article_invitations(self):
}
},
'content': {
'authorids': {
'authors': {
'order': 2,
'value': {
'param': {
'const': {
'replace': {
'index': '${6/content/author_index/value}',
'value': '${6/content/author_id/value}'
'value': {
'fullname': '${7/content/author_name/value}',
'username': '${7/content/author_id/value}'
Comment thread
melisabok marked this conversation as resolved.
Comment thread
melisabok marked this conversation as resolved.
}
}
}
}
}
}
}
}
}
}
)
)
Expand Down Expand Up @@ -966,24 +990,19 @@ def set_dblp_invitations(self):
},
'authors': {
'order': 2,
'description': 'Authors of paper.',
'value': {
'param': {
'type': 'string[]',
'regex': '[^;,\\n]+(,[^,\\n]+)*'
'type': 'author{}',
'properties': {
'fullname': { 'param': { 'type': 'string' } },
'username': { 'param': { 'type': 'string' } },
},
}
}
},
'authorids': {
'order': 3,
'value': {
'param': {
'type': 'string[]',
'optional': True
}
}
},
'venue': {
'order': 4,
'order': 3,
'description': 'Enter the venue where the paper was published.',
'value': {
'param': {
Expand All @@ -993,7 +1012,7 @@ def set_dblp_invitations(self):
}
},
'venueid': {
'order': 5,
'order': 4,
'value': {
'param': {
'type': "string",
Expand Down Expand Up @@ -1154,27 +1173,22 @@ def set_arxiv_invitations(self):
},
'authors': {
'order': 2,
'description': 'Authors of paper.',
'value': {
'param': {
'type': 'string[]',
'regex': '[^;,\\n]+(,[^,\\n]+)*'
'type': 'author{}',
'properties': {
'fullname': { 'param': { 'type': 'string' } },
'username': { 'param': { 'type': 'string' } },
},
}
}
},
'authorids': {
'abstract': {
'order': 3,
'description': 'Abstract of paper.',
'value': {
'param': {
'type': 'string[]',
'optional': True
}
}
},
'abstract': {
'order': 4,
'description': 'Abstract of paper.',
'value': {
'param': {
'type': 'string',
'markdown': True,
'input': 'textarea',
Expand All @@ -1183,7 +1197,7 @@ def set_arxiv_invitations(self):
}
},
'subject_areas': {
'order': 5,
'order': 4,
'description': 'Subject areas of paper.',
'value': {
'param': {
Expand All @@ -1195,7 +1209,7 @@ def set_arxiv_invitations(self):
}
},
'pdf': {
'order': 6,
'order': 5,
'description': 'Link to the PDF paper.',
'value': {
'param': {
Expand All @@ -1204,9 +1218,9 @@ def set_arxiv_invitations(self):
'optional': True
}
}
},
},
'venue': {
'order': 7,
'order': 6,
'description': 'Enter the venue where the paper was published.',
'value': {
'param': {
Expand All @@ -1217,7 +1231,7 @@ def set_arxiv_invitations(self):
}
},
'venueid': {
'order': 8,
'order': 7,
'value': {
'param': {
'type': "string",
Expand Down Expand Up @@ -1333,24 +1347,19 @@ def set_orcid_invitations(self):
},
'authors': {
'order': 2,
'description': 'Authors of paper.',
'value': {
'param': {
'type': 'string[]',
'regex': '[^;,\\n]+(,[^,\\n]+)*'
'type': 'author{}',
'properties': {
'fullname': { 'param': { 'type': 'string' } },
'username': { 'param': { 'type': 'string' } },
},
}
}
},
'authorids': {
'order': 3,
'value': {
'param': {
'type': 'string[]',
'optional': True
}
}
},
'venue': {
'order': 4,
'order': 3,
'description': 'Enter the venue where the paper was published.',
'value': {
'param': {
Expand All @@ -1360,7 +1369,7 @@ def set_orcid_invitations(self):
}
},
'venueid': {
'order': 5,
'order': 4,
'value': {
'param': {
'type': "string",
Expand Down
23 changes: 20 additions & 3 deletions openreview/profile/process/arxiv_record_process.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,26 @@ async function process(client, edit, invitation) {
const note = Tools.convertArxivXmlToNote(edit.content?.xml?.value);

note.id = edit.note.id;
const authorids = edit.note.content.authorids?.value;
if (authorids) {
note.content.authorids.value = note.content.authorids.value.map((authorid, index) => authorids[index] || authorid);

// Handle legacy convert format (string arrays) by converting to author{} objects
const authors = note.content.authors?.value || [];
if (authors.length > 0 && typeof authors[0] === 'string') {
const authorids = note.content.authorids?.value || [];
note.content.authors = {
value: authors.map((name, i) => ({ fullname: name, username: authorids[i] || '' }))
};
delete note.content.authorids;
}

const existingAuthors = edit.note.content.authors?.value;
if (existingAuthors) {
note.content.authors.value = note.content.authors.value.map((author, index) => {
const existing = existingAuthors[index];
if (existing?.username) {
return { ...author, username: existing.username };
}
return author;
});
Comment thread
melisabok marked this conversation as resolved.
}

note.content.venueid = {
Expand Down
12 changes: 6 additions & 6 deletions openreview/profile/process/author_coreference_pre_process.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,14 @@ async function process(client, edit, invitation) {

const { profiles } = await client.getProfiles({ id: edit.signatures[0] });
const userProfile = profiles[0];

const usernames = userProfile.content.names.map(name => name.username);
const names = userProfile.content.names.map(name => name.fullname);

if (authorId === '') {
const authorName = publication.content.authorids?.value[authorIndex];
if (!usernames.some(username => username === authorName)) {
return Promise.reject(new OpenReviewError({ name: 'Error', message: `The author name ${authorName} from index ${authorIndex} doesn't match with the names listed in your profile` }));
const authorUsername = publication.content.authors.value[authorIndex]?.username;
if (!usernames.some(username => username === authorUsername)) {
return Promise.reject(new OpenReviewError({ name: 'Error', message: `The author name ${authorUsername} from index ${authorIndex} doesn't match with the names listed in your profile` }));
Copy link

Copilot AI Mar 30, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This error message says "author name" but the value being checked and interpolated here is the author's username (authorUsername). Updating the message to refer to "author username" (or using the fullname instead) will make failures easier to understand.

Suggested change
return Promise.reject(new OpenReviewError({ name: 'Error', message: `The author name ${authorUsername} from index ${authorIndex} doesn't match with the names listed in your profile` }));
return Promise.reject(new OpenReviewError({ name: 'Error', message: `The author username ${authorUsername} from index ${authorIndex} doesn't match with the usernames listed in your profile` }));

Copilot uses AI. Check for mistakes.
}
return;
}
Expand All @@ -34,8 +34,8 @@ async function process(client, edit, invitation) {
if (usernameIndex === -1) {
return Promise.reject(new OpenReviewError({ name: 'Error', message: `The author id ${authorId} doesn't match with the names listed in your profile` }));
}
const authorName = publication.content.authors.value[authorIndex];

const authorName = publication.content.authors.value[authorIndex]?.fullname;
const nameIndex = names.indexOf(authorName);
if (nameIndex === -1) {
return Promise.reject(new OpenReviewError({ name: 'Error', message: `The author name ${authorName} from index ${authorIndex} doesn't match with the names listed in your profile` }));
Expand Down
8 changes: 4 additions & 4 deletions openreview/profile/process/author_removal_pre_process.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,12 @@ async function process(client, edit, invitation) {

const { profiles } = await client.getProfiles({ id: edit.signatures[0] });
const userProfile = profiles[0];

const usernames = userProfile.content.names.map(name => name.username);
Copy link

Copilot AI Mar 30, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This pre-process script is not referenced anywhere in the repository (no invitation points to process/author_removal_pre_process.js). If Author_Removal is intended to use it, wire it up in openreview/profile/management.py; otherwise consider removing it to avoid maintaining dead code.

Suggested change
const usernames = userProfile.content.names.map(name => name.username);
const names = Array.isArray(userProfile?.content?.names) ? userProfile.content.names : [];
const usernames = names
.map(name => name && name.username)
.filter(username => !!username);

Copilot uses AI. Check for mistakes.

const authorName = publication.content.authorids?.value[authorIndex];
if (!usernames.some(username => username === authorName)) {
return Promise.reject(new OpenReviewError({ name: 'Error', message: `The author name ${authorName} from index ${authorIndex} doesn't match with the names listed in your profile` }));
const authorUsername = publication.content.authors.value[authorIndex]?.username;
if (!usernames.some(username => username === authorUsername)) {
return Promise.reject(new OpenReviewError({ name: 'Error', message: `The author name ${authorUsername} from index ${authorIndex} doesn't match with the names listed in your profile` }));
Comment thread
melisabok marked this conversation as resolved.
Comment thread
melisabok marked this conversation as resolved.
}

}
23 changes: 20 additions & 3 deletions openreview/profile/process/dblp_record_process.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,26 @@ async function process(client, edit, invitation) {
const note = Tools.convertDblpXmlToNote(edit.content?.xml?.value);

note.id = edit.note.id;
const authorids = edit.note.content.authorids?.value;
if (authorids) {
note.content.authorids.value = note.content.authorids.value.map((authorid, index) => authorids[index] || authorid);

// Handle legacy convert format (string arrays) by converting to author{} objects
const authors = note.content.authors?.value || [];
if (authors.length > 0 && typeof authors[0] === 'string') {
const authorids = note.content.authorids?.value || [];
note.content.authors = {
value: authors.map((name, i) => ({ fullname: name, username: authorids[i] || '' }))
};
delete note.content.authorids;
}

const existingAuthors = edit.note.content.authors?.value;
if (existingAuthors) {
note.content.authors.value = note.content.authors.value.map((author, index) => {
const existing = existingAuthors[index];
if (existing?.username) {
return { ...author, username: existing.username };
}
return author;
});
Comment thread
melisabok marked this conversation as resolved.
}

note.content.venueid = {
Expand Down
9 changes: 9 additions & 0 deletions openreview/profile/process/deprecated_dblp_record_process.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,15 @@ async function process(client, edit, invitation) {
const note = Tools.convertDblpXmlToNote(edit.content?.xml?.value);

note.id = edit.note.id;

const convertedAuthors = note.content.authors?.value || [];
Comment thread
melisabok marked this conversation as resolved.
const isObjectFormat = convertedAuthors.length > 0 && typeof convertedAuthors[0] === 'object';

if (isObjectFormat) {
note.content.authors = { value: convertedAuthors.map(a => a.fullname) };
note.content.authorids = { value: convertedAuthors.map(a => a.username || '') };
}

const authorids = edit.note.content.authorids?.value;
if (authorids) {
note.content.authorids.value = note.content.authorids.value.map((authorid, index) => authorids[index] || authorid);
Expand Down
Loading
Loading