Skip to content

Commit

Permalink
change PLayerHistory model for jump feature
Browse files Browse the repository at this point in the history
  • Loading branch information
AmooHashem committed May 11, 2024
1 parent 6742335 commit 02ea58f
Show file tree
Hide file tree
Showing 8 changed files with 83 additions and 28 deletions.
4 changes: 2 additions & 2 deletions apps/fsm/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,9 @@ class UploadFileAnswerAdmin(admin.ModelAdmin):
class PlayerHistoryAdmin(ExportActionMixin, admin.ModelAdmin):
model = PlayerHistory
list_display = ['player', 'state', 'start_time', 'end_time',
'entered_by_edge', 'reverse_enter', 'delta_time']
'passed_edge', 'is_edge_passed_in_reverse', 'delta_time']
list_filter = ['start_time', 'end_time',
'state__fsm', 'state', 'entered_by_edge']
'state__fsm', 'state', 'passed_edge']

def delta_time(self, obj):
if (obj.end_time and obj.start_time):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Generated by Django 4.1.3 on 2024-05-11 22:41

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
('fsm', '0111_alter_registrationform_has_certificate'),
]

operations = [
migrations.RenameField(
model_name='playerhistory',
old_name='reverse_enter',
new_name='is_edge_passed_in_reverse',
),
migrations.AlterField(
model_name='playerhistory',
name='entered_by_edge',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='players_histories', to='fsm.edge'),
),
migrations.AlterField(
model_name='playerhistory',
name='state',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='players_histories', to='fsm.state'),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Generated by Django 4.1.3 on 2024-05-11 22:53

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('fsm', '0112_rename_reverse_enter_playerhistory_is_edge_passed_in_reverse_and_more'),
]

operations = [
migrations.RenameField(
model_name='playerhistory',
old_name='entered_by_edge',
new_name='passed_edge',
),
migrations.AlterField(
model_name='playerhistory',
name='is_edge_passed_in_reverse',
field=models.BooleanField(blank=True, default=False, null=True),
),
]
17 changes: 10 additions & 7 deletions apps/fsm/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,6 @@ class EventType(models.TextChoices):
'ProgramContactInfo', on_delete=models.SET_NULL, related_name='program', blank=True, null=True)
is_visible = models.BooleanField(default=True)


def __str__(self):
return self.name

Expand Down Expand Up @@ -407,12 +406,12 @@ class PlayerHistory(models.Model):
player = models.ForeignKey(
'fsm.Player', on_delete=models.CASCADE, related_name='histories')
state = models.ForeignKey(
State, on_delete=models.CASCADE, related_name='player_histories')
State, on_delete=models.SET_NULL, related_name='players_histories', null=True, blank=True)
start_time = models.DateTimeField(null=True, blank=True)
end_time = models.DateTimeField(null=True, blank=True)
entered_by_edge = models.ForeignKey(Edge, related_name='histories', default=None, null=True, blank=True,
on_delete=models.SET_NULL)
reverse_enter = models.BooleanField(default=False)
passed_edge = models.ForeignKey(Edge, related_name='players_histories', null=True, blank=True,
on_delete=models.SET_NULL)
is_edge_passed_in_reverse = models.BooleanField(default=False, null=True, blank=True)

def __str__(self):
return f'{self.player.id}-{self.state.name}'
Expand Down Expand Up @@ -481,11 +480,15 @@ class CorrectionStatus(models.TextChoices):
status = models.CharField(max_length=25, blank=False,
default='Waiting', choices=RegistrationStatus.choices)
is_participating = models.BooleanField(default=False)
team = models.ForeignKey('fsm.Team', on_delete=models.SET_NULL,
related_name='members', null=True, blank=True)
certificate = models.FileField(
upload_to='certificates/', null=True, blank=True, default=None)

team = models.ForeignKey('fsm.Team', on_delete=models.SET_NULL,
related_name='members', null=True, blank=True)

def get_player_of(self, fsm: FSM):
return self.players.filter(fsm=fsm).first()

