Skip to content

Commit

Permalink
add SafeTokenAuthentication for getting programs and articles weather…
Browse files Browse the repository at this point in the history
… 403 error
  • Loading branch information
AmooHashem committed May 8, 2024
1 parent a0771bd commit 51d10e7
Show file tree
Hide file tree
Showing 6 changed files with 48 additions and 55 deletions.
4 changes: 2 additions & 2 deletions apps/fsm/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

from .views.answer_view import UploadAnswerViewSet, AnswerViewSet
from .views.article_view import ArticleViewSet, say_hello
from .views.event_view import EventViewSet
from .views.program_view import ProgramViewSet
from .views.fsm_view import *
from .views.edge_view import *
from .views.registration_receipt_view import RegistrationReceiptViewSet
Expand All @@ -20,7 +20,7 @@
path("test/" , say_hello)
]

router.register(r'event', EventViewSet, basename='events')
router.register(r'event', ProgramViewSet, basename='events')
router.register(r'fsm', FSMViewSet, basename='fsms')
router.register(r'article', ArticleViewSet, basename='articles')

Expand Down
19 changes: 17 additions & 2 deletions apps/fsm/utils.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
from io import BytesIO
import requests
from rest_framework_simplejwt.authentication import JWTAuthentication
from io import BytesIO
from django.core.files.uploadedfile import InMemoryUploadedFile
import os
from django.db.models import Q

from apps.fsm.models import FSM, Edge


def _get_fsm_edges(fsm: FSM) -> list[Edge]:
return Edge.objects.filter(Q(tail__fsm=fsm) | Q(head__fsm=fsm))


def get_django_file(url: str):
Expand All @@ -20,3 +27,11 @@ def get_django_file(url: str):
file_io, None, file_name, file_type, file_size, None)

return django_file


class SafeTokenAuthentication(JWTAuthentication):
def authenticate(self, request):
try:
return super().authenticate(request=request)
except:
return None
17 changes: 13 additions & 4 deletions apps/fsm/views/article_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,17 @@
from drf_yasg.utils import swagger_auto_schema
from rest_framework import viewsets, status
from django.views.decorators.cache import cache_page
from rest_framework.decorators import action , api_view
from rest_framework.decorators import action
from rest_framework.permissions import AllowAny
from rest_framework.response import Response
from django_filters.rest_framework import DjangoFilterBackend
from django.utils.decorators import method_decorator
from django.http import JsonResponse

from apps.fsm.models import Article
from apps.fsm.permissions import IsArticleModifier
from apps.fsm.serializers.paper_serializers import ArticleSerializer, ChangeWidgetOrderSerializer
from apps.fsm.utils import SafeTokenAuthentication

from django.http import JsonResponse

@cache_page(60 * 1, key_prefix="site1")
def say_hello(request):
Expand All @@ -23,13 +24,17 @@ def say_hello(request):
return JsonResponse({"message": data})



class ArticleViewSet(viewsets.ModelViewSet):
serializer_class = ArticleSerializer
queryset = Article.objects.all()
my_tags = ['articles']
filterset_fields = ['website', 'is_private']

def get_authenticators(self):
if self.request.method == 'GET':
self.authentication_classes = [SafeTokenAuthentication]
return super().get_authenticators()

def get_serializer_class(self):
try:
return self.serializer_action_classes[self.action]
Expand Down Expand Up @@ -59,3 +64,7 @@ def change_order(self, request, pk=None):
if serializer.is_valid(raise_exception=True):
self.get_object().set_widget_order(serializer.validated_data.get('order'))
return Response(data=ArticleSerializer(self.get_object()).data, status=status.HTTP_200_OK)

@method_decorator(cache_page(60 * 1, key_prefix="article"))
def list(self, request, *args, **kwargs):
return super().list(self, request, *args, **kwargs)
36 changes: 5 additions & 31 deletions apps/fsm/views/fsm_view.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
from django.db import transaction
from django.db.models import Q
from django.utils import timezone
from django.views.decorators.cache import cache_page
from django_filters.rest_framework import DjangoFilterBackend
from django.utils.decorators import method_decorator
from drf_yasg.utils import swagger_auto_schema
from rest_framework import status
Expand All @@ -14,8 +12,9 @@

