diff options
| -rw-r--r-- | pydis_site/apps/api/admin.py | 28 | ||||
| -rw-r--r-- | pydis_site/apps/api/dblogger.py | 22 | ||||
| -rw-r--r-- | pydis_site/apps/api/migrations/0064_delete_logentry.py | 16 | ||||
| -rw-r--r-- | pydis_site/apps/api/migrations/0066_merge_20201003_0730.py | 14 | ||||
| -rw-r--r-- | pydis_site/apps/api/models/__init__.py | 1 | ||||
| -rw-r--r-- | pydis_site/apps/api/models/log_entry.py | 55 | ||||
| -rw-r--r-- | pydis_site/apps/api/serializers.py | 14 | ||||
| -rw-r--r-- | pydis_site/apps/api/tests/test_dblogger.py | 27 | ||||
| -rw-r--r-- | pydis_site/apps/api/urls.py | 2 | ||||
| -rw-r--r-- | pydis_site/apps/api/viewsets/__init__.py | 1 | ||||
| -rw-r--r-- | pydis_site/apps/api/viewsets/log_entry.py | 36 | ||||
| -rw-r--r-- | pydis_site/settings.py | 5 | 
12 files changed, 31 insertions, 190 deletions
| diff --git a/pydis_site/apps/api/admin.py b/pydis_site/apps/api/admin.py index 5093e605..b6fee9d1 100644 --- a/pydis_site/apps/api/admin.py +++ b/pydis_site/apps/api/admin.py @@ -14,7 +14,6 @@ from .models import (      DeletedMessage,      DocumentationLink,      Infraction, -    LogEntry,      MessageDeletionContext,      Nomination,      OffTopicChannelName, @@ -120,33 +119,6 @@ class InfractionAdmin(admin.ModelAdmin):          return False [email protected](LogEntry) -class LogEntryAdmin(admin.ModelAdmin): -    """Allows viewing logs in the Django Admin without allowing edits.""" - -    actions = None -    list_display = ('timestamp', 'level', 'message') -    fieldsets = ( -        ('Overview', {'fields': ('timestamp', 'application', 'logger_name')}), -        ('Metadata', {'fields': ('level', 'module', 'line')}), -        ('Contents', {'fields': ('message',)}) -    ) -    list_filter = ('level', 'timestamp') -    search_fields = ('message',) - -    def has_add_permission(self, request: HttpRequest) -> bool: -        """Deny manual LogEntry creation.""" -        return False - -    def has_change_permission(self, *args) -> bool: -        """Prevent editing from django admin.""" -        return False - -    def has_delete_permission(self, request: HttpRequest, obj: Optional[LogEntry] = None) -> bool: -        """Deny LogEntry deletion.""" -        return False - -  @admin.register(DeletedMessage)  class DeletedMessageAdmin(admin.ModelAdmin):      """Admin formatting for the DeletedMessage model.""" diff --git a/pydis_site/apps/api/dblogger.py b/pydis_site/apps/api/dblogger.py deleted file mode 100644 index 4b4e3a9d..00000000 --- a/pydis_site/apps/api/dblogger.py +++ /dev/null @@ -1,22 +0,0 @@ -from logging import LogRecord, StreamHandler - - -class DatabaseLogHandler(StreamHandler): -    """Logs entries into the database.""" - -    def emit(self, record: LogRecord) -> None: -        """Write the given `record` into the database.""" -        # This import needs to be deferred due to Django's application -        # registry instantiation logic loading this handler before the -        # application is ready. -        from pydis_site.apps.api.models.log_entry import LogEntry - -        entry = LogEntry( -            application='site', -            logger_name=record.name, -            level=record.levelname.lower(), -            module=record.module, -            line=record.lineno, -            message=self.format(record) -        ) -        entry.save() diff --git a/pydis_site/apps/api/migrations/0064_delete_logentry.py b/pydis_site/apps/api/migrations/0064_delete_logentry.py new file mode 100644 index 00000000..a5f344d1 --- /dev/null +++ b/pydis_site/apps/api/migrations/0064_delete_logentry.py @@ -0,0 +1,16 @@ +# Generated by Django 3.0.9 on 2020-10-03 06:57 + +from django.db import migrations + + +class Migration(migrations.Migration): + +    dependencies = [ +        ('api', '0063_Allow_blank_or_null_for_nomination_reason'), +    ] + +    operations = [ +        migrations.DeleteModel( +            name='LogEntry', +        ), +    ] diff --git a/pydis_site/apps/api/migrations/0066_merge_20201003_0730.py b/pydis_site/apps/api/migrations/0066_merge_20201003_0730.py new file mode 100644 index 00000000..298416db --- /dev/null +++ b/pydis_site/apps/api/migrations/0066_merge_20201003_0730.py @@ -0,0 +1,14 @@ +# Generated by Django 3.0.9 on 2020-10-03 07:30 + +from django.db import migrations + + +class Migration(migrations.Migration): + +    dependencies = [ +        ('api', '0064_delete_logentry'), +        ('api', '0065_auto_20200919_2033'), +    ] + +    operations = [ +    ] diff --git a/pydis_site/apps/api/models/__init__.py b/pydis_site/apps/api/models/__init__.py index e3f928e1..0a8c90f6 100644 --- a/pydis_site/apps/api/models/__init__.py +++ b/pydis_site/apps/api/models/__init__.py @@ -14,4 +14,3 @@ from .bot import (      Role,      User  ) -from .log_entry import LogEntry diff --git a/pydis_site/apps/api/models/log_entry.py b/pydis_site/apps/api/models/log_entry.py deleted file mode 100644 index 752cd2ca..00000000 --- a/pydis_site/apps/api/models/log_entry.py +++ /dev/null @@ -1,55 +0,0 @@ -from django.db import models -from django.utils import timezone - -from pydis_site.apps.api.models.mixins import ModelReprMixin - - -class LogEntry(ModelReprMixin, models.Model): -    """A log entry generated by one of the PyDis applications.""" - -    application = models.CharField( -        max_length=20, -        help_text="The application that generated this log entry.", -        choices=( -            ('bot', 'Bot'), -            ('seasonalbot', 'Seasonalbot'), -            ('site', 'Website') -        ) -    ) -    logger_name = models.CharField( -        max_length=100, -        help_text="The name of the logger that generated this log entry." -    ) -    timestamp = models.DateTimeField( -        default=timezone.now, -        help_text="The date and time when this entry was created." -    ) -    level = models.CharField( -        max_length=8,  # 'critical' -        choices=( -            ('debug', 'Debug'), -            ('info', 'Info'), -            ('warning', 'Warning'), -            ('error', 'Error'), -            ('critical', 'Critical') -        ), -        help_text=( -            "The logger level at which this entry was emitted. The levels " -            "correspond to the Python `logging` levels." -        ) -    ) -    module = models.CharField( -        max_length=100, -        help_text="The fully qualified path of the module generating this log line." -    ) -    line = models.PositiveSmallIntegerField( -        help_text="The line at which the log line was emitted." -    ) -    message = models.TextField( -        help_text="The textual content of the log line." -    ) - -    class Meta: -        """Customizes the default generated plural name to valid English.""" - -        verbose_name_plural = 'Log entries' diff --git a/pydis_site/apps/api/serializers.py b/pydis_site/apps/api/serializers.py index 90bd6f91..f9a5517e 100644 --- a/pydis_site/apps/api/serializers.py +++ b/pydis_site/apps/api/serializers.py @@ -9,7 +9,6 @@ from .models import (      DocumentationLink,      FilterList,      Infraction, -    LogEntry,      MessageDeletionContext,      Nomination,      OffTopicChannelName, @@ -191,19 +190,6 @@ class ExpandedInfractionSerializer(InfractionSerializer):          return ret -class LogEntrySerializer(ModelSerializer): -    """A class providing (de-)serialization of `LogEntry` instances.""" - -    class Meta: -        """Metadata defined for the Django REST Framework.""" - -        model = LogEntry -        fields = ( -            'application', 'logger_name', 'timestamp', -            'level', 'module', 'line', 'message' -        ) - -  class OffTopicChannelNameSerializer(ModelSerializer):      """A class providing (de-)serialization of `OffTopicChannelName` instances.""" diff --git a/pydis_site/apps/api/tests/test_dblogger.py b/pydis_site/apps/api/tests/test_dblogger.py deleted file mode 100644 index bb19f297..00000000 --- a/pydis_site/apps/api/tests/test_dblogger.py +++ /dev/null @@ -1,27 +0,0 @@ -import logging -from datetime import datetime - -from django.test import TestCase - -from ..dblogger import DatabaseLogHandler -from ..models import LogEntry - - -class DatabaseLogHandlerTests(TestCase): -    def test_logs_to_database(self): -        module_basename = __name__.split('.')[-1] -        logger = logging.getLogger(__name__) -        logger.handlers = [DatabaseLogHandler()] -        logger.warning("I am a test case!") - -        # Ensure we only have a single record in the database -        # after the logging call above. -        [entry] = LogEntry.objects.all() - -        self.assertEqual(entry.application, 'site') -        self.assertEqual(entry.logger_name, __name__) -        self.assertIsInstance(entry.timestamp, datetime) -        self.assertEqual(entry.level, 'warning') -        self.assertEqual(entry.module, module_basename) -        self.assertIsInstance(entry.line, int) -        self.assertEqual(entry.message, "I am a test case!") diff --git a/pydis_site/apps/api/urls.py b/pydis_site/apps/api/urls.py index 4dbf93db..2e1ef0b4 100644 --- a/pydis_site/apps/api/urls.py +++ b/pydis_site/apps/api/urls.py @@ -8,7 +8,6 @@ from .viewsets import (      DocumentationLinkViewSet,      FilterListViewSet,      InfractionViewSet, -    LogEntryViewSet,      NominationViewSet,      OffTopicChannelNameViewSet,      OffensiveMessageViewSet, @@ -71,7 +70,6 @@ urlpatterns = (      #      # from django_hosts.resolvers import reverse      path('bot/', include((bot_router.urls, 'api'), namespace='bot')), -    path('logs', LogEntryViewSet.as_view({'post': 'create'}), name='logs'),      path('healthcheck', HealthcheckView.as_view(), name='healthcheck'),      path('rules', RulesView.as_view(), name='rules')  ) diff --git a/pydis_site/apps/api/viewsets/__init__.py b/pydis_site/apps/api/viewsets/__init__.py index dfbb880d..f133e77f 100644 --- a/pydis_site/apps/api/viewsets/__init__.py +++ b/pydis_site/apps/api/viewsets/__init__.py @@ -12,4 +12,3 @@ from .bot import (      RoleViewSet,      UserViewSet  ) -from .log_entry import LogEntryViewSet diff --git a/pydis_site/apps/api/viewsets/log_entry.py b/pydis_site/apps/api/viewsets/log_entry.py deleted file mode 100644 index 9108a4fa..00000000 --- a/pydis_site/apps/api/viewsets/log_entry.py +++ /dev/null @@ -1,36 +0,0 @@ -from rest_framework.mixins import CreateModelMixin -from rest_framework.viewsets import GenericViewSet - -from pydis_site.apps.api.models.log_entry import LogEntry -from pydis_site.apps.api.serializers import LogEntrySerializer - - -class LogEntryViewSet(CreateModelMixin, GenericViewSet): -    """ -    View supporting the creation of log entries in the database for viewing via the log browser. - -    ## Routes -    ### POST /logs -    Create a new log entry. - -    #### Request body -    >>> { -    ...     'application': str,  # 'bot' | 'seasonalbot' | 'site' -    ...     'logger_name': str,  # such as 'bot.cogs.moderation' -    ...     'timestamp': Optional[str],  # from `datetime.utcnow().isoformat()` -    ...     'level': str,  # 'debug' | 'info' | 'warning' | 'error' | 'critical' -    ...     'module': str,  # such as 'pydis_site.apps.api.serializers' -    ...     'line': int,  # > 0 -    ...     'message': str,  # textual formatted content of the logline -    ... } - -    #### Status codes -    - 201: returned on success -    - 400: if the request body has invalid fields, see the response for details - -    ## Authentication -    Requires a API token. -    """ - -    queryset = LogEntry.objects.all() -    serializer_class = LogEntrySerializer diff --git a/pydis_site/settings.py b/pydis_site/settings.py index 3769fa25..5eb812ac 100644 --- a/pydis_site/settings.py +++ b/pydis_site/settings.py @@ -260,14 +260,11 @@ LOGGING = {      'handlers': {          'console': {              'class': 'logging.StreamHandler' -        }, -        'database': { -            'class': 'pydis_site.apps.api.dblogger.DatabaseLogHandler'          }      },      'loggers': {          'django': { -            'handlers': ['console', 'database'], +            'handlers': ['console'],              'propagate': True,              'level': env(                  'LOG_LEVEL', | 
