Using row and col integer is better than metadata with jsonfield

This commit is contained in:
2020-11-06 20:58:47 -03:00
parent adf12efd75
commit 197624d7c8
5 changed files with 135 additions and 8 deletions

View File

@@ -2,7 +2,7 @@ from rest_framework import status
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.views import APIView from rest_framework.views import APIView
from game.models import Game, GameEvent from game.models import Game, GameEvent, GameStatuses
from ..serializers import GameSerializer, GameEventSerializer from ..serializers import GameSerializer, GameEventSerializer
@@ -41,9 +41,16 @@ class GameEventResource(APIView):
""" Creates a new event """ """ Creates a new event """
try: try:
Game.objects.get(pk=game_id) game = Game.objects.get(pk=game_id)
except Game.DoesNotExist: except Game.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND) return Response(status=status.HTTP_404_NOT_FOUND)
print(game.status, game.status == GameStatuses.FINISHED)
if game.status == GameStatuses.FINISHED:
print("WTF, DEVERIA PASSAR AQUI")
return Response(
{"message": "Game is already finished"},
status=status.HTTP_412_PRECONDITION_FAILED,
)
serializer = GameEventSerializer(data=request.data) serializer = GameEventSerializer(data=request.data)
if serializer.is_valid(): if serializer.is_valid():

View File

@@ -0,0 +1,29 @@
from django.contrib import admin
from .models import Game, GameEvent
@admin.register(Game)
class GameAdmin(admin.ModelAdmin):
list_display = (
"id",
"created_at",
"modified_at",
"rows",
"cols",
"mines",
"win",
"status",
)
list_filter = (
"win",
"status",
)
@admin.register(GameEvent)
class GameEventAdmin(admin.ModelAdmin):
list_display = ("id", "created_at", "game", "type", "event_row", "event_col")
list_filter = ("type",)

View File

@@ -0,0 +1,51 @@
# Generated by Django 3.1.3 on 2020-11-06 23:57
from django.db import migrations, models
import game.models
class Migration(migrations.Migration):
dependencies = [
("game", "0004_auto_20201106_0453"),
]
operations = [
migrations.RemoveField(model_name="gameevent", name="metadata",),
migrations.AddField(
model_name="gameevent",
name="event_col",
field=models.PositiveIntegerField(
blank=True,
default=None,
help_text="Column on the board where the event occurred, if applicable",
null=True,
verbose_name="The column clicked",
),
),
migrations.AddField(
model_name="gameevent",
name="event_row",
field=models.PositiveIntegerField(
blank=True,
default=None,
help_text="Row on the board where the event occurred, if applicable",
null=True,
verbose_name="The row clicked",
),
),
migrations.AlterField(
model_name="game",
name="status",
field=models.IntegerField(
choices=[
(0, "NOT_PLAYED"),
(1, "PLAYING"),
(2, "PAUSED"),
(3, "FINISHED"),
],
default=game.models.GameStatuses["NOT_PLAYED"],
help_text="Actual game status",
),
),
]

View File

@@ -2,7 +2,7 @@ from enum import IntEnum
from django.db import models from django.db import models
from django_mysql.models import JSONField from django_mysql.models import JSONField
from internal.utils import empty_list, empty_object from internal.utils import empty_list
from .game import Minesweeper from .game import Minesweeper
@@ -19,7 +19,8 @@ class GameStatuses(EnumChoicesBase):
NOT_PLAYED = 0 NOT_PLAYED = 0
PLAYING = 1 PLAYING = 1
FINISHED = 2 PAUSED = 2
FINISHED = 3
class Game(models.Model): class Game(models.Model):
@@ -93,8 +94,19 @@ class GameEvent(models.Model):
help_text="The game event", help_text="The game event",
) )
metadata = JSONField( event_row = models.PositiveIntegerField(
"Event metadata", default=empty_object, help_text="Some usefull event metadata" "The row clicked",
default=None,
null=True,
blank=True,
help_text="Row on the board where the event occurred, if applicable",
)
event_col = models.PositiveIntegerField(
"The column clicked",
default=None,
null=True,
blank=True,
help_text="Column on the board where the event occurred, if applicable",
) )
class Meta: class Meta:

View File

@@ -1,17 +1,45 @@
from django.db.models.signals import post_save, pre_save from django.db.models.signals import post_save, pre_save
from django.dispatch import receiver from django.dispatch import receiver
from .models import Game, GameEvent, EventTypes from .models import Game, GameEvent, EventTypes, GameStatuses
from .game import Minesweeper from .game import Minesweeper
@receiver(post_save, sender=Game) @receiver(post_save, sender=Game)
def game_start(sender, signal, instance, **kwargs): def game_start(sender, signal, instance, **kwargs):
""" If the game was just created, insert the first event START_GAME """ """ If the game was just created, insert the first event START_GAME """
if not instance.status == GameStatuses.NOT_PLAYED:
return
GameEvent.objects.get_or_create(game=instance, type=EventTypes.START_GAME) GameEvent.objects.get_or_create(game=instance, type=EventTypes.START_GAME)
@receiver(pre_save, sender=GameEvent)
def mark_game_as_playing(sender, signal, instance, **kwargs):
""" When event match, mark the game instance as playing """
playing_events = [
EventTypes.START_GAME,
EventTypes.RESUME,
EventTypes.CLICK_MINE,
EventTypes.CLICK_POINT,
EventTypes.CLICK_EMPTY,
EventTypes.CLICK_FLAG,
]
if instance.type in playing_events:
instance.game.status = GameStatuses.PLAYING
instance.game.save()
elif instance.type == EventTypes.PAUSE:
instance.game.status = GameStatuses.PAUSED
instance.game.save()
if instance.type == EventTypes.CLICK_MINE:
instance.game.status = GameStatuses.FINISHED
instance.game.win = False
instance.game.save()
@receiver(pre_save, sender=GameEvent) @receiver(pre_save, sender=GameEvent)
def identify_click_event(sender, signal, instance, **kwargs): def identify_click_event(sender, signal, instance, **kwargs):
""" Verify what is on the naive click: mine, point or empty """ """ Verify what is on the naive click: mine, point or empty """