From b3534f4f44549e4f8b074167bab88f0e44a868aa Mon Sep 17 00:00:00 2001 From: T'rahk Rokym Date: Mon, 21 Apr 2025 13:16:21 +0200 Subject: [PATCH] Basic documentation --- allianceauth/services/hooks.py | 11 ++++ allianceauth/templatetags/admin_status.py | 32 +++++++---- .../custom/app-announcement-hooks.md | 52 ++++++++++++++++++ .../img/app_announcement_hook_example.png | Bin 0 -> 38454 bytes docs/development/custom/index.md | 1 + 5 files changed, 85 insertions(+), 11 deletions(-) create mode 100644 docs/development/custom/app-announcement-hooks.md create mode 100755 docs/development/custom/img/app_announcement_hook_example.png diff --git a/allianceauth/services/hooks.py b/allianceauth/services/hooks.py index a2da7827..75ed30dc 100644 --- a/allianceauth/services/hooks.py +++ b/allianceauth/services/hooks.py @@ -8,6 +8,7 @@ from django.utils.functional import cached_property from allianceauth.hooks import get_hooks from allianceauth.menu.hooks import MenuItemHook +from allianceauth.templatetags.admin_status import AppAnnouncementHook from .models import NameFormatConfig @@ -145,6 +146,16 @@ class MenuItemHook(MenuItemHook): def __init_subclass__(cls) -> None: return super().__init_subclass__() +class AppAnnouncementHook(AppAnnouncementHook): + """ + AppAnnouncementHook shim to allianceauth.templatetags.admin_status + + :param AppAnnouncementHook: _description_ + :type AppAnnouncementHook: _type_ + """ + def __init_subclass__(cls) -> None: + return super().__init_subclass__() + class UrlHook: """A hook for registering the URLs of a Django app. diff --git a/allianceauth/templatetags/admin_status.py b/allianceauth/templatetags/admin_status.py index 09b41b50..c91b19b0 100644 --- a/allianceauth/templatetags/admin_status.py +++ b/allianceauth/templatetags/admin_status.py @@ -1,6 +1,6 @@ import logging from dataclasses import dataclass -from enum import Enum, auto +from enum import Enum from urllib.parse import quote_plus import requests @@ -36,14 +36,24 @@ GITLAB_AUTH_ANNOUNCEMENT_ISSUES_URL = ( logger = logging.getLogger(__name__) -class RepositoryKind(Enum): - """What kind of repository is being used""" - GITLAB = auto() - GITHUB = auto() - @dataclass class AppAnnouncementHook: - """Hook for an application to send GitHub/GitLab issues as announcements""" + """ + A hook for an application to send GitHub/GitLab issues as announcements on the dashboard + + Args: + - app_name: The name of your application + - repository_namespace: The namespace of the remote repository of your application source code. + It should look like `/`. + - repository_kind: Enumeration to determine if your repository is a GitHub or GitLab repository. + - label: The label applied to issues that should be seen as announcements, case-sensitive. + Default value: `announcement` + """ + class RepositoryKind(Enum): + """Simple enumeration to determine which api should be called to access issues""" + GITLAB = "gitlab" + GITHUB = "github" + app_name: str repository_namespace: str repository_kind: RepositoryKind @@ -56,9 +66,9 @@ class AppAnnouncementHook: be displayed. """ match self.repository_kind: - case RepositoryKind.GITHUB: + case AppAnnouncementHook.RepositoryKind.GITHUB: announcement_list = self._get_github_announcement_list() - case RepositoryKind.GITLAB: + case AppAnnouncementHook.RepositoryKind.GITLAB: announcement_list = self._get_gitlab_announcement_list() case _: return [] @@ -95,11 +105,11 @@ class AppAnnouncementHook: @hooks.register("app_announcement_hook") def test_hook(): - return AppAnnouncementHook("test GitLab app", "r0kym/allianceauth-example-plugin", RepositoryKind.GITLAB) + return AppAnnouncementHook("test GitLab app", "r0kym/allianceauth-example-plugin", AppAnnouncementHook.RepositoryKind.GITLAB) @hooks.register("app_announcement_hook") def test_hook_2(): - return AppAnnouncementHook("test GitHub app", "r0kym/test", RepositoryKind.GITHUB) + return AppAnnouncementHook("test GitHub app", "r0kym/test", AppAnnouncementHook.RepositoryKind.GITHUB) @register.simple_tag() def decimal_widthratio(this_value, max_value, max_width) -> str: diff --git a/docs/development/custom/app-announcement-hooks.md b/docs/development/custom/app-announcement-hooks.md new file mode 100644 index 00000000..e5886e4b --- /dev/null +++ b/docs/development/custom/app-announcement-hooks.md @@ -0,0 +1,52 @@ +# Announcement Hooks + +This hook allows the issues opened on your application repository to be displayed on the alliance auth front page to +administrators. + +![app_announcement_hook_example](img/app_announcement_hook_example.png) + +To register an AppAnnouncementHook class, you would do the following: + +```python +from allianceauth import hooks +from allianceauth.services.hooks import AppAnnouncementHook + +@hooks.register('app_announcement_hook') +def announcement_hook(): + return AppAnnouncementHook("Your app name", "USERNAME/REPOSITORY_NAME", AppAnnouncementHook.RepositoryKind.GITLAB) +``` + +The `AppAnnouncementHook` class will + +```{eval-rst} +.. autoclass:: allianceauth.services.hooks.AppAnnouncementHook + :members: __init__ + :undoc-members: +``` + +## Parameters + +### app_name + +The name of your application. + +### repository_namespace + +Here you should enter the namespace of your repository. +The structure stays the same for both GitHub and GitLab repositories. \ +A repository with the url `https://gitlab.com/username/appname` will have a namespace of `username/appname`. + +### repository_kind + +This variable is an enumeration of the class `AppAnnouncemementHook.RepositoryKind` + +```{eval-rst} +.. autoclass:: allianceauth.services.hooks.AppAnnouncementHook.RepositoryKind + :members: GITLAB, GITHUB + :undoc-members: +``` + +### label + +The label that will determine if issues should be seen as an announcement. +This value is case-sensitive and the default value is `"announcement"`. diff --git a/docs/development/custom/img/app_announcement_hook_example.png b/docs/development/custom/img/app_announcement_hook_example.png new file mode 100755 index 0000000000000000000000000000000000000000..dab4766f821a2ad09fb9a5b96bdbd4b7da50806c GIT binary patch literal 38454 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¨q5n=5 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