Your career: presentations, conferences and seminars, one section with a role and a type #694

Closed
opened 2026-10-03 01:59:06 +00:00 by tiagoagueda · 1 comment
Owner

The maintainer's list, under Your career, names “Presentations”, “Conferences” and “Seminars”. A person who has given a talk, led a workshop, sat on a programme committee or simply taken part in an event has nowhere in Postulo to say so except a project or a link. This issue adds one section for the three names, following the shape and the checklist settled in #692.

What exists today

  • No such record. The career's kinds are in src/postulo/resume/registry.py:28-80; none is an event. The closest are Project (a name, a role, a link, dates, a summary and highlights, src/postulo/resume/models.py:198-212) and a Link of kind “Video” for a recording (:273-282). Interview, ApplicationEvent and ListingEvent are other things (src/postulo/applications/models.py, src/postulo/jobs/models.py:1339): events in a job search, not in a career.
  • A precedent for a short closed list with an honest blank. Proficiency offers a fixed list and “Not stated”, which prints nothing: “a level is a claim about yourself that somebody will test”, and an importer once invented B1 for people who had never stated one (resume/models.py:231-247, #235). A choice's label is drawn in the CV's own language through the catalogues.
  • What Europass says, from the schemas read for #692: the current Candidate format has ConferencesAndSeminars/ConferenceAndSeminar, an EventType with Title (required), Date (a start, an optional end, a duration and an Ongoing flag), Location, Description and any number of Links; its documentation says it is for events a person “may have participated in … presented their own work or projects, facilitated a workshop, been a panellist or an event organiser … or been a member of a scientific committee”, so the role is prose inside Description. Separately, SpeakingHistory/SpeakingEvent (EventName, Description) is for “an event in which the person was a lecturer or presenter”. The format before 2020 had Achievement codes conferences, seminars and workshops, and the printed template's heading Presentations had no code.
  • The plugin reads none of it (src/postulo/plugins/europass/candidate.py:136-147): the elements are named in its “nowhere to go” notice (:622-644), and the older Achievement paragraphs become one Project each (plugins/europass/reader.py:471-483).
  • A date is a month and a year on a CV: experience, education and projects print YEAR_MONTH_FORMAT (src/postulo/templates/documents/themes/base_cv.html:144-147).
  • The word “event” is taken. A model's name and the archive's block names are what tie a CV entry, a translation and a restore together (core/export.py:153-162, :781); ApplicationEvent (src/postulo/applications/models.py:537) and ListingEvent (src/postulo/jobs/models.py:1339) already use the word, and the archive writes an events list under each posting (format 23, in the history comment at core/export.py:80).
  • Conference papers are a different record: #687 gives a publication its types, among them BibTeX's inproceedings.

Checked against main at f09b6010b.

Proposal

  1. One model, Participation (“Event”; the section's heading is “Presentations, conferences and seminars”). A ResumeItem with: event (required, 200: the event's name, “PyCon Portugal 2025”); title (optional, 200: what the person presented, a talk, a poster, a workshop); role (a closed list with “Not stated”: speaker, poster, panellist, workshop leader, organiser, committee member, attendee); kind (a closed list with “Not stated”, labelled “Type” as #705 recommends: conference, seminar, workshop, other); start_date and end_date (optional); place (optional text, “Lisbon, Portugal” or “Online”); url (optional, one address: a programme, slides or a recording); summary (optional, a line or two). Slug participation, placed in OVERVIEW_ORDER where #692 puts it.
  2. The form asks for the event and the role first, in that order, and says what each is for (“What you presented, if you presented something.”). A role of “Not stated” and a type of “Not stated” are accepted and print nothing.
  3. The CV prints one line per entry, who-what-where-when in that order: the role, the title in quotation marks when there is one, the event, the place, and the month and year; the summary under it. Both base themes, the plain text and the Word file print the same line. The role and the type are drawn in the CV's language. The entry is on a CV only when the person puts it there.
  4. Translations: place and summary only. The event's name and the title of the talk are not translated, by the rule that keeps a credential's name as it is (resume/translatable.py:16-26).
  5. Archive and candidate file: block participations (the model's plural, as projects and certifications are), in RESUME_FIELDS, RESUME_MODELS and TRANSLATION_SECTIONS; the importer's maps; a Kind whose names are the event, the title and the role and whose dates are the start and the end, so the same annual event in two years is two entries with a note that the review page already writes (“You have one like it with other dates”). ordering.DATE_FIELDS gets Participation: start_date. Both formats go up by one from whatever they are when the commit lands.
  6. Europass. ConferenceAndSeminar is read into Record as an entry: Title the event, Date the dates (an Ongoing flag leaves the end empty), Location the place, Description the summary, the first Link the address; the role and the type are left as “Not stated”, because the element does not say them and the prose is not parsed. A SpeakingEvent is read with the role speaker, which the element itself states, its EventName as the event and its Description as the summary. A link beyond the first is named on the review page as not read.
  7. Search by event, title and place, linking to #section-participation. Demo data: one of each role worth showing. Wiki: Your career record says what an entry is, when to use this section and not a course or a publication.

Decisions

These are recommendations the maintainer has not confirmed.

  • One section or three. Options: (a) one section, with a role and a type; (b) three sections, one per name in the list; (c) two: what you gave and what you attended. Recommended: (a). A presentation is a role at an event, not a kind of event: the same talk is given at a conference and again at a seminar, and three sections would have three copies of one form and three places to look for one afternoon. Europass's current format makes the same cut (conferences and seminars as one element, speaking as another). A CV can still lead with the talks, because the role is on every line.
  • Role: a closed list or free text. Recommended: a closed list with “Not stated”, translated through the catalogues, so a French CV says “Intervenant” and a Portuguese one “Orador” without anyone typing it twice (the words are for the translators to choose). Free text would put the role beside the event in the person's language only. “Other” is not offered: the title and the summary can say more.
  • Role and type are not guessed. An importer that reads a ConferenceAndSeminar does not decide the person was a speaker or an attendee. A role the file does not state stays unstated, for the reason Proficiency has a blank.
  • Attending. Listing an event one only attended is the person's call, and the role says so. Recommended: offered, never prompted.
  • Where a seminar becomes a course. Recommended rule, in the help and the wiki: an event is one place on set days that the person took part in, spoke at or helped run; a course (#695) is learning with a provider, a length and, usually, an outcome. A one-day training that issued a certificate is a course.
  • A paper and its talk. Two records, linked by nothing: the paper is a publication (#687), the talk is a participation. Recommended: no link now; either could carry a reference to the other later without changing this shape.
  • Name of the model. Participation, not Event, Talk or Appearance: ApplicationEvent and ListingEvent already take the word, and Appearance is a Settings page. The maintainer may prefer another; the slug is in the address and the archive, so it is cheaper to settle now.
  • Words that already mean something else. msgid "Role" is a job in the catalogues (“Poste” in the fr-FR draft) and msgid "Type" is typography until #705 settles it. Recommended: the event's role and type take messages of their own, with a pgettext context, so a translator is not asked to make one word do both.
  • iCalendar. The list's rule that events leave as iCalendar is about what Postulo schedules (interviews, deadlines; #661). A talk given last year is a record, not a date to be reminded of. Recommended: not exported as iCalendar; JSON through the archive and the candidate file, as for the rest of the career.
  • Several links. Europass allows many; one is enough here. Recommended: one address, the first read, the others named as not read.

Prior art

No dependency. The standard is the Europass formats, read for #692: EventType and SpeakingEventType as quoted above. Whether the portal fills ConferencesAndSeminars or SpeakingHistory for what a person adds is not verified, and a real download has not been compared (#318). Not verified either: how the Duration of a Date is written, which this issue does not read.

Builds on

Issues #131 (entries in other languages), #181 (the candidate file), #203 (the order of entries), #235 (a level or a role nobody stated is not made up), #244 and #318 (the Europass reader and its real-download check). New issues of this set: #692 (shape and checklist), #705 (“Type”, not “Kind”), #687 (publications), #695 (courses).

Needed by

Nothing waits on it.

Done when

  • A new tests/test_participations.py: create, edit, delete and move through the registry; a role and a type of “Not stated” are accepted and print nothing; the CV prints the line in the document's language (role and type drawn from the catalogue) in the HTML themes, the plain text and the Word file, a portfolio prints it without an empty heading, and an entry with only an event prints just that; a new entry lands by its start date.
  • tests/test_career_sections.py (the #692 guard) passes with the section; tests/test_career_languages.py gains “a participation translates its place and summary, not its event or title”.
  • The standing checklist, for a new record type: the archive format goes up by one (core/export.py FORMAT_VERSION, 29 at f09b6010b; one more than whatever it is when the commit lands) with a round trip in tests/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 in SHAPES (tests/test_candidate_file.py:372-387), a review row for a good entry and a refused one, and tests/security/test_candidate_file.py for hostile or over-long values; tests/test_europass_candidate.py reads a ConferenceAndSeminar and a SpeakingEvent as above and names a second link as not read; 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.py is untouched unless Record changes on the surface, in which case its wiki line and Writing a plugin follow; tests/test_page_coverage.py needs no entry; tests/security/test_isolation_sweep.py and a per-section test show another account's entry is a 404; account deletion removes them (tests/test_account_deletion.py); strings, including the two lists, are in the working catalogues (en-GB, fr-FR, pt-PT as drafts) and Weblate (#349).
  • The wiki and the CHANGELOG line (ends (#N)) are in the same commit.

From the list of improvements of 2026-10-02.

The maintainer's list, under Your career, names “Presentations”, “Conferences” and “Seminars”. A person who has given a talk, led a workshop, sat on a programme committee or simply taken part in an event has nowhere in Postulo to say so except a project or a link. This issue adds one section for the three names, following the shape and the checklist settled in #692. ## What exists today - **No such record.** The career's kinds are in `src/postulo/resume/registry.py:28-80`; none is an event. The closest are `Project` (a name, a role, a link, dates, a summary and highlights, `src/postulo/resume/models.py:198-212`) and a `Link` of kind “Video” for a recording (`:273-282`). `Interview`, `ApplicationEvent` and `ListingEvent` are other things (`src/postulo/applications/models.py`, `src/postulo/jobs/models.py:1339`): events in a job search, not in a career. - **A precedent for a short closed list with an honest blank.** `Proficiency` offers a fixed list and “Not stated”, which prints nothing: “a level is a claim about yourself that somebody will test”, and an importer once invented B1 for people who had never stated one (`resume/models.py:231-247`, #235). A choice's label is drawn in the CV's own language through the catalogues. - **What Europass says**, from the schemas read for #692: the current Candidate format has `ConferencesAndSeminars/ConferenceAndSeminar`, an `EventType` with `Title` (required), `Date` (a start, an optional end, a duration and an `Ongoing` flag), `Location`, `Description` and any number of `Link`s; its documentation says it is for events a person “may have participated in … presented their own work or projects, facilitated a workshop, been a panellist or an event organiser … or been a member of a scientific committee”, so the role is prose inside `Description`. Separately, `SpeakingHistory/SpeakingEvent` (`EventName`, `Description`) is for “an event in which the person was a lecturer or presenter”. The format before 2020 had `Achievement` codes `conferences`, `seminars` and `workshops`, and the printed template's heading *Presentations* had no code. - **The plugin reads none of it** (`src/postulo/plugins/europass/candidate.py:136-147`): the elements are named in its “nowhere to go” notice (`:622-644`), and the older `Achievement` paragraphs become one Project each (`plugins/europass/reader.py:471-483`). - **A date is a month and a year on a CV**: experience, education and projects print `YEAR_MONTH_FORMAT` (`src/postulo/templates/documents/themes/base_cv.html:144-147`). - **The word “event” is taken.** A model's name and the archive's block names are what tie a CV entry, a translation and a restore together (`core/export.py:153-162`, `:781`); `ApplicationEvent` (`src/postulo/applications/models.py:537`) and `ListingEvent` (`src/postulo/jobs/models.py:1339`) already use the word, and the archive writes an `events` list under each posting (format 23, in the history comment at `core/export.py:80`). - Conference papers are a different record: #687 gives a publication its types, among them BibTeX's `inproceedings`. Checked against `main` at `f09b6010b`. ## Proposal 1. **One model, `Participation`** (“Event”; the section's heading is “Presentations, conferences and seminars”). A `ResumeItem` with: `event` (required, 200: the event's name, “PyCon Portugal 2025”); `title` (optional, 200: what the person presented, a talk, a poster, a workshop); `role` (a closed list with “Not stated”: speaker, poster, panellist, workshop leader, organiser, committee member, attendee); `kind` (a closed list with “Not stated”, labelled “Type” as #705 recommends: conference, seminar, workshop, other); `start_date` and `end_date` (optional); `place` (optional text, “Lisbon, Portugal” or “Online”); `url` (optional, one address: a programme, slides or a recording); `summary` (optional, a line or two). Slug `participation`, placed in `OVERVIEW_ORDER` where #692 puts it. 2. **The form** asks for the event and the role first, in that order, and says what each is for (“What you presented, if you presented something.”). A role of “Not stated” and a type of “Not stated” are accepted and print nothing. 3. **The CV** prints one line per entry, who-what-where-when in that order: the role, the title in quotation marks when there is one, the event, the place, and the month and year; the summary under it. Both base themes, the plain text and the Word file print the same line. The role and the type are drawn in the CV's language. The entry is on a CV only when the person puts it there. 4. **Translations**: `place` and `summary` only. The event's name and the title of the talk are not translated, by the rule that keeps a credential's name as it is (`resume/translatable.py:16-26`). 5. **Archive and candidate file**: block `participations` (the model's plural, as `projects` and `certifications` are), in `RESUME_FIELDS`, `RESUME_MODELS` and `TRANSLATION_SECTIONS`; the importer's maps; a `Kind` whose `names` are the event, the title and the role and whose `dates` are the start and the end, so the same annual event in two years is two entries with a note that the review page already writes (“You have one like it with other dates”). `ordering.DATE_FIELDS` gets `Participation: start_date`. Both formats go up by one from whatever they are when the commit lands. 6. **Europass.** `ConferenceAndSeminar` is read into `Record` as an entry: `Title` the event, `Date` the dates (an `Ongoing` flag leaves the end empty), `Location` the place, `Description` the summary, the first `Link` the address; the role and the type are left as “Not stated”, because the element does not say them and the prose is not parsed. A `SpeakingEvent` is read with the role *speaker*, which the element itself states, its `EventName` as the event and its `Description` as the summary. A link beyond the first is named on the review page as not read. 7. **Search** by event, title and place, linking to `#section-participation`. **Demo data**: one of each role worth showing. **Wiki**: *Your career record* says what an entry is, when to use this section and not a course or a publication. ## Decisions These are recommendations the maintainer has not confirmed. - **One section or three.** Options: (a) one section, with a role and a type; (b) three sections, one per name in the list; (c) two: what you gave and what you attended. **Recommended: (a).** A presentation is a role at an event, not a kind of event: the same talk is given at a conference and again at a seminar, and three sections would have three copies of one form and three places to look for one afternoon. Europass's current format makes the same cut (conferences and seminars as one element, speaking as another). A CV can still lead with the talks, because the role is on every line. - **Role: a closed list or free text.** **Recommended: a closed list with “Not stated”**, translated through the catalogues, so a French CV says “Intervenant” and a Portuguese one “Orador” without anyone typing it twice (the words are for the translators to choose). Free text would put the role beside the event in the person's language only. “Other” is not offered: the title and the summary can say more. - **Role and type are not guessed.** An importer that reads a `ConferenceAndSeminar` does not decide the person was a speaker or an attendee. A role the file does not state stays unstated, for the reason `Proficiency` has a blank. - **Attending.** Listing an event one only attended is the person's call, and the role says so. **Recommended:** offered, never prompted. - **Where a seminar becomes a course.** **Recommended rule, in the help and the wiki:** an event is one place on set days that the person took part in, spoke at or helped run; a course (#695) is learning with a provider, a length and, usually, an outcome. A one-day training that issued a certificate is a course. - **A paper and its talk.** Two records, linked by nothing: the paper is a publication (#687), the talk is a participation. **Recommended:** no link now; either could carry a reference to the other later without changing this shape. - **Name of the model.** `Participation`, not `Event`, `Talk` or `Appearance`: `ApplicationEvent` and `ListingEvent` already take the word, and *Appearance* is a Settings page. The maintainer may prefer another; the slug is in the address and the archive, so it is cheaper to settle now. - **Words that already mean something else.** `msgid "Role"` is a job in the catalogues (“Poste” in the fr-FR draft) and `msgid "Type"` is typography until #705 settles it. **Recommended:** the event's role and type take messages of their own, with a `pgettext` context, so a translator is not asked to make one word do both. - **iCalendar.** The list's rule that events leave as iCalendar is about what Postulo schedules (interviews, deadlines; #661). A talk given last year is a record, not a date to be reminded of. **Recommended:** not exported as iCalendar; JSON through the archive and the candidate file, as for the rest of the career. - **Several links.** Europass allows many; one is enough here. **Recommended:** one address, the first read, the others named as not read. ## Prior art No dependency. The standard is the Europass formats, read for #692: `EventType` and `SpeakingEventType` as quoted above. Whether the portal fills `ConferencesAndSeminars` or `SpeakingHistory` for what a person adds is not verified, and a real download has not been compared (#318). Not verified either: how the `Duration` of a `Date` is written, which this issue does not read. ## Builds on Issues #131 (entries in other languages), #181 (the candidate file), #203 (the order of entries), #235 (a level or a role nobody stated is not made up), #244 and #318 (the Europass reader and its real-download check). New issues of this set: #692 (shape and checklist), #705 (“Type”, not “Kind”), #687 (publications), #695 (courses). ## Needed by Nothing waits on it. ## Done when - A new `tests/test_participations.py`: create, edit, delete and move through the registry; a role and a type of “Not stated” are accepted and print nothing; the CV prints the line in the document's language (role and type drawn from the catalogue) in the HTML themes, the plain text and the Word file, a portfolio prints it without an empty heading, and an entry with only an event prints just that; a new entry lands by its start date. - `tests/test_career_sections.py` (the #692 guard) passes with the section; `tests/test_career_languages.py` gains “a participation translates its place and summary, not its event or title”. - The standing checklist, for a new record type: the archive format goes up by one (`core/export.py` `FORMAT_VERSION`, 29 at `f09b6010b`; one more than whatever it is when the commit lands) with a round trip in `tests/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 in `SHAPES` (`tests/test_candidate_file.py:372-387`), a review row for a good entry and a refused one, and `tests/security/test_candidate_file.py` for hostile or over-long values; `tests/test_europass_candidate.py` reads a `ConferenceAndSeminar` and a `SpeakingEvent` as above and names a second link as not read; 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.py` is untouched unless `Record` changes on the surface, in which case its wiki line and *Writing a plugin* follow; `tests/test_page_coverage.py` needs no entry; `tests/security/test_isolation_sweep.py` and a per-section test show another account's entry is a 404; account deletion removes them (`tests/test_account_deletion.py`); strings, including the two lists, are in the working catalogues (en-GB, fr-FR, pt-PT as drafts) and Weblate (#349). - The wiki and the CHANGELOG line (ends `(#N)`) are in the same commit. From the list of improvements of 2026-10-02.
tiagoagueda added this to the 0.6.0 milestone 2026-10-03 01:59:06 +00:00
Author
Owner

Landed on main with a green Forgejo CI run. Its entry in the CHANGELOG's Unreleased section ends in (#694).

Landed on main with a green Forgejo CI run. Its entry in the CHANGELOG's Unreleased section ends in (#694).
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#694
No description provided.