diff --git a/docker-compose.yml b/docker-compose.yml index e3e7380..f44bb67 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,7 +9,8 @@ services: - ./server:/usr/src/app environment: - DEBUG=1 - command: python manage.py runserver 0.0.0.0:8000 + command: > + sh -c "python manage.py makemigrations && python manage.py migrate && python populate_data.py && python manage.py runserver 0.0.0.0:8000" frontend: build: ./client diff --git a/server/populate_data.py b/server/populate_data.py new file mode 100644 index 0000000..0ef9c2f --- /dev/null +++ b/server/populate_data.py @@ -0,0 +1,106 @@ +import os +import django +from django.db import transaction + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "server.settings") +django.setup() + +from server.models import ( + Game, + Guild, + Player, + PlayerGameProfile, + WowProfile, + ValorantProfile, + PlayerGuild, +) + + +def populate_games(): + games = ["World of Warcraft", "Valorant"] + for game in games: + g = Game.objects.get_or_create(name=game)[0] + + +def populate_guilds(): + guilds = ["Gamers", "Epic Nerds"] + for guild in guilds: + g = Guild.objects.get_or_create(name=guild)[0] + + +def populate_players(): + players = ["Pixel", "Zman", "Skip"] + for player in players: + p = Player.objects.get_or_create(name=player)[0] + + +def populate_player_guilds(): + player_guilds = [ + {"player": "Pixel", "guild": "Gamers"}, + {"player": "Zman", "guild": "Gamers"}, + {"player": "Skip", "guild": "Epic Nerds"}, + ] + for profile in player_guilds: + p = PlayerGuild.objects.get_or_create( + player=Player.objects.get(name=profile["player"]), + guild=Guild.objects.get(name=profile["guild"]), + )[0] + + +def populate_player_game_profiles(): + player_game_profiles = [ + {"player": "Pixel", "game": "World of Warcraft"}, + {"player": "Zman", "game": "World of Warcraft"}, + {"player": "Skip", "game": "Valorant"}, + {"player": "Skip", "game": "World of Warcraft"}, + ] + for profile in player_game_profiles: + p = PlayerGameProfile.objects.get_or_create( + player=Player.objects.get(name=profile["player"]), + game=Game.objects.get(name=profile["game"]), + )[0] + + +def populate_wow_profiles(): + wow_profiles = [ + {"player": "Pixel", "level": 60, "class_name": "Mage"}, + {"player": "Zman", "level": 60, "class_name": "Warrior"}, + {"player": "Skip", "level": 60, "class_name": "Rogue"}, + ] + for profile in wow_profiles: + p = WowProfile.objects.get_or_create( + player_game_profile=PlayerGameProfile.objects.get( + player=Player.objects.get(name=profile["player"]), + game=Game.objects.get(name="World of Warcraft"), + ), + level=profile["level"], + class_name=profile["class_name"], + )[0] + + +def populate_valorant_profiles(): + valorant_profiles = [{"player": "Skip", "rank": "Diamond"}] + for profile in valorant_profiles: + p = ValorantProfile.objects.get_or_create( + player_game_profile=PlayerGameProfile.objects.get( + player=Player.objects.get(name=profile["player"]), + game=Game.objects.get(name="Valorant"), + ), + rank=profile["rank"], + )[0] + + +def populate(): + with transaction.atomic(): + populate_games() + populate_guilds() + populate_players() + populate_player_game_profiles() + populate_wow_profiles() + populate_valorant_profiles() + + +if __name__ == "__main__": + print("Populating script!") + populate() + print("Population complete!") diff --git a/server/server/migrations/0002_alter_game_id_alter_guild_id_alter_player_id_and_more.py b/server/server/migrations/0002_alter_game_id_alter_guild_id_alter_player_id_and_more.py new file mode 100644 index 0000000..dc880d9 --- /dev/null +++ b/server/server/migrations/0002_alter_game_id_alter_guild_id_alter_player_id_and_more.py @@ -0,0 +1,43 @@ +# Generated by Django 4.2.7 on 2023-11-30 21:50 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('server', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='game', + name='id', + field=models.AutoField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='guild', + name='id', + field=models.AutoField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='player', + name='id', + field=models.AutoField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='playergameprofile', + name='id', + field=models.AutoField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='valorantprofile', + name='id', + field=models.AutoField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='wowprofile', + name='id', + field=models.AutoField(primary_key=True, serialize=False), + ), + ] diff --git a/server/server/migrations/0003_remove_player_guild_playerguild.py b/server/server/migrations/0003_remove_player_guild_playerguild.py new file mode 100644 index 0000000..d0822e2 --- /dev/null +++ b/server/server/migrations/0003_remove_player_guild_playerguild.py @@ -0,0 +1,31 @@ +# Generated by Django 4.2.7 on 2023-11-30 21:55 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('server', '0002_alter_game_id_alter_guild_id_alter_player_id_and_more'), + ] + + operations = [ + migrations.RemoveField( + model_name='player', + name='guild', + ), + migrations.CreateModel( + name='PlayerGuild', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('creation_date', models.DateTimeField(auto_now_add=True, verbose_name='date created')), + ('guild', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='players', to='server.guild')), + ('player', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='guilds', to='server.player')), + ], + options={ + 'verbose_name': 'Player Guild', + 'verbose_name_plural': 'Player Guilds', + }, + ), + ] diff --git a/server/server/models.py b/server/server/models.py index 0579ad9..6b5899c 100644 --- a/server/server/models.py +++ b/server/server/models.py @@ -2,32 +2,48 @@ from django.db import models class Guild(models.Model): + id = models.AutoField(primary_key=True) name = models.CharField(max_length=200) tag = models.CharField(max_length=10) creation_date = models.DateTimeField("date created", auto_now_add=True) def __str__(self): return f"{self.name} [{self.tag}]" - + class Meta: verbose_name = "Guild" verbose_name_plural = "Guilds" class Player(models.Model): + id = models.AutoField(primary_key=True) name = models.CharField(max_length=200) - guild = models.ForeignKey(Guild, on_delete=models.CASCADE, related_name="players") creation_date = models.DateTimeField("date created", auto_now_add=True) def __str__(self): return self.name - + class Meta: verbose_name = "Player" verbose_name_plural = "Players" +class PlayerGuild(models.Model): + id = models.AutoField(primary_key=True) + player = models.ForeignKey(Player, on_delete=models.CASCADE, related_name="guilds") + guild = models.ForeignKey(Guild, on_delete=models.CASCADE, related_name="players") + creation_date = models.DateTimeField("date created", auto_now_add=True) + + def __str__(self): + return f"{self.player} - {self.guild}" + + class Meta: + verbose_name = "Player Guild" + verbose_name_plural = "Player Guilds" + + class Game(models.Model): + id = models.AutoField(primary_key=True) name = models.CharField(max_length=200) creation_date = models.DateTimeField("date created", auto_now_add=True) @@ -40,6 +56,7 @@ class Game(models.Model): class PlayerGameProfile(models.Model): + id = models.AutoField(primary_key=True) player = models.ForeignKey( Player, on_delete=models.CASCADE, related_name="game_profiles" ) @@ -57,6 +74,7 @@ class PlayerGameProfile(models.Model): class WowProfile(models.Model): + id = models.AutoField(primary_key=True) player_game_profile = models.OneToOneField( PlayerGameProfile, on_delete=models.CASCADE, related_name="wow_profile" ) @@ -66,13 +84,14 @@ class WowProfile(models.Model): def __str__(self): return f"{self.player_game_profile.player} - {self.player_game_profile.game}" - + class Meta: verbose_name = "WoW Profile" verbose_name_plural = "WoW Profiles" class ValorantProfile(models.Model): + id = models.AutoField(primary_key=True) player_game_profile = models.OneToOneField( PlayerGameProfile, on_delete=models.CASCADE, related_name="valorant_profile" ) @@ -81,7 +100,7 @@ class ValorantProfile(models.Model): 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" diff --git a/server/server/serializers.py b/server/server/serializers.py index 7970856..979160e 100644 --- a/server/server/serializers.py +++ b/server/server/serializers.py @@ -1,5 +1,13 @@ from rest_framework import serializers -from .models import Guild, Player, Game, PlayerGameProfile, WowProfile, ValorantProfile +from .models import ( + Guild, + Player, + Game, + PlayerGameProfile, + WowProfile, + ValorantProfile, + PlayerGuild, +) class GuildSerializer(serializers.ModelSerializer): @@ -42,3 +50,10 @@ class ValorantProfileSerializer(serializers.ModelSerializer): model = ValorantProfile fields = ["id", "player_game_profile", "rank", "creation_date"] read_only_fields = ["id", "creation_date"] + + +class PlayerGuildSerializer(serializers.ModelSerializer): + class Meta: + model = PlayerGuild + fields = ["id", "player", "guild", "creation_date"] + read_only_fields = ["id", "creation_date"] diff --git a/server/server/urls.py b/server/server/urls.py index e889a0e..1d93ef9 100644 --- a/server/server/urls.py +++ b/server/server/urls.py @@ -1,16 +1,26 @@ from django.urls import path, include +from django.contrib import admin from rest_framework.routers import DefaultRouter -from .views import GameViewSet, GuildViewSet, PlayerViewSet, PlayerGameProfileViewSet, WowProfileViewSet, ValorantProfileViewSet, hello_world +from .views import ( + GameViewSet, + GuildViewSet, + PlayerViewSet, + PlayerGameProfileViewSet, + WowProfileViewSet, + ValorantProfileViewSet, + hello_world, +) router = DefaultRouter() -router.register(r'games', GameViewSet) -router.register(r'guilds', GuildViewSet) -router.register(r'players', PlayerViewSet) -router.register(r'player-game-profiles', PlayerGameProfileViewSet) -router.register(r'wow-profiles', WowProfileViewSet) -router.register(r'valorant-profiles', ValorantProfileViewSet) +router.register(r"games", GameViewSet) +router.register(r"guilds", GuildViewSet) +router.register(r"players", PlayerViewSet) +router.register(r"player-game-profiles", PlayerGameProfileViewSet) +router.register(r"wow-profiles", WowProfileViewSet) +router.register(r"valorant-profiles", ValorantProfileViewSet) urlpatterns = [ - path('', hello_world, name='index'), - path('', include(router.urls)), + path("", hello_world, name="index"), + path("", include(router.urls)), + path("admin/", admin.site.urls), ] diff --git a/server/server/views.py b/server/server/views.py index e9de056..7baf727 100644 --- a/server/server/views.py +++ b/server/server/views.py @@ -1,7 +1,23 @@ from django.http import HttpResponse from rest_framework import viewsets -from .models import Game, Guild, Player, PlayerGameProfile, WowProfile, ValorantProfile -from .serializers import GameSerializer, GuildSerializer, PlayerSerializer, PlayerGameProfileSerializer, WowProfileSerializer, ValorantProfileSerializer +from .models import ( + Game, + Guild, + Player, + PlayerGameProfile, + WowProfile, + ValorantProfile, + PlayerGuild, +) +from .serializers import ( + GameSerializer, + GuildSerializer, + PlayerSerializer, + PlayerGameProfileSerializer, + WowProfileSerializer, + ValorantProfileSerializer, + PlayerGuildSerializer, +) def hello_world(request): @@ -36,3 +52,8 @@ class WowProfileViewSet(viewsets.ModelViewSet): class ValorantProfileViewSet(viewsets.ModelViewSet): queryset = ValorantProfile.objects.all() serializer_class = ValorantProfileSerializer + + +class PlayerGuildViewSet(viewsets.ModelViewSet): + queryset = PlayerGuild.objects.all() + serializer_class = PlayerGuildSerializer