From 163fe35bcf9924108b876e05c442a5946eeb6b58 Mon Sep 17 00:00:00 2001 From: Pasha Liashenko Date: Mon, 4 May 2026 17:02:14 +0300 Subject: [PATCH 1/6] add game models and main function --- db/models.py | 30 ++++++++++++++++++++++++++++++ main.py | 37 ++++++++++++++++++++++++++++++++++++- 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/db/models.py b/db/models.py index 137941ffa..88de70712 100644 --- a/db/models.py +++ b/db/models.py @@ -1 +1,31 @@ from django.db import models + + +class Race(models.Model): + name = models.CharField(max_length=255, unique=True) + description = models.TextField(blank=True) + + +class Skill(models.Model): + name = models.CharField(max_length=255, unique=True) + bonus = models.CharField(max_length=255) + race = models.ForeignKey(Race, on_delete=models.CASCADE) + + +class Guild(models.Model): + name = models.CharField(max_length=255) + description = models.TextField(null=True) + + +class Player(models.Model): + nickname = models.CharField(max_length=255, unique=True) + email = models.EmailField(max_length=255) + bio = models.CharField(max_length=255) + race = models.ForeignKey(Race, on_delete=models.CASCADE) + guild = models.ForeignKey( + Guild, + on_delete=models.SET_NULL, + null=True, + blank=True, + ) + created_at = models.DateTimeField(auto_now_add=True) diff --git a/main.py b/main.py index e71f55d89..756378b21 100644 --- a/main.py +++ b/main.py @@ -1,10 +1,45 @@ +import json + import init_django_orm # noqa: F401 from db.models import Race, Skill, Player, Guild def main() -> None: - pass + with open("players.json", "r") as file: + player_data = json.load(file) + + for nickname, data in player_data.items(): + race, created = Race.objects.get_or_create( + name=data["race"]["name"], + defaults={"description": data["race"]["description"]} + ) + + for skill_data in data["race"]["skills"]: + Skill.objects.get_or_create( + name=skill_data["name"], + defaults={ + "bonus": skill_data["bonus"], + "race": race, + } + ) + + guild = None + if data["guild"] is not None: + guild, _ = Guild.objects.get_or_create( + name=data["guild"]["name"], + defaults={"description": data["guild"]["description"]} + ) + + Player.objects.get_or_create( + nickname=nickname, + defaults={ + "email": data["email"], + "bio": data["bio"], + "race": race, + "guild": guild, + } + ) if __name__ == "__main__": From 51bf271408b775b125ddb1a5e74a15e174f3ca8c Mon Sep 17 00:00:00 2001 From: Pasha Liashenko Date: Mon, 4 May 2026 17:06:20 +0300 Subject: [PATCH 2/6] add initial migration --- db/migrations/0001_initial.py | 52 +++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 db/migrations/0001_initial.py diff --git a/db/migrations/0001_initial.py b/db/migrations/0001_initial.py new file mode 100644 index 000000000..ac63f5bad --- /dev/null +++ b/db/migrations/0001_initial.py @@ -0,0 +1,52 @@ +# Generated by Django 6.0.4 on 2026-05-04 16:56 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Guild', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255)), + ('description', models.TextField(null=True)), + ], + ), + migrations.CreateModel( + name='Race', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255, unique=True)), + ('description', models.TextField(blank=True)), + ], + ), + migrations.CreateModel( + name='Player', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('nickname', models.CharField(max_length=255, unique=True)), + ('email', models.EmailField(max_length=255)), + ('bio', models.CharField(max_length=255)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('guild', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='db.guild')), + ('race', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='db.race')), + ], + ), + migrations.CreateModel( + name='Skill', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255, unique=True)), + ('bonus', models.CharField(max_length=255)), + ('race', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='db.race')), + ], + ), + ] From 5bebb0c17472ed26da49d5886034206b281f1d1b Mon Sep 17 00:00:00 2001 From: Pasha Liashenko Date: Mon, 4 May 2026 17:25:26 +0300 Subject: [PATCH 3/6] Solution --- db/models.py | 7 ++++--- main.py | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/db/models.py b/db/models.py index 88de70712..2f7b75148 100644 --- a/db/models.py +++ b/db/models.py @@ -9,11 +9,11 @@ class Race(models.Model): class Skill(models.Model): name = models.CharField(max_length=255, unique=True) bonus = models.CharField(max_length=255) - race = models.ForeignKey(Race, on_delete=models.CASCADE) + race = models.ForeignKey(Race, on_delete=models.CASCADE, related_name='skills') class Guild(models.Model): - name = models.CharField(max_length=255) + name = models.CharField(max_length=255, unique=True) description = models.TextField(null=True) @@ -21,11 +21,12 @@ class Player(models.Model): nickname = models.CharField(max_length=255, unique=True) email = models.EmailField(max_length=255) bio = models.CharField(max_length=255) - race = models.ForeignKey(Race, on_delete=models.CASCADE) + race = models.ForeignKey(Race, on_delete=models.CASCADE, related_name='players') guild = models.ForeignKey( Guild, on_delete=models.SET_NULL, null=True, blank=True, + related_name='players', ) created_at = models.DateTimeField(auto_now_add=True) diff --git a/main.py b/main.py index 756378b21..f52ae42f1 100644 --- a/main.py +++ b/main.py @@ -24,8 +24,8 @@ def main() -> None: } ) - guild = None - if data["guild"] is not None: + guild_data = data.get("guild") + if guild_data: guild, _ = Guild.objects.get_or_create( name=data["guild"]["name"], defaults={"description": data["guild"]["description"]} From 2728385d141c82afb11d9e92e54e6759509ed6bf Mon Sep 17 00:00:00 2001 From: Pasha Liashenko Date: Mon, 4 May 2026 17:30:54 +0300 Subject: [PATCH 4/6] Solution --- ..._guild_name_alter_player_guild_and_more.py | 34 +++++++++++++++++++ db/models.py | 12 +++++-- 2 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 db/migrations/0002_alter_guild_name_alter_player_guild_and_more.py diff --git a/db/migrations/0002_alter_guild_name_alter_player_guild_and_more.py b/db/migrations/0002_alter_guild_name_alter_player_guild_and_more.py new file mode 100644 index 000000000..b3aeeca68 --- /dev/null +++ b/db/migrations/0002_alter_guild_name_alter_player_guild_and_more.py @@ -0,0 +1,34 @@ +# Generated by Django 6.0.4 on 2026-05-04 17:21 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('db', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='guild', + name='name', + field=models.CharField(max_length=255, unique=True), + ), + migrations.AlterField( + model_name='player', + name='guild', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='players', to='db.guild'), + ), + migrations.AlterField( + model_name='player', + name='race', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='players', to='db.race'), + ), + migrations.AlterField( + model_name='skill', + name='race', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='skills', to='db.race'), + ), + ] diff --git a/db/models.py b/db/models.py index 2f7b75148..068885fd8 100644 --- a/db/models.py +++ b/db/models.py @@ -9,7 +9,11 @@ class Race(models.Model): class Skill(models.Model): name = models.CharField(max_length=255, unique=True) bonus = models.CharField(max_length=255) - race = models.ForeignKey(Race, on_delete=models.CASCADE, related_name='skills') + race = models.ForeignKey( + Race, + on_delete=models.CASCADE, + related_name='skills' + ) class Guild(models.Model): @@ -21,7 +25,11 @@ class Player(models.Model): nickname = models.CharField(max_length=255, unique=True) email = models.EmailField(max_length=255) bio = models.CharField(max_length=255) - race = models.ForeignKey(Race, on_delete=models.CASCADE, related_name='players') + race = models.ForeignKey( + Race, + on_delete=models.CASCADE, + related_name='players' + ) guild = models.ForeignKey( Guild, on_delete=models.SET_NULL, From 0f6642d61493eb9ca19160cb3666ed616e4a6c57 Mon Sep 17 00:00:00 2001 From: Pasha Liashenko Date: Mon, 4 May 2026 17:34:17 +0300 Subject: [PATCH 5/6] Solution --- db/models.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/db/models.py b/db/models.py index 068885fd8..68c8bf2e5 100644 --- a/db/models.py +++ b/db/models.py @@ -12,7 +12,7 @@ class Skill(models.Model): race = models.ForeignKey( Race, on_delete=models.CASCADE, - related_name='skills' + related_name="skills" ) @@ -28,13 +28,13 @@ class Player(models.Model): race = models.ForeignKey( Race, on_delete=models.CASCADE, - related_name='players' + related_name="players" ) guild = models.ForeignKey( Guild, on_delete=models.SET_NULL, null=True, blank=True, - related_name='players', + related_name="players", ) created_at = models.DateTimeField(auto_now_add=True) From db189929bf9f5deb16c0804661dae9b6aa037ddc Mon Sep 17 00:00:00 2001 From: Pasha Liashenko Date: Tue, 5 May 2026 18:40:23 +0300 Subject: [PATCH 6/6] Solution --- main.py | 1 + 1 file changed, 1 insertion(+) diff --git a/main.py b/main.py index f52ae42f1..e87d5a60a 100644 --- a/main.py +++ b/main.py @@ -24,6 +24,7 @@ def main() -> None: } ) + guild = None guild_data = data.get("guild") if guild_data: guild, _ = Guild.objects.get_or_create(