aa-rss-to-discord 2.3.32.3.3__py3-none-any.whl → 2.4.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. aa_rss_to_discord/__init__.py +3 -2
  2. aa_rss_to_discord/apps.py +5 -2
  3. aa_rss_to_discord/constants.py +1 -1
  4. aa_rss_to_discord/locale/cs_CZ/LC_MESSAGES/django.po +2 -2
  5. aa_rss_to_discord/locale/de/LC_MESSAGES/django.po +2 -2
  6. aa_rss_to_discord/locale/django.pot +3 -3
  7. aa_rss_to_discord/locale/es/LC_MESSAGES/django.po +2 -2
  8. aa_rss_to_discord/locale/fr_FR/LC_MESSAGES/django.po +2 -2
  9. aa_rss_to_discord/locale/it_IT/LC_MESSAGES/django.po +2 -2
  10. aa_rss_to_discord/locale/ja/LC_MESSAGES/django.po +2 -2
  11. aa_rss_to_discord/locale/ko_KR/LC_MESSAGES/django.po +2 -2
  12. aa_rss_to_discord/locale/nl_NL/LC_MESSAGES/django.po +2 -2
  13. aa_rss_to_discord/locale/pl_PL/LC_MESSAGES/django.po +2 -2
  14. aa_rss_to_discord/locale/ru/LC_MESSAGES/django.po +2 -2
  15. aa_rss_to_discord/locale/sk/LC_MESSAGES/django.po +2 -2
  16. aa_rss_to_discord/locale/uk/LC_MESSAGES/django.mo +0 -0
  17. aa_rss_to_discord/locale/uk/LC_MESSAGES/django.po +7 -7
  18. aa_rss_to_discord/locale/zh_Hans/LC_MESSAGES/django.po +2 -2
  19. aa_rss_to_discord/managers.py +1 -1
  20. aa_rss_to_discord/providers.py +43 -0
  21. aa_rss_to_discord/tasks.py +59 -135
  22. aa_rss_to_discord/tests/__init__.py +41 -0
  23. aa_rss_to_discord/tests/test_auth_hooks.py +49 -0
  24. aa_rss_to_discord/tests/test_managers.py +32 -0
  25. aa_rss_to_discord/tests/test_models.py +165 -0
  26. aa_rss_to_discord/tests/test_providers.py +99 -0
  27. aa_rss_to_discord/tests/test_tasks.py +176 -0
  28. {aa_rss_to_discord-2.3.32.3.3.dist-info → aa_rss_to_discord-2.4.0.dist-info}/METADATA +11 -9
  29. aa_rss_to_discord-2.4.0.dist-info/RECORD +51 -0
  30. {aa_rss_to_discord-2.3.32.3.3.dist-info → aa_rss_to_discord-2.4.0.dist-info}/WHEEL +1 -1
  31. aa_rss_to_discord-2.3.32.3.3.dist-info/RECORD +0 -44
  32. {aa_rss_to_discord-2.3.32.3.3.dist-info → aa_rss_to_discord-2.4.0.dist-info}/licenses/LICENSE +0 -0
@@ -5,5 +5,6 @@ App init
5
5
  # Django
6
6
  from django.utils.translation import gettext_lazy as _
7
7
 
8
- __version__ = "2.3.32.3.3"
9
- __title__ = _("RSS to Discord")
8
+ __version__ = "2.4.0"
9
+ __title__ = "RSS to Discord"
10
+ __title_translated__ = _("RSS to Discord")
aa_rss_to_discord/apps.py CHANGED
@@ -4,9 +4,10 @@ app config
4
4
 
5
5
  # Django
6
6
  from django.apps import AppConfig
7
+ from django.utils.text import format_lazy
7
8
 
8
9
  # AA RSS to Discord
9
- from aa_rss_to_discord import __version__
10
+ from aa_rss_to_discord import __title_translated__, __version__
10
11
 
11
12
 
12
13
  class AaRssToDiscordConfig(AppConfig):
@@ -16,4 +17,6 @@ class AaRssToDiscordConfig(AppConfig):
16
17
 
17
18
  name = "aa_rss_to_discord"
18
19
  label = "aa_rss_to_discord"
19
- verbose_name = f"RSS to Discord v{__version__}"
20
+ verbose_name = format_lazy(
21
+ "{app_title} v{version}", app_title=__title_translated__, version=__version__
22
+ )
@@ -9,7 +9,7 @@ from feedparser import USER_AGENT as feedparser_user_agent
9
9
  from aa_rss_to_discord import __version__
