Your career: citations, read as how often your published work has been cited, and when it was counted #697
Labels
No labels
accessibility
authentication
breaking change
bug
documentation
enhancement
interface
internationalisation
observability
performance
security
tier
1
tier
2
tier
3
tier/4
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
Postulo/postulo#697
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The maintainer's list, under Your career, names “Citations” and does not say what it means. This issue states a reading, offers the others under Decisions, and proposes the smallest record that serves the one recommended: a count of how often a person's published work has been cited, from a named source, on a named date, optionally for one of their publications (#687). It follows the shape and the checklist settled in #692. It is 1.0.0 because the meaning is the maintainer's to confirm and the record needs publications first.
What exists today
Linkof kind “Publication” (src/postulo/resume/models.py:273-318). The kinds are insrc/postulo/resume/registry.py:28-80. #687 proposes the publication record this one points at.Europass_CV_Instructions_EN.pdf, not fetched). The sheet never defines “Citations”; it gives examples for Publication, Project, Membership and References only. The older XML had anAchievementcodecitations(Europass XML schema documentation v3.4.0, §4.7.6), and the same document's example of an attached resource is “List of Citations” beside a “Video CV” link. The current Candidate format has no element for it. The heading sits in a list of academic and professional items (publications, presentations, conferences, honours, memberships), which is why the reading below is the researcher's.src/postulo/plugins/europass/candidate.py:136-147): a citation typed intoOthersarrives as a Project (:603-619), andPublicationHistoryis named in the “nowhere to go” notice (tests/test_europass_candidate.py:561-577).src/postulo/accounts/identifiers.py:21-23), and the outbound requests are inventoried in #366. The person's ORCID, ResearcherID and Scopus Author ID are stored identifiers (#46, #638). #688 proposes the first opt-in lookups, for publications.resume/candidate.py:170-171,:1157-1182); a new section that points at a publication does the same.src/postulo/templates/documents/themes/base_cv.html:144-147), and translated plurals are used wherever a count is said (overview.html:101).Checked against
mainatf09b6010b.Proposal
Citation(“Citation count”; heading “Citations”). AResumeItemwith:source(required text, 200: “Google Scholar”, “Scopus”, “Web of Science”, “Crossref”, “OpenCitations”, or whatever the person counted from; the form offers those as suggestions in a datalist, not as a closed list);count(a whole number from 1 to 10,000,000);as_of(a date, required, proposed as today: a count with no date is a claim that cannot age);publication(optional, one of the owner's publications; empty means the body of work as a whole; cascade, since a count of a deleted paper means nothing);url(optional: a profile or record page);summary(optional, one line). Slugcitation, placed inOVERVIEW_ORDERwhere #692 puts it. Needs #687 for the link; without it the field is left out and added with it.summaryonly. The source is somebody's name, the count a number.citationsinRESUME_FIELDS,RESUME_MODELSandTRANSLATION_SECTIONS; the importer's maps; aKindwhosenamesare the source and the title of the publication it names (as a skill's key includes its group) and whosedatesareas_of, so a later count from the same source is a new entry and the review page says “You have one like it with other dates”. Thepublication_idis a local id resolved after publications, asgroup_idis after groups; a reference to a publication not in the file leaves the count as one for the whole body of work and says so. Both formats go up by one from whatever they are when the commit lands.countis read through the form's own bounds.PublicationHistoryorOthers.#section-citation. Demo data: one for the whole body of work and one for a paper. Wiki: Your career record says what an entry is and that nothing is counted for the person.postulo.plugins.http, with size, time and address limits), opt-in per request and never automatic, as #688 does for a publication. It is a separate issue once #688's client exists; the record stores thesourceandas_ofit would write.Decisions
These are recommendations the maintainer has not confirmed.
TRADEMARKS.md, #654 is about marks).urlis typed, and Postulo builds no link nobody asked for.Prior art
No dependency in this issue. For the later lookup, from sources read in this session:
is-referenced-by-countin a work's record: a request for one DOI on 2026-10-02 returned the field and anindexedtimestamp for the record. The terms (the polite pool, rate limits) and the Crossref client libraries are compared in #688.api.opencitations.net/index/v2):/citation-count/{id}for a DOI, PMID, ISSN, ISBN or OMID, and/citations/{id}for the works citing it; a token is optional but recommended; “180 requests/minute per IP address”; its page licenses the API documentation under CC BY 4.0 and says the software behind it is ISC; the licence of the index data itself is not stated there and is not verified here, and a lookup issue must check it.applications/ical.pyanddocuments/docx.py. The precedent does not apply: no file format is written here.Builds on
Issues #46 and #638 (the person's research identifiers), #181 (the candidate file), #203 (the order of entries), #244 and #318 (the Europass reader), #366 (the inventory of outbound requests). New issues of this set: #692 (shape and checklist), #687 (publications), #688 (looking a publication up), #693 (honours and awards).
Needed by
A lookup of a count from a DOI (not filed in this set) builds on it.
Done when
tests/test_citations.py: create, edit, delete and move through the registry;countaccepts 1 to 10,000,000 and refuses 0, a negative and text;as_ofis required and proposed as today; an entry may name one of the owner's publications and a foreign publication is refused by the form and by the save; deleting a publication deletes its counts; the CV prints the line, plural-aware, with its date, in the HTML themes, the plain text and the Word file, and a portfolio prints it without an empty heading.tests/test_career_sections.py(the #692 guard) passes with the section;tests/test_career_languages.pygains “a citation translates its summary only”.core/export.pyFORMAT_VERSION, 29 atf09b6010b; one more than whatever it is when the commit lands) with a round trip intests/test_export.py, a CV holding one and an older archive that still loads; the candidate format (4) goes up by one with its line inSHAPES(tests/test_candidate_file.py:372-387), a review row for a good entry, one with a missing publication and one refused, andtests/security/test_candidate_file.pyfor hostile values;tests/test_europass_candidate.pyasserts a citation is not invented from a file; the API is unchanged (there is none for the career); search finds one (tests/test_search.py); CV print choice (#308) and the processing record (core/gdpr.py) do not apply;tests/test_wiki_surface.pyis untouched;tests/test_page_coverage.pyneeds no entry;tests/security/test_isolation_sweep.pyand a per-section test show another account's entry is a 404; account deletion removes them (tests/test_account_deletion.py); strings, including the plural message, are in the working catalogues (en-GB, fr-FR, pt-PT as drafts) and Weblate (#349).(#N)) are in the same commit.From the list of improvements of 2026-10-02.