Skip to content

Commit

Permalink
init PlayerTransition model and sync it with PlayerStateHistory
Browse files Browse the repository at this point in the history
  • Loading branch information
AmooHashem committed May 13, 2024
1 parent 02ea58f commit 7cfdf9c
Show file tree
Hide file tree
Showing 16 changed files with 284 additions and 52 deletions.
4 changes: 2 additions & 2 deletions apps/accounts/management/commands/create_players.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

from django.utils import timezone

from apps.fsm.models import RegistrationReceipt, Event, Player, PlayerHistory
from apps.fsm.models import RegistrationReceipt, Event, Player, PlayerStateHistory
from .users import users

logger = logging.getLogger(__file__)
Expand All @@ -19,6 +19,6 @@ def handle(self, *args, **options):
for r in RegistrationReceipt.objects.filter(is_participating=True):
if len(Player.objects.filter(user=r.user, fsm=f, receipt=r)) <= 0:
p = Player.objects.create(user=r.user, fsm=f, receipt=r, current_state=f.first_state, last_visit=timezone.now())
PlayerHistory.objects.create(player=p, state=f.first_state, start_time=p.last_visit)
PlayerStateHistory.objects.create(player=p, state=f.first_state, start_time=p.last_visit)

self.stdout.write(self.style.SUCCESS(f'created_for {r.user.username} & {f.name}'))
18 changes: 9 additions & 9 deletions apps/fsm/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from apps.fsm.models import Choice, DetailBoxWidget, Edge, Paper, ProgramContactInfo, RegistrationForm, Problem, AnswerSheet, RegistrationReceipt, Team, \
Invitation, CertificateTemplate, Font, FSM, State, WidgetHint, Hint, Widget, Video, Audio, Image, Player, Iframe, SmallAnswerProblem, \
SmallAnswer, BigAnswerProblem, BigAnswer, MultiChoiceProblem, MultiChoiceAnswer, Answer, TextWidget, Event, \
UploadFileAnswer, UploadFileProblem, PlayerHistory, Article, Tag, Aparat
UploadFileAnswer, UploadFileProblem, PlayerStateHistory, Article, Tag, Aparat

from apps.fsm.utils import get_django_file

Expand Down Expand Up @@ -44,15 +44,15 @@ class UploadFileAnswerAdmin(admin.ModelAdmin):


class PlayerHistoryAdmin(ExportActionMixin, admin.ModelAdmin):
model = PlayerHistory
list_display = ['player', 'state', 'start_time', 'end_time',
'passed_edge', 'is_edge_passed_in_reverse', 'delta_time']
list_filter = ['start_time', 'end_time',
'state__fsm', 'state', 'passed_edge']
model = PlayerStateHistory
list_display = ['player', 'state', 'arrival_time', 'departure_time',
'transited_edge', 'is_edge_transited_in_reverse', 'delta_time']
list_filter = ['arrival_time', 'departure_time',
'state__fsm', 'state', 'transited_edge']

def delta_time(self, obj):
if (obj.end_time and obj.start_time):
return obj.end_time - obj.start_time
if (obj.departure_time and obj.arrival_time):
return obj.departure_time - obj.arrival_time
return "-"


Expand Down Expand Up @@ -526,7 +526,7 @@ class UploadFileProblemCustomAdmin(admin.ModelAdmin):
admin.site.register(TextWidget, TextWidgetAdmin)
admin.site.register(DetailBoxWidget, DetailBoxWidgetAdmin)
admin.site.register(Player, PlayerAdmin)
admin.site.register(PlayerHistory, PlayerHistoryAdmin)
admin.site.register(PlayerStateHistory, PlayerHistoryAdmin)
admin.site.register(Widget, WidgetAdmin)
admin.site.register(UploadFileAnswer, UploadFileAnswerAdmin)
admin.site.register(Tag)
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Generated by Django 4.1.3 on 2024-05-13 12:21

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


class Migration(migrations.Migration):

dependencies = [
('fsm', '0113_rename_entered_by_edge_playerhistory_passed_edge_and_more'),
]

operations = [
migrations.RenameField(
model_name='playerhistory',
old_name='is_edge_passed_in_reverse',
new_name='is_edge_transited_in_reverse',
),
migrations.RenameField(
model_name='playerhistory',
old_name='passed_edge',
new_name='transited_edge',
),
migrations.AddField(
model_name='playerhistory',
name='source_state',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='source_of_players_transitions', to='fsm.state'),
),
migrations.AlterField(
model_name='playerhistory',
name='state',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='target_of_players_transitions', to='fsm.state'),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 4.1.3 on 2024-05-13 12:21

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('fsm', '0114_rename_is_edge_passed_in_reverse_playerhistory_is_edge_transited_in_reverse_and_more'),
]

