aboutsummaryrefslogtreecommitdiffstats
path: root/pydis_site/apps/api
diff options
context:
space:
mode:
authorGravatar Johannes Christ <[email protected]>2019-10-11 19:45:34 +0200
committerGravatar Johannes Christ <[email protected]>2019-10-11 19:45:34 +0200
commit6bd2ea4a1d50ea1cecbd4b3a996523425efbd65b (patch)
tree97336df0cef5d7aeea662a76df437e675c336768 /pydis_site/apps/api
parentdisable usage of pyuwsgi on windows due to incompatibility, library is only u... (diff)
Allow viewing log entries in the Django Admin.
Diffstat (limited to 'pydis_site/apps/api')
-rw-r--r--pydis_site/apps/api/admin.py31
-rw-r--r--pydis_site/apps/api/models/log_entry.py13
-rw-r--r--pydis_site/apps/api/tests/test_models.py40
3 files changed, 73 insertions, 11 deletions
diff --git a/pydis_site/apps/api/admin.py b/pydis_site/apps/api/admin.py
index c3784317..2c41d624 100644
--- a/pydis_site/apps/api/admin.py
+++ b/pydis_site/apps/api/admin.py
@@ -1,18 +1,39 @@
from django.contrib import admin
from .models import (
- BotSetting, DeletedMessage,
- DocumentationLink, Infraction,
- MessageDeletionContext, Nomination,
- OffTopicChannelName, Role,
- Tag, User
+ BotSetting,
+ DeletedMessage,
+ DocumentationLink,
+ Infraction,
+ LogEntry,
+ MessageDeletionContext,
+ Nomination,
+ OffTopicChannelName,
+ Role,
+ Tag,
+ User
)
+class LogEntryAdmin(admin.ModelAdmin):
+ """Allows viewing logs in the Django Admin without allowing edits."""
+
+ readonly_fields = (
+ 'application',
+ 'logger_name',
+ 'timestamp',
+ 'level',
+ 'module',
+ 'line',
+ 'message'
+ )
+
+
admin.site.register(BotSetting)
admin.site.register(DeletedMessage)
admin.site.register(DocumentationLink)
admin.site.register(Infraction)
+admin.site.register(LogEntry, LogEntryAdmin)
admin.site.register(MessageDeletionContext)
admin.site.register(Nomination)
admin.site.register(OffTopicChannelName)
diff --git a/pydis_site/apps/api/models/log_entry.py b/pydis_site/apps/api/models/log_entry.py
index acd7953a..55a022d7 100644
--- a/pydis_site/apps/api/models/log_entry.py
+++ b/pydis_site/apps/api/models/log_entry.py
@@ -1,9 +1,15 @@
+import textwrap
+
from django.db import models
from django.utils import timezone
from pydis_site.apps.api.models.utils import ModelReprMixin
+# Used to shorten the timestamp length in the Django Admin.
+TIMESTAMP_WITH_SECONDS_LENGTH = len('YYYY-MM-DD HH:MM:SS')
+
+
class LogEntry(ModelReprMixin, models.Model):
"""A log entry generated by one of the PyDis applications."""
@@ -48,3 +54,10 @@ class LogEntry(ModelReprMixin, models.Model):
message = models.TextField(
help_text="The textual content of the log line."
)
+
+ def __str__(self) -> str:
+ timestamp = str(self.timestamp)[:TIMESTAMP_WITH_SECONDS_LENGTH]
+ message = textwrap.shorten(self.message, width=140)
+ level = self.level[:4].upper()
+
+ return f'{timestamp} | {self.application} | {level} | {message}'
diff --git a/pydis_site/apps/api/tests/test_models.py b/pydis_site/apps/api/tests/test_models.py
index 2120b056..6011ba21 100644
--- a/pydis_site/apps/api/tests/test_models.py
+++ b/pydis_site/apps/api/tests/test_models.py
@@ -1,13 +1,21 @@
-from datetime import datetime as dt, timezone
+from datetime import datetime as dt
from django.test import SimpleTestCase
+from django.utils import timezone
from ..models import (
- DeletedMessage, DocumentationLink,
- Infraction, Message,
- MessageDeletionContext, ModelReprMixin,
- OffTopicChannelName, Reminder,
- Role, Tag, User
+ DeletedMessage,
+ DocumentationLink,
+ Infraction,
+ LogEntry,
+ Message,
+ MessageDeletionContext,
+ ModelReprMixin,
+ OffTopicChannelName,
+ Reminder,
+ Role,
+ Tag,
+ User
)
@@ -25,6 +33,26 @@ class ReprMixinTests(SimpleTestCase):
self.assertEqual(repr(self.klass), expected)
+class LogEntryStringDunderTests(SimpleTestCase):
+ def setUp(self):
+ self.entry = LogEntry(
+ application='bot',
+ logger_name='bot.rules.antispam',
+ timestamp=timezone.now(),
+ level='debug',
+ module='bot.rules.antispam',
+ line=44,
+ message="One day computers might become useful."
+ )
+
+ def test_str_shows_content(self):
+ tokens = str(self.entry).split(' | ')
+ _timestamp, app, level, message = tokens
+ self.assertEqual(app, 'bot')
+ self.assertEqual(level, 'DEBU'),
+ self.assertEqual(message, "One day computers might become useful.")
+
+
class StringDunderMethodTests(SimpleTestCase):
def setUp(self):
self.objects = (