From f10d8496310b3425fff2975c36cc3f82ae458720 Mon Sep 17 00:00:00 2001 From: Corban-Lee <77944149+XordK@users.noreply.github.com> Date: Thu, 26 Jan 2023 14:38:07 +0000 Subject: [PATCH] added other data models from the specs --- src/mainapp/admin.py | 27 +++++++- src/mainapp/migrations/0001_initial.py | 30 ++++++++- .../0002_member_peg_alter_member_team.py | 25 ++++++++ src/mainapp/models.py | 61 ++++++++++++++++--- 4 files changed, 132 insertions(+), 11 deletions(-) create mode 100644 src/mainapp/migrations/0002_member_peg_alter_member_team.py diff --git a/src/mainapp/admin.py b/src/mainapp/admin.py index 032dcb9..3ab2193 100644 --- a/src/mainapp/admin.py +++ b/src/mainapp/admin.py @@ -2,7 +2,7 @@ from django.contrib import admin -from .models import Peg +from .models import Peg, Member, Team, Section @admin.register(Peg) @@ -14,3 +14,28 @@ class PegAdmin(admin.ModelAdmin): list_display = ("peg_number",) search_fields = ("peg_number",) + +@admin.register(Member) +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") + + +@admin.register(Team) +class TeamAdmin(admin.ModelAdmin): + """Admin model for the Team model.""" + + readonly_fields = ("team_number",) + list_display = ("team_number",) + search_fields = ("team_number",) + + +@admin.register(Section) +class SectionAdmin(admin.ModelAdmin): + """Admin model for the Section model.""" + + list_display = ("character",) + search_fields = ("character",) diff --git a/src/mainapp/migrations/0001_initial.py b/src/mainapp/migrations/0001_initial.py index 6a12d9c..dd0dc47 100644 --- a/src/mainapp/migrations/0001_initial.py +++ b/src/mainapp/migrations/0001_initial.py @@ -1,6 +1,8 @@ -# Generated by Django 4.1.5 on 2023-01-26 09:11 +# Generated by Django 4.1.5 on 2023-01-26 14:24 -from django.db import migrations +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion import mainapp.models @@ -9,6 +11,7 @@ class Migration(migrations.Migration): initial = True dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ @@ -18,4 +21,27 @@ class Migration(migrations.Migration): ('peg_number', mainapp.models.ReusableAutoField(default=mainapp.models.ReusableAutoField.get_default, editable=False, primary_key=True, serialize=False)), ], ), + migrations.CreateModel( + name='Section', + fields=[ + ('character', models.CharField(max_length=1, primary_key=True, serialize=False, validators=[mainapp.models.validate_section_character])), + ], + ), + migrations.CreateModel( + name='Team', + fields=[ + ('team_number', mainapp.models.ReusableAutoField(default=mainapp.models.ReusableAutoField.get_default, editable=False, primary_key=True, serialize=False)), + ('section', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='mainapp.section')), + ], + ), + migrations.CreateModel( + name='Member', + fields=[ + ('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)), + ], + ), ] diff --git a/src/mainapp/migrations/0002_member_peg_alter_member_team.py b/src/mainapp/migrations/0002_member_peg_alter_member_team.py new file mode 100644 index 0000000..2f276d6 --- /dev/null +++ b/src/mainapp/migrations/0002_member_peg_alter_member_team.py @@ -0,0 +1,25 @@ +# 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 b31ec15..f79de2b 100644 --- a/src/mainapp/models.py +++ b/src/mainapp/models.py @@ -1,4 +1,5 @@ from django.db import models +from django.core.exceptions import ValidationError # products/models.py from django.db import models @@ -24,6 +25,8 @@ class ReusableAutoField(models.PositiveIntegerField): return 1 def get_default(self): + """Returns the default value for this field""" + return self.get_next_available_id(self.model) @@ -33,16 +36,58 @@ class Peg(models.Model): peg_number = ReusableAutoField(primary_key=True, default=ReusableAutoField.get_default, editable=False) def __str__(self): - return f"{self.peg_number}" + return f"Peg {self.peg_number}" -def get_next_available_peg_id(): - queryset = Peg.__class__._default_manager.all() - try: - last_id = queryset.order_by("-pk")[0].pk - except IndexError: - last_id = 0 - return last_id + 1 +def validate_team_size(value): + if Member.objects.filter(team=value).count() >= 3: + raise ValidationError('Team already has maximal amount of members (3)') + + +class Member(models.Model): + """Represents a member of a team""" + + 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) + + def __str__(self): + return f"{self.first_name} {self.last_name} (team {self.team.team_number}))" + + +class Team(models.Model): + """Represents a team""" + + team_number = ReusableAutoField(primary_key=True, default=ReusableAutoField.get_default, editable=False) + section = models.OneToOneField("Section", on_delete=models.SET_NULL, null=True, blank=True) + + def __str__(self): + return f"Team {self.team_number}" + + +def validate_section_character(value): + """Validates the section character""" + + value = value.upper() + banned_characters = ["I"] + + if value in banned_characters: + raise ValidationError(f"The character <{value}> is a prohibited character because fuck you I guess") + + +class Section(models.Model): + """Represents a section of the scoreboard""" + + # character field stores a single character but doesnt allow for 'E' or 'e' + character = models.CharField(primary_key=True, max_length=1, validators=(validate_section_character, )) + + def clean(self): + self.character = self.character.upper() + + def __str__(self): + return f"Section {self.character}" #class Scoreboard(models.Model):