Skip to main content

AA Forum

Badge: Version Badge: License Badge: Supported Python Versions Badge: Supported Django Versions Badge: pre-commit Badge: pre-commit.ci status Badge: Code Style: black Badge: Automated Tests Badge: Code Coverage Badge: Translation Status Badge: Contributor Covenant Badge: Support Discord Alliance Auth Compatibility

Badge: Buy me a coffee

Simple forum app for Alliance Auth



Before You Install This Module

This module needs quite some configuration done before working properly. You need to modify your Apache/Nginx configuration as well as the global URL config of Alliance Auth. So please only install if you know what you're doing/feel comfortable making these kinds of changes. For your own sanity, and mine :-)

Overview

Features

  • Simple permission system. Only 2 permissions. ("has_access" and "can_manage")
  • Simple administration, no maze to click through to get where you want to go.
  • Categories and boards are sortable via drag and drop in the admin view.
  • Mass creation of boards with a new category.
  • Boards can be restricted to 1 or more groups, boards without restrictions are visible for everyone who has access to the forum.
  • Announcement boards where only certain users can start topics.
  • Child boards (1 Level), which inherit their access restrictions from their parent.
  • CKEditor with image upload.
  • Unread topics counter as a number on the "Forum" link in the left navigation.
  • Optional notifications about new topics in a board via Discord webhooks.
  • Forum profile for each user.
  • Personal Messages.
    • Optional Discord PM for new personal messages.
      This feature is disabled by default, can be enabled by each user in their forum profile. Needs one of the following applications installed:

Screenshots

Forum Index

Screenshot: Forum Index

Topic Overview / Board Index

Screenshot: Topic Overview / Board Index

Topic View

Screenshot: Topic View

Start New Topic (ckEditor)

Screenshot: Start new Topic

Admin View

Screenshot: Admin View

Installation

Important: Please make sure you meet all preconditions before you proceed:

  • AA Forum is a plugin for Alliance Auth. If you don't have Alliance Auth running already, please install it first before proceeding. (see the official AA installation guide for details)
  • AA Forum needs a couple of changes made to your Webserver and Alliance Auth configuration. So make sure you know how to do so. The steps needed will be described in this document, but you need to understand what will be changed.

Step 1: Install the Package

Make sure you're in the virtual environment (venv) of your Alliance Auth installation Then install the latest release directly from PyPi.

pip install aa-forum==3.2.0

Step 2: Configure Alliance Auth

Settings in /home/allianceserver/myauth/myauth/settings/local.py

This is fairly simple, configure your AA settings (local.py) as follows:

# AA Forum
INSTALLED_APPS += [
    "django_ckeditor_5",  # https://github.com/hvlads/django-ckeditor-5
    "aa_forum",  # https://github.com/ppfeufer/aa-forum
]

