Skip to content

Commit

Permalink
feat: add a function for transiting to a state
Browse files Browse the repository at this point in the history
  • Loading branch information
AmooHashem committed Oct 14, 2024
1 parent 82efd3c commit 8a3478d
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 2 deletions.
6 changes: 6 additions & 0 deletions apps/fsm/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,12 @@ def transit_player_in_fsm(player: Player, source_state: State, target_state: Sta
player.last_visit = transition_time
player.save()

if edge is None:
edge = Edge.objects.filter(tail=source_state, head=target_state) or \
Edge.objects.filter(tail=target_state, head=source_state)
if edge.count() > 0:
edge = edge.first()

player_transition = PlayerTransition.objects.create(
player=player,
source_state=source_state,
Expand Down
2 changes: 1 addition & 1 deletion apps/fsm/views/fsm_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ def enter_fsm(self, request, pk=None):
serializer.is_valid(raise_exception=True)
player = serializer.save()
transit_player_in_fsm(
player=player, source_state=None, target_state=fsm.first_state, edge=None)
player=player, source_state=None, target_state=fsm.first_state)

# if any state has been deleted and player has no current state:
if player.current_state is None:
Expand Down
35 changes: 34 additions & 1 deletion apps/fsm/views/player_view.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from django.shortcuts import get_object_or_404
from django.db import transaction
from drf_yasg.utils import swagger_auto_schema
from rest_framework import status
Expand All @@ -8,6 +9,7 @@
from rest_framework.permissions import IsAuthenticated
from rest_framework import viewsets

from apps.fsm.models.fsm import State
from errors.error_codes import serialize_error
from errors.exceptions import InternalServerError
from apps.fsm.models import FSM, Player
Expand Down Expand Up @@ -69,7 +71,7 @@ def go_backward(self, request, pk):
player = transit_player_in_fsm(
player, edge.head, edge.tail, edge)
return Response(status=status.HTTP_202_ACCEPTED)

else:
raise InternalServerError('Not implemented Yet😎')

Expand All @@ -92,3 +94,34 @@ def mentor_move_backward(self, request, pk):

else:
raise InternalServerError('Not implemented Yet😎')

@swagger_auto_schema(responses={200: PlayerSerializer}, tags=['player'])
@action(detail=True, methods=['get'], permission_classes=[IsAuthenticated], url_path='transit-to-state')
def transit_to_state(self, request):
state_id = request.data.get('state')
state = get_object_or_404(State, id=state_id)
player = Player.objects.filter(user=request.user, fsm=state.fsm)
if player is None:
Player.objects.create(
user=request.user,
fsm=state.fsm,
current_state=state,
)

if not is_transition_permitted(player.current_state, state):
# todo
pass

transit_player_in_fsm(
player=player,
source_state=player.current_state,
target_state=state,
)

return Response(status=status.HTTP_204_NO_CONTENT)


def is_transition_permitted(source_state: State, target_state: State):
if source_state.id == target_state.id:
return True
return True

0 comments on commit 8a3478d

Please sign in to comment.