Describe the environment variables a plugin declares
A plugin lists each variable it reads as an EnvironmentVariable in its
environment attribute and reads it with read_environment. Say how one
is named, what the start-up check and manage.py settings do with it,
how to test the declaration, and list the two names on the surface.
Refs postulo/postulo#1186
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A sync plugin can read what its last good run kept with sync_state and
return the next one on SyncReport.state, at most MAX_SYNC_STATE_BYTES.
Say when it is kept and dropped, how to test it with run_sync and
kept_sync_state, and list the two names on the surface.
Refs postulo/postulo#1165
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Show the mark as a vector, and ask plugins to do the same
Home shows images/postulo.svg, a copy of the logo.svg the core serves
since #1238, instead of the PNG. Nothing else in the wiki, its
translations or the documentation site's build named images/postulo.png,
so it goes.
Writing a plugin says, under "A logo, if you have one": a plugin's logo,
icon or any drawn picture is kept and served as an SVG first; a raster
only where a platform takes nothing else, rendered from the SVG by a
script in the plugin's repository; Postulo's mark never copied as a
raster.
Refs postulo/postulo#1238
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Describe a CV's Europass and JSON Resume downloads
In other formats names the two, says what of a CV each leaves out is named beside its
download and that the Europass file reads back through the importer; the file formats
module lists its new sub-modules, and GeoJSON, which it already had.
Refs postulo/postulo#1100
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The page sent plugins to postulo.plugins.http, which is not on the surface; client is
imported from postulo.plugins.api, as the example above it already does.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Say how a plugin's tests keep the migrated database between runs
Beside the other postulo.plugins.testing helpers: the two lines of conftest.py, what names
the copy, and how POSTULO_TEST_DB_CACHE and a cache step decide it on CI.
Refs postulo/postulo#1144
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A new section says how a plugin declares a DashboardWidget, what its context is handed, what
its template may write and how to test it; the surface's list names it, and what a widget
is handed is no longer called unsettled.
Refs postulo/postulo#1102
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bring the scheduler's and the worker's habits up to date
Files and Configuration say how often uploads are checked and orphans looked
for, add POSTULO_SCRUB_EVERY_DAYS, and say what is now tidied by itself: the
queue's finished tasks, expired cache entries, a slow store's backlog. A
notification that failed is tried again, an idle worker is quiet, and Writing
a plugin says what that means for a notifier's send().
Refs postulo/postulo#1118
Refs postulo/postulo#1119
Refs postulo/postulo#1121
Refs postulo/postulo#1167
Refs postulo/postulo#1163
Refs postulo/postulo#1117
Refs postulo/postulo#1172
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Name the two new warnings, and what is read once and kept
Configuration and Installing Postulo name postulo.W003 and postulo.W004, give
the occupations file its new size, and say when the Overview asks the fonts
again. Writing a plugin says that the primary number and link of a contact
are read from prefetched rows.
Refs postulo/postulo#1109
Refs postulo/postulo#1110
Refs postulo/postulo#1171
Refs postulo/postulo#1133
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Say how a killed backup, a failing sync and a silent worker behave
Backups gain the .partial file an archive is written under and the ten-minute
claim of a running backup; Background work says when an interrupted errand is
marked failed and what its page says while no worker is seen. Syncs gain the
back-off of a failing connection, for the person and for a plugin author, and
what add_reminder returns.
Refs postulo/postulo#1123
Refs postulo/postulo#1131
Refs postulo/postulo#1122
Refs postulo/postulo#1162
Refs postulo/postulo#1164
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Writing a plugin: keep the Author-email example on one line
The code span broke across lines with <address> starting the second one.
Forgejo's CommonMark reads it as code, but Python-Markdown (the documentation
site's Zensical build at wiki.tiagoagueda.com) took it for an unclosed HTML
<address> block and dropped the rest of the page after "Saying who you are".
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Groups, sharing and what stays each person's (#896)
The amended promise on Accounts and invitations, a section on groups and sharing (owner,
share, what stays yours, the trail, changing the owner, leaving, conflicts, imports), and
the plugin guide's new events and scoping calls.
Refs postulo/postulo#896
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Spoken languages are chosen by code, and a CV names them in its own language (#689)
Your career record: the Languages section is a list with Other, what a CV prints, what
happened to entries already typed, the management command, archive and candidate file.
Writing a plugin: Record["languages"] gains an optional code.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Writing a plugin names MessagingService, MessagingServicePlugin and messaging_service_of
and says the kind registers in postulo.messaging_services. Refs postulo/postulo#682 #672#665#658#656#333
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Your own email now sends from the record page; company names are compared without capitals
Configuration, Writing-a-plugin, Files-and-what-you-sent: the Email these step on Record what
you sent (sent first, frozen and recorded only if it went, an outbox plugin raises on failure).
Installing-Postulo: company and department names are unique ignoring capitals and spacing, the
upgrade stops and lists any clash, and manage.py company_name_clashes lists them beforehand.
Refs postulo/postulo#361postulo/postulo#546
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>