Skip to content

Commit

Permalink
fix: fix the bug on duplicated widgets for different user players
Browse files Browse the repository at this point in the history
  • Loading branch information
AmooHashem committed Nov 17, 2024
1 parent 19b34d1 commit 76bc9a3
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 11 deletions.
2 changes: 1 addition & 1 deletion apps/widgets/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class RandomWidgetAdmin(WidgetAdmin):

@admin.register(SeenWidget)
class SeenWidgetAdmin(admin.ModelAdmin):
list_display = ['id', 'user', 'target_widget',
list_display = ['id', 'user', 'player', 'target_widget',
'container_random_widget', 'seen_at']
list_filter = ['container_random_widget', 'seen_at']
search_fields = []
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Generated by Django 4.1.3 on 2024-11-17 16:27

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


class Migration(migrations.Migration):

dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('fsm', '0232_alter_widget_widget_type'),
('widgets', '0006_randomwidget_unique_widgets_only_seenwidget_and_more'),
]

operations = [
migrations.RemoveIndex(
model_name='seenwidget',
name='widgets_see_user_id_bb79cc_idx',
),
migrations.AlterUniqueTogether(
name='seenwidget',
unique_together=set(),
),
migrations.AddField(
model_name='seenwidget',
name='player',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='seen_widget_records', to='fsm.player'),
),
migrations.AlterUniqueTogether(
name='seenwidget',
unique_together={('user', 'player', 'target_widget', 'container_random_widget')},
),
migrations.AddIndex(
model_name='seenwidget',
index=models.Index(fields=['user', 'player', 'target_widget', 'container_random_widget'], name='widgets_see_user_id_fcd409_idx'),
),
]
27 changes: 19 additions & 8 deletions apps/widgets/models/other_widgets/random.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
from apps.fsm.models.base import Widget, clone_widget
import random

from apps.fsm.models.fsm import Player


class RandomWidget(Widget):
box_paper_id = models.PositiveIntegerField()
Expand All @@ -14,7 +16,7 @@ class RandomWidget(Widget):
def clone(self, paper):
return clone_widget(self, paper)

def get_random_widget(self, user):
def get_random_widget(self, player):
from apps.fsm.models.base import Widget

# Get all widgets in the same box paper
Expand All @@ -23,8 +25,9 @@ def get_random_widget(self, user):
if self.unique_widgets_only:
# First check if user has seen any widgets through this random widget
seen_records = SeenWidget.objects.filter(
user=user,
container_random_widget=self
user=player.user,
player=player,
container_random_widget=self,
)

if seen_records.exists():
Expand All @@ -46,7 +49,8 @@ def get_random_widget(self, user):
if self.unique_widgets_only:
# Track that it was seen through this random widget
SeenWidget.objects.create(
user=user,
user=player.user,
player=player,
target_widget=random_widget,
container_random_widget=self
)
Expand All @@ -68,10 +72,16 @@ class SeenWidget(models.Model):
on_delete=models.CASCADE,
related_name="seen_widget_records",
)
player = models.ForeignKey(
Player,
on_delete=models.CASCADE,
related_name="seen_widget_records",
null=True,
)
target_widget = models.ForeignKey(
Widget,
on_delete=models.CASCADE,
related_name="seen_widget_records"
related_name="seen_widget_records",
)
container_random_widget = models.ForeignKey(
RandomWidget,
Expand All @@ -81,8 +91,9 @@ class SeenWidget(models.Model):
seen_at = models.DateTimeField(auto_now_add=True)

class Meta:
unique_together = ('user', 'target_widget', 'container_random_widget')
unique_together = ('user', 'player', 'target_widget',
'container_random_widget')
indexes = [
models.Index(fields=['user', 'target_widget',
'container_random_widget']),
models.Index(fields=['user', 'player',
'target_widget', 'container_random_widget']),
]
12 changes: 10 additions & 2 deletions apps/widgets/serializers/other_widgets/random_widget_serializer.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
from django.shortcuts import get_object_or_404
from apps.fsm.models.base import Widget
from apps.fsm.models.fsm import FSM
from apps.widgets.models.other_widgets.random import RandomWidget
from apps.widgets.serializers.widget_serializer import WidgetSerializer

Expand All @@ -16,8 +18,14 @@ def create(self, validated_data):

def to_representation(self, instance):
from apps.widgets.serializers.widget_polymorphic_serializer import WidgetPolymorphicSerializer
user = self.context.get('request').user
from apps.fsm.utils import get_players
request = self.context.get('request')
user = request.user
fsm_id = request.headers.get('FSM')
fsm = get_object_or_404(FSM, id=fsm_id)
player = get_players(user, fsm).last()

representation = super().to_representation(instance)
representation['widget'] = WidgetPolymorphicSerializer(
instance.get_random_widget(user)).data
instance.get_random_widget(player)).data
return representation

0 comments on commit 76bc9a3

Please sign in to comment.