10
10
 
11
11
  APP_NAME = "aa-rss-to-discord"
12
- APP_NAME_USERAGENT = "AA-RSS-to-Discord"
12
+ APP_NAME_USERAGENT = "AaRssToDiscord"
13
13
  GITHUB_URL = f"https://github.com/ppfeufer/{APP_NAME}"
14
14
  USER_AGENT = (
15
15
  f"{APP_NAME_USERAGENT}/{__version__} (+{GITHUB_URL}) via {feedparser_user_agent}"
@@ -7,7 +7,7 @@ msgid ""
7
7
  msgstr ""
8
8
  "Project-Id-Version: AA RSS to Discord 2.2.0\n"
9
9
  "Report-Msgid-Bugs-To: https://github.com/ppfeufer/aa-rss-to-discord/issues\n"
10
- "POT-Creation-Date: 2025-08-05 10:15+0200\n"
10
+ "POT-Creation-Date: 2025-12-02 08:06+0100\n"
11
11
  "PO-Revision-Date: 2024-05-10 14:10+0000\n"
12
12
  "Last-Translator: Anonymous <noreply@weblate.org>\n"
13
13
  "Language-Team: Czech <https://weblate.ppfeufer.de/projects/alliance-auth-apps/aa-rss-to-discord/cs/>\n"
@@ -18,7 +18,7 @@ msgstr ""
18
18
  "Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
19
19
  "X-Generator: Weblate 5.5.3\n"
20
20
 
21
- #: aa_rss_to_discord/__init__.py:9
21
+ #: aa_rss_to_discord/__init__.py:10
22
22
  msgid "RSS to Discord"
23
23
  msgstr ""
24
24
 
@@ -6,7 +6,7 @@ msgid ""
6
6
  msgstr ""
7
7
  "Project-Id-Version: AA RSS to Discord 2.2.0\n"
8
8
  "Report-Msgid-Bugs-To: https://github.com/ppfeufer/aa-rss-to-discord/issues\n"
9
- "POT-Creation-Date: 2025-08-05 10:15+0200\n"
9
+ "POT-Creation-Date: 2025-12-02 08:06+0100\n"
10
10
  "PO-Revision-Date: 2025-04-25 14:24+0000\n"
11
11
  "Last-Translator: Peter Pfeufer <info@ppfeufer.de>\n"
12
12
  "Language-Team: German <https://weblate.ppfeufer.de/projects/alliance-auth-apps/aa-rss-to-discord/de/>\n"
@@ -17,7 +17,7 @@ msgstr ""
17
17
  "Plural-Forms: nplurals=2; plural=n != 1;\n"
18
18
  "X-Generator: Weblate 5.11\n"
19
19
 
20
- #: aa_rss_to_discord/__init__.py:9
20
+ #: aa_rss_to_discord/__init__.py:10
21
21
  msgid "RSS to Discord"
22
22
  msgstr "RSS zu Discord"
23
23
 
@@ -6,9 +6,9 @@
6
6
  #, fuzzy
7
7
  msgid ""
8
8
  msgstr ""
9
- "Project-Id-Version: AA RSS to Discord 2.3.32.3.3\n"
9
+ "Project-Id-Version: AA RSS to Discord 2.4.0\n"
10
10
  "Report-Msgid-Bugs-To: https://github.com/ppfeufer/aa-rss-to-discord/issues\n"
11
- "POT-Creation-Date: 2025-08-05 10:15+0200\n"
11
+ "POT-Creation-Date: 2025-12-02 08:06+0100\n"
12
12
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13
13
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
14
  "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,7 +17,7 @@ msgstr ""
17
17
  "Content-Type: text/plain; charset=UTF-8\n"
18
18
  "Content-Transfer-Encoding: 8bit\n"
19
19
 
20
- #: aa_rss_to_discord/__init__.py:9
20
+ #: aa_rss_to_discord/__init__.py:10
21
21
  msgid "RSS to Discord"
22
22
  msgstr ""
23
23
 
@@ -6,7 +6,7 @@ msgid ""
6
6
  msgstr ""
7
7
  "Project-Id-Version: AA RSS to Discord 2.2.0\n"
8
8
  "Report-Msgid-Bugs-To: https://github.com/ppfeufer/aa-rss-to-discord/issues\n"
9
- "POT-Creation-Date: 2025-08-05 10:15+0200\n"
9
+ "POT-Creation-Date: 2025-12-02 08:06+0100\n"
10
10
  "PO-Revision-Date: 2024-05-10 14:10+0000\n"
11
11
  "Last-Translator: Zigor Fernandez Moreno <sietehierros@gmail.com>\n"
12
12
  "Language-Team: Spanish <https://weblate.ppfeufer.de/projects/alliance-auth-apps/aa-rss-to-discord/es/>\n"
@@ -17,7 +17,7 @@ msgstr ""
17
17
  "Plural-Forms: nplurals=2; plural=n != 1;\n"
18
18
  "X-Generator: Weblate 5.5.3\n"
19
19
 
20
- #: aa_rss_to_discord/__init__.py:9
20
+ #: aa_rss_to_discord/__init__.py:10
21
21
  msgid "RSS to Discord"
22
22
  msgstr ""
23
23
 
@@ -9,7 +9,7 @@ msgid ""
9
9
  msgstr ""
10
10
  "Project-Id-Version: AA RSS to Discord 2.2.0\n"
11
11
  "Report-Msgid-Bugs-To: https://github.com/ppfeufer/aa-rss-to-discord/issues\n"
12
- "POT-Creation-Date: 2025-08-05 10:15+0200\n"
12
+ "POT-Creation-Date: 2025-12-02 08:06+0100\n"
13
13
  "PO-Revision-Date: 2025-08-03 04:24+0000\n"
14
14
  "Last-Translator: The “Devcutter” Guy <mick162534@gmail.com>\n"
15
15
  "Language-Team: French <https://weblate.ppfeufer.de/projects/alliance-auth-apps/aa-rss-to-discord/fr/>\n"
@@ -20,7 +20,7 @@ msgstr ""
20
20
  "Plural-Forms: nplurals=2; plural=n > 1;\n"
21
21
  "X-Generator: Weblate 5.12.2\n"
22
22
 
23
- #: aa_rss_to_discord/__init__.py:9
23
+ #: aa_rss_to_discord/__init__.py:10
24
24
  msgid "RSS to Discord"
25
25
  msgstr "RSS vers Discord"
26
26
 
@@ -7,7 +7,7 @@ msgid ""
7
7
  msgstr ""
8
8
  "Project-Id-Version: AA RSS to Discord 2.2.0\n"
9
9
  "Report-Msgid-Bugs-To: https://github.com/ppfeufer/aa-rss-to-discord/issues\n"
10
- "POT-Creation-Date: 2025-08-05 10:15+0200\n"
10
+ "POT-Creation-Date: 2025-12-02 08:06+0100\n"
11
11
  "PO-Revision-Date: 2024-05-10 14:10+0000\n"
12
12
  "Last-Translator: Anonymous <noreply@weblate.org>\n"
13
13
  "Language-Team: Italian <https://weblate.ppfeufer.de/projects/alliance-auth-apps/aa-rss-to-discord/it/>\n"
@@ -18,7 +18,7 @@ msgstr ""
18
18
  "Plural-Forms: nplurals=2; plural=n != 1;\n"
19
19
  "X-Generator: Weblate 5.5.3\n"
20
20
 
21
- #: aa_rss_to_discord/__init__.py:9
21
+ #: aa_rss_to_discord/__init__.py:10
22
22
  msgid "RSS to Discord"
23
23
  msgstr ""
24
24
 
@@ -6,7 +6,7 @@ msgid ""
6
6
  msgstr ""
7
7
  "Project-Id-Version: AA RSS to Discord 2.2.0\n"
8
8
  "Report-Msgid-Bugs-To: https://github.com/ppfeufer/aa-rss-to-discord/issues\n"
9
- "POT-Creation-Date: 2025-08-05 10:15+0200\n"
9
+ "POT-Creation-Date: 2025-12-02 08:06+0100\n"
10
10
  "PO-Revision-Date: 2024-08-05 10:10+0000\n"
11
11
  "Last-Translator: Anata_no_Usiro <yt23542354m@gmail.com>\n"
12
12
  "Language-Team: Japanese <https://weblate.ppfeufer.de/projects/alliance-auth-apps/aa-rss-to-discord/ja/>\n"
@@ -17,7 +17,7 @@ msgstr ""
17
17
  "Plural-Forms: nplurals=1; plural=0;\n"
18
18
  "X-Generator: Weblate 5.6.2\n"
19
19
 
20
- #: aa_rss_to_discord/__init__.py:9
20
+ #: aa_rss_to_discord/__init__.py:10
21
21
  msgid "RSS to Discord"
22
22
  msgstr "RSS から Discord へ"
23
23
 
@@ -7,7 +7,7 @@ msgid ""
7
7
  msgstr ""
8
8
  "Project-Id-Version: AA RSS to Discord 2.2.0\n"
9
9
  "Report-Msgid-Bugs-To: https://github.com/ppfeufer/aa-rss-to-discord/issues\n"
10
- "POT-Creation-Date: 2025-08-05 10:15+0200\n"
10
+ "POT-Creation-Date: 2025-12-02 08:06+0100\n"
11
11
  "PO-Revision-Date: 2024-05-10 14:10+0000\n"
12
12
  "Last-Translator: Hue Radient <seataoji@gmail.com>\n"
13
13
  "Language-Team: Korean <https://weblate.ppfeufer.de/projects/alliance-auth-apps/aa-rss-to-discord/ko/>\n"
@@ -18,7 +18,7 @@ msgstr ""
18
18
  "Plural-Forms: nplurals=1; plural=0;\n"
19
19
  "X-Generator: Weblate 5.5.3\n"
20
20
 
21
- #: aa_rss_to_discord/__init__.py:9
21
+ #: aa_rss_to_discord/__init__.py:10
22
22
  msgid "RSS to Discord"
23
23
  msgstr "디스코드로 RSS피드보내기"
24
24
 
@@ -7,7 +7,7 @@ msgid ""
7
7
  msgstr ""
8
8
  "Project-Id-Version: AA RSS to Discord 2.2.0\n"
9
9
  "Report-Msgid-Bugs-To: https://github.com/ppfeufer/aa-rss-to-discord/issues\n"
10
- "POT-Creation-Date: 2025-08-05 10:15+0200\n"
10
+ "POT-Creation-Date: 2025-12-02 08:06+0100\n"
11
11
  "PO-Revision-Date: 2024-05-10 14:10+0000\n"
12
12
  "Last-Translator: Anonymous <noreply@weblate.org>\n"
13
13
  "Language-Team: Dutch <https://weblate.ppfeufer.de/projects/alliance-auth-apps/aa-rss-to-discord/nl/>\n"
@@ -18,7 +18,7 @@ msgstr ""
18
18
  "Plural-Forms: nplurals=2; plural=n != 1;\n"
19
19
  "X-Generator: Weblate 5.5.3\n"
20
20
 
21
- #: aa_rss_to_discord/__init__.py:9
21
+ #: aa_rss_to_discord/__init__.py:10
22
22
  msgid "RSS to Discord"
23
23
  msgstr ""
24
24
 
@@ -7,7 +7,7 @@ msgid ""
7
7
  msgstr ""
8
8
  "Project-Id-Version: AA RSS to Discord 2.2.0\n"
9
9
  "Report-Msgid-Bugs-To: https://github.com/ppfeufer/aa-rss-to-discord/issues\n"
10
- "POT-Creation-Date: 2025-08-05 10:15+0200\n"
10
+ "POT-Creation-Date: 2025-12-02 08:06+0100\n"
11
11
  "PO-Revision-Date: 2024-05-10 14:10+0000\n"
12
12
  "Last-Translator: Anonymous <noreply@weblate.org>\n"
13
13
  "Language-Team: Polish <https://weblate.ppfeufer.de/projects/alliance-auth-apps/aa-rss-to-discord/pl/>\n"
@@ -18,7 +18,7 @@ msgstr ""
18
18
  "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19
19
  "X-Generator: Weblate 5.5.3\n"
20
20
 
21
- #: aa_rss_to_discord/__init__.py:9
21
+ #: aa_rss_to_discord/__init__.py:10
22
22
  msgid "RSS to Discord"
23
23
  msgstr ""
24
24
 
@@ -7,7 +7,7 @@ msgid ""
7
7
  msgstr ""
8
8
  "Project-Id-Version: AA RSS to Discord 2.2.0\n"
9
9
  "Report-Msgid-Bugs-To: https://github.com/ppfeufer/aa-rss-to-discord/issues\n"
10
- "POT-Creation-Date: 2025-08-05 10:15+0200\n"
10
+ "POT-Creation-Date: 2025-12-02 08:06+0100\n"
11
11
  "PO-Revision-Date: 2024-05-10 14:10+0000\n"
12
12
  "Last-Translator: Dromiel <dimhry@yandex.ru>\n"
13
13
  "Language-Team: Russian <https://weblate.ppfeufer.de/projects/alliance-auth-apps/aa-rss-to-discord/ru/>\n"
@@ -18,7 +18,7 @@ msgstr ""
18
18
  "Plural-Forms: nplurals=4; plural=n==1 ? 3 : (n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
19
19
  "X-Generator: Weblate 5.5.3\n"
20
20
 
21
- #: aa_rss_to_discord/__init__.py:9
21
+ #: aa_rss_to_discord/__init__.py:10
22
22
  msgid "RSS to Discord"
23
23
  msgstr "RSS к Дискорду"
24
24
 
@@ -7,7 +7,7 @@ msgid ""
7
7
  msgstr ""
8
8
  "Project-Id-Version: AA RSS to Discord 2.2.0\n"
9
9
  "Report-Msgid-Bugs-To: https://github.com/ppfeufer/aa-rss-to-discord/issues\n"
10
- "POT-Creation-Date: 2025-08-05 10:15+0200\n"
10
+ "POT-Creation-Date: 2025-12-02 08:06+0100\n"
11
11
  "PO-Revision-Date: 2024-05-10 14:10+0000\n"
12
12
  "Last-Translator: Anonymous <noreply@weblate.org>\n"
13
13
  "Language-Team: Slovak <https://weblate.ppfeufer.de/projects/alliance-auth-apps/aa-rss-to-discord/sk/>\n"
@@ -18,7 +18,7 @@ msgstr ""
18
18
  "Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n"
19
19
  "X-Generator: Weblate 5.5.3\n"
20
20
 
21
- #: aa_rss_to_discord/__init__.py:9
21
+ #: aa_rss_to_discord/__init__.py:10
22
22
  msgid "RSS to Discord"
23
23
  msgstr ""
24
24
 
@@ -7,8 +7,8 @@ msgid ""
7
7
  msgstr ""
8
8
  "Project-Id-Version: AA RSS to Discord 2.2.0\n"
9
9
  "Report-Msgid-Bugs-To: https://github.com/ppfeufer/aa-rss-to-discord/issues\n"
10
- "POT-Creation-Date: 2025-08-05 10:15+0200\n"
11
- "PO-Revision-Date: 2025-04-10 07:05+0000\n"
10
+ "POT-Creation-Date: 2025-12-02 08:06+0100\n"
11
+ "PO-Revision-Date: 2025-08-27 20:43+0000\n"
12
12
  "Last-Translator: s0k0l -_- <salarysalo@gmail.com>\n"
13
13
  "Language-Team: Ukrainian <https://weblate.ppfeufer.de/projects/alliance-auth-apps/aa-rss-to-discord/uk/>\n"
14
14
  "Language: uk\n"
@@ -16,19 +16,19 @@ msgstr ""
16
16
  "Content-Type: text/plain; charset=UTF-8\n"
17
17
  "Content-Transfer-Encoding: 8bit\n"
18
18
  "Plural-Forms: nplurals=4; plural=n==1 ? 3 : (n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
19
- "X-Generator: Weblate 5.10.4\n"
19
+ "X-Generator: Weblate 5.13\n"
20
20
 
21
- #: aa_rss_to_discord/__init__.py:9
21
+ #: aa_rss_to_discord/__init__.py:10
22
22
  msgid "RSS to Discord"
23
23
  msgstr "RSS до Діскорду"
24
24
 
25
25
  #: aa_rss_to_discord/models.py:44
26
26
  msgid "RSS Feed"
27
- msgstr "RSS-канал"
27
+ msgstr "RSS-фід"
28
28
 
29
29
  #: aa_rss_to_discord/models.py:45
30
30
  msgid "RSS Feeds"
31
- msgstr "RSS-канали"
31
+ msgstr "RSS-фіди"
32
32
 
33
33
  #: aa_rss_to_discord/models.py:72
34
34
  msgid "Last Item"
@@ -36,4 +36,4 @@ msgstr "Останній елемент"
36
36
 
37
37
  #: aa_rss_to_discord/models.py:73
38
38
  msgid "Last Items"
39
- msgstr "Останні Елемети"
39
+ msgstr "Останні Елементи"
@@ -7,7 +7,7 @@ msgid ""
7
7
  msgstr ""
8
8
  "Project-Id-Version: AA RSS to Discord 2.2.0\n"
9
9
  "Report-Msgid-Bugs-To: https://github.com/ppfeufer/aa-rss-to-discord/issues\n"
10
- "POT-Creation-Date: 2025-08-05 10:15+0200\n"
10
+ "POT-Creation-Date: 2025-12-02 08:06+0100\n"
11
11
  "PO-Revision-Date: 2024-05-10 14:10+0000\n"
12
12
  "Last-Translator: Anonymous <noreply@weblate.org>\n"
13
13
  "Language-Team: Chinese (Simplified) <https://weblate.ppfeufer.de/projects/alliance-auth-apps/aa-rss-to-discord/zh_Hans/>\n"
@@ -18,7 +18,7 @@ msgstr ""
18
18
  "Plural-Forms: nplurals=1; plural=0;\n"
19
19
  "X-Generator: Weblate 5.5.3\n"
20
20
 
21
- #: aa_rss_to_discord/__init__.py:9
21
+ #: aa_rss_to_discord/__init__.py:10
22
22
  msgid "RSS to Discord"
23
23
  msgstr ""
24
24
 
@@ -8,7 +8,7 @@ from django.db import models
8
8
 
9
9
  class RssFeedsManager(models.Manager):
10
10
  """
11
- AFatManager
11
+ RssFeedsManager
12
12
  """
13
13
 
14
14
  def select_enabled(self):
@@ -0,0 +1,43 @@
1
+ """
2
+ Providers for the AA RSS to Discord app.
3
+ """
4
+
5
+ # Standard Library
6
+ import logging
7
+
8
+
9
+ class AppLogger(logging.LoggerAdapter):
10
+ """
11
+ Custom logger adapter that adds a prefix to log messages.
12
+
13
+ Taken from the `allianceauth-app-utils` package.
14
+ Credits to: Erik Kalkoken
15
+ """
16
+
17
+ def __init__(self, my_logger, prefix):
18
+ """
19
+ Initializes the AppLogger with a logger and a prefix.
20
+
21
+ :param my_logger: Logger instance
22
+ :type my_logger: logging.Logger
23
+ :param prefix: Prefix string to add to log messages
24
+ :type prefix: str
25
+ """
26
+
27
+ super().__init__(my_logger, {})
28
+
29
+ self.prefix = prefix
30
+
31
+ def process(self, msg, kwargs):
32
+ """
33
+ Prepares the log message by adding the prefix.
34
+
35
+ :param msg: Log message
36
+ :type msg: str
37
+ :param kwargs: Additional keyword arguments
38
+ :type kwargs: dict
39
+ :return: Prefixed log message and kwargs
40
+ :rtype: tuple
41
+ """
42
+
43
+ return f"[{self.prefix}] {msg}", kwargs
@@ -3,28 +3,24 @@ AA RSS To Discord Tasks
3
3
  """
4
4
 
5
5
  # Standard Library
6
- import logging
7
6
  import re
8
7
 
9
8
  # Third Party
10
9
  import feedparser
10
+ from aadiscordbot.tasks import send_message
11
11
  from celery import shared_task
12
12
 
13
- # Django
14
- from django.apps import apps
15
-
16
13
  # Alliance Auth
17
14
  from allianceauth.services.hooks import get_extension_logger
18
15
  from allianceauth.services.tasks import QueueOnce
19
16
 
20
- # Alliance Auth (External Libs)
21
- from app_utils.logging import LoggerAddTag
22
-
23
17
  # AA RSS to Discord
24
18
  from aa_rss_to_discord import __title__
19
+ from aa_rss_to_discord.constants import USER_AGENT
25
20
  from aa_rss_to_discord.models import LastItem, RssFeeds
21
+ from aa_rss_to_discord.providers import AppLogger
26
22
 
27
- logger = LoggerAddTag(get_extension_logger(__name__), __title__)
23
+ logger = AppLogger(get_extension_logger(__name__), __title__)
28
24
 
29
25
 
30
26
  def remove_emoji(string):
@@ -66,142 +62,70 @@ def remove_emoji(string):
66
62
 
67
63
 
68
64
  @shared_task(**{"base": QueueOnce})
69
- def fetch_rss() -> None: # pylint: disable=too-many-statements, too-many-branches
65
+ def fetch_rss() -> None:
70
66
  """
71
- Fetch RSS feeds and post to Discord
67
+ Fetch RSS feeds and post new entries to Discord channels.
72
68
 
73
69
  :return:
74
70
  :rtype:
75
71
  """
76
72
 
77
- # pylint: disable=too-many-nested-blocks
78
- if apps.is_installed(app_name="aadiscordbot"):
79
- # Third Party
80
- from aadiscordbot.tasks import ( # pylint: disable=import-outside-toplevel
81
- send_message,
82
- )
73
+ rss_feeds = RssFeeds.objects.select_enabled()
74
+
75
+ if not rss_feeds:
76
+ logger.debug("No RSS feeds found to parse.")
83
77
 
84
- rss_feeds = RssFeeds.objects.select_enabled()
85
-
86
- if rss_feeds:
87
- for rss_feed in rss_feeds:
88
- logger.info(msg=f'Fetching RSS Feed "{rss_feed.name}"')
89
-
90
- feed = feedparser.parse(url_file_stream_or_string=rss_feed.url)
91
-
92
- feed_entry_title = "No title"
93
- feed_entry_link = None
94
- feed_entry_time = None
95
- feed_entry_guid = None
96
- has_last_item = False
97
- last_item = None
98
- post_entry = False
99
-
100
- try:
101
- latest_entry = feed.entries[0]
102
-
103
- feed_entry_title = remove_emoji(
104
- string=latest_entry.get("title", "No title")
105
- )
106
- feed_entry_link = latest_entry.get("link", None)
107
- feed_entry_time = latest_entry.get(
108
- "published", latest_entry.updated
109
- )
110
- feed_entry_guid = latest_entry.get("id", None)
111
- except AttributeError as exc:
112
- logger.debug(
113
- msg=f'Malformed RSS feed item in feed "{rss_feed.name}". Error: {exc}'
114
- )
115
- except IndexError as exc:
116
- logger.debug(
117
- msg=f'Could not index the RSS feed "{rss_feed.name}". Error: {exc}'
118
- )
119
- else:
120
- post_entry = True
121
- has_last_item = True
122
-
123
- try:
124
- last_item = LastItem.objects.get(rss_feed=rss_feed)
125
-
126
- if (
127
- last_item
128
- and last_item.rss_item_time == feed_entry_time
129
- and last_item.rss_item_title == feed_entry_title
130
- and last_item.rss_item_link == feed_entry_link
131
- and last_item.rss_item_guid == feed_entry_guid
132
- ):
133
- logger.debug(
134
- msg=(
135
- f'News item "{feed_entry_title}" for RSS Feed '
136
- f'"{rss_feed.name}" has already been posted to your Discord'
137
- )
138
- )
139
- post_entry = False
140
- except LastItem.DoesNotExist:
141
- logger.debug(msg="This seems to be a completely new RSS feed.")
142
-
143
- has_last_item = False
78
+ return
144
79
 
80
+ for rss_feed in rss_feeds:
81
+ logger.info(f'Fetching RSS Feed "{rss_feed.name}"')
82
+ feed = feedparser.parse(rss_feed.url, agent=USER_AGENT)
83
+
84
+ try:
85
+ latest_entry = feed.entries[0]
86
+ feed_entry_title = remove_emoji(latest_entry.get("title", "No title"))
87
+ feed_entry_link = latest_entry.get("link")
88
+ feed_entry_time = latest_entry.get("published", latest_entry.updated)
89
+ feed_entry_guid = latest_entry.get("id")
90
+ except (AttributeError, IndexError) as exc:
91
+ logger.debug(f'Error processing feed "{rss_feed.name}": {exc}')
92
+
93
+ continue
94
+
95
+ try:
96
+ last_item = LastItem.objects.get(rss_feed=rss_feed)
97
+ is_duplicate = (
98
+ last_item.rss_item_time == feed_entry_time
99
+ and last_item.rss_item_title == feed_entry_title
100
+ and last_item.rss_item_link == feed_entry_link
101
+ and last_item.rss_item_guid == feed_entry_guid
102
+ )
103
+
104
+ if is_duplicate:
145
105
  logger.debug(
146
- msg=(
147
- "RSS Information gathered: "
148
- f"post_entry => {post_entry}, "
149
- f'feed_entry_link => "{feed_entry_link}", '
150
- f'feed_entry_title => "{feed_entry_title}", '
151
- f"feed_entry_time => {feed_entry_time}, "
152
- f"feed_entry_guid => {feed_entry_guid}"
153
- )
106
+ f'News item "{feed_entry_title}" for RSS Feed "{rss_feed.name}" '
107
+ "has already been posted to your Discord"
154
108
  )
155
109
 
156
- if (
157
- post_entry is True
158
- and feed_entry_link is not None
159
- and feed_entry_guid is not None
160
- ):
161
- logger.info(
162
- msg=(
163
- "New entry found, posting to Discord channel "
164
- f"{rss_feed.discord_channel}"
165
- )
166
- )
167
-
168
- if has_last_item is True:
169
- # Update the last item ...
170
- last_item.rss_item_time = feed_entry_time
171
- last_item.rss_item_title = feed_entry_title
172
- last_item.rss_item_link = feed_entry_link
173
- last_item.rss_item_guid = feed_entry_guid
174
- last_item.save()
175
- else:
176
- # Set the last item ...
177
- LastItem(
178
- rss_feed=rss_feed,
179
- rss_item_time=feed_entry_time,
180
- rss_item_title=feed_entry_title,
181
- rss_item_link=feed_entry_link,
182
- rss_item_guid=feed_entry_guid,
183
- ).save()
184
-
185
- discord_message = f"**{rss_feed.name}**\n{feed_entry_link}"
186
-
187
- send_message(
188
- channel_id=rss_feed.discord_channel.channel,
189
- message=discord_message,
190
- )
191
- else:
192
- logger.debug(
193
- msg=(
194
- f'No item for feed "{rss_feed.name}" to post. '
195
- 'Missing either "post_entry" to be "True" or '
196
- 'either "feed_entry_link" or "feed_entry_guid" is "None".'
197
- )
198
- )
199
- else:
200
- logger.debug(msg="No RSS feeds found to parse.")
201
- else:
202
- logging.info(
203
- msg=(
204
- "AA Discordbot (https://github.com/pvyParts/allianceauth-discordbot) "
205
- "needs to be installed and configured."
206
- )
110
+ continue
111
+ except LastItem.DoesNotExist:
112
+ logger.debug("This seems to be a completely new RSS feed.")
113
+
114
+ logger.info(
115
+ f"New entry found, posting to Discord channel {rss_feed.discord_channel}"
116
+ )
117
+
118
+ LastItem.objects.update_or_create(
119
+ rss_feed=rss_feed,
120
+ defaults={
121
+ "rss_item_time": feed_entry_time,
122
+ "rss_item_title": feed_entry_title,
123
+ "rss_item_link": feed_entry_link,
124
+ "rss_item_guid": feed_entry_guid,
125
+ },
126
+ )
127
+
128
+ send_message(
129
+ channel_id=rss_feed.discord_channel.channel,
130
+ message=f"**{rss_feed.name}**\n{feed_entry_link}",
207
131
  )
@@ -0,0 +1,41 @@
1
+ """
2
+ Initialize the tests
3
+ """
4
+
5
+ # Standard Library
6
+ import socket
7
+
8
+ # Django
9
+ from django.test import TestCase
10
+
11
+
12
+ class SocketAccessError(Exception):
13
+ """Error raised when a test script accesses the network"""
14
+
15
+
16
+ class BaseTestCase(TestCase):
17
+ """Variation of Django's TestCase class that prevents any network use.
18
+
19
+ Example:
20
+
21
+ .. code-block:: python
22
+
23
+ class TestMyStuff(BaseTestCase):
24
+ def test_should_do_what_i_need(self): ...
25
+
26
+ """
27
+
28
+ @classmethod
29
+ def setUpClass(cls):
30
+ cls.socket_original = socket.socket
31
+ socket.socket = cls.guard
32
+ return super().setUpClass()
33
+
34
+ @classmethod
35
+ def tearDownClass(cls):
36
+ socket.socket = cls.socket_original
37
+ return super().tearDownClass()
38
+
39
+ @staticmethod
40
+ def guard(*args, **kwargs):
41
+ raise SocketAccessError("Attempted to access network")