Add per-page titles/meta/Open Graph, semantic landmarks, robots/sitemap/llms.txt, and accessibility fixes so humans and agents can discover and navigate the site reliably.
## Summary
Closes#20.
- Bump Django pin from `>=5.2,<6` to `>=6.0,<7` (resolved **6.0.7**) and refresh `uv.lock`
- Update `TimeInfoBase.save` for Django 6 keyword-only `Model.save`
- Pass `required_score` directly to `ReCaptchaV3` (removes django-recaptcha deprecation warning)
- Fix `Payments.date` fixed default → callable `timezone.now` (+ migration `0012`)
Reviewed against [Django 6.0 release notes](https://docs.djangoproject.com/en/6.0/releases/6.0/). `DEFAULT_AUTO_FIELD` already `BigAutoField`. No other removed APIs in use.
**Compat notes**
- `django-phonenumber-field` 8.4.0 advertises Django 6.0 support
- `django-recaptcha` 4.1.0 has no upper Django bound; classifiers still list through 5.2 only — smoke-tested via suite
## Test plan
- [x] `uv run python manage.py check` — clean
- [x] `uv run python manage.py test` — 30 passed
- [ ] CI unit tests green on this PR
- [ ] Smoke board pages, membership form, auth/sign-in, recaptcha after merge/deploy
Reviewed-on: #26
## Summary
- Root cause: `docker-compose.yml` used `${DATABASE_URL:-…}`, so the Act runner’s host/`prod` `DATABASE_URL` was interpolated into the web service. Containerized deploy tests then ran against shared Postgres instead of the bundled compose `db`.
- Stop reading host `DATABASE_URL` in compose (use `COMPOSE_DATABASE_URL` override only).
- Deploy docker step: unset DB secrets, dedicated compose project name, `up --wait db`, force test `DATABASE_URL` to `postgres://scha:scha@db:5432/scha`, `down -v` on exit (ephemeral DB).
- Clear `DATABASE_URL`/`DB_HOST` in `unittests.yml` / `ci.yml` so host sqlite-fallback tests cannot hit prod either.
## Test plan
- [ ] Merge to `master` and watch Unit Tests + Deploy docker job.
- [ ] Confirm docker step connects only to compose `db` (no traffic/errors against `10.0.0.230`).
- [ ] Confirm `docker compose -p scha-ci-<sha> …` volumes cleaned after job (`down -v`).
- [ ] Local: `docker compose up --build` still works with bundled Postgres.
Reviewed-on: #24
## Summary
Closes#1.
- Adds real Django unit tests in `schasite/tests.py` (public pages, membership form + form validation, model helpers, calendar helpers, Stripe endpoints with mocks, auth/login_required behavior).
- Includes the dockerize + Gitea Actions CI/CD base so PRs run tests and deploy only after Unit Tests succeed on a `master` push (company_site pattern).
## Test plan
- [x] `DJANGO_ENV=dev DJANGO_SECRET_KEY=test-secret-key uv run python manage.py test schasite` — 30 tests OK
- [ ] Open this PR and confirm Unit Tests / CI workflows run on the self-hosted runner
- [ ] After merge to `master`, confirm Unit Tests run on push and deploy only proceeds when they pass
Reviewed-on: #22
## Summary
- Remove unused `.top-head` / `.top-body` CSS rules that referenced missing GIF files (`top-head.gif`, `top-body.gif`), which caused `whitenoise.storage.MissingFileError` and crashed the prod container at collectstatic/startup.
- Drop a stray `{% load static %}` tag from `style.css` (not a Django template).
- Branch rebased onto current `master` (dockerize already merged via #21); this PR is the CSS-only fix.
## Test plan
- [ ] Merge and let deploy run (or redeploy scha prod).
- [ ] Confirm web container stays up (no WhiteNoise `MissingFileError`).
- [ ] Spot-check site CSS still looks fine on public pages.
- [ ] Separately: if Compose still warns about unset `$…` vars, escape `$` as `$$` in `~/Documents/secrets/scha/scha_prod.env` password/`DATABASE_URL`.
Reviewed-on: #23