diff --git a/.gitignore b/.gitignore index 033df5f..5909789 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .venv __pycache__ +db.sqlite3 \ No newline at end of file diff --git a/server/requirements.txt b/server/requirements.txt index a543531..f1a5d00 100644 Binary files a/server/requirements.txt and b/server/requirements.txt differ diff --git a/server/server/migrations/0001_initial.py b/server/server/migrations/0001_initial.py new file mode 100644 index 0000000..cb1c9d6 --- /dev/null +++ b/server/server/migrations/0001_initial.py @@ -0,0 +1,93 @@ +# Generated by Django 4.2.7 on 2023-11-30 20:12 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Game', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=200)), + ('creation_date', models.DateTimeField(auto_now_add=True, verbose_name='date created')), + ], + options={ + 'verbose_name': 'Game', + 'verbose_name_plural': 'Games', + }, + ), + migrations.CreateModel( + name='Guild', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=200)), + ('tag', models.CharField(max_length=10)), + ('creation_date', models.DateTimeField(auto_now_add=True, verbose_name='date created')), + ], + options={ + 'verbose_name': 'Guild', + 'verbose_name_plural': 'Guilds', + }, + ), + migrations.CreateModel( + name='Player', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=200)), + ('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')), + ], + options={ + 'verbose_name': 'Player', + 'verbose_name_plural': 'Players', + }, + ), + migrations.CreateModel( + name='PlayerGameProfile', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('creation_date', models.DateTimeField(auto_now_add=True, verbose_name='date created')), + ('game', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='player_profiles', to='server.game')), + ('player', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='game_profiles', to='server.player')), + ], + options={ + 'verbose_name': 'Player Game Profile', + 'verbose_name_plural': 'Player Game Profiles', + }, + ), + migrations.CreateModel( + name='WowProfile', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('level', models.IntegerField()), + ('class_name', models.CharField(max_length=200)), + ('creation_date', models.DateTimeField(auto_now_add=True, verbose_name='date created')), + ('player_game_profile', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='wow_profile', to='server.playergameprofile')), + ], + options={ + 'verbose_name': 'WoW Profile', + 'verbose_name_plural': 'WoW Profiles', + }, + ), + migrations.CreateModel( + name='ValorantProfile', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('rank', models.CharField(max_length=200)), + ('creation_date', models.DateTimeField(auto_now_add=True, verbose_name='date created')), + ('player_game_profile', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='valorant_profile', to='server.playergameprofile')), + ], + options={ + 'verbose_name': 'Valorant Profile', + 'verbose_name_plural': 'Valorant Profiles', + }, + ), + ] diff --git a/server/server/migrations/__init__.py b/server/server/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/server/models.py b/server/server/models.py new file mode 100644 index 0000000..0579ad9 --- /dev/null +++ b/server/server/models.py @@ -0,0 +1,87 @@ +from django.db import models + + +class Guild(models.Model): + 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): + 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 Game(models.Model): + name = models.CharField(max_length=200) + creation_date = models.DateTimeField("date created", auto_now_add=True) + + def __str__(self): + return self.name + + class Meta: + verbose_name = "Game" + verbose_name_plural = "Games" + + +class PlayerGameProfile(models.Model): + player = models.ForeignKey( + Player, on_delete=models.CASCADE, related_name="game_profiles" + ) + game = models.ForeignKey( + Game, on_delete=models.CASCADE, related_name="player_profiles" + ) + creation_date = models.DateTimeField("date created", auto_now_add=True) + + def __str__(self): + return f"{self.player} - {self.game}" + + class Meta: + verbose_name = "Player Game Profile" + verbose_name_plural = "Player Game Profiles" + + +class WowProfile(models.Model): + player_game_profile = models.OneToOneField( + PlayerGameProfile, on_delete=models.CASCADE, related_name="wow_profile" + ) + level = models.IntegerField() + class_name = 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 = "WoW Profile" + verbose_name_plural = "WoW Profiles" + + +class ValorantProfile(models.Model): + 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" diff --git a/server/server/serializers.py b/server/server/serializers.py new file mode 100644 index 0000000..7970856 --- /dev/null +++ b/server/server/serializers.py @@ -0,0 +1,44 @@ +from rest_framework import serializers +from .models import Guild, Player, Game, PlayerGameProfile, WowProfile, ValorantProfile + + +class GuildSerializer(serializers.ModelSerializer): + class Meta: + model = Guild + fields = ["id", "name", "tag", "creation_date"] + read_only_fields = ["id", "creation_date"] + + +class PlayerSerializer(serializers.ModelSerializer): + class Meta: + model = Player + fields = ["id", "name", "guild", "creation_date"] + read_only_fields = ["id", "creation_date"] + + +class GameSerializer(serializers.ModelSerializer): + class Meta: + model = Game + fields = ["id", "name", "creation_date"] + read_only_fields = ["id", "creation_date"] + + +class PlayerGameProfileSerializer(serializers.ModelSerializer): + class Meta: + model = PlayerGameProfile + fields = ["id", "player", "game", "creation_date"] + read_only_fields = ["id", "creation_date"] + + +class WowProfileSerializer(serializers.ModelSerializer): + class Meta: + model = WowProfile + fields = ["id", "player_game_profile", "level", "class_name", "creation_date"] + read_only_fields = ["id", "creation_date"] + + +class ValorantProfileSerializer(serializers.ModelSerializer): + class Meta: + model = ValorantProfile + fields = ["id", "player_game_profile", "rank", "creation_date"] + read_only_fields = ["id", "creation_date"] diff --git a/server/server/settings.py b/server/server/settings.py index ea4b9f7..27ca625 100644 --- a/server/server/settings.py +++ b/server/server/settings.py @@ -37,6 +37,8 @@ INSTALLED_APPS = [ "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", + "rest_framework", + "server", ] MIDDLEWARE = [ diff --git a/server/server/urls.py b/server/server/urls.py index 7070101..e889a0e 100644 --- a/server/server/urls.py +++ b/server/server/urls.py @@ -1,24 +1,16 @@ -""" -URL configuration for server project. +from django.urls import path, include +from rest_framework.routers import DefaultRouter +from .views import GameViewSet, GuildViewSet, PlayerViewSet, PlayerGameProfileViewSet, WowProfileViewSet, ValorantProfileViewSet, hello_world -The `urlpatterns` list routes URLs to views. For more information please see: - https://docs.djangoproject.com/en/4.2/topics/http/urls/ -Examples: -Function views - 1. Add an import: from my_app import views - 2. Add a URL to urlpatterns: path('', views.home, name='home') -Class-based views - 1. Add an import: from other_app.views import Home - 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') -Including another URLconf - 1. Import the include() function: from django.urls import include, path - 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) -""" -from django.contrib import admin -from django.urls import path -from .views import 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) urlpatterns = [ - path('', hello_world), - path("admin/", admin.site.urls), + path('', hello_world, name='index'), + path('', include(router.urls)), ] diff --git a/server/server/views.py b/server/server/views.py index 9dea469..e9de056 100644 --- a/server/server/views.py +++ b/server/server/views.py @@ -1,5 +1,38 @@ 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 + def hello_world(request): return HttpResponse("Hello, World!") + +class GameViewSet(viewsets.ModelViewSet): + queryset = Game.objects.all() + serializer_class = GameSerializer + + +class GuildViewSet(viewsets.ModelViewSet): + queryset = Guild.objects.all() + serializer_class = GuildSerializer + + +class PlayerViewSet(viewsets.ModelViewSet): + queryset = Player.objects.all() + serializer_class = PlayerSerializer + + +class PlayerGameProfileViewSet(viewsets.ModelViewSet): + queryset = PlayerGameProfile.objects.all() + serializer_class = PlayerGameProfileSerializer + + +class WowProfileViewSet(viewsets.ModelViewSet): + queryset = WowProfile.objects.all() + serializer_class = WowProfileSerializer + + +class ValorantProfileViewSet(viewsets.ModelViewSet): + queryset = ValorantProfile.objects.all() + serializer_class = ValorantProfileSerializer