Add logs to the API (this right should only be given to superusers)

This commit is contained in:
Yohann D'ANELLO 2020-03-11 10:08:28 +01:00
parent 38ad870939
commit bc97eb1eb4
8 changed files with 58 additions and 3 deletions

View File

@ -7,6 +7,7 @@ from rest_framework import routers, serializers, viewsets
from activity.api.urls import register_activity_urls from activity.api.urls import register_activity_urls
from member.api.urls import register_members_urls from member.api.urls import register_members_urls
from note.api.urls import register_note_urls from note.api.urls import register_note_urls
from logs.api.urls import register_logs_urls
class UserSerializer(serializers.ModelSerializer): class UserSerializer(serializers.ModelSerializer):
@ -41,6 +42,7 @@ router.register('user', UserViewSet)
register_members_urls(router, 'members') register_members_urls(router, 'members')
register_activity_urls(router, 'activity') register_activity_urls(router, 'activity')
register_note_urls(router, 'note') register_note_urls(router, 'note')
register_logs_urls(router, 'logs')
app_name = 'api' app_name = 'api'

View File

View File

@ -0,0 +1,17 @@
# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later
from rest_framework import serializers
from ..models import Changelog
class ChangelogSerializer(serializers.ModelSerializer):
"""
REST API Serializer for Changelog types.
The djangorestframework plugin will analyse the model `Changelog` and parse all fields in the API.
"""
class Meta:
model = Changelog
fields = '__all__'

11
apps/logs/api/urls.py Normal file
View File

@ -0,0 +1,11 @@
# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later
from .views import ChangelogViewSet
def register_logs_urls(router, path):
"""
Configure router for Activity REST API.
"""
router.register(path, ChangelogViewSet)

17
apps/logs/api/views.py Normal file
View File

@ -0,0 +1,17 @@
# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later
from rest_framework import viewsets
from .serializers import ChangelogSerializer
from ..models import Changelog
class ChangelogViewSet(viewsets.ModelViewSet):
"""
REST API View set.
The djangorestframework plugin will get all `Changelog` objects, serialize it to JSON with the given serializer,
then render it on /api/logs/
"""
queryset = Changelog.objects.all()
serializer_class = ChangelogSerializer

View File

@ -56,6 +56,12 @@ class Changelog(models.Model):
max_length=16, max_length=16,
null=False, null=False,
blank=False, blank=False,
choices=[
('create', _('create')),
('edit', _('edit')),
('delete', _('delete')),
],
default='edit',
verbose_name=_('action'), verbose_name=_('action'),
) )

View File

@ -69,6 +69,7 @@ def save_object(sender, instance, **kwargs):
else: else:
user = note.get().user user = note.get().user
# noinspection PyProtectedMember
if user is not None and instance._meta.label_lower == "auth.user" and previous: if user is not None and instance._meta.label_lower == "auth.user" and previous:
# On n'enregistre pas les connexions # On n'enregistre pas les connexions
if instance.last_login != previous.last_login: if instance.last_login != previous.last_login:
@ -80,8 +81,8 @@ def save_object(sender, instance, **kwargs):
model = instance.__class__ model = instance.__class__
fields = '__all__' fields = '__all__'
previous_json = JSONRenderer().render(CustomSerializer(previous).data) previous_json = JSONRenderer().render(CustomSerializer(previous).data).decode("UTF-8")
instance_json = JSONRenderer().render(CustomSerializer(instance).data) instance_json = JSONRenderer().render(CustomSerializer(instance).data).decode("UTF-8")
if previous_json == instance_json: if previous_json == instance_json:
# Pas de log s'il n'y a pas de modification # Pas de log s'il n'y a pas de modification
@ -115,7 +116,7 @@ def delete_object(sender, instance, **kwargs):
model = instance.__class__ model = instance.__class__
fields = '__all__' fields = '__all__'
instance_json = JSONRenderer().render(CustomSerializer(instance).data) instance_json = JSONRenderer().render(CustomSerializer(instance).data).decode("UTF-8")
Changelog.objects.create(user=user, Changelog.objects.create(user=user,
ip=ip, ip=ip,

View File

@ -140,6 +140,7 @@ REST_FRAMEWORK = {
'rest_framework.permissions.DjangoModelPermissions' 'rest_framework.permissions.DjangoModelPermissions'
], ],
'DEFAULT_AUTHENTICATION_CLASSES': [ 'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.TokenAuthentication', 'rest_framework.authentication.TokenAuthentication',
] ]
} }