This repository has been archived on 2023-09-24. You can view files and clone it, but cannot push or open issues or pull requests.
takahe/users/views/admin/settings.py
Andrew Godwin 9ad9bdd936 Implement post rate limits, move to signed cookies
Also improve the test harness a little
Fixes #112
2022-12-15 15:55:33 -07:00

199 lines
6.2 KiB
Python

from django.utils.decorators import method_decorator
from django.utils.safestring import mark_safe
from core.models import Config
from users.decorators import admin_required
from users.views.settings import SettingsPage
@method_decorator(admin_required, name="dispatch")
class AdminSettingsPage(SettingsPage):
"""
Shows a settings page dynamically created from our settings layout
at the bottom of the page. Don't add this to a URL directly - subclass!
"""
options_class = Config.SystemOptions
def load_config(self):
return Config.load_system()
def save_config(self, key, value):
Config.set_system(key, value)
class BasicSettings(AdminSettingsPage):
section = "basic"
options = {
"site_name": {
"title": "Site Name",
},
"highlight_color": {
"title": "Highlight Color",
"help_text": "Used for logo background and other highlights",
},
"post_length": {
"title": "Maximum Post Length",
"help_text": "The maximum number of characters allowed per post",
},
"post_minimum_interval": {
"title": "Minimum Posting Interval",
"help_text": "The minimum number of seconds a user must wait between posts",
},
"content_warning_text": {
"title": "Content Warning Feature Name",
"help_text": "What the feature that lets users provide post summaries is called",
},
"site_about": {
"title": "About This Site",
"help_text": "Displayed on the homepage and the about page.\nUse Markdown for formatting.",
"display": "textarea",
},
"site_icon": {
"title": "Site Icon",
"help_text": "Minimum size 64x64px. Should be square.",
},
"site_banner": {
"title": "Site Banner",
"help_text": "Must be at least 650px wide. 3:1 ratio of width:height recommended.",
},
"identity_max_per_user": {
"title": "Maximum Identities Per User",
"help_text": "Non-admins will be blocked from creating more than this",
},
"identity_min_length": {
"title": "Minimum Length For User Identities",
"help_text": "Non-admins will be blocked from creating identities shorter than this",
},
"signup_allowed": {
"title": "Signups Allowed",
"help_text": "If signups are allowed at all",
},
"signup_invite_only": {
"title": "Invite-Only",
"help_text": "If signups require an invite code",
},
"signup_text": {
"title": "Signup Page Text",
"help_text": "Shown above the signup form",
"display": "textarea",
},
"restricted_usernames": {
"title": "Restricted Usernames",
"help_text": "Usernames that only admins can register for identities. One per line.",
"display": "textarea",
},
"hashtag_unreviewed_are_public": {
"title": "Unreviewed Hashtags Are Public",
"help_text": "Public Hashtags may appear in Trending and have a Tags timeline",
},
"emoji_unreviewed_are_public": {
"title": "Unreviewed Emoji Are Public",
"help_text": "Public Emoji may appear as images, instead of shortcodes",
},
}
layout = {
"Branding": [
"site_name",
"site_about",
"site_icon",
"site_banner",
"highlight_color",
],
"Signups": ["signup_allowed", "signup_invite_only", "signup_text"],
"Posts": [
"post_length",
"post_minimum_interval",
"content_warning_text",
"hashtag_unreviewed_are_public",
"emoji_unreviewed_are_public",
],
"Identities": [
"identity_max_per_user",
"identity_min_length",
"restricted_usernames",
],
}
cache_field_defaults = {
"min_value": 0,
"max_value": 900,
"step_size": 15,
}
class TuningSettings(AdminSettingsPage):
section = "tuning"
options = {
"cache_timeout_page_default": {
**cache_field_defaults,
"title": "Default Timeout",
"help_text": "The number of seconds to cache a rendered page",
},
"cache_timeout_page_timeline": {
**cache_field_defaults,
"title": "Timeline Timeout",
"help_text": "The number of seconds to cache a rendered timeline page",
},
"cache_timeout_page_post": {
**cache_field_defaults,
"title": "Individual Post Timeout",
"help_text": mark_safe(
"The number of seconds to cache a rendered individual Post page<br>Note: This includes the JSON responses to other servers"
),
},
"cache_timeout_identity_feed": {
**cache_field_defaults,
"title": "Identity Feed Timeout",
"help_text": "The number of seconds to cache a rendered Identity RSS feed",
},
}
layout = {
"Rendered Page Cache": [
"cache_timeout_page_default",
"cache_timeout_page_timeline",
"cache_timeout_page_post",
],
"RSS Feeds": [
"cache_timeout_identity_feed",
],
}
class PoliciesSettings(AdminSettingsPage):
section = "policies"
options = {
"policy_terms": {
"title": "Terms of Service Page",
"help_text": "Will only be shown if it has content. Use Markdown for formatting.",
"display": "textarea",
},
"policy_privacy": {
"title": "Privacy Policy Page",
"help_text": "Will only be shown if it has content. Use Markdown for formatting.",
"display": "textarea",
},
"policy_rules": {
"title": "Server Rules Page",
"help_text": "Will only be shown if it has content. Use Markdown for formatting.",
"display": "textarea",
},
}
layout = {
"Policies": [
"policy_rules",
"policy_terms",
"policy_privacy",
],
}