A certification names its issuer as a company #686
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#686
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 says, under Your career: “Certification is issued by a Company (with valid NACE code).” Today the issuer of a certification is a line of free text. Unlike a school or an employer, the organisations that issue certifications do not sit in one NACE division, so the part of the sentence that needs care is “valid NACE code”.
What exists today
Certification.issueris aCharField(200, blank=True), helped by “Who awarded it.” (src/postulo/resume/models.py:215-228,resume/forms.py:192-201). A certification translates nothing, on purpose: “both of its texts are the awarding body's wording — the name of a credential is the credential” (resume/translatable.py:18-26;tests/test_career_languages.py:83-85and the screen at:342-351). #131 (closed) decided that.templates/documents/themes/base_cv.html:121,base_portfolio.html:125,documents/rendering.py:363-371), search covers both (core/search.py:489), and a certification is “its name and its issuer” and its dates in the candidate file (resume/candidate.py:259-266). Seed data names CNCF (core/management/commands/seed_demo.py:476).core/importer.py:530-575,:597), the career block is shared by the archive and the candidate file and fingerprinted (core/export.py:382-391,tests/test_candidate_file.py:354-387), a company merge and delete know nothing of the career (jobs/merging.py:230-250,jobs/views.py:574-610), and every list of companies would gain the issuer.Industry.codeis a NACE division set from the name, and a company has industries through a many-to-many (jobs/models.py:42-81,:288-290;jobs/industries.py:165-176). The vendored file holds the 22 sections and 87 divisions of NACE Rev. 2.1 in 24 languages and no groups or classes (jobs/data/nace-2.1.json, 177 KB;data/LICENCE.md: “Groups (three digits) and classes (four) were not taken”, which was a choice and not a licence term).Industry.codeismax_length=4(jobs/models.py:61): it holds85and would hold8569, not85.69.Checked against
mainatf09b6010b.Proposal
Three commits, after #683 (the link, the marker, the files) and #671 (the registry); each leaves
maingreen.Certification.company, a nullable foreign key tojobs.Company,SET_NULL, withissuerkept as the optional text every theme and file reads. The issuer box offers the person's companies as #683's does, in the order e1's registry gives for the role “awarding body”: the companies whose industries include division 85 or 94 first, then every other company below them. On save the text is matched to the owner's company by name, case-insensitively, or a company is added, marked as from the career, with no industry assigned: a school can be classified from the form it was typed into, a vendor or a professional body cannot.company(name or blank) in the archive and the candidate file, linked by name after the companies exist, offered as a link on the review page only on an exact match, never created from a file; the Europass import adds none; a migration links exact name matches only; the company page lists the certifications that name it; the merge moves them and the delete dialog counts them.Decisions
Industry.code, and a larger file: the English-only titles of the 1,025 divisions, groups and classes come to 65 KB, against 177 KB for 109 entries in 24 languages today, so the full set in 24 languages would be well over a megabyte (an estimate, not measured). Recommended: division level only, as #671 does; nothing here needs a class.Prior art
No new dependency. The classification is Eurostat's NACE Rev. 2.1, already vendored under CC BY 4.0 (
jobs/data/LICENCE.md); the rule that a classification is taken and not invented is #140's and #266's. The classes quoted are from Eurostat, NACE Rev. 2.1 — Statistical classification of economic activities in the European Union, 2025 edition (doi:10.2785/155339). Not verified: how Eurostat's notes treat public authorities that issue licences (division 84), and which class a cloud vendor or a foundation falls in.Builds on
Issues #131 (a certification translates nothing), #140 and #266, #683, #671.
Needed by
#670 (the issuer of a credential), #693 (awards and memberships name an organisation as a company too).
Done when
tests/test_career_companies.py(new in #683) gains the certification cases: saving links or adds a company marked as from the career, never assigns an industry, never uses another owner's company; the migration links exact matches only; an entry with no issuer saves as before.tests/test_nace.py): the “awarding body” role is divisions 85 and 94, every code in the registry exists in the vendored file; the order puts a company with “Education” or a membership-organisation industry first and loses none; the notice shows for a company with no coded industry, not for one with an industry outside 85 and 94, and never blocks.tests/test_career_languages.pystill passes unchanged (a certification translates nothing,:83-85,:342-351);tests/test_help_text.pyfollows the field.tests/test_merging.pymoves certifications;tests/test_jobs_isolation.pyandtests/security/test_isolation_sweep.pyshow another account's company is neither offered nor linked.tests/test_export.pyand the archive round trip carrycompanyon a certification at the new format;tests/test_candidate_file.pyholds the newSHAPESline andtests/security/test_candidate_file.pya hostilecompany;tests/test_importers.pyfor the importer's pass.core/gdpr.py). Standing checklist otherwise: archive format one more than whatever it is when the commit lands (29 atf09b6010b), candidate format likewise (4), strings in the working catalogues (en-GB, fr-FR, pt-PT as drafts) and Weblate (#349);Your-career-record.mdandjobs/industries.py's docstring (22 sections, 651 classes) changed in the same commits.From the list of improvements of 2026-10-02.
Landed on main with a green Forgejo CI run. Its entry in the CHANGELOG's Unreleased section ends in (#686).