- Rate limits in the shared cache for comments, issues, uploads and invites; a limited HTMX reply keeps the draft. - Content-Security-Policy (self only, no inline script or style, bucket origin for images and frames) and Permissions-Policy on every page. htmx configured not to inject styles or eval. - Moderation: deactivating a user ends their sessions and keeps their content; deleted accounts show as "ghost"; reserved usernames; the admin won't delete an org's last owner. - Admin requires a TOTP code (django-otp), with add_admin_totp to enrol. - Email provider chosen by environment through django-anymail. - Playwright browser tests: axe WCAG 2.1 AA on every page in light and dark, no CSP violations, keyboard walkthrough, theme toggle. Explicit Canvas/CanvasText on :root fixes dark-mode contrast detection. - bin/start creates the data dir if missing; docs/operations.md runbook. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
41 lines
951 B
TOML
41 lines
951 B
TOML
[project]
|
|
name = "intent"
|
|
version = "0.1.0"
|
|
description = "Track the why behind features, across implementations."
|
|
requires-python = ">=3.13"
|
|
dependencies = [
|
|
"django>=5.2,<5.3",
|
|
"django-allauth[socialaccount]>=65.21",
|
|
"django-anymail==15.2",
|
|
"django-otp==1.7.5",
|
|
"django-storages[s3]>=1.14.6",
|
|
"gunicorn>=26.2.0",
|
|
"markdown-it-py>=4.2.0",
|
|
"nh3>=0.3.7",
|
|
"python-ulid>=4.0.1",
|
|
"sentry-sdk[django]>=2.73.0",
|
|
"whitenoise>=6.12.0",
|
|
]
|
|
|
|
[dependency-groups]
|
|
dev = [
|
|
"playwright==1.64.1",
|
|
"pytest>=9.1.1",
|
|
"pytest-django>=4.14.0",
|
|
"ruff>=0.17.3",
|
|
]
|
|
|
|
[tool.ruff]
|
|
line-length = 100
|
|
target-version = "py313"
|
|
extend-exclude = ["*/migrations/*"]
|
|
|
|
[tool.ruff.lint]
|
|
select = ["E", "F", "I", "UP", "B", "DJ"]
|
|
|
|
[tool.pytest.ini_options]
|
|
DJANGO_SETTINGS_MODULE = "config.settings.test"
|
|
testpaths = ["tests"]
|
|
markers = [
|
|
"browser: real-browser tests (Playwright + Chromium); skip with -m 'not browser'",
|
|
]
|