2026-10-05 09:36:20 +02:00
|
|
|
# retoor <retoor@molodetz.nl>
|
2026-10-05 11:12:18 +02:00
|
|
|
import re
|
|
|
|
|
from pathlib import Path
|
|
|
|
|
|
|
|
|
|
INTRO_SEED_FILE = Path(__file__).resolve().parent / "seed" / "intro.md"
|
|
|
|
|
SITE_INTRO_SEED = re.sub(r"\A<!--.*?-->\n", "", INTRO_SEED_FILE.read_text(encoding="utf-8"), count=1, flags=re.S)
|
|
|
|
|
|
2026-10-05 09:36:20 +02:00
|
|
|
ROLE_ADMIN = "Admin"
|
|
|
|
|
ROLE_MEMBER = "Member"
|
|
|
|
|
ROLES = (ROLE_ADMIN, ROLE_MEMBER)
|
|
|
|
|
|
|
|
|
|
TOPICS = {
|
2026-10-05 11:25:41 +02:00
|
|
|
"roll": "Roll",
|
|
|
|
|
"standard": "Standard",
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
LEGACY_TOPICS = {
|
|
|
|
|
"rol": "roll",
|
|
|
|
|
"standaard": "standard",
|
2026-10-05 09:36:20 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
POST_STATUSES = ("draft", "published")
|
|
|
|
|
|
|
|
|
|
MEDIA_KINDS = {
|
|
|
|
|
"flyer": "Flyers",
|
|
|
|
|
"meme": "Memes",
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JOIN_STATUSES = ("open", "contacted", "accepted", "declined")
|
|
|
|
|
|
|
|
|
|
SOFT_DELETE_TABLES = (
|
|
|
|
|
"users",
|
|
|
|
|
"sessions",
|
|
|
|
|
"posts",
|
|
|
|
|
"join_requests",
|
|
|
|
|
"notifications",
|
|
|
|
|
"media_items",
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
UNREPORTABLE_TABLES = {
|
|
|
|
|
"users": "Only the operator holds accounts; no public user content.",
|
|
|
|
|
"sessions": "Private credential rows.",
|
|
|
|
|
"posts": "Authored by administrators only; moderation module not selected.",
|
|
|
|
|
"join_requests": "Owner-private ledger visible to administrators only.",
|
|
|
|
|
"notifications": "Owner-private inbox rows.",
|
|
|
|
|
"media_items": "Operator-curated gallery assets.",
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
REPORTABLE_TARGETS: frozenset[str] = frozenset()
|
|
|
|
|
|
|
|
|
|
NOTIFICATION_TYPES = {
|
2026-10-05 11:25:41 +02:00
|
|
|
"join.request": "New request via Join",
|
|
|
|
|
"post.published": "Post published",
|
|
|
|
|
"backup.finished": "Backup finished",
|
|
|
|
|
"backup.failed": "Backup failed",
|
|
|
|
|
"auth.apikey": "API key renewed",
|
|
|
|
|
"system.maintenance": "Maintenance mode changed",
|
2026-10-05 09:36:20 +02:00
|
|
|
}
|
|
|
|
|
|
2026-10-06 02:56:08 +02:00
|
|
|
CRAWLER_PRIVATE_PREFIXES = ("/notifications", "/admin", "/profile", "/invite")
|
2026-10-05 09:36:20 +02:00
|
|
|
|
|
|
|
|
CRAWLER_MARKERS = (
|
|
|
|
|
"bot",
|
|
|
|
|
"crawler",
|
|
|
|
|
"spider",
|
|
|
|
|
"slurp",
|
|
|
|
|
"crawl",
|
|
|
|
|
"facebookexternalhit",
|
|
|
|
|
"bingpreview",
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
TERMS_EXEMPT_PREFIXES = (
|
|
|
|
|
"/static",
|
|
|
|
|
"/avatar",
|
|
|
|
|
"/auth",
|
|
|
|
|
"/docs",
|
2026-10-05 11:25:41 +02:00
|
|
|
"/terms",
|
2026-10-05 09:36:20 +02:00
|
|
|
"/privacy",
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
MAINTENANCE_ALLOWED_PREFIXES = ("/static", "/avatar", "/auth", "/admin")
|
|
|
|
|
|
|
|
|
|
RATE_LIMIT_EXEMPT_PREFIXES: tuple[str, ...] = ()
|
|
|
|
|
|
|
|
|
|
GZIP_SKIP_PREFIXES: tuple[str, ...] = ()
|
|
|
|
|
|
|
|
|
|
SETTINGS_DEFAULTS = {
|
|
|
|
|
"site_title": "Molodetz",
|
2026-10-05 11:25:41 +02:00
|
|
|
"site_tagline": "The circle, not the commercial.",
|
2026-10-05 11:12:18 +02:00
|
|
|
"site_intro": SITE_INTRO_SEED,
|
2026-10-05 09:36:20 +02:00
|
|
|
"maintenance_mode": "0",
|
2026-10-05 11:25:41 +02:00
|
|
|
"maintenance_message": "Molodetz is closed for maintenance. Back shortly.",
|
2026-10-05 09:36:20 +02:00
|
|
|
"rate_limit_per_minute": "60",
|
|
|
|
|
"rate_limit_window_seconds": "60",
|
|
|
|
|
"session_max_age_days": "7",
|
|
|
|
|
"session_remember_days": "30",
|
2026-10-06 02:56:08 +02:00
|
|
|
"invite_expiry_days": "7",
|
2026-10-05 09:36:20 +02:00
|
|
|
"terms_version": "1",
|
|
|
|
|
"friendly_404": "1",
|
|
|
|
|
"audit_retention_days": "365",
|
|
|
|
|
"outbound_proxy_url": "",
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CLIENT_RENDER_TEMPLATES = frozenset({"admin/post_form.html"})
|
|
|
|
|
|
|
|
|
|
HTTP_CLIENT_ALLOWLIST = frozenset({"molodetz/stealth.py"})
|