Skip to main content

parody-web

A reusable Django app that serves a parody build artifact as a public book site, with section-level auth gating. It's the web surface of the parody ecosystem:

  • parody — core: builds the artifact (and the print/LaTeX side, for now)
  • parody-web — this: renders an artifact as a website
  • (future) parody-print — if/when the LaTeX side is split out of core

You pip install parody-web into a thin per-book Django project; the package is generic, so one codebase serves every book site. Each book differs only by config + content. First site: the partial Real-Time Computing book at rtcbook.org.

Access model

The site imports the full artifact and gates by section: the public sees only online_only sections (the openly-licensed subset); the private parts require login, and only the owner has an account. One deployment serves both the public partial book and — to the owner — the whole thing. (If you'd rather the full text never touch the database, import the partial parody build --online-only artifact instead — then there are no private sections.)

Why a Django app (not a static site)

Parody artifact html is Django-template-flavored — it embeds {% media %}, {% static %}, {% cite %} etc. This app renders it natively through the Django template engine (parody_web.templatetags.parody_web.render_book), so there's no second, lossy tag-resolution renderer to maintain.

Use it in a project

# settings.py
INSTALLED_APPS = [..., "parody_web"]
BOOK_SLUG = "real-time-computing"     # which imported book is the site root
# urls.py
urlpatterns = [path("", include("parody_web.urls")), ...]
pip install parody-web
python manage.py migrate
python manage.py createsuperuser                       # the owner (only account)
python manage.py import_artifact rtc.json --slug real-time-computing

Provides: Book/Chapter/Section models, the import_artifact command (upsert-by-slug, idempotent), index + section views, templates (override them in your project), and the rendering template tags. Reads settings.BOOK_SLUG, MEDIA_URL, LOGIN_URL.

A ready-to-copy thin project — settings, urls, Procfile, and AWS/SSM deploy glue — lives in example_site/; generate a new book site from it.

Data-entry tables

A lab manual authors an observation table as ::: {.editable-table}. On the site a signed-in reader types their readings into it, Save keeps them, and they are still there next visit. A reader who is not signed in sees the table with its inputs disabled and a line saying why.

Download JSON gives back that one table; All my tables (/tables.json) gives every table in the book the reader has put something in — a term's measurements in one file instead of a scavenger hunt through a dozen labs.

The file is the table as it appears on the page: a columns header row, and rows as one flat record per row keyed by those headers, including the column the row labels live in. Empty cells are "" rather than missing, so a half-filled table still loads as a table:

import json, pandas as pd
d = json.load(open("mechatronics-lab-manual-lab-test-observations.json"))
df = pd.DataFrame(d["rows"], columns=d["columns"])

Each file also carries which book, which section (title, number and URL) and when it was exported, and names its shape in format (parody-table/1, parody-tables/1) so a later change to that shape is a new number rather than a silent break.

Values are stored per cell, keyed to the reader and to Section.key rather than to a row that re-import would delete — a term's measurements outlive the book being rebuilt. Nothing is needed from the host but migrate.

Serving a book from your own project

A host project (a course site, say) can serve a parody book while keeping its own readers, gating, and per-user features. See Host integration for the four seams: imported per-exercise solutions/problems, the pluggable access policy (PARODY_WEB_ACCESS_POLICY), the per-user overlay include points, and the Section.key join key.

Develop

pip install -e .
python runtests.py            # standalone test suite (tests/settings.py)

Deploy

AWS via SSM + GitHub Actions, designed for reuse across book projects: each book site is a small repo (copied from example_site/) that pins this package and calls the shared reusable workflow (deploy-reusable.yml) — improve the renderer or the deploy once, every site picks it up. Runbook: example_site/deploy/AWS.md.

Status

0.x — interfaces may change. Renders the rtc artifact end to end with section-level auth gating; 9 tests. {% cite %} currently renders [key] (wire citeproc/a .bib for full citations). Not yet published to PyPI or deployed to rtcbook.org (owner steps).

Metadata

Release files for parody-web 0.99.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for parody-web 0.99.0
File Size Uploaded Provenance
parody_web-0.99.0.tar.gz 1.3 MB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for parody-web 0.99.0
File Interpreter ABI Platform
parody_web-0.99.0-py3-none-any.whl Python 3 none any Details

Total release size: 2.6 MB

Release files / parody_web-0.99.0.tar.gz

Download URL parody_web-0.99.0.tar.gz
Size 1.3 MB
Tags Source
SHA-256 checksum
How to use checksums
076dc9566262c5ac9000cc216b0cb0218582a92fb8fcaf9fffb7ac8687487b2a
BLAKE2b-256 checksum
How to use checksums
f7c95dfcef3e90fc30e2fa29a2b58fb04a4cecf3089f25f4a3f15851bacc6604
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.13

Release files / parody_web-0.99.0-py3-none-any.whl

Download URL parody_web-0.99.0-py3-none-any.whl
Size 1.3 MB
Tags Python 3
SHA-256 checksum
How to use checksums
b4e4e1ef6858776287d189f7f3eff806d93df3aa849b85b1e5a5b3ab960a45dc
BLAKE2b-256 checksum
How to use checksums
a8318fddfafc4418bf38a36ed66fa5a1e233f9c99fa5b6f13dc655be0d3fe941
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.13

Security for parody-web 0.99.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Release history Release notifications | RSS feed

This release

0.99.0 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page