# Django CKEditor 5 Configuration
if "django_ckeditor_5" in INSTALLED_APPS:
    # CKEditor 5 File Upload Configuration
    CKEDITOR_5_FILE_UPLOAD_PERMISSION = (
        "authenticated"  # Possible values: "staff", "authenticated", "any"
    )

    MEDIA_URL = "/media/uploads/"
    MEDIA_ROOT = "/var/www/myauth/media/uploads"

    customColorPalette = [
        {"color": "hsl(4, 90%, 58%)", "label": "Red"},
        {"color": "hsl(340, 82%, 52%)", "label": "Pink"},
        {"color": "hsl(291, 64%, 42%)", "label": "Purple"},
        {"color": "hsl(262, 52%, 47%)", "label": "Deep Purple"},
        {"color": "hsl(231, 48%, 48%)", "label": "Indigo"},
        {"color": "hsl(207, 90%, 54%)", "label": "Blue"},
    ]

    CKEDITOR_5_CONFIGS = {
        "default": {
            "toolbar": [
                "heading",
                "|",
                "bold",
                "italic",
                "link",
                "bulletedList",
                "numberedList",
                "blockQuote",
            ],
        },
        "extends": {
            "blockToolbar": [
                "paragraph",
                "heading1",
                "heading2",
                "heading3",
                "|",
                "bulletedList",
                "numberedList",
                "|",
                "blockQuote",
            ],
            "toolbar": [
                "heading",
                "|",
                "outdent",
                "indent",
                "|",
                "bold",
                "italic",
                "link",
                "underline",
                "strikethrough",
                "subscript",
                "superscript",
                "highlight",
                "|",
                "insertImage",
                "mediaEmbed",
                "|",
                "bulletedList",
                "numberedList",
                "todoList",
                "insertTable",
                "|",
                "blockQuote",
                "codeBlock",
                "|",
                "fontSize",
                "fontFamily",
                "fontColor",
                "fontBackgroundColor",
                "removeFormat",
                "|",
                "sourceEditing",
            ],
            "image": {
                "toolbar": [
                    "imageTextAlternative",
                    "|",
                    "imageStyle:alignLeft",
                    "imageStyle:alignRight",
                    "imageStyle:alignCenter",
                    "imageStyle:side",
                    "|",
                ],
                "styles": [
                    "full",
                    "side",
                    "alignLeft",
                    "alignRight",
                    "alignCenter",
                ],
            },
            "table": {
                "contentToolbar": [
                    "tableColumn",
                    "tableRow",
                    "mergeTableCells",
                    "tableProperties",
                    "tableCellProperties",
                ],
                "tableProperties": {
                    "borderColors": customColorPalette,
                    "backgroundColors": customColorPalette,
                },
                "tableCellProperties": {
                    "borderColors": customColorPalette,
                    "backgroundColors": customColorPalette,
                },
            },
            "heading": {
                "options": [
                    {
                        "model": "paragraph",
                        "title": "Paragraph",
                        "class": "ck-heading_paragraph",
                    },
                    {
                        "model": "heading1",
                        "view": "h1",
                        "title": "Heading 1",
                        "class": "ck-heading_heading1",
                    },
                    {
                        "model": "heading2",
                        "view": "h2",
                        "title": "Heading 2",
                        "class": "ck-heading_heading2",
                    },
                    {
                        "model": "heading3",
                        "view": "h3",
                        "title": "Heading 3",
                        "class": "ck-heading_heading3",
                    },
                ]
            },
        },
        "list": {
            "properties": {
                "styles": "true",
                "startIndex": "true",
                "reversed": "true",
            }
        },
    }

Settings in /home/allianceserver/myauth/myauth/urls.py

Now let's move on to editing the global URL configuration of Alliance Auth. To do so, you need to open /home/allianceserver/myauth/myauth/urls.py and change the following block right before the handler definitions:

from django.apps import apps  # Only if not already imported earlier
from django.conf import settings  # Only if not already imported earlier
from django.conf.urls.static import static  # Only if not already imported earlier
from django.urls import path  # Only if not already imported earlier

# If django_ckeditor_5 is loaded
if apps.is_installed("django_ckeditor_5"):
    # URL configuration for CKEditor 5
    urlpatterns = (
        [
            path("ckeditor5/", include("django_ckeditor_5.urls")),
        ]
        + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
        + urlpatterns
    )

After this, your urls.py should look similar to this:

from django.apps import apps
from django.conf import settings
from django.conf.urls.static import static
from django.urls import include, path, re_path

from allianceauth import urls

# Alliance auth urls
urlpatterns = [
    path(r"", include(urls)),
]

# If django_ckeditor_5 is loaded
if apps.is_installed("django_ckeditor_5"):
    # URL configuration for CKEditor 5
    urlpatterns = (
        [
            path("ckeditor5/", include("django_ckeditor_5.urls")),
        ]
        + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
        + urlpatterns
    )

handler500 = "allianceauth.views.Generic500Redirect"
handler404 = "allianceauth.views.Generic404Redirect"
handler403 = "allianceauth.views.Generic403Redirect"
handler400 = "allianceauth.views.Generic400Redirect"

Step 3: Configure Your Webserver

Your webserver needs to know from where to serve the uploaded images, of course, so we have to tell it.

Apache

In your vhost configuration, you have a line ProxyPassMatch ^/static !, which tells the server where to find all the static files. We're adding a similar line for the media, right below that one.

Add the following right below the static proxy match:

ProxyPassMatch ^/media !