@property
def purchases(self):
if self.answer_sheet_of.event_or_fsm.merchandise:
Expand Down
10 changes: 5 additions & 5 deletions apps/fsm/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,8 @@ def move_on_edge(player:Player, edge:Edge, departure_time, is_forward):
if last_state_history:
last_state_history.end_time = departure_time
last_state_history.save()
PlayerHistory.objects.create(player=player, state=edge.head if is_forward else edge.tail, entered_by_edge=edge,
start_time=departure_time, reverse_enter=not is_forward)
PlayerHistory.objects.create(player=player, state=edge.head if is_forward else edge.tail, passed_edge=edge,
start_time=departure_time, is_edge_passed_in_reverse=not is_forward)
return player


Expand All @@ -98,10 +98,10 @@ def get_a_player_from_team(team, fsm):

def get_player_latest_taken_edge(player: Player):
latest_history = player.histories.filter(
reverse_enter=False, state=player.current_state).last()
is_edge_passed_in_reverse=False, state=player.current_state).last()

if latest_history and latest_history.entered_by_edge:
last_taken_edge = latest_history.entered_by_edge
if latest_history and latest_history.passed_edge:
last_taken_edge = latest_history.passed_edge
else:
# if the latest hostory is deleted, choose an inward_edges randomly
last_taken_edge = player.current_state.inward_edges.all().first()
Expand Down
12 changes: 6 additions & 6 deletions apps/fsm/views/edge_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ def go_forward(self, request, pk):

departure_time = timezone.now()
for member in team.members.all():
player = member.players.filter(fsm=fsm).first()
player = member.get_player_of(fsm=fsm)
if player:
player = move_on_edge(
player, edge, departure_time, is_forward=True)
Expand Down Expand Up @@ -109,16 +109,16 @@ def go_forward(self, request, pk):
@transaction.atomic
@action(detail=True, methods=['post'], serializer_class=TeamGetSerializer)
def mentor_move_forward(self, request, pk):
serializer = TeamGetSerializer(
data=self.request.data, context=self.get_serializer_context())
serializer.is_valid(raise_exception=True)
team: Team = serializer.validated_data['team']
edge = self.get_object()
fsm = edge.tail.fsm

serializer = TeamGetSerializer(
data=request.data, context=self.get_serializer_context())
serializer.is_valid(raise_exception=True)
team: Team = serializer.validated_data['team']
if team:
for member in team.members.all():
player = member.players.filter(fsm=fsm).first()
player = member.get_player_of(fsm=fsm)
if player:
player = move_on_edge(
player, edge, departure_time=timezone.now(), is_forward=True)
Expand Down
4 changes: 2 additions & 2 deletions apps/fsm/views/player_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ def go_backward(self, request, pk):
if player.current_state == edge.head:
departure_time = timezone.now()
for member in team.members.all():
player = member.players.filter(fsm=fsm).first()
player = member.get_player_of(fsm=fsm)
if player:
player = move_on_edge(
player, edge, departure_time, is_forward=False)
Expand Down Expand Up @@ -106,7 +106,7 @@ def mentor_move_backward(self, request, pk):

departure_time = timezone.now()
for member in team.members.all():
player = member.players.filter(fsm=fsm).first()
player = member.get_player_of(fsm=fsm)
if player:
player = move_on_edge(
player, edge, departure_time, is_forward=False)
Expand Down
12 changes: 6 additions & 6 deletions apps/roadmap/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ def _get_player_taken_path(player_id: int):
for i in range(100):
previous_state = _get_previous_taken_state(
player_current_state, histories)
# if the entered_by_edge is deleted, it isn't possible to reach to previous state
# if the passed_edge is deleted, it isn't possible to reach to previous state
if not previous_state:
break
taken_path.append(Link.get_link_from_states(
Expand All @@ -35,11 +35,11 @@ def _get_player_taken_path(player_id: int):

def _get_previous_taken_state(player_current_state: State, histories: list[PlayerHistory]):
for history in histories:
if history.reverse_enter:
if history.is_edge_passed_in_reverse:
continue
# if the entered_by_edge is deleted:
if not history.entered_by_edge:
# if the passed_edge is deleted:
if not history.passed_edge:
continue
if history.entered_by_edge.head == player_current_state:
return history.entered_by_edge.tail
if history.passed_edge.head == player_current_state:
return history.passed_edge.tail
return None

0 comments on commit 02ea58f

Please sign in to comment.