Publications — Forms
Forms — Publications
Module:
publications(Module #11) · See blueprint:docs/blueprints/publications.mdAll forms below are internal (admin / editor login required) unless noted. Donor Wall is already live; this module unifies website pages, journal issues, books, electronic media, donor wall, and press releases under one Publication model with versioned content. The form tone follows
aayojana_framework.html.
Section A — Website Pages (CMS)
Form 3.1 — Create / Edit Website Page
Purpose: Author a static or semi-static website page — About, Programs, Daily Schedule, Trustees — under the institution's primary domain. Versioned content; publish / unpublish flow. Who fills: Editor or module-admin (Publications) · ad-hoc; one form per page.
| Field | Type | Required | Options / Validation | Default | Help |
|---|---|---|---|---|---|
| Page Title (English) | text | yes | 5-255 chars | — | Shown in browser tab + nav |
| Page Title (Sanskrit / Devanagari) | text | no | TEXT, VijayaDV PUA preserved | — | Optional — for bilingual sites |
| Slug | text | yes | lowercase + hyphen; unique per (tenant, type=website_page) | (auto from title) | URL: /publications/{slug} |
| Parent Page | FK select | no | publications where type=website_page | — | Builds nested-page hierarchy |
| Body (rich text) | rich-text editor | yes | TipTap; HTML output | — | Markdown source-of-truth + visual editor |
| Cover Image | file | no | jpg/png; max 5 MB | — | Optional hero image |
| Visibility | select | yes | public / tenant_only / subscribers_only / private | public | "private" = drafts |
| Status | select | yes | draft / in_review / published / archived / unpublished | draft | Workflow gate |
| Published At | datetime | no | not future > 30 days | (now on publish) | Future-date for scheduled publish |
| SEO Description (meta) | textarea | no | 50-300 chars; display in search | — | Used as <meta name=description> |
| SEO Keywords | text | no | comma-separated; up to 200 chars | — | Optional, low-impact |
| Canonical URL | url | no | https:// | — | If page is mirrored externally |
Submit action: Creates publications(type='website_page') + new
publication_versions row (version = max+1). On Status flip to published,
sets published_at, marks the latest version is_active=true, and writes audit
event for legal-weight pages (e.g. trust-deed disclosures). Sanskrit text is stored
in TEXT column with PUA preserved.
Related forms: Form 3.7 (attach media), Form 4.x in Comms (announce new page
to subscribers).
Section B — Donor Wall
Form 3.2 — Donor Wall Entry
Purpose: Add or edit a public donor recognition entry — name (or anonymous), amount-band or specific category, photo (if approved), recognition tier. Already live in DISA; this form is the unified Aayojana version. Who fills: Module-admin or finance officer · per donor / per donation event.
| Field | Type | Required | Options / Validation | Default | Help |
|---|---|---|---|---|---|
| Linked Donor (Member) | FK select (members) | yes | members.id | — | Donor's master record |
| Display Mode | select | yes | named / anonymous / family-name | named | Honours member.hide_name |
| Public Display Name | text | conditional | required if mode=named or family-name; up to 160 chars | (member.full_name) | Override for "Smt. & Sri X family" |
| Display Sanskrit Name | text | no | VijayaDV PUA preserved | — | Optional |
| Recognition Tier | select | yes | platinum / gold / silver / bronze / community | community | Tenant-configurable bands |
| Display Amount? | select | yes | exact / band / hidden | band | Honours member.hide_amount |
| Specific Amount (₹) | number | conditional | required if Display Amount = exact; ≥ 0 | — | — |
| Amount Band | text | conditional | required if Display Amount = band | — | "₹1L – ₹5L" auto-derived from tier |
| Category | select | no | annadana / building / endowment / general / specific-seva | general | Fund / purpose tag |
| Photo (optional) | file | no | jpg/png; max 2 MB; aspect 1:1 preferred | — | Only if donor consented (photo_consent=true) |
| Display From Date | date | no | — | today | Schedule publishing |
| Display Until Date | date | no | ≥ from_date | — | NULL = perennial; for FY-bound donor walls |
| Notes (internal) | textarea | no | up to 1000 chars | — | Not shown publicly |
Submit action: Creates / updates the donor row inside the active
Publication(type='donor_wall') for the current FY. Honours member-level privacy
flags (hide_name, hide_amount, photo_consent) — if conflict, the form
warns and falls back to safer setting. Public /donor-wall URL re-renders.
Related forms: Form 3.3 (compose Annual Donor Wall publication), Form 5.x in
Reports (publications_donor_wall_analytics).
Form 3.3 — Donor Wall Publication Compose
Purpose: Compose an FY-specific donor wall edition (snapshot) — pick FY, ordering, display until, freeze the list of entries. Who fills: Module-admin · once per FY (around Apr 1).
| Field | Type | Required | Options / Validation | Default | Help |
|---|---|---|---|---|---|
| Title | text | yes | 5-255 chars | — | "Donor Wall — FY 2025-26" |
| Slug | text | yes | unique per (tenant, type=donor_wall) | (auto) | — |
| FY | text | yes | 7 chars YYYY-YY |
(current FY) | "2025-26" |
| Display Until | date | yes | ≥ today | (today + 1y) | When this edition rotates out |
| Order Mode | select | yes | by-tier-then-amount / alphabetical / date-of-donation | by-tier-then-amount | — |
| Include Anonymous Block | checkbox | no | — | true | Show count of anonymous donors |
| Cover Headline (Sanskrit) | text | no | VijayaDV PUA preserved | — | "धर्मं चर" / similar invocation |
| Cover Image | file | no | jpg/png; max 5 MB | — | Banner image |
| Snapshot Source | select | yes | live / freeze-now | live | "freeze-now" copies entries to body_json snapshot |
| Visibility | select | yes | public / private | public | — |
Submit action: Creates a Publication(type='donor_wall') row. If
Snapshot Source = freeze-now, copies the current list of donor entries into
body_json so a future Form 3.2 edit doesn't disturb this published edition.
Related forms: Form 3.2 (manage individual entries).
Section C — Journal / Periodical
Form 3.4 — Periodical Journal Issue Compose
Purpose: Compose one issue of a scholarly / institutional journal — title, volume + issue number, contributor list, body sections, scheduled publish date. Who fills: Editor · per issue (typically monthly / quarterly).
| Field | Type | Required | Options / Validation | Default | Help |
|---|---|---|---|---|---|
| Journal Series | FK select | yes | publications where parent_id is series root | — | "Datta Vani — Quarterly" |
| Volume | number | yes | ≥ 1 | (last+1 if same FY else 1) | — |
| Issue Number | number | yes | ≥ 1 | (last+1) | Sequential within volume |
| Issue Title | text | yes | 5-255 chars | — | "Vol IV Issue 3 — Adhyatma Vidya" |
| Theme | text | no | up to 200 chars | — | Editorial theme |
| Cover Image | file | no | jpg/png; max 5 MB | — | — |
| Body Sections (JSON) | structured | yes | array of {heading, body_html, contributor_ids[]} |
[] |
Built via UI; each = article |
| Contributors | multi-FK (members) | no | members.id list | — | Auto-aggregated from sections |
| External Contributors | text (CSV) | no | "Name (Affiliation)" entries | — | For non-member authors |
| Scheduled Publish At | datetime | no | not past | — | NULL = manual publish |
| Visibility | select | yes | public / subscribers_only | subscribers_only | Print issues stay subscriber-only by default |
| Distribution Channels | multi-select | yes | print / electronic | electronic | Drives Comms dispatch list |
| Status | select | yes | draft / in_review / published / archived | draft | — |
| ISSN | text | no | 8 chars XXXX-XXXX |
(series.issn) | Inherited from series if set |
Submit action: Creates publications(type='journal_issue') + new
publication_versions row holding the body. On publish, optionally triggers
comms.send_to_segment to subscribers segment for electronic channel; print
queue is generated as a Reports journal_print_dispatch PDF for the press.
Related forms: Form 3.6 (subscriber management), Form 4.5 in Comms (campaign
monitor for electronic dispatch).
Section D — Books / Volumes Catalog
Form 3.5 — Book / Volume Catalog Entry
Purpose: Catalogue a published book / volume — title, authors, ISBN, publisher, year, distribution status, chapter tree. Who fills: Editor / publications-admin · once per book; updated for reprints.
| Field | Type | Required | Options / Validation | Default | Help |
|---|---|---|---|---|---|
| Title (English) | text | yes | 5-255 chars | — | — |
| Title (Sanskrit / Devanagari) | text | no | VijayaDV PUA preserved | — | — |
| Slug | text | yes | unique per (tenant, type=book) | (auto) | — |
| Authors | multi-FK (members) | no | members.id | — | Internal authors |
| External Author Names | text (CSV) | no | "Name (Affiliation)" | — | For non-member authors |
| ISBN | text | no | 10 or 13 digits with hyphens | — | Manual; India ISBN agency not API'd |
| Edition | text | no | "1st", "2nd revised", etc. | 1st | — |
| Publisher Name | text | no | up to 200 chars | (tenant.name) | Default = self-published |
| Publication Year | number | yes | 1900 – current+1 | (current year) | — |
| Pages | number | no | ≥ 1 | — | Print pages |
| Cover Image | file | no | jpg/png; max 5 MB; portrait preferred | — | — |
| Summary / Blurb | textarea | no | up to 2000 chars | — | Back-cover blurb |
| Chapter Tree (JSON) | structured | no | array of {title, page_start, body_html?} |
[] |
Optional sub-publications |
| Price (₹) | number | no | ≥ 0 | — | If sold; else 0 |
| Distribution Status | select | yes | in_print / out_of_print / digital_only / forthcoming | in_print | — |
| Physical Stock (book inventory) | FK select | no | asset_inventory.id | — | Cross-link to Asset Management physical-copy register |
| Visibility | select | yes | public / tenant_only / subscribers_only | public | — |
| Status | select | yes | draft / in_review / published / archived | draft | — |
Submit action: Creates publications(type='book') + version. ISBN, edition,
pages, publisher, year stored in metadata. If Physical Stock is linked,
metadata.asset_inventory_id is set so Asset Mgmt knows about printed-copy stock.
On published, writes Audit event (legal_weight=True — books are
legally cited works).
Related forms: Form 3.7 (attach a PDF preview / full e-book), Form 3.6
(book subscriber list).
Section E — Electronic Media
Form 3.6 — Electronic Media Asset
Purpose: Upload an audio / video / image asset (lecture recording, ritual documentary, photo gallery item) with title, transcript, speaker, duration. Who fills: Editor / archivist · per asset; transcript may be backfilled later.
| Field | Type | Required | Options / Validation | Default | Help |
|---|---|---|---|---|---|
| Title (English) | text | yes | 5-255 chars | — | "Rudra Pārāyaṇa — Mysuru 2026 Mahā Śivarātri" |
| Title (Sanskrit / Devanagari) | text | no | VijayaDV PUA preserved | — | Honour devanagari titles |
| Kind | select | yes | audio / video / image / pdf / document | video | — |
| File Upload | file | yes (one of) | mp3/mp4/jpg/png/pdf; max 500 MB; signed-URL upload | — | Stored to GCS bucket |
| External File URL | url | yes (one of) | https:// | — | If hosted on YouTube / external CDN |
| Mime Type | text | no | (auto-detected) | — | Override only if needed |
| Duration (seconds) | number | conditional | required if kind ∈ {audio, video} | — | Auto-computed where possible |
| Speaker (Member) | FK select (members) | no | members.id | — | Internal speaker |
| Speaker (External Name) | text | no | up to 255 chars | — | If guest |
| Captured At (date+time) | datetime | no | not future | — | When recording was made |
| Transcript | textarea | no | up to 200,000 chars; VijayaDV PUA preserved | — | Sanskrit / English / bilingual |
| Description | textarea | no | up to 2000 chars | — | Context + abstract |
| Rights | select | yes | cc-by / cc-by-nc / all-rights-reserved / public-domain | all-rights-reserved | Affects public re-use messaging |
| Tags | multi-text | no | lowercase + hyphen | — | "rudra", "shivaratri", "mysuru-2026" |
Submit action: Creates media_assets row. If linked to a parent publication
(via Form 3.7), creates a publication_media_links row. For video / audio,
optionally enqueues a transcript-generation job (out of scope v1).
Related forms: Form 3.7 (attach to a publication), Form 3.4 (add as journal
inline media).
Form 3.7 — Attach Media to Publication
Purpose: Many-to-many link between an existing media asset and a publication — mark its role (cover / inline / attachment / transcript). Who fills: Editor · ad-hoc.
| Field | Type | Required | Options / Validation | Default | Help |
|---|---|---|---|---|---|
| Publication | FK select | yes | publications.id | — | Target publication |
| Media Asset | FK select | yes | media_assets.id | — | Source media |
| Role | select | yes | cover / inline / attachment / transcript | inline | What is its purpose in the publication |
| Display Order | number | no | ≥ 0 | (max+1) | For multi-attachment galleries |
| Caption | text | no | up to 500 chars | — | Sanskrit / English caption |
Submit action: Creates publication_media_links row (unique on publication_id+media_id).
Related forms: Form 3.6 (upload new media first if needed).
Section F — Subscriptions
Form 3.8 — Subscription Management
Purpose: Add or remove a subscriber to a specific publication (Journal series, Books-new-release alerts, Donor Wall update mailings) with channel preference (print / electronic). Who fills: Module-admin · ad-hoc; bulk import handled via Newsletter Form 6.8.
| Field | Type | Required | Options / Validation | Default | Help |
|---|---|---|---|---|---|
| Publication | FK select | yes | publications where type ∈ {journal_issue parent, book series, donor_wall} | — | Subscribe to a series or single |
| Subscriber Kind | select | yes | member / external | member | — |
| Subscriber (Member) | FK select | conditional | required if kind=member | — | Pre-fills name + addresses |
| External Email | conditional | required if kind=external and channel=electronic | — | — | |
| External Name | text | conditional | required if kind=external | — | Display name |
| Postal Address | FK select | conditional | required if channel=print | (member's primary) | From addresses |
| Channel | select | yes | print / electronic | electronic | — |
| Paid Until Date | date | no | ≥ today | — | NULL = free / lifetime |
| Status | select | yes | active / paused / cancelled | active | — |
Submit action: Inserts publication_subscriptions row. Triggers a one-shot
"thank you for subscribing" Comms message via the publication's owner-template.
Related forms: Form 6.4 in Newsletter (preference centre — public-facing
counterpart for unsubscribe), Form 4.x in Comms (audit log of dispatches).
Workflow notes
- Donor Wall is the legacy migration target — DISA's existing donor-wall logic
becomes the first
Publication(type='donor_wall'); the public URL/donor-wallcontinues to work and reads from this table. - Versioning: every Save creates a new
publication_versionsrow; only one version isis_active=true. Publishing flips activation. - Editorial workflow:
draft → in_review → published → archived/unpublished. In Phase A, this is a free-text status; in Phase B+ it gates via two-key for legal_weight types (Books, Press Releases). - Sanskrit content: ALL TEXT columns preserve VijayaDV PUA characters — never
Unicode-normalised, never
.strip()ed in ways that touch ZWJ/ZWNJ. - Cross-module: Journal issue dispatch goes through
comms.send_to_segment; subscribers form a CommsAudienceSegmentper publication. - Reports cross-cuts:
publications_donor_wall_analytics,publications_journal_subscribers,publications_media_engagementare all registered with the Reports module bypublications.register_definitions(). - Press releases are a separate
type='press_release'so the Outreach module's Form 1.5 (Media Coverage Log) can FK back to specific releases via metadata.