<feed xmlns='http://www.w3.org/2005/Atom'>
<title>cccms/app/controllers, branch erdgeist-modernize-auth</title>
<subtitle>[no description]</subtitle>
<id>https://erdgeist.org/gitweb/cccms/atom?h=erdgeist-modernize-auth</id>
<link rel='self' href='https://erdgeist.org/gitweb/cccms/atom?h=erdgeist-modernize-auth'/>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/'/>
<updated>2026-07-16T22:42:54Z</updated>
<entry>
<title>Cutover to new Recent Changes widget</title>
<updated>2026-07-16T22:42:54Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-07-16T22:42:54Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=c810d1aa93a267dd8fcf8984c5d0b125629efa31'/>
<id>urn:sha1:c810d1aa93a267dd8fcf8984c5d0b125629efa31</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Split current_unique_name in a setter and an accessor</title>
<updated>2026-07-16T13:12:07Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-07-16T13:12:07Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=b701669d0d9a5d7be01f99b8e725c05c6c5d52ce'/>
<id>urn:sha1:b701669d0d9a5d7be01f99b8e725c05c6c5d52ce</id>
<content type='text'>
Also clean up some instance variable assignments on the way.
</content>
</entry>
<entry>
<title>Add a reader for the action log at admin/log</title>
<updated>2026-07-16T01:30:01Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-07-16T01:30:01Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=190daaa8a0bb79e750894b83e31b9d99f7d900a4'/>
<id>urn:sha1:190daaa8a0bb79e750894b83e31b9d99f7d900a4</id>
<content type='text'>
NodeActionsController#index lists entries newest-first, filterable
by node_id or user_id -- the two zoom shapes the log was designed
around. Rendering goes through NodeActionsHelper.action_summary,
which builds one sentence per entry from metadata alone, so entries
referencing deleted users or nodes render from their snapshots;
live associations only upgrade names to links. Unknown verbs
degrade to a generic sentence rather than an error, since the log
outlives its vocabulary. The helper is the escaping boundary:
every metadata value passes through h() before assembly.

Actor names link to the log's own user zoom rather than the unused
users page -- inspecting a suspicious user's other actions is the
intended workflow. Publish entries with a translation_diff expose
a collapsed per-locale change table linking out to the revision
itself. Sentences live in en.yml/de.yml following the existing
widget-string convention. nodes#show links to its node's zoomed
log.
</content>
</entry>
<entry>
<title>Record the full lifecycle contract in NodeAction entries</title>
<updated>2026-07-16T00:40:03Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-07-16T00:40:03Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=c0c9250141c2fa64fed967b8b9ad9bada3694c3d'/>
<id>urn:sha1:c0c9250141c2fa64fed967b8b9ad9bada3694c3d</id>
<content type='text'>
A contract comment above NodeAction.record! now specifies every
verb's metadata shape. NodeAction.head_diff computes the publish
diff between an outgoing head and its replacement -- default-locale
title pair always, author/tags pairs and template/assets/abstract/
body flags only when changed, and a per-locale translation_diff
with added/removed/changed status. It is a pure function of its two
pages, shared by publish, rollback, and the future backfill, and
reads translation rows directly so fallbacks never masquerade as
content.

publish entries carry via ("draft" or "revision"); restore_revision!
is now transactional, takes the acting user, and logs through the
same diff. Staged slug/parent changes applied at publish log a move
entry with the path pair. Node creation logs a create entry with
initial title and path. The draft-scoped translation_destroy writer
is retired -- locale removal is recorded by the publish diff, where
it becomes public fact.
</content>
</entry>
<entry>
<title>Provide parent_unique_name in nodes#new if parent is already pre-set</title>
<updated>2026-07-15T23:40:37Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-07-15T23:40:37Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=fb7b8233f1bbf7acb88d48f96e6f81cefe168d1c'/>
<id>urn:sha1:fb7b8233f1bbf7acb88d48f96e6f81cefe168d1c</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Add NodeAction: an append-only log of who did what to a node</title>
<updated>2026-07-15T02:23:09Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-07-14T23:41:34Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=d56155231814633e04f856d22646fea24ef97011'/>
<id>urn:sha1:d56155231814633e04f856d22646fea24ef97011</id>
<content type='text'>
node_id/page_id/user_id are lookup and ordering only -- all three
nullify on delete, so an entry outlives its actor and its subject.
Everything that must survive those deletions lives in a mandatory
metadata jsonb written once at creation: the actor's username, the
node's human-readable name (pinned to the default locale), and
action-specific extras such as publish's title from/to.

NodeAction.record! is the single constructor, so every entry gets
the same baseline metadata without each call site re-implementing
it. occurred_at is one field for live and backfilled entries alike;
inferred_from distinguishes them -- nil means witnessed at the
moment it happened, populated names how a backfilled entry was
estimated.

Instrumented so far: publish (crediting the actual publisher,
threaded through from the controller -- previously nobody had the
act of publishing recorded anywhere), revert's discard_autosave and
destroy_draft branches, and translation destroy. publish_draft! now
runs in a transaction so the promotion and its log entry land
together. The remaining verbs follow once this mechanism has proven
itself.
</content>
</entry>
<entry>
<title>Supply related-asset URLs/name and public inline-image CSS</title>
<updated>2026-07-14T16:30:40Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-07-14T15:25:37Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=6ddc9d73f1299cdeb90bc88ed0bb53821c4825aa'/>
<id>urn:sha1:6ddc9d73f1299cdeb90bc88ed0bb53821c4825aa</id>
<content type='text'>
RelatedAssetsController#create's JSON includes large_url,
original_url, and name alongside thumb_url/url; the related-asset
list items in both editors carry them as data-large-url,
data-original-url, and data-name.

ccc.css gets the public-facing .inline-image--full/--half/--left/
--right rules -- admin.css and TinyMCE's content_style cover the
cockpit and in-editor renderings respectively.
</content>
</entry>
<entry>
<title>Make revisions locale aware</title>
<updated>2026-07-14T00:17:04Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-07-14T00:17:04Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=88ebeaac7fcf140cbab489e841bf9c197f84c4ea'/>
<id>urn:sha1:88ebeaac7fcf140cbab489e841bf9c197f84c4ea</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Store return_to before resetting session in loging. Fixes returning to an admin page before logging in</title>
<updated>2026-07-13T23:32:30Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-07-13T23:32:30Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=7185965d97a2d7d98f5feda6cc10fb5d87fcf816'/>
<id>urn:sha1:7185965d97a2d7d98f5feda6cc10fb5d87fcf816</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Remove redundant default translation from the translations subsection</title>
<updated>2026-07-13T17:28:49Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-07-13T17:28:49Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=0113d895e2fd8bf2cf88ae0196b9ab144ac9350b'/>
<id>urn:sha1:0113d895e2fd8bf2cf88ae0196b9ab144ac9350b</id>
<content type='text'>
</content>
</entry>
</feed>