Now we also need to let the server know where to find the media directory we just configured the proxy for. To do so, add a new Alias to your configuration. This can be done right below the already existing Alias for /static:

Alias "/media" "/var/www/myauth/media/"

At last, a "Directory" rule is needed as well. Add the following code below the already existing Directory rule for the static files:

<Directory "/var/www/myauth/media/">
    Require all granted
</Directory>

So the whole block should now look like this:

ProxyPassMatch ^/static !
ProxyPassMatch ^/media !  # *** NEW proxy rule
ProxyPass / http://127.0.0.1:8000/
ProxyPassReverse / http://127.0.0.1:8000/
ProxyPreserveHost On

Alias "/static" "/var/www/myauth/static/"
Alias "/media" "/var/www/myauth/media/"

<Directory "/var/www/myauth/static/">
    Require all granted
</Directory>

<Directory "/var/www/myauth/media/">
    Require all granted
</Directory>

Restart your Apache webserver.

Nginx

In order to let Nginx know where to find the uploaded files, you need to add a new location rule to the configuration. Add the following right below the definition for your "static" location.

location /media {
    alias /var/www/myauth/media;
    autoindex off;
}

Restart your Nginx webserver.

Step 4: Finalizing the Installation

Run static files collection and migrations

python manage.py collectstatic
python manage.py migrate

Restart your supervisor services for Auth

Step 5: Setting up Permissions

Now it's time to set up access permissions for your new module. You can do so in your admin backend.

ID Description Notes
basic_access Can access the AA-Forum module Grants access to the forum
manage_forum Can manage the AA-Forum module (Categories, topics and messages) Users with this permission can create, edit and delete boards and categories in the "Administration" view. They can also modify and delete messages and topics in the "Forum" view. Users with this permission are not bound by group restrictions and have access to all boards and topics, so choose wisely who is getting this permission.

Step 6: (Optional) Settings for Discord Proxy (If Used)

If you are using discordproxy to send Discord messages, you can configure the host and port in your local.py settings.

Name Description Default
DISCORDPROXY_HOST Hostname used to communicate with Discord Proxy. localhost
DISCORDPROXY_PORT Port used to communicate with Discord Proxy. 50051

Changelog

See CHANGELOG.md

Translation Status

Translation status

Do you want to help translate this app into your language or improve the existing translation? - Join our team of translators!

Contributing

Do you want to contribute to this project? That's cool!

Please make sure to read the Contribution Guidelines. (I promise, it's not much, just some basics)

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

aa_forum-3.2.0.tar.gz (433.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

aa_forum-3.2.0-py3-none-any.whl (547.7 kB view details)

Uploaded Python 3

File details

Details for the file aa_forum-3.2.0.tar.gz.

File metadata

  • Download URL: aa_forum-3.2.0.tar.gz
  • Upload date:
  • Size: 433.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for aa_forum-3.2.0.tar.gz
Algorithm Hash digest
SHA256 b6c01de7a3c5f4b8529c7800de1f1371d2b0f2468ca104be7f3519e3e691b3d2
MD5 fe074d686733e7253ee921e7aa10f9db
BLAKE2b-256 0bf59dc6ea299666e952130656521aa72d710a08fadababcfd384ac4716d9c47

See more details on using hashes here.

Provenance

The following attestation bundles were made for aa_forum-3.2.0.tar.gz:

Publisher: release.yml on ppfeufer/aa-forum

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file aa_forum-3.2.0-py3-none-any.whl.

File metadata

  • Download URL: aa_forum-3.2.0-py3-none-any.whl
  • Upload date:
  • Size: 547.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for aa_forum-3.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ad514cb43ebfdba742417913a5cea7bde6a57ad6bb508959a67e25ebc0a7ec84
MD5 d40d7fd69c4478e2200337a644b23c79
BLAKE2b-256 f2cb05f3e360e4c0a02cbc7f583d0ff414f07c5c015af0c34ff1d2be455a92c4

See more details on using hashes here.

Provenance

The following attestation bundles were made for aa_forum-3.2.0-py3-none-any.whl:

Publisher: release.yml on ppfeufer/aa-forum

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

3.2.0

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page