diff --git a/src/mainapp/admin.py b/src/mainapp/admin.py index 3ab2193..7a9093b 100644 --- a/src/mainapp/admin.py +++ b/src/mainapp/admin.py @@ -19,9 +19,9 @@ class PegAdmin(admin.ModelAdmin): class MemberAdmin(admin.ModelAdmin): """Admin model for the Member model.""" - list_display = ("first_name", "last_name", "user", "team", "peg") - search_fields = ("first_name", "last_name", "user", "team", "peg") - list_filter = ("team", "peg") + list_display = ("first_name", "last_name", "team") + search_fields = ("first_name", "last_name", "team") + list_filter = ("team",) @admin.register(Team) diff --git a/src/mainapp/management/__init__.py b/src/mainapp/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/mainapp/management/commands/__init__.py b/src/mainapp/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/mainapp/management/commands/create_members_fixture.py b/src/mainapp/management/commands/create_members_fixture.py new file mode 100644 index 0000000..351cdf1 --- /dev/null +++ b/src/mainapp/management/commands/create_members_fixture.py @@ -0,0 +1,68 @@ +import random +import names +import json +from django.core.management.base import BaseCommand +from mainapp.models import Member, Team + + +class Command(BaseCommand): + help = "Creates a fixture with randomly generated Member objects" + + def add_arguments(self, parser): + parser.add_argument("num_members", type=int) + + def handle(self, *args, **options): + num_members = options["num_members"] + teams = Team.objects.all() + if not teams: + print("No teams found. Please create some teams first.") + return + + members = [] + for team in teams: + for _ in range(num_members): + first_name = names.get_first_name() + last_name = names.get_last_name() + member = Member(first_name=first_name, last_name=last_name, team=team) + members.append(member) + + Member.objects.bulk_create(members) + + self.stdout.write(self.style.SUCCESS(f"Created {num_members} members.")) + + + # create a team fixture file + teams_fixture = [] + for team in teams: + team_fixture = { + "model": "mainapp.team", + "pk": team.pk, + "fields": { + "team_number": team.team_number, + "section": team.section_id + } + } + teams_fixture.append(team_fixture) + + with open("src/mainapp/fixtures/teams_fixture.json", "w") as f: + f.write(json.dumps(teams_fixture, indent=2)) + self.stdout.write(self.style.SUCCESS("Created teams_fixture.json.")) + + + # create a members fixture file + members_fixture = [] + for member in members: + member_fixture = { + "model": "mainapp.member", + "pk": member.pk, + "fields": { + "first_name": member.first_name, + "last_name": member.last_name, + "team": member.team_id + } + } + members_fixture.append(member_fixture) + + with open("src/mainapp/fixtures/members_fixture.json", "w") as f: + f.write(json.dumps(members_fixture, indent=2)) + self.stdout.write(self.style.SUCCESS("Created members_fixture.json.")) diff --git a/src/mainapp/management/commands/create_teams_fixture.py b/src/mainapp/management/commands/create_teams_fixture.py new file mode 100644 index 0000000..1211396 --- /dev/null +++ b/src/mainapp/management/commands/create_teams_fixture.py @@ -0,0 +1,37 @@ +from django.core.management.base import BaseCommand +from mainapp.models import Team +import random + +class Command(BaseCommand): + help = "Creates a fixture file for Team objects" + + def add_arguments(self, parser): + parser.add_argument("num_teams", type=int, help="Number of teams to create") + + def handle(self, *args, **options): + num_teams = options["num_teams"] + + teams = [] + for i in range(num_teams): + team = Team.objects.create() + teams.append(team) + + for team in teams: + self.stdout.write(self.style.SUCCESS(f"Created team {team.team_number}")) + + filename = f"src/mainapp/fixtures/teams_{num_teams}.json" + with open(filename, "w") as f: + self.stdout.write(f"Writing fixture to {filename}") + f.write("[\n") + for i, team in enumerate(teams): + f.write(" {\n") + f.write(f' "model": "mainapp.team",\n') + f.write(f' "pk": {team.team_number},\n') + f.write(' "fields": {}\n') + f.write(" }") + if i < len(teams) - 1: + f.write(",") + f.write("\n") + f.write("]\n") + + self.stdout.write(self.style.SUCCESS("Fixture created successfully")) diff --git a/src/mainapp/migrations/0001_initial.py b/src/mainapp/migrations/0001_initial.py index dd0dc47..e2e00e4 100644 --- a/src/mainapp/migrations/0001_initial.py +++ b/src/mainapp/migrations/0001_initial.py @@ -1,6 +1,5 @@ -# Generated by Django 4.1.5 on 2023-01-26 14:24 +# Generated by Django 4.1.5 on 2023-05-06 15:53 -from django.conf import settings from django.db import migrations, models import django.db.models.deletion import mainapp.models @@ -11,7 +10,6 @@ class Migration(migrations.Migration): initial = True dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ @@ -40,8 +38,7 @@ class Migration(migrations.Migration): ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('first_name', models.CharField(max_length=255)), ('last_name', models.CharField(max_length=255)), - ('team', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='mainapp.team')), - ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ('team', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='mainapp.team', validators=[mainapp.models.validate_team_size])), ], ), ] diff --git a/src/mainapp/migrations/0002_member_peg_alter_member_team.py b/src/mainapp/migrations/0002_member_peg_alter_member_team.py deleted file mode 100644 index 2f276d6..0000000 --- a/src/mainapp/migrations/0002_member_peg_alter_member_team.py +++ /dev/null @@ -1,25 +0,0 @@ -# Generated by Django 4.1.5 on 2023-01-26 14:31 - -from django.db import migrations, models -import django.db.models.deletion -import mainapp.models - - -class Migration(migrations.Migration): - - dependencies = [ - ('mainapp', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='member', - name='peg', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='mainapp.peg'), - ), - migrations.AlterField( - model_name='member', - name='team', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='mainapp.team', validators=[mainapp.models.validate_team_size]), - ), - ] diff --git a/src/mainapp/models.py b/src/mainapp/models.py index 3fabee1..7ae25cb 100644 --- a/src/mainapp/models.py +++ b/src/mainapp/models.py @@ -49,13 +49,16 @@ class Member(models.Model): first_name = models.CharField(max_length=255) last_name = models.CharField(max_length=255) - user = models.OneToOneField("auth.User", on_delete=models.CASCADE) - team = models.ForeignKey("Team", on_delete=models.SET_NULL, null=True, blank=True, validators=(validate_team_size,)) - peg = models.OneToOneField("Peg", on_delete=models.SET_NULL, null=True, blank=True) + team = models.ForeignKey("Team", on_delete=models.SET_NULL, null=True, blank=True, validators=(validate_team_size,), related_name='members') + # peg = models.OneToOneField("Peg", on_delete=models.SET_NULL, null=True, blank=True) def __str__(self): return f"{self.first_name} {self.last_name} (team {self.team.team_number}))" + @property + def fullname(self) -> str: + return f"{self.first_name} {self.last_name}" + class Team(models.Model): """Represents a team""" @@ -66,6 +69,10 @@ class Team(models.Model): def __str__(self): return f"Team {self.team_number}" + @property + def members(self) -> list[Member]: + Member.objects.filter(team=self) + def validate_section_character(value): """Validates the section character""" diff --git a/src/mainapp/templates/teams.html b/src/mainapp/templates/teams.html index d498aec..eba6989 100644 --- a/src/mainapp/templates/teams.html +++ b/src/mainapp/templates/teams.html @@ -62,7 +62,7 @@
@@ -101,7 +101,6 @@ * * **/ function isEmptyOrSpaces(string) { - console.log(string === null || string.match(/^ *$/) !== null); return string === null || string.match(/^ *$/) !== null; } @@ -109,43 +108,53 @@ $("#teamsContainer").html(""); // Clear the previous listed teams if (teams.length < 1) { - $("#teamsNotFound").show() + $("#teamsNotFound").show(); } // Iterate over and add each team teams.forEach((team, index) => { - - const teamColumn = $( - `