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.102.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.102.0
File Size Uploaded
parody_web-0.102.0.tar.gz 1.3 MB Details

Built distribution (wheel)

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

Total release size: 2.7 MB

Release files / parody_web-0.102.0.tar.gz

Download URL parody_web-0.102.0.tar.gz
Size 1.3 MB
Tags Source
SHA-256 checksum
How to use checksums
4489da61eb7e83df0df526d55596519011159cdc615f69810b720936511319ad
BLAKE2b-256 checksum
How to use checksums
78a8918fc07d7229abe3ae5216522c5a51e94d03f009ba0f011a3333444f7203
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.102.0-py3-none-any.whl

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

Release history Release notifications | RSS feed

This release

0.102.0 This release

2 release files

0.98.0

2 release files

0.96.0

2 release files

0.95.0

2 release files

0.94.0

2 release files

0.93.0

2 release files

0.92.0

2 release files

0.91.0

2 release files

0.90.0

2 release files

0.89.0

2 release files

0.88.0

2 release files

0.87.0

2 release files

0.86.0

2 release files

0.85.0

2 release files

0.84.0

2 release files

0.82.0

2 release files

0.79.0

2 release files

0.78.0

2 release files

0.77.0

2 release files

0.76.0

2 release files

0.75.0

2 release files

0.74.0

2 release files

0.73.0

2 release files

0.72.1

2 release files

0.72.0

2 release files

0.71.0

2 release files

0.70.0

2 release files

0.69.0

2 release files

0.68.0

2 release files

0.67.0

2 release files

0.66.1

2 release files

0.66.0

2 release files

0.65.0

2 release files

0.64.1

2 release files

0.64.0

2 release files

0.63.0

2 release files

0.62.0

2 release files

0.61.0

2 release files

0.60.0

2 release files

0.59.1

2 release files

0.59.0

2 release files

0.58.1

2 release files

0.58.0

2 release files

0.57.1

2 release files

0.57.0

2 release files

0.56.0

2 release files

0.55.1

2 release files

0.55.0

2 release files

0.54.1

2 release files

0.54.0

2 release files

0.53.0

2 release files

0.52.0

2 release files

0.49.0

2 release files

0.48.1

2 release files

0.48.0

2 release files

0.47.0

2 release files

0.46.0

2 release files

0.45.4

2 release files

0.45.3

2 release files

0.45.2

2 release files

0.45.1

2 release files

0.45.0

2 release files

0.44.1

2 release files

0.44.0

2 release files

0.42.0

2 release files

0.41.2

2 release files

0.41.1

2 release files

0.41.0

2 release files

0.40.0

2 release files

0.39.2

2 release files

0.39.1

2 release files

0.39.0

2 release files

0.38.0

2 release files

0.37.1

2 release files

0.37.0

2 release files

0.36.0

2 release files

0.35.0

2 release files

0.34.2

2 release files

0.34.1

2 release files

0.34.0

2 release files

0.29.1

2 release files

0.29.0

2 release files

0.28.2

2 release files

0.28.1

2 release files

0.28.0

2 release files

0.27.0

2 release files

0.26.0

2 release files

0.25.0

2 release files

0.24.0

2 release files

0.23.0

2 release files

0.22.0

2 release files

0.21.0

2 release files

0.20.0

2 release files

0.19.0

2 release files

0.18.0

2 release files

0.17.0

2 release files

0.16.0

2 release files

0.15.0

2 release files

0.14.0

2 release files

0.13.0

2 release files

0.12.0

2 release files

0.11.0

2 release files

0.10.2

2 release files

0.10.1

2 release files

0.10.0

2 release files

0.9.0

2 release files

0.8.0

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.1.14

2 release files

0.1.13

2 release files

0.1.12

2 release files

0.1.11

2 release files

0.1.10

2 release files

0.1.9

2 release files

0.1.8

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

1 release file

0.1.0

2 release files

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