{"id":15024436,"url":"https://github.com/ppfeufer/aa-bulletin-board","last_synced_at":"2026-03-03T00:13:13.204Z","repository":{"id":39603981,"uuid":"339135950","full_name":"ppfeufer/aa-bulletin-board","owner":"ppfeufer","description":"A simple bulletin board for Alliance Auth","archived":false,"fork":false,"pushed_at":"2025-08-23T09:55:09.000Z","size":2273,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-08-24T03:54:14.563Z","etag":null,"topics":["allianceauth","bulletin-board","django","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ppfeufer.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"ko_fi":"ppfeufer"}},"created_at":"2021-02-15T16:23:12.000Z","updated_at":"2025-08-23T09:55:11.000Z","dependencies_parsed_at":"2024-01-12T01:19:10.211Z","dependency_job_id":"52344c1c-b241-48d1-95ce-7c7e41dc8a93","html_url":"https://github.com/ppfeufer/aa-bulletin-board","commit_stats":{"total_commits":549,"total_committers":6,"mean_commits":91.5,"dds":"0.29508196721311475","last_synced_commit":"541eb71d271894afe19b475b4f1cd4d9f4c382ea"},"previous_names":[],"tags_count":56,"template":false,"template_full_name":null,"purl":"pkg:github/ppfeufer/aa-bulletin-board","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ppfeufer%2Faa-bulletin-board","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ppfeufer%2Faa-bulletin-board/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ppfeufer%2Faa-bulletin-board/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ppfeufer%2Faa-bulletin-board/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ppfeufer","download_url":"https://codeload.github.com/ppfeufer/aa-bulletin-board/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ppfeufer%2Faa-bulletin-board/sbom","scorecard":{"id":742722,"data":{"date":"2025-08-18","repo":{"name":"github.com/ppfeufer/aa-bulletin-board","commit":"1e4ab704748e0731feaae0d38c1078aab6acab57"},"scorecard":{"version":"v5.2.1-41-g40576783","commit":"40576783fda6698350fcbbeaea760ff827433034"},"score":4.3,"checks":[{"name":"Maintained","score":10,"reason":"30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/5 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#dangerous-workflow"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#cii-best-practices"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#binary-artifacts"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#packaging"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: GNU General Public License v3.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#license"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#security-policy"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/automated-checks.yml:1","Warn: no topLevel permission defined: .github/workflows/potential-duplicates.yml:1","Warn: no topLevel permission defined: .github/workflows/release.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#token-permissions"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#fuzzing"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/automated-checks.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/ppfeufer/aa-bulletin-board/automated-checks.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/automated-checks.yml:43: update your workflow using https://app.stepsecurity.io/secureworkflow/ppfeufer/aa-bulletin-board/automated-checks.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/automated-checks.yml:52: update your workflow using https://app.stepsecurity.io/secureworkflow/ppfeufer/aa-bulletin-board/automated-checks.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/automated-checks.yml:96: update your workflow using https://app.stepsecurity.io/secureworkflow/ppfeufer/aa-bulletin-board/automated-checks.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/automated-checks.yml:100: update your workflow using https://app.stepsecurity.io/secureworkflow/ppfeufer/aa-bulletin-board/automated-checks.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/automated-checks.yml:110: update your workflow using https://app.stepsecurity.io/secureworkflow/ppfeufer/aa-bulletin-board/automated-checks.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/automated-checks.yml:144: update your workflow using https://app.stepsecurity.io/secureworkflow/ppfeufer/aa-bulletin-board/automated-checks.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/automated-checks.yml:164: update your workflow using https://app.stepsecurity.io/secureworkflow/ppfeufer/aa-bulletin-board/automated-checks.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/automated-checks.yml:168: update your workflow using https://app.stepsecurity.io/secureworkflow/ppfeufer/aa-bulletin-board/automated-checks.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/automated-checks.yml:188: update your workflow using https://app.stepsecurity.io/secureworkflow/ppfeufer/aa-bulletin-board/automated-checks.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/potential-duplicates.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/ppfeufer/aa-bulletin-board/potential-duplicates.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/ppfeufer/aa-bulletin-board/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/ppfeufer/aa-bulletin-board/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:44: update your workflow using https://app.stepsecurity.io/secureworkflow/ppfeufer/aa-bulletin-board/release.yml/master?enable=pin","Warn: npmCommand not pinned by hash: .github/workflows/automated-checks.yml:50","Warn: pipCommand not pinned by hash: .github/workflows/automated-checks.yml:117","Warn: pipCommand not pinned by hash: .github/workflows/automated-checks.yml:118","Warn: pipCommand not pinned by hash: .github/workflows/automated-checks.yml:175","Warn: pipCommand not pinned by hash: .github/workflows/automated-checks.yml:176","Warn: pipCommand not pinned by hash: .github/workflows/automated-checks.yml:177","Warn: pipCommand not pinned by hash: .github/workflows/release.yml:28","Warn: pipCommand not pinned by hash: .github/workflows/release.yml:29","Warn: pipCommand not pinned by hash: .github/workflows/release.yml:30","Info:   0 out of   9 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   5 third-party GitHubAction dependencies pinned","Info:   0 out of   1 npmCommand dependencies pinned","Info:   0 out of   8 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#pinned-dependencies"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v2.4.2 not signed: https://api.github.com/repos/ppfeufer/aa-bulletin-board/releases/237452355","Warn: release artifact v2.4.1 not signed: https://api.github.com/repos/ppfeufer/aa-bulletin-board/releases/230722327","Warn: release artifact v2.4.0 not signed: https://api.github.com/repos/ppfeufer/aa-bulletin-board/releases/222639336","Warn: release artifact v2.3.5 not signed: https://api.github.com/repos/ppfeufer/aa-bulletin-board/releases/216570585","Warn: release artifact v2.3.4 not signed: https://api.github.com/repos/ppfeufer/aa-bulletin-board/releases/211212896","Warn: release artifact v2.4.2 does not have provenance: https://api.github.com/repos/ppfeufer/aa-bulletin-board/releases/237452355","Warn: release artifact v2.4.1 does not have provenance: https://api.github.com/repos/ppfeufer/aa-bulletin-board/releases/230722327","Warn: release artifact v2.4.0 does not have provenance: https://api.github.com/repos/ppfeufer/aa-bulletin-board/releases/222639336","Warn: release artifact v2.3.5 does not have provenance: https://api.github.com/repos/ppfeufer/aa-bulletin-board/releases/216570585","Warn: release artifact v2.3.4 does not have provenance: https://api.github.com/repos/ppfeufer/aa-bulletin-board/releases/211212896"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":9,"reason":"1 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-22T17:54:25.205Z","repository_id":39603981,"created_at":"2025-08-22T17:54:25.206Z","updated_at":"2025-08-22T17:54:25.206Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272858556,"owners_count":25005096,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-30T02:00:09.474Z","response_time":77,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["allianceauth","bulletin-board","django","python"],"created_at":"2024-09-24T20:00:21.417Z","updated_at":"2026-03-03T00:13:13.192Z","avatar_url":"https://github.com/ppfeufer.png","language":"Python","funding_links":["https://ko-fi.com/ppfeufer","https://ko-fi.com/N4N8CL1BY"],"categories":[],"sub_categories":[],"readme":"# AA Bulletin Board\u003ca name=\"aa-bulletin-board\"\u003e\u003c/a\u003e\n\n[![Version](https://img.shields.io/pypi/v/aa-bulletin-board?label=release)](https://pypi.org/project/aa-bulletin-board/)\n[![License](https://img.shields.io/github/license/ppfeufer/aa-bulletin-board)](https://github.com/ppfeufer/aa-bulletin-board/blob/master/LICENSE)\n[![Python](https://img.shields.io/pypi/pyversions/aa-bulletin-board)](https://pypi.org/project/aa-bulletin-board/)\n[![Django](https://img.shields.io/pypi/djversions/aa-bulletin-board?label=django)](https://pypi.org/project/aa-bulletin-board/)\n![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit\u0026logoColor=white)\n[![pre-commit.ci status](https://results.pre-commit.ci/badge/github/ppfeufer/aa-bulletin-board/master.svg)](https://results.pre-commit.ci/latest/github/ppfeufer/aa-bulletin-board/master)\n[![Code Style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](http://black.readthedocs.io/en/latest/)\n[![Discord](https://img.shields.io/discord/399006117012832262?label=discord)](https://discord.gg/fjnHAmk)\n[![Automated Checks](https://github.com/ppfeufer/aa-bulletin-board/actions/workflows/automated-checks.yml/badge.svg)](https://github.com/ppfeufer/aa-bulletin-board/actions/workflows/automated-checks.yml)\n[![codecov](https://codecov.io/gh/ppfeufer/aa-bulletin-board/branch/master/graph/badge.svg?token=UCXABR42QC)](https://codecov.io/gh/ppfeufer/aa-bulletin-board)\n[![Translation status](https://weblate.ppfeufer.de/widget/alliance-auth-apps/aa-bulletin-board/svg-badge.svg)](https://weblate.ppfeufer.de/engage/alliance-auth-apps/)\n[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](https://github.com/ppfeufer/aa-forum/blob/master/CODE_OF_CONDUCT.md)\n\n[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/N4N8CL1BY)\n\nSimple bulletin board for [Alliance Auth](https://gitlab.com/allianceauth/allianceauth)\n\n______________________________________________________________________\n\n\u003c!-- mdformat-toc start --slug=github --maxlevel=6 --minlevel=2 --\u003e\n\n- [Before You Install This Module](#before-you-install-this-module)\n- [Installation](#installation)\n  - [Step 1: Install the Package](#step-1-install-the-package)\n  - [Step 2: Configure Alliance Auth](#step-2-configure-alliance-auth)\n    - [Settings in `/home/allianceserver/myauth/myauth/settings/local.py`](#settings-in-homeallianceservermyauthmyauthsettingslocalpy)\n    - [Settings in `/home/allianceserver/myauth/myauth/urls.py`](#settings-in-homeallianceservermyauthmyauthurlspy)\n  - [Step 3: Configure Your Webserver](#step-3-configure-your-webserver)\n    - [Apache](#apache)\n    - [Nginx](#nginx)\n  - [Step 4: Finalizing the Installation](#step-4-finalizing-the-installation)\n  - [Step 5: Set Up Permissions](#step-5-set-up-permissions)\n- [Permissions](#permissions)\n- [Changelog](#changelog)\n- [Translation Status](#translation-status)\n- [Contributing](#contributing)\n\n\u003c!-- mdformat-toc end --\u003e\n\n______________________________________________________________________\n\n![AA Bulletin Board](https://raw.githubusercontent.com/ppfeufer/aa-bulletin-board/master/docs/images/presentation/aa-bulletin-board.jpg \"AA Bulletin Board\")\n\n## Before You Install This Module\u003ca name=\"before-you-install-this-module\"\u003e\u003c/a\u003e\n\nThis app needs quite some configuration done before working properly. You need to\nmodify your Apache/Nginx configuration as well as the global URL config of Alliance\nAuth. So please only install if you know what you're doing/feel comfortable to make\nthese kinds of changes. For your own sanity, and mine :-)\n\n## Installation\u003ca name=\"installation\"\u003e\u003c/a\u003e\n\n\u003e [!IMPORTANT]\n\u003e\n\u003e Please make sure you meet all preconditions before you proceed.\n\n- AA Bulletin Board is a plugin for Alliance Auth. If you don't have Alliance Auth\n  running already, please install it first before proceeding. (see the official\n  [AA installation guide](https://allianceauth.readthedocs.io/en/latest/installation/allianceauth.html)\n  or details)\n- Aa Bulletin Board needs a couple of changes made to your Webserver and Alliance\n  Auth configuration. So make sure you know how to do so. The steps needed will be\n  described in this document, but you need to understand what will be changed.\n\n### Step 1: Install the Package\u003ca name=\"step-1-install-the-package\"\u003e\u003c/a\u003e\n\nMake sure you're in the virtual environment (venv) of your Alliance Auth\ninstallation Then install the latest release directly from PyPi.\n\n```shell\npip install aa-bulletin-board==2.5.4\n```\n\n### Step 2: Configure Alliance Auth\u003ca name=\"step-2-configure-alliance-auth\"\u003e\u003c/a\u003e\n\n#### Settings in `/home/allianceserver/myauth/myauth/settings/local.py`\u003ca name=\"settings-in-homeallianceservermyauthmyauthsettingslocalpy\"\u003e\u003c/a\u003e\n\nThis is fairly simple, configure your AA settings (`local.py`) as follows:\n\n```python\n# AA Bulletin Board\nINSTALLED_APPS += [\n    \"django_ckeditor_5\",  # https://github.com/hvlads/django-ckeditor-5\n    \"aa_bulletin_board\",  # https://github.com/ppfeufer/aa-bulletin-board\n]\n\n# Django CKEditor 5 Configuration\nif \"django_ckeditor_5\" in INSTALLED_APPS:\n    # CKEditor 5 File Upload Configuration\n    CKEDITOR_5_FILE_UPLOAD_PERMISSION = (\n        \"authenticated\"  # Possible values: \"staff\", \"authenticated\", \"any\"\n    )\n\n    MEDIA_URL = \"/media/uploads/\"\n    MEDIA_ROOT = \"/var/www/myauth/media/uploads\"\n\n    customColorPalette = [\n        {\"color\": \"hsl(4, 90%, 58%)\", \"label\": \"Red\"},\n        {\"color\": \"hsl(340, 82%, 52%)\", \"label\": \"Pink\"},\n        {\"color\": \"hsl(291, 64%, 42%)\", \"label\": \"Purple\"},\n        {\"color\": \"hsl(262, 52%, 47%)\", \"label\": \"Deep Purple\"},\n        {\"color\": \"hsl(231, 48%, 48%)\", \"label\": \"Indigo\"},\n        {\"color\": \"hsl(207, 90%, 54%)\", \"label\": \"Blue\"},\n    ]\n\n    CKEDITOR_5_CONFIGS = {\n        \"default\": {\n            \"toolbar\": [\n                \"heading\",\n                \"|\",\n                \"bold\",\n                \"italic\",\n                \"link\",\n                \"bulletedList\",\n                \"numberedList\",\n                \"blockQuote\",\n            ],\n        },\n        \"extends\": {\n            \"blockToolbar\": [\n                \"paragraph\",\n                \"heading1\",\n                \"heading2\",\n                \"heading3\",\n                \"|\",\n                \"bulletedList\",\n                \"numberedList\",\n                \"|\",\n                \"blockQuote\",\n            ],\n            \"toolbar\": [\n                \"heading\",\n                \"|\",\n                \"outdent\",\n                \"indent\",\n                \"|\",\n                \"bold\",\n                \"italic\",\n                \"link\",\n                \"underline\",\n                \"strikethrough\",\n                \"subscript\",\n                \"superscript\",\n                \"highlight\",\n                \"|\",\n                \"insertImage\",\n                \"mediaEmbed\",\n                \"|\",\n                \"bulletedList\",\n                \"numberedList\",\n                \"todoList\",\n                \"insertTable\",\n                \"|\",\n                \"blockQuote\",\n                \"codeBlock\",\n                \"|\",\n                \"fontSize\",\n                \"fontFamily\",\n                \"fontColor\",\n                \"fontBackgroundColor\",\n                \"removeFormat\",\n                \"|\",\n                \"sourceEditing\",\n            ],\n            \"image\": {\n                \"toolbar\": [\n                    \"imageTextAlternative\",\n                    \"|\",\n                    \"imageStyle:alignLeft\",\n                    \"imageStyle:alignRight\",\n                    \"imageStyle:alignCenter\",\n                    \"imageStyle:side\",\n                    \"|\",\n                ],\n                \"styles\": [\n                    \"full\",\n                    \"side\",\n                    \"alignLeft\",\n                    \"alignRight\",\n                    \"alignCenter\",\n                ],\n            },\n            \"table\": {\n                \"contentToolbar\": [\n                    \"tableColumn\",\n                    \"tableRow\",\n                    \"mergeTableCells\",\n                    \"tableProperties\",\n                    \"tableCellProperties\",\n                ],\n                \"tableProperties\": {\n                    \"borderColors\": customColorPalette,\n                    \"backgroundColors\": customColorPalette,\n                },\n                \"tableCellProperties\": {\n                    \"borderColors\": customColorPalette,\n                    \"backgroundColors\": customColorPalette,\n                },\n            },\n            \"heading\": {\n                \"options\": [\n                    {\n                        \"model\": \"paragraph\",\n                        \"title\": \"Paragraph\",\n                        \"class\": \"ck-heading_paragraph\",\n                    },\n                    {\n                        \"model\": \"heading1\",\n                        \"view\": \"h1\",\n                        \"title\": \"Heading 1\",\n                        \"class\": \"ck-heading_heading1\",\n                    },\n                    {\n                        \"model\": \"heading2\",\n                        \"view\": \"h2\",\n                        \"title\": \"Heading 2\",\n                        \"class\": \"ck-heading_heading2\",\n                    },\n                    {\n                        \"model\": \"heading3\",\n                        \"view\": \"h3\",\n                        \"title\": \"Heading 3\",\n                        \"class\": \"ck-heading_heading3\",\n                    },\n                ]\n            },\n        },\n        \"list\": {\n            \"properties\": {\n                \"styles\": \"true\",\n                \"startIndex\": \"true\",\n                \"reversed\": \"true\",\n            }\n        },\n    }\n```\n\n#### Settings in `/home/allianceserver/myauth/myauth/urls.py`\u003ca name=\"settings-in-homeallianceservermyauthmyauthurlspy\"\u003e\u003c/a\u003e\n\nNow let's move on to editing the global URL configuration of Alliance Auth. To do so,\nyou need to open `/home/allianceserver/myauth/myauth/urls.py` and change the\nfollowing block right before the `handler` definitions:\n\n```python\nfrom django.apps import apps  # Only if not already imported earlier\nfrom django.conf import settings  # Only if not already imported earlier\nfrom django.conf.urls.static import static  # Only if not already imported earlier\nfrom django.urls import path  # Only if not already imported earlier\n\n# If django_ckeditor_5 is loaded\nif apps.is_installed(\"django_ckeditor_5\"):\n    # URL configuration for CKEditor 5\n    urlpatterns = (\n        [\n            path(\"ckeditor5/\", include(\"django_ckeditor_5.urls\")),\n        ]\n        + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)\n        + urlpatterns\n    )\n```\n\nAfter this, your `urls.py` should look similar to this:\n\n```python\nfrom django.apps import apps\nfrom django.conf import settings\nfrom django.conf.urls.static import static\nfrom django.urls import include, path, re_path\n\nfrom allianceauth import urls\n\n# Alliance auth urls\nurlpatterns = [\n    path(r\"\", include(urls)),\n]\n\n# If django_ckeditor_5 is loaded\nif apps.is_installed(\"django_ckeditor_5\"):\n    # URL configuration for CKEditor 5\n    urlpatterns = (\n        [\n            path(\"ckeditor5/\", include(\"django_ckeditor_5.urls\")),\n        ]\n        + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)\n        + urlpatterns\n    )\n\nhandler500 = \"allianceauth.views.Generic500Redirect\"\nhandler404 = \"allianceauth.views.Generic404Redirect\"\nhandler403 = \"allianceauth.views.Generic403Redirect\"\nhandler400 = \"allianceauth.views.Generic400Redirect\"\n```\n\n### Step 3: Configure Your Webserver\u003ca name=\"step-3-configure-your-webserver\"\u003e\u003c/a\u003e\n\nYour webserver needs to know from where to serve the uploaded images, of course, so we\nhave to tell it.\n\n#### Apache\u003ca name=\"apache\"\u003e\u003c/a\u003e\n\nIn your vhost configuration you have a line `ProxyPassMatch ^/static !`, which tells\nthe server where to find all the static files. We're adding a similar line for the\nmedia, right below that one.\n\nAdd the following right below the static proxy match:\n\n```apache\nProxyPassMatch ^/media !\n```\n\nNow we also need to let the server know where to find the media directory we just\nconfigured the proxy for. To do so, add a new Alias to your configuration. This can\nbe done right below the already existing Alias for `/static`:\n\n```apache\nAlias \"/media\" \"/var/www/myauth/media/\"\n```\n\nAt last, a Directory rule is needed as well. Add the following code below to the\nalready existing Directory rule for the static files:\n\n```apache\n\u003cDirectory \"/var/www/myauth/media/\"\u003e\n    Require all granted\n\u003c/Directory\u003e\n```\n\nSo the whole block should now look like this:\n\n```apache\nProxyPassMatch ^/static !\nProxyPassMatch ^/media !  # *** NEW proxy rule\nProxyPass / http://127.0.0.1:8000/\nProxyPassReverse / http://127.0.0.1:8000/\nProxyPreserveHost On\n\nAlias \"/static\" \"/var/www/myauth/static/\"\nAlias \"/media\" \"/var/www/myauth/media/\"\n\n\u003cDirectory \"/var/www/myauth/static/\"\u003e\n    Require all granted\n\u003c/Directory\u003e\n\n\u003cDirectory \"/var/www/myauth/media/\"\u003e\n    Require all granted\n\u003c/Directory\u003e\n```\n\nRestart your Apache webserver.\n\n#### Nginx\u003ca name=\"nginx\"\u003e\u003c/a\u003e\n\nIn order to let Nginx know where to find the uploaded files, you need to add a new\nlocation rule to the configuration.\n\n```nginx\nlocation /media {\n    alias /var/www/myauth/media;\n    autoindex off;\n}\n```\n\nRestart your Nginx webserver.\n\n### Step 4: Finalizing the Installation\u003ca name=\"step-4-finalizing-the-installation\"\u003e\u003c/a\u003e\n\nRun static files collection and migrations\n\n```shell\npython manage.py collectstatic\npython manage.py migrate\n```\n\nRestart your supervisor services for Auth\n\n### Step 5: Set Up Permissions\u003ca name=\"step-5-set-up-permissions\"\u003e\u003c/a\u003e\n\nNow it's time to set up access permissions for your new module. You can do so in\nyour admin backend. Read the [Permissions](#permissions) section for more information\nabout the available permissions.\n\n## Permissions\u003ca name=\"permissions\"\u003e\u003c/a\u003e\n\n| ID                 | Description                   | Notes                                                                           |\n| :----------------- | :---------------------------- | :------------------------------------------------------------------------------ |\n| `basic_access`     | Can access the Bulletin Board | Grants read access to the bulletin board                                        |\n| `manage_bulletins` | Can manage bulletins          | Grants the right to edit and delete existing bulletins and create new bulletins |\n\n## Changelog\u003ca name=\"changelog\"\u003e\u003c/a\u003e\n\nSee [CHANGELOG.md](https://github.com/ppfeufer/aa-bulletin-board/blob/master/CHANGELOG.md)\n\n## Translation Status\u003ca name=\"translation-status\"\u003e\u003c/a\u003e\n\n[![Translation status](https://weblate.ppfeufer.de/widget/alliance-auth-apps/aa-bulletin-board/multi-auto.svg)](https://weblate.ppfeufer.de/engage/alliance-auth-apps/)\n\nDo you want to help translate this app into your language or improve the existing\ntranslation? - [Join our team of translators][weblate engage]!\n\n## Contributing\u003ca name=\"contributing\"\u003e\u003c/a\u003e\n\nDo you want to contribute to this project? That's cool!\n\nPlease make sure to read the [Contribution Guidelines].\\\n(I promise, it's not much, just some basics)\n\n\u003c!-- Links --\u003e\n\n[contribution guidelines]: https://github.com/ppfeufer/aa-bulletin-board/blob/master/CONTRIBUTING.md \"Contribution Guidelines\"\n[weblate engage]: https://weblate.ppfeufer.de/engage/alliance-auth-apps/ \"Weblate Translations\"\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fppfeufer%2Faa-bulletin-board","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fppfeufer%2Faa-bulletin-board","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fppfeufer%2Faa-bulletin-board/lists"}