A candidate's own record cannot be taken out on its own, and nothing can be put back #181

Open
opened 2026-09-12 09:07:42 +00:00 by tiagoagueda · 0 comments
Owner

Observation

Postulo can already hand somebody everything as JSON. core/export.py::build_document
assembles the whole account — profile, career, companies, applications, documents, captures,
plugin data — as postulo.json inside a zip with the files beside it, reachable at
Settings → Your data.

Two things it is not:

  1. There is no import. Nothing reads postulo.json back. The archive is a way out and a
    way to keep a copy; it is not a way to move.
  2. It is all or nothing. Somebody who wants to carry their own CV data to another Postulo
    — or keep it in a git repository, or hand it to a script — has to take their entire
    application history with it. The career data is the part that is theirs and portable;
    the applications are a record of one job hunt.

The only import that exists is Europass (plugins/europass), which reads somebody else's
format and cannot read Postulo's own.

What this issue is

A candidate-scoped JSON export and import on Your details: the person's own record and
nothing else.

details        picture metadata, name, headline, location,
               website, linkedin, contact block
phone numbers
postal addresses
experience / education / projects / links
skills / certifications / languages
their translations

Not companies, not applications, not captures, not documents. Those are the job hunt, not the
candidate.

What has to be decided

Merge or replace. Importing into an account that already has fifteen roles is the case
that matters, and both answers are defensible: replace is predictable and destroys work;
merge is safe and produces duplicates. Probably: the import says what it found and what it
would do, and the person confirms — the same shape as the capture review screen, and for the
same reason, which is that reading somebody else's file is guesswork.

What identifies an entry. Without it, importing the same file twice doubles everything.
The archive's own note says its ids are local to the file:

Identifiers are local to this file and exist so the parts can be reconnected; they are not
meaningful anywhere else.

So matching has to be on content — an experience is its employer, title and dates — with the
same "tell, do not refuse" stance as #178.

The format, and whether it is a third one. build_document already shapes every one of
these blocks. This should be the same shapes, a subset of the same document, with its own
format marker — not a second spelling of a person's career that then has to be kept in step.
FORMAT_VERSION and TRANSLATION_SECTIONS are already there to build on.

The picture. JSON alone cannot carry it. Either the export is a zip like the account one,
or the picture is left out and said to be left out. Leaving it out keeps the file something a
person can read and edit in a text editor, which is most of the point.

Worth having afterwards, not here

An importer for the full postulo.json, so an account round-trips. That is much larger —
every model, plugin data, files, and a remapping problem for every id — and it should copy
whatever this issue settles about merge, matching and confirmation rather than invent it in
parallel.

## Observation Postulo can already hand somebody **everything** as JSON. `core/export.py::build_document` assembles the whole account — profile, career, companies, applications, documents, captures, plugin data — as `postulo.json` inside a zip with the files beside it, reachable at *Settings → Your data*. Two things it is not: 1. **There is no import.** Nothing reads `postulo.json` back. The archive is a way out and a way to keep a copy; it is not a way to move. 2. **It is all or nothing.** Somebody who wants to carry their own CV data to another Postulo — or keep it in a git repository, or hand it to a script — has to take their entire application history with it. The career data is the part that is *theirs* and portable; the applications are a record of one job hunt. The only import that exists is Europass (`plugins/europass`), which reads somebody else's format and cannot read Postulo's own. ## What this issue is A **candidate-scoped** JSON export and import on *Your details*: the person's own record and nothing else. details picture metadata, name, headline, location, website, linkedin, contact block phone numbers postal addresses experience / education / projects / links skills / certifications / languages their translations Not companies, not applications, not captures, not documents. Those are the job hunt, not the candidate. ## What has to be decided **Merge or replace.** Importing into an account that already has fifteen roles is the case that matters, and both answers are defensible: *replace* is predictable and destroys work; *merge* is safe and produces duplicates. Probably: the import says what it found and what it would do, and the person confirms — the same shape as the capture review screen, and for the same reason, which is that reading somebody else's file is guesswork. **What identifies an entry.** Without it, importing the same file twice doubles everything. The archive's own note says its ids are local to the file: > Identifiers are local to this file and exist so the parts can be reconnected; they are not > meaningful anywhere else. So matching has to be on content — an experience is its employer, title and dates — with the same "tell, do not refuse" stance as #178. **The format, and whether it is a third one.** `build_document` already shapes every one of these blocks. This should be the *same shapes*, a subset of the same document, with its own `format` marker — not a second spelling of a person's career that then has to be kept in step. `FORMAT_VERSION` and `TRANSLATION_SECTIONS` are already there to build on. **The picture.** JSON alone cannot carry it. Either the export is a zip like the account one, or the picture is left out and said to be left out. Leaving it out keeps the file something a person can read and edit in a text editor, which is most of the point. ## Worth having afterwards, not here An importer for the full `postulo.json`, so an account round-trips. That is much larger — every model, plugin data, files, and a remapping problem for every id — and it should copy whatever this issue settles about merge, matching and confirmation rather than invent it in parallel.
tiagoagueda added this to the 0.5.0 milestone 2026-09-15 21:33:29 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Postulo/postulo#181
No description provided.