<feed xmlns='http://www.w3.org/2005/Atom'>
<title>cccms/db, branch master</title>
<subtitle>[no description]</subtitle>
<id>http://erdgeist.org/gitweb/cccms/atom?h=master</id>
<link rel='self' href='http://erdgeist.org/gitweb/cccms/atom?h=master'/>
<link rel='alternate' type='text/html' href='http://erdgeist.org/gitweb/cccms/'/>
<updated>2026-08-20T10:55:19Z</updated>
<entry>
<title>Add migration for redirects flag and target</title>
<updated>2026-08-20T10:55:19Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-08-20T10:55:19Z</published>
<link rel='alternate' type='text/html' href='http://erdgeist.org/gitweb/cccms/commit/?id=bc573fe863fcbfc536161edc54955de4408cf13f'/>
<id>urn:sha1:bc573fe863fcbfc536161edc54955de4408cf13f</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Redirect a page to a node or an external URL</title>
<updated>2026-08-19T14:05:40Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-08-19T14:05:40Z</published>
<link rel='alternate' type='text/html' href='http://erdgeist.org/gitweb/cccms/commit/?id=4df88b601b1900c287051d827eaff46f498f60d0'/>
<id>urn:sha1:4df88b601b1900c287051d827eaff46f498f60d0</id>
<content type='text'>
Page#redirect_target resolves the precedence and returns nil for a
destination that is restricted or has no head, so a page with a broken
target renders itself rather than linking nowhere. The banner partial will
call the same method, so the redirect and the link cannot drift.

One hop, no exceptions, checked in publish_draft! rather than as a
validation: two nodes publishing concurrently could each pass a save-time
check and still produce a chain. "Live" means heads only, a draft redirect
that has not published is not yet a link anyone can follow.

Node.search excludes redirecting pages. editor_search does not: an editor
looking for one searches by title, and only the body is worth hiding.
</content>
</entry>
<entry>
<title>Make db/schema.rb the authoritative database description</title>
<updated>2026-08-09T14:25:32Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-08-09T14:25:32Z</published>
<link rel='alternate' type='text/html' href='http://erdgeist.org/gitweb/cccms/commit/?id=5d33a8ae2b14260ec045342b7ca56def03914e09'/>
<id>urn:sha1:5d33a8ae2b14260ec045342b7ca56def03914e09</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Drop nodes.external_url</title>
<updated>2026-08-09T14:03:40Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-08-09T14:03:40Z</published>
<link rel='alternate' type='text/html' href='http://erdgeist.org/gitweb/cccms/commit/?id=0f4288d91de7b48f7bbed832ca80246b0055cc64'/>
<id>urn:sha1:0f4288d91de7b48f7bbed832ca80246b0055cc64</id>
<content type='text'>
The column moved to page.rb and was now written only by publish_draft!
and by the chapter seed, and read by nothing.

lib/tasks/pages.rake goes with it. backfill_external_url reads the dropped
column. backfill_address is spent and no longer safe to re-run.
</content>
</entry>
<entry>
<title>Add external url to pages</title>
<updated>2026-08-08T00:50:31Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-08-08T00:50:31Z</published>
<link rel='alternate' type='text/html' href='http://erdgeist.org/gitweb/cccms/commit/?id=5203b80f47786b8adc169e80d89cd69159c44b62'/>
<id>urn:sha1:5203b80f47786b8adc169e80d89cd69159c44b62</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Drop the staged address columns from nodes</title>
<updated>2026-08-07T18:46:45Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-08-07T18:46:45Z</published>
<link rel='alternate' type='text/html' href='http://erdgeist.org/gitweb/cccms/commit/?id=65a182112c52e9ba512bf172e1f2cdaadae9a7a5'/>
<id>urn:sha1:65a182112c52e9ba512bf172e1f2cdaadae9a7a5</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Move the pending address from the node onto the draft</title>
<updated>2026-08-07T04:15:14Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-08-07T04:15:14Z</published>
<link rel='alternate' type='text/html' href='http://erdgeist.org/gitweb/cccms/commit/?id=f4ddfff03ca9f25d50f39a1971877362d85eb9cb'/>
<id>urn:sha1:f4ddfff03ca9f25d50f39a1971877362d85eb9cb</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Log user logins and reconstruct last activity from logs</title>
<updated>2026-08-02T21:55:38Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-08-02T21:55:38Z</published>
<link rel='alternate' type='text/html' href='http://erdgeist.org/gitweb/cccms/commit/?id=c63c4620d1c659712cec93e354e84f5017bd6254'/>
<id>urn:sha1:c63c4620d1c659712cec93e354e84f5017bd6254</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Group user accounts by role</title>
<updated>2026-07-31T13:55:43Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-07-31T13:55:43Z</published>
<link rel='alternate' type='text/html' href='http://erdgeist.org/gitweb/cccms/commit/?id=464dd4266bdc433805010b5dca428f4cb75c2a81'/>
<id>urn:sha1:464dd4266bdc433805010b5dca428f4cb75c2a81</id>
<content type='text'>
Replaces the two-way admin/user split with four groups ordered by
capability: administration, Redaktion, editors, alumni. alumni takes
precedence over capability in role_group, so a retired admin appears at the
bottom rather than the top.

Forms now offer the three roles as checkboxes rather than a single admin
checkbox, with a trailing hidden blank so an empty set can be posted, and
user_params permits roles only for admins. Three create buttons prefill the
common combinations.
</content>
</entry>
<entry>
<title>Retire the unused per-node permission subsystem</title>
<updated>2026-07-31T12:35:16Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-07-31T12:35:16Z</published>
<link rel='alternate' type='text/html' href='http://erdgeist.org/gitweb/cccms/commit/?id=5f17f421b176d48ef556fb379f59bbb7d284b48e'/>
<id>urn:sha1:5f17f421b176d48ef556fb379f59bbb7d284b48e</id>
<content type='text'>
Every path through Permission raised or lied: validates_presence_of on a
boolean made granted = false unsaveable, since false.blank? is true;
get_permission_for read a nonexistent identifier attribute; has_permission?
called an undefined plural method and returned a truthy relation in every
case; and set_permission mutated granted without saving. Nothing outside the
model referenced it and the table was empty.
</content>
</entry>
</feed>