operations = [
migrations.RenameField(
model_name='playerhistory',
old_name='state',
new_name='target_state',
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 4.1.3 on 2024-05-13 13:43

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('fsm', '0115_rename_state_playerhistory_target_state'),
]

operations = [
migrations.AlterField(
model_name='playerhistory',
name='is_edge_transited_in_reverse',
field=models.BooleanField(blank=True, null=True),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Generated by Django 4.1.3 on 2024-05-13 13:46

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('fsm', '0116_alter_playerhistory_is_edge_transited_in_reverse'),
]

operations = [
migrations.RenameField(
model_name='playerhistory',
old_name='target_state',
new_name='state',
),
migrations.RemoveField(
model_name='playerhistory',
name='source_state',
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 4.1.3 on 2024-05-13 13:48

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('fsm', '0117_rename_target_state_playerhistory_state_and_more'),
]

operations = [
migrations.RenameModel(
old_name='PlayerHistory',
new_name='PlayerStateHistory',
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Generated by Django 4.1.3 on 2024-05-13 13:57

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


class Migration(migrations.Migration):

dependencies = [
('fsm', '0118_rename_playerhistory_playerstatehistory'),
]

operations = [
migrations.AlterField(
model_name='playerstatehistory',
name='end_time',
field=models.DateTimeField(null=True),
),
migrations.AlterField(
model_name='playerstatehistory',
name='start_time',
field=models.DateTimeField(auto_now=True),
),
migrations.AlterField(
model_name='playerstatehistory',
name='state',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='player_state_histories', to='fsm.state'),
),
migrations.AlterField(
model_name='playerstatehistory',
name='transited_edge',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='player_histories', to='fsm.edge'),
),
]
25 changes: 25 additions & 0 deletions apps/fsm/migrations/0120_playertransitionhistory.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Generated by Django 4.1.3 on 2024-05-13 13:57

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


class Migration(migrations.Migration):

dependencies = [
('fsm', '0119_alter_playerstatehistory_end_time_and_more'),
]

operations = [
migrations.CreateModel(
name='PlayerTransitionHistory',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('time', models.DateTimeField(auto_now=True)),
('is_edge_transited_in_reverse', models.BooleanField(blank=True, null=True)),
('source_state', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='source_of_player_transitions', to='fsm.state')),
('target_state', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='target_of_player_transitions', to='fsm.state')),
('transited_edge', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='player_transition_histories', to='fsm.edge')),
],
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Generated by Django 4.1.3 on 2024-05-13 14:02

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('fsm', '0120_playertransitionhistory'),
]

operations = [
migrations.RenameField(
model_name='playerstatehistory',
old_name='start_time',
new_name='arrival_time',
),
migrations.RenameField(
model_name='playerstatehistory',
old_name='end_time',
new_name='departure_time',
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Generated by Django 4.1.3 on 2024-05-13 14:15

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


class Migration(migrations.Migration):

dependencies = [
('fsm', '0121_rename_start_time_playerstatehistory_arrival_time_and_more'),
]

operations = [
migrations.RenameModel(
old_name='PlayerTransitionHistory',
new_name='PlayerTransition',
),
migrations.AddField(
model_name='playerstatehistory',
name='arrival',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='state_arrival_history', to='fsm.playertransition'),
),
migrations.AddField(
model_name='playerstatehistory',
name='departure',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='state_departure_history', to='fsm.playertransition'),
),
]
33 changes: 24 additions & 9 deletions apps/fsm/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -402,27 +402,42 @@ def __str__(self):
return f'از {self.tail.name} به {self.head.name}'


class PlayerHistory(models.Model):
class PlayerTransition(models.Model):
source_state = models.ForeignKey(
State, on_delete=models.SET_NULL, related_name='source_of_player_transitions', null=True)
target_state = models.ForeignKey(
State, on_delete=models.SET_NULL, related_name='target_of_player_transitions', null=True)
time = models.DateTimeField(auto_now_add=True)
transited_edge = models.ForeignKey(Edge, related_name='player_transition_histories', null=True, blank=True,
on_delete=models.SET_NULL)
is_edge_transited_in_reverse = models.BooleanField(null=True, blank=True)


class PlayerStateHistory(models.Model):
player = models.ForeignKey(
'fsm.Player', on_delete=models.CASCADE, related_name='histories')
state = models.ForeignKey(
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)
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)
State, on_delete=models.SET_NULL, related_name='player_state_histories', null=True, blank=True)
arrival = models.ForeignKey(
PlayerTransition, on_delete=models.SET_NULL, null=True, related_name='state_arrival_history')
departure = models.ForeignKey(
PlayerTransition, on_delete=models.SET_NULL, null=True, related_name='state_departure_history')
arrival_time = models.DateTimeField(auto_now_add=True)
departure_time = models.DateTimeField(null=True)
transited_edge = models.ForeignKey(Edge, related_name='player_histories', null=True, blank=True,
on_delete=models.SET_NULL)
is_edge_transited_in_reverse = models.BooleanField(null=True, blank=True)

def __str__(self):
return f'{self.player.id}-{self.state.name}'
return f'{self.player.id}-{self.state.name if self.state else ""}'


################ ARTICLE #################


class Tag(models.Model):
name = models.CharField(unique=True, max_length=25)
created_at = models.DateTimeField(auto_now=True)
created_at = models.DateTimeField(auto_now_add=True)

def __str__(self) -> str:
return self.name
Expand Down
4 changes: 2 additions & 2 deletions apps/fsm/serializers/player_serializer.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
from rest_framework import serializers

from apps.fsm.models import Player, PlayerHistory
from apps.fsm.models import Player, PlayerStateHistory
from apps.fsm.serializers.paper_serializers import StateSerializer
from apps.fsm.serializers.team_serializer import TeamSerializer


class PlayerHistorySerializer(serializers.ModelSerializer):
class Meta:
model = PlayerHistory
model = PlayerStateHistory
fields = '__all__'
read_only_fields = ['id']

Expand Down
Loading

0 comments on commit 7cfdf9c

Please sign in to comment.