Skip to content
Merged
Show file tree
Hide file tree
Changes from 22 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
123 changes: 67 additions & 56 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,25 @@ 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.
}
}
}
},
'hidden': True
}
}
}
}
}
}
}
)
)
Expand All @@ -334,19 +347,19 @@ def set_public_article_invitations(self):
writers=[self.public_article_group_id],
signatures=[self.public_article_group_id],
invitees=['~', self.dblp_group_id, self.arxiv_group_id, self.orcid_group_id, self.support_group_id],
preprocess=self.get_process_content('process/author_coreference_pre_process.js'),
preprocess=self.get_process_content('process/author_removal_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 +382,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 +399,25 @@ 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.
}
}
}
},
'hidden': True
}
}
}
}
}
}
}
)
)
Expand Down Expand Up @@ -966,24 +992,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 +1014,7 @@ def set_dblp_invitations(self):
}
},
'venueid': {
'order': 5,
'order': 4,
'value': {
'param': {
'type': "string",
Expand Down Expand Up @@ -1154,27 +1175,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 +1199,7 @@ def set_arxiv_invitations(self):
}
},
'subject_areas': {
'order': 5,
'order': 4,
'description': 'Subject areas of paper.',
'value': {
'param': {
Expand All @@ -1195,7 +1211,7 @@ def set_arxiv_invitations(self):
}
},
'pdf': {
'order': 6,
'order': 5,
'description': 'Link to the PDF paper.',
'value': {
'param': {
Expand All @@ -1204,9 +1220,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 +1233,7 @@ def set_arxiv_invitations(self):
}
},
'venueid': {
'order': 8,
'order': 7,
'value': {
'param': {
'type': "string",
Expand Down Expand Up @@ -1333,24 +1349,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 +1371,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
25 changes: 11 additions & 14 deletions openreview/profile/process/author_coreference_pre_process.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,12 @@ async function process(client, edit, invitation) {

const authorIndex = edit.content.author_index.value;
const authorId = edit.content.author_id.value;
const authorName = edit.content.author_name.value;

if (Tools.prettyId(authorId) !== authorName) {
return Promise.reject(new OpenReviewError({ name: 'Error', message: `The author id ${authorId} doesn't match with the author name ${authorName}` }));
}
Comment thread
melisabok marked this conversation as resolved.

const { notes } = await client.getNotes({ id: edit.note.id });
const publication = notes[0];

Expand All @@ -17,27 +22,19 @@ 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` }));
}
return;
}
const usernames = userProfile.content.names.map(name => name.username).filter(username => !!username);
const names = userProfile.content.names.map(name => name.fullname);

const usernameIndex = usernames.indexOf(authorId);

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 nameIndex = names.indexOf(authorName);

const publicationAuthorName = publication.content.authors.value[authorIndex]?.fullname;
const nameIndex = names.indexOf(publicationAuthorName);
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` }));
return Promise.reject(new OpenReviewError({ name: 'Error', message: `The author name ${publicationAuthorName} from index ${authorIndex} doesn't match with the names listed in your profile` }));
}
}
16 changes: 11 additions & 5 deletions openreview/profile/process/author_removal_pre_process.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ async function process(client, edit, invitation) {
client.throwErrors = true;

const authorIndex = edit.content.author_index.value;
const authorName = edit.content.author_name.value;

const { notes } = await client.getNotes({ id: edit.note.id });
const publication = notes[0];
Expand All @@ -16,12 +17,17 @@ 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 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 usernames = userProfile.content.names.map(name => name.username).filter(username => !!username);

const authorUsername = publication.content.authors.value[authorIndex]?.username;

if (Tools.prettyId(authorUsername) !== authorName) {
return Promise.reject(new OpenReviewError({ name: 'Error', message: `The author username ${authorUsername} from index ${authorIndex} doesn't match with the author name ${authorName}` }));
Comment thread
melisabok marked this conversation as resolved.
}

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.
}

}
Loading