schema upd

This commit is contained in:
zman27 2023-12-05 09:03:18 -05:00
parent d9cb852964
commit cd89bba8ad
2 changed files with 82 additions and 45 deletions

View File

@ -2,6 +2,9 @@ from django.db import models
class Guild(models.Model): class Guild(models.Model):
"""
This model is used to store the guild data.
"""
id = models.AutoField(primary_key=True) id = models.AutoField(primary_key=True)
name = models.CharField(max_length=200) name = models.CharField(max_length=200)
tag = models.CharField(max_length=10) tag = models.CharField(max_length=10)
@ -16,6 +19,9 @@ class Guild(models.Model):
class Player(models.Model): class Player(models.Model):
"""
This model is used to store the player data.
"""
id = models.AutoField(primary_key=True) id = models.AutoField(primary_key=True)
name = models.CharField(max_length=200) name = models.CharField(max_length=200)
creation_date = models.DateTimeField("date created", auto_now_add=True) creation_date = models.DateTimeField("date created", auto_now_add=True)
@ -29,9 +35,13 @@ class Player(models.Model):
class PlayerGuild(models.Model): class PlayerGuild(models.Model):
"""
This model is used to store the player's guild data.
"""
id = models.AutoField(primary_key=True) id = models.AutoField(primary_key=True)
player = models.ForeignKey(Player, on_delete=models.CASCADE, related_name="guilds") player = models.ForeignKey(Player, on_delete=models.CASCADE, related_name="guilds")
guild = models.ForeignKey(Guild, on_delete=models.CASCADE, related_name="players") guild = models.ForeignKey(Guild, on_delete=models.CASCADE, related_name="players")
role = models.CharField(max_length=200) # admin, officer, member, etc. eventually tie to permissions and account stuff
creation_date = models.DateTimeField("date created", auto_now_add=True) creation_date = models.DateTimeField("date created", auto_now_add=True)
def __str__(self): def __str__(self):
@ -43,6 +53,9 @@ class PlayerGuild(models.Model):
class Game(models.Model): class Game(models.Model):
"""
This model is used to store the game data.
"""
id = models.AutoField(primary_key=True) id = models.AutoField(primary_key=True)
name = models.CharField(max_length=200) name = models.CharField(max_length=200)
creation_date = models.DateTimeField("date created", auto_now_add=True) creation_date = models.DateTimeField("date created", auto_now_add=True)
@ -55,7 +68,12 @@ class Game(models.Model):
verbose_name_plural = "Games" verbose_name_plural = "Games"
class PlayerGameProfile(models.Model): class PlayerGameData(models.Model):
"""
This model is used to store the game data for a player.
Anything can be stored in the data field, but it will
be validated against the schema before being stored.
"""
id = models.AutoField(primary_key=True) id = models.AutoField(primary_key=True)
player = models.ForeignKey( player = models.ForeignKey(
Player, on_delete=models.CASCADE, related_name="game_profiles" Player, on_delete=models.CASCADE, related_name="game_profiles"
@ -64,43 +82,53 @@ class PlayerGameProfile(models.Model):
Game, on_delete=models.CASCADE, related_name="player_profiles" Game, on_delete=models.CASCADE, related_name="player_profiles"
) )
creation_date = models.DateTimeField("date created", auto_now_add=True) creation_date = models.DateTimeField("date created", auto_now_add=True)
data = models.JSONField()
def __str__(self): def __str__(self):
return f"{self.player} - {self.game}" return f"{self.player} - {self.game}"
class Meta: class Meta:
verbose_name = "Player Game Profile" verbose_name = "Player Game Data"
verbose_name_plural = "Player Game Profiles" verbose_name_plural = "Player Game Data"
class WowProfile(models.Model): class GuildGameDataSchema(models.Model):
"""
This model is used to store the schema for the game data.
Right now it is associated with guild until we determine
which entity should own the schema.
Player Game Data will be validated against this schema.
"""
id = models.AutoField(primary_key=True) id = models.AutoField(primary_key=True)
player_game_profile = models.OneToOneField( guild = models.ForeignKey(
PlayerGameProfile, on_delete=models.CASCADE, related_name="wow_profile" Guild, on_delete=models.CASCADE, related_name="schemas"
) )
level = models.IntegerField() game = models.ForeignKey(
class_name = models.CharField(max_length=200) Game, on_delete=models.CASCADE, related_name="schemas"
)
schema = models.JSONField()
def __str__(self):
return f"{self.guild} - {self.game}"
class Meta:
verbose_name = "Guild Game Data Schema"
verbose_name_plural = "Guild Game Data Schemas"
class WowClasses(models.Model):
"""
Example of a model that could be used to pre-populate
dropdowns in the UI.
"""
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=200)
creation_date = models.DateTimeField("date created", auto_now_add=True) creation_date = models.DateTimeField("date created", auto_now_add=True)
def __str__(self): def __str__(self):
return f"{self.player_game_profile.player} - {self.player_game_profile.game}" return self.name
class Meta: class Meta:
verbose_name = "WoW Profile" verbose_name = "WoW Class"
verbose_name_plural = "WoW Profiles" verbose_name_plural = "WoW Classes"
class ValorantProfile(models.Model):
id = models.AutoField(primary_key=True)
player_game_profile = models.OneToOneField(
PlayerGameProfile, on_delete=models.CASCADE, related_name="valorant_profile"
)
rank = models.CharField(max_length=200)
creation_date = models.DateTimeField("date created", auto_now_add=True)
def __str__(self):
return f"{self.player_game_profile.player} - {self.player_game_profile.game}"
class Meta:
verbose_name = "Valorant Profile"
verbose_name_plural = "Valorant Profiles"

