mirror of
https://gitlab.crans.org/bde/nk20
synced 2025-12-11 05:57:51 +01:00
Compare commits
2 Commits
qrcode-tot
...
api-update
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e0a2cb1d62 | ||
|
|
412ea7b609 |
@@ -30,16 +30,12 @@ class ActivityViewSet(ReadProtectedModelViewSet):
|
|||||||
The djangorestframework plugin will get all `Activity` objects, serialize it to JSON with the given serializer,
|
The djangorestframework plugin will get all `Activity` objects, serialize it to JSON with the given serializer,
|
||||||
then render it on /api/activity/activity/
|
then render it on /api/activity/activity/
|
||||||
"""
|
"""
|
||||||
queryset = Activity.objects.order_by('id')
|
queryset = Activity.objects.order_by('-date_start')
|
||||||
serializer_class = ActivitySerializer
|
serializer_class = ActivitySerializer
|
||||||
filter_backends = [DjangoFilterBackend, RegexSafeSearchFilter]
|
filter_backends = [DjangoFilterBackend, RegexSafeSearchFilter]
|
||||||
filterset_fields = ['name', 'description', 'activity_type', 'location', 'creater', 'organizer', 'attendees_club',
|
filterset_fields = ['name', 'description', 'activity_type', 'location', 'creater', 'organizer', 'attendees_club',
|
||||||
'date_start', 'date_end', 'valid', 'open', ]
|
'date_start', 'date_end', 'valid', 'open', ]
|
||||||
search_fields = ['$name', '$description', '$location', '$creater__last_name', '$creater__first_name',
|
search_fields = ['$name', '$description', '$location', '$organizer__name', ]
|
||||||
'$creater__email', '$creater__note__alias__name', '$creater__note__alias__normalized_name',
|
|
||||||
'$organizer__name', '$organizer__email', '$organizer__note__alias__name',
|
|
||||||
'$organizer__note__alias__normalized_name', '$attendees_club__name', '$attendees_club__email',
|
|
||||||
'$attendees_club__note__alias__name', '$attendees_club__note__alias__normalized_name', ]
|
|
||||||
|
|
||||||
|
|
||||||
class GuestViewSet(ReadProtectedModelViewSet):
|
class GuestViewSet(ReadProtectedModelViewSet):
|
||||||
|
|||||||
@@ -89,11 +89,3 @@ class OAuthSerializer(serializers.ModelSerializer):
|
|||||||
'note',
|
'note',
|
||||||
'memberships',
|
'memberships',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class QRCodeCheckSerializer(serializers.Serializer):
|
|
||||||
data = serializers.CharField(
|
|
||||||
label="Données du QR Code",
|
|
||||||
help_text="Le contenu brut lu depuis le QR Code (Username + Token)",
|
|
||||||
required=True
|
|
||||||
)
|
|
||||||
|
|||||||
@@ -3,18 +3,17 @@
|
|||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.conf.urls import include
|
from django.conf.urls import include
|
||||||
from django.urls import re_path, path
|
from django.urls import re_path
|
||||||
from rest_framework import routers
|
from rest_framework import routers
|
||||||
|
|
||||||
from .views import UserInformationView
|
from .views import UserInformationView
|
||||||
from .viewsets import ContentTypeViewSet, UserViewSet, QRCodeVerificationViewSet
|
from .viewsets import ContentTypeViewSet, UserViewSet
|
||||||
|
|
||||||
# Routers provide an easy way of automatically determining the URL conf.
|
# Routers provide an easy way of automatically determining the URL conf.
|
||||||
# Register each app API router and user viewset
|
# Register each app API router and user viewset
|
||||||
router = routers.DefaultRouter()
|
router = routers.DefaultRouter()
|
||||||
router.register('models', ContentTypeViewSet)
|
router.register('models', ContentTypeViewSet)
|
||||||
router.register('user', UserViewSet)
|
router.register('user', UserViewSet)
|
||||||
router.register('check_qrcode', QRCodeVerificationViewSet, basename='check_qrcode')
|
|
||||||
|
|
||||||
if "activity" in settings.INSTALLED_APPS:
|
if "activity" in settings.INSTALLED_APPS:
|
||||||
from activity.api.urls import register_activity_urls
|
from activity.api.urls import register_activity_urls
|
||||||
@@ -62,7 +61,6 @@ app_name = 'api'
|
|||||||
# Additionally, we include login URLs for the browsable API.
|
# Additionally, we include login URLs for the browsable API.
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
re_path('^', include(router.urls)),
|
re_path('^', include(router.urls)),
|
||||||
path('me/', UserInformationView.as_view({'get': 'retrieve'})),
|
re_path('^me/', UserInformationView.as_view()),
|
||||||
path('me/qrcode/', UserInformationView.as_view({'get': 'qrcode'})),
|
|
||||||
re_path('^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
|
re_path('^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,19 +1,13 @@
|
|||||||
# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay
|
# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
import base64
|
|
||||||
import os
|
|
||||||
from io import BytesIO
|
|
||||||
|
|
||||||
import qrcode
|
|
||||||
import pyotp
|
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from django.http.response import HttpResponse
|
from rest_framework.generics import RetrieveAPIView
|
||||||
from rest_framework import viewsets, mixins
|
|
||||||
|
|
||||||
from .serializers import OAuthSerializer
|
from .serializers import OAuthSerializer
|
||||||
|
|
||||||
|
|
||||||
class UserInformationView(mixins.RetrieveModelMixin, viewsets.GenericViewSet):
|
class UserInformationView(RetrieveAPIView):
|
||||||
"""
|
"""
|
||||||
These fields are give to OAuth authenticators.
|
These fields are give to OAuth authenticators.
|
||||||
"""
|
"""
|
||||||
@@ -24,11 +18,3 @@ class UserInformationView(mixins.RetrieveModelMixin, viewsets.GenericViewSet):
|
|||||||
|
|
||||||
def get_object(self):
|
def get_object(self):
|
||||||
return self.request.user
|
return self.request.user
|
||||||
|
|
||||||
def qrcode(self, request, *args, **kwargs):
|
|
||||||
secret = base64.b32encode(os.getenv("DJANGO_SECRET_KEY").encode())
|
|
||||||
qr_img = qrcode.make(f"{str(request.user.note)}{pyotp.TOTP(secret, interval=30).now()}")
|
|
||||||
buffer = BytesIO()
|
|
||||||
qr_img.save(buffer, format="PNG")
|
|
||||||
buffer.seek(0)
|
|
||||||
return HttpResponse(buffer, content_type="image/png")
|
|
||||||
|
|||||||
@@ -2,22 +2,18 @@
|
|||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
import re
|
import re
|
||||||
import base64
|
|
||||||
import os
|
|
||||||
|
|
||||||
import pyotp
|
|
||||||
from django.contrib.contenttypes.models import ContentType
|
from django.contrib.contenttypes.models import ContentType
|
||||||
from django_filters.rest_framework import DjangoFilterBackend
|
from django_filters.rest_framework import DjangoFilterBackend
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from rest_framework.viewsets import ReadOnlyModelViewSet, ModelViewSet, GenericViewSet
|
from rest_framework.viewsets import ReadOnlyModelViewSet, ModelViewSet
|
||||||
from rest_framework.response import Response
|
|
||||||
from permission.backends import PermissionBackend
|
from permission.backends import PermissionBackend
|
||||||
from note.models import Alias
|
from note.models import Alias
|
||||||
|
|
||||||
from .filters import RegexSafeSearchFilter
|
from .filters import RegexSafeSearchFilter
|
||||||
from .serializers import UserSerializer, ContentTypeSerializer, QRCodeCheckSerializer
|
from .serializers import UserSerializer, ContentTypeSerializer
|
||||||
|
|
||||||
|
|
||||||
def is_regex(pattern):
|
def is_regex(pattern):
|
||||||
@@ -128,17 +124,3 @@ class ContentTypeViewSet(ReadOnlyModelViewSet):
|
|||||||
filter_backends = [DjangoFilterBackend, RegexSafeSearchFilter]
|
filter_backends = [DjangoFilterBackend, RegexSafeSearchFilter]
|
||||||
filterset_fields = ['id', 'app_label', 'model', ]
|
filterset_fields = ['id', 'app_label', 'model', ]
|
||||||
search_fields = ['$app_label', '$model', ]
|
search_fields = ['$app_label', '$model', ]
|
||||||
|
|
||||||
|
|
||||||
class QRCodeVerificationViewSet(GenericViewSet):
|
|
||||||
serializer_class = QRCodeCheckSerializer
|
|
||||||
queryset = User.objects.none()
|
|
||||||
|
|
||||||
def get_view_name(self):
|
|
||||||
return "Vérification QR Code"
|
|
||||||
|
|
||||||
def create(self, request, *args, **kwargs):
|
|
||||||
serializer = self.get_serializer(data=request.data)
|
|
||||||
serializer.is_valid(raise_exception=True)
|
|
||||||
secret = base64.b32encode(os.getenv("DJANGO_SECRET_KEY").encode())
|
|
||||||
return Response({'valid': pyotp.TOTP(secret, interval=30).verify(serializer.validated_data['data'][-6:])})
|
|
||||||
|
|||||||
@@ -20,5 +20,3 @@ python-memcached~=1.62
|
|||||||
phonenumbers~=9.0.8
|
phonenumbers~=9.0.8
|
||||||
tablib~=3.8.0
|
tablib~=3.8.0
|
||||||
Pillow>=11.3.0
|
Pillow>=11.3.0
|
||||||
pyotp~=2.9.0
|
|
||||||
qrcode~=8.2
|
|
||||||
Reference in New Issue
Block a user