11
📰

Publications — Forms

Website · donor wall · journals · electronic media

Forms — Publications

Module: publications (Module #11) · See blueprint: docs/blueprints/publications.md

All 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 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