View File

@ -3,10 +3,10 @@ from .models import (
Guild, Guild,
Player, Player,
Game, Game,
PlayerGameProfile,
WowProfile,
ValorantProfile,
PlayerGuild, PlayerGuild,
PlayerGameData,
GuildGameDataSchema,
WowClasses,
) )
@ -20,7 +20,7 @@ class GuildSerializer(serializers.ModelSerializer):
class PlayerSerializer(serializers.ModelSerializer): class PlayerSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Player model = Player
fields = ["id", "name", "guild", "creation_date"] fields = ["id", "name", "creation_date"]
read_only_fields = ["id", "creation_date"] read_only_fields = ["id", "creation_date"]
@ -31,25 +31,27 @@ class GameSerializer(serializers.ModelSerializer):
read_only_fields = ["id", "creation_date"] read_only_fields = ["id", "creation_date"]
class PlayerGameProfileSerializer(serializers.ModelSerializer): class PlayerGameDataSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = PlayerGameProfile model = PlayerGameData
fields = ["id", "player", "game", "creation_date"] fields = ["id", "player", "game", "creation_date", "data"]
read_only_fields = ["id", "creation_date"] read_only_fields = ["id", "creation_date"]
def validate_data(self, value):
game_id = self.initial_data["game"]
# pull schema from guildgameschema
schema = GuildGameDataSchema.objects.get(game=game_id)
# validate data against schema
# if valid, return value
# if not valid, raise serializers.ValidationError("Invalid data")
return value
class WowProfileSerializer(serializers.ModelSerializer):
class GuildGameDataSchemaSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = WowProfile model = GuildGameDataSchema
fields = ["id", "player_game_profile", "level", "class_name", "creation_date"] fields = ["id", "guild", "game", "schema"]
read_only_fields = ["id", "creation_date"] read_only_fields = ["id"]
class ValorantProfileSerializer(serializers.ModelSerializer):
class Meta:
model = ValorantProfile
fields = ["id", "player_game_profile", "rank", "creation_date"]
read_only_fields = ["id", "creation_date"]
class PlayerGuildSerializer(serializers.ModelSerializer): class PlayerGuildSerializer(serializers.ModelSerializer):
@ -57,3 +59,10 @@ class PlayerGuildSerializer(serializers.ModelSerializer):
model = PlayerGuild model = PlayerGuild
fields = ["id", "player", "guild", "creation_date"] fields = ["id", "player", "guild", "creation_date"]
read_only_fields = ["id", "creation_date"] read_only_fields = ["id", "creation_date"]
class WowClassesSerializer(serializers.ModelSerializer):
class Meta:
model = WowClasses
fields = ["id", "name", "creation_date"]
read_only_fields = ["id", "creation_date"]