from apps.accounts.serializers import AccountSerializer
from apps.accounts.utils import find_user
from apps.fsm.utils import _get_fsm_edges
from errors.error_codes import serialize_error
from apps.fsm.models import AnswerSheet, RegistrationReceipt, FSM, PlayerHistory, Player, Edge, RegistrationReceipt, Problem
from apps.fsm.models import AnswerSheet, RegistrationReceipt, FSM, PlayerHistory, Player, RegistrationReceipt, Problem
from apps.fsm.permissions import MentorPermission, HasActiveRegistration
from apps.fsm.serializers.fsm_serializers import FSMMinimalSerializer, FSMSerializer, KeySerializer, EdgeSerializer, \
TeamGetSerializer
Expand All @@ -37,7 +36,7 @@ def get_permissions(self):
if self.action in ['partial_update', 'update', 'destroy', 'add_mentor', 'get_states', 'get_edges',
'get_player_from_team', 'activate', 'players']:
permission_classes = [MentorPermission]
elif self.action in ['enter', 'get_self', 'review']:
elif self.action in ['enter', 'review']:
permission_classes = [HasActiveRegistration]
else:
permission_classes = self.permission_classes
Expand Down Expand Up @@ -107,19 +106,6 @@ def enter(self, request, pk=None):
return Response(PlayerSerializer(context=self.get_serializer_context()).to_representation(player),
status=status.HTTP_200_OK)

# @swagger_auto_schema(responses={200: PlayerSerializer}, tags=['player'])
# @transaction.atomic
# @action(detail=True, methods=['get'])
# def get_self(self, request, pk=None):
# fsm = self.get_object()
# user = self.request.user
# player = get_player(user, fsm)
# if player:
# return Response(PlayerSerializer(context=self.get_serializer_context()).to_representation(player),
# status=status.HTTP_200_OK)
# else:
# raise NotFound(serialize_error('4081'))

@swagger_auto_schema(responses={200: MockWidgetSerializer}, tags=['player', 'fsm'])
@transaction.atomic
@action(detail=True, methods=['get'])
Expand Down Expand Up @@ -244,18 +230,6 @@ def activate(self, request, pk=None):
return Response(data={'new_players_count': len(f.players.all()), 'previous_players_count': previous_players},
status=status.HTTP_200_OK)

@method_decorator(cache_page(60 * 1 , key_prefix="fsm"))
@method_decorator(cache_page(60 * 1, key_prefix="fsm"))
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())

page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)

serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)


def _get_fsm_edges(fsm: FSM) -> list[Edge]:
return Edge.objects.filter(Q(tail__fsm=fsm) | Q(head__fsm=fsm))
return super().list(self, request, *args, **kwargs)
23 changes: 10 additions & 13 deletions apps/fsm/views/event_view.py → apps/fsm/views/program_view.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from rest_framework import permissions, status
from rest_framework import permissions
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
from django.views.decorators.cache import cache_page
Expand All @@ -7,14 +7,20 @@
from django.utils.decorators import method_decorator

from apps.fsm.serializers.program_serializers import ProgramSerializer
from apps.fsm.utils import SafeTokenAuthentication


class EventViewSet(ModelViewSet):
class ProgramViewSet(ModelViewSet):
serializer_class = ProgramSerializer
queryset = Event.objects.all()
my_tags = ['event']
filterset_fields = ['website', 'is_private']

def get_authenticators(self):
if self.request.method == 'GET':
self.authentication_classes = [SafeTokenAuthentication]
return super().get_authenticators()

def get_serializer_context(self):
context = super().get_serializer_context()
context.update({'user': self.request.user})
Expand All @@ -31,15 +37,6 @@ def get_permissions(self):
permission_classes = [IsEventModifier]
return [permission() for permission in permission_classes]

@method_decorator(cache_page(60 * 1, key_prefix="event"))
@method_decorator(cache_page(60 * 1, key_prefix="program"))
def list(self, request, *args, **kwargs):
print("hjk")
queryset = self.filter_queryset(self.get_queryset())

page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)

serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
return super().list(self, request, *args, **kwargs)
4 changes: 1 addition & 3 deletions apps/roadmap/utils.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@

from apps.fsm.views.fsm_view import _get_fsm_edges

from apps.fsm.utils import _get_fsm_edges
from apps.roadmap.models import Link
from apps.fsm.models import FSM, Player, PlayerHistory, State

Expand Down

0 comments on commit 51d10e7

Please sign in to comment.