From 5f7ba001ac23aaa49e2de13457b64baeb6c00a10 Mon Sep 17 00:00:00 2001 From: Corban-Lee Date: Tue, 5 Nov 2024 13:47:12 +0000 Subject: [PATCH] replace generic types abstract model with integer choices --- apps/home/admin.py | 24 +-- apps/home/migrations/0001_initial.py | 175 +++++++++++---------- apps/home/models.py | 219 ++++++++++++++++++++++----- 3 files changed, 265 insertions(+), 153 deletions(-) diff --git a/apps/home/admin.py b/apps/home/admin.py index 1f09d79..813b994 100644 --- a/apps/home/admin.py +++ b/apps/home/admin.py @@ -9,30 +9,14 @@ from . import models class Angler(admin.ModelAdmin): pass -@admin.register(models.AnglerGroupType) -class AnglerGroupType(admin.ModelAdmin): pass - - @admin.register(models.AnglerGroup) class AnglerGroup(admin.ModelAdmin): pass -@admin.register(models.FishType) -class FishType(admin.ModelAdmin): pass - - -@admin.register(models.WatersType) -class WatersType(admin.ModelAdmin): pass - - @admin.register(models.Waters) class Waters(admin.ModelAdmin): pass -@admin.register(models.VenueType) -class VenueType(admin.ModelAdmin): pass - - @admin.register(models.VenueAddress) class VenueAddress(admin.ModelAdmin): pass @@ -41,12 +25,8 @@ class VenueAddress(admin.ModelAdmin): pass class VenueContacts(admin.ModelAdmin): pass -@admin.register(models.CompetitorType) -class CompetitorType(admin.ModelAdmin): pass - - -@admin.register(models.MatchType) -class MatchType(admin.ModelAdmin): pass +@admin.register(models.Venue) +class Venue(admin.ModelAdmin): pass @admin.register(models.Match) diff --git a/apps/home/migrations/0001_initial.py b/apps/home/migrations/0001_initial.py index a2ea9c6..11941a5 100644 --- a/apps/home/migrations/0001_initial.py +++ b/apps/home/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.0.6 on 2024-11-05 11:39 +# Generated by Django 5.0.6 on 2024-11-05 12:49 import django.db.models.deletion import django.utils.timezone @@ -20,55 +20,58 @@ class Migration(migrations.Migration): ('name', models.CharField(max_length=128)), ('redact', models.BooleanField()), ], - ), - migrations.CreateModel( - name='AnglerGroupType', - fields=[ - ('name', models.CharField(max_length=128)), - ('id', models.AutoField(primary_key=True, serialize=False)), - ], options={ - 'ordering': ('name',), - 'abstract': False, - }, - ), - migrations.CreateModel( - name='CompetitorType', - fields=[ - ('name', models.CharField(max_length=128)), - ('id', models.AutoField(primary_key=True, serialize=False)), - ], - options={ - 'ordering': ('name',), - 'abstract': False, - }, - ), - migrations.CreateModel( - name='FishType', - fields=[ - ('name', models.CharField(max_length=128)), - ('id', models.AutoField(primary_key=True, serialize=False)), - ], - options={ - 'ordering': ('name',), - 'abstract': False, + 'verbose_name': 'angler', + 'verbose_name_plural': 'anglers', }, ), migrations.CreateModel( name='LeagueRule', fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ], - ), - migrations.CreateModel( - name='MatchType', - fields=[ - ('name', models.CharField(max_length=128)), ('id', models.AutoField(primary_key=True, serialize=False)), + ('name', models.CharField(max_length=128)), + ('ranking_system', models.PositiveSmallIntegerField(choices=[(0, 'choice 1'), (1, 'choice 2'), (2, 'choice 3')])), + ('points_allocation', models.PositiveSmallIntegerField(choices=[(0, 'choice 1'), (1, 'choice 2'), (2, 'choice 3')])), + ('points_awarded', models.PositiveSmallIntegerField(choices=[(0, 'choice 1'), (1, 'choice 2'), (2, 'choice 3')])), + ('place_secondly_by_weight', models.BooleanField()), + ('team_places_secondly_by_section', models.BooleanField()), + ('section_placed_positions', models.IntegerField()), + ('worst_place_limits', models.BooleanField()), + ('attendance_points', models.IntegerField()), + ('did_not_weigh', models.PositiveSmallIntegerField(choices=[(0, 'choice 1'), (1, 'choice 2'), (2, 'choice 3')])), + ('did_not_weigh_value', models.IntegerField()), + ('left_early', models.PositiveSmallIntegerField(choices=[(0, 'choice 1'), (1, 'choice 2'), (2, 'choice 3')])), + ('left_early_value', models.IntegerField()), + ('did_not_book', models.IntegerField()), + ('disqualification', models.PositiveSmallIntegerField(choices=[(0, 'choice 1'), (1, 'choice 2'), (2, 'choice 3')])), + ('disqualification_value', models.IntegerField()), + ('best_league_sessions', models.IntegerField()), + ('worst_league_sessions', models.IntegerField()), + ('match_placed_positions', models.IntegerField()), ], options={ - 'ordering': ('name',), - 'abstract': False, + 'verbose_name': 'league rule', + 'verbose_name_plural': 'league rules', + }, + ), + migrations.CreateModel( + name='Match', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('name', models.CharField(max_length=128)), + ('description', models.CharField(max_length=384)), + ('meeting_point', models.CharField(max_length=1024)), + ('use_metric', models.BooleanField()), + ('allow_in_tournaments', models.BooleanField()), + ('start_datetime', models.DateTimeField()), + ('end_datetime', models.DateTimeField()), + ('draw_datetime', models.DateTimeField()), + ('type', models.PositiveSmallIntegerField(choices=[(0, 'choice 1'), (1, 'choice 2'), (2, 'choice 3')])), + ('competitor_type', models.PositiveSmallIntegerField(choices=[(0, 'choice 1'), (1, 'choice 2'), (2, 'choice 3')])), + ], + options={ + 'verbose_name': 'match', + 'verbose_name_plural': 'matches', }, ), migrations.CreateModel( @@ -79,6 +82,10 @@ class Migration(migrations.Migration): ('url', models.URLField()), ('image', models.ImageField(upload_to='')), ], + options={ + 'verbose_name': 'sponsor', + 'verbose_name_plural': 'sponsors', + }, ), migrations.CreateModel( name='Venue', @@ -91,7 +98,12 @@ class Migration(migrations.Migration): ('updated_at', models.DateTimeField(default=django.utils.timezone.now, editable=False)), ('profile_picture', models.ImageField(upload_to='')), ('banner_picture', models.ImageField(upload_to='')), + ('type', models.PositiveSmallIntegerField(choices=[(0, 'Fishery'), (1, 'Club'), (2, 'Private')])), ], + options={ + 'verbose_name': 'venue', + 'verbose_name_plural': 'venues', + }, ), migrations.CreateModel( name='VenueAddress', @@ -107,6 +119,10 @@ class Migration(migrations.Migration): ('latitude', models.DecimalField(decimal_places=16, max_digits=22)), ('longitude', models.DecimalField(decimal_places=16, max_digits=22)), ], + options={ + 'verbose_name': 'venue address', + 'verbose_name_plural': 'venue addresses', + }, ), migrations.CreateModel( name='VenueContacts', @@ -119,27 +135,25 @@ class Migration(migrations.Migration): ('twitter_url', models.URLField()), ('instagram_url', models.URLField()), ], - ), - migrations.CreateModel( - name='VenueType', - fields=[ - ('name', models.CharField(max_length=128)), - ('id', models.AutoField(primary_key=True, serialize=False)), - ], options={ - 'ordering': ('name',), - 'abstract': False, + 'verbose_name': 'venue contacts', + 'verbose_name_plural': 'venue contacts', }, ), migrations.CreateModel( - name='WatersType', + name='Waters', fields=[ - ('name', models.CharField(max_length=128)), ('id', models.AutoField(primary_key=True, serialize=False)), + ('name', models.CharField(max_length=128)), + ('pegs_from', models.IntegerField()), + ('pegs_to', models.IntegerField()), + ('map', models.ImageField(upload_to='')), + ('type', models.PositiveSmallIntegerField(choices=[(0, 'Commercial Water'), (1, 'Natural Still Water'), (2, 'Canal'), (3, 'River'), (4, 'Loch')])), + ('fish_types', models.PositiveSmallIntegerField(choices=[(0, 'Coarse'), (1, 'Specimen Carp'), (2, 'Game'), (3, 'Predator')])), ], options={ - 'ordering': ('name',), - 'abstract': False, + 'verbose_name': 'waters', + 'verbose_name_plural': 'waters', }, ), migrations.CreateModel( @@ -147,26 +161,13 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(primary_key=True, serialize=False)), ('name', models.CharField(max_length=128)), + ('type', models.PositiveSmallIntegerField(choices=[(0, 'choice 1'), (1, 'choice 2'), (2, 'choice 3')])), ('anglers', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='apps_home.angler')), - ('type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='apps_home.anglergrouptype')), - ], - ), - migrations.CreateModel( - name='Match', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(max_length=128)), - ('description', models.CharField(max_length=384)), - ('meeting_point', models.CharField(max_length=1024)), - ('use_metric', models.BooleanField()), - ('allow_in_tournaments', models.BooleanField()), - ('start_datetime', models.DateTimeField()), - ('end_datetime', models.DateTimeField()), - ('draw_datetime', models.DateTimeField()), - ('competitor_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='apps_home.competitortype')), - ('type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='apps_home.matchtype')), - ('venue', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='apps_home.venue')), ], + options={ + 'verbose_name': 'angler group', + 'verbose_name_plural': 'angler groups', + }, ), migrations.CreateModel( name='League', @@ -181,6 +182,10 @@ class Migration(migrations.Migration): ('rules', models.ManyToManyField(to='apps_home.leaguerule')), ('matches', models.ManyToManyField(to='apps_home.match')), ], + options={ + 'verbose_name': 'league', + 'verbose_name_plural': 'leagues', + }, ), migrations.CreateModel( name='LeagueResult', @@ -193,6 +198,15 @@ class Migration(migrations.Migration): ('league', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='apps_home.league')), ('sponsor', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='apps_home.sponsor')), ], + options={ + 'verbose_name': 'league result', + 'verbose_name_plural': 'league results', + }, + ), + migrations.AddField( + model_name='match', + name='venue', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='apps_home.venue'), ), migrations.AddField( model_name='venue', @@ -204,23 +218,6 @@ class Migration(migrations.Migration): name='contacts', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='apps_home.venuecontacts'), ), - migrations.AddField( - model_name='venue', - name='type', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='apps_home.venuetype'), - ), - migrations.CreateModel( - name='Waters', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(max_length=128)), - ('pegs_from', models.IntegerField()), - ('pegs_to', models.IntegerField()), - ('map', models.ImageField(upload_to='')), - ('fish_types', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='apps_home.fishtype')), - ('type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='apps_home.waterstype')), - ], - ), migrations.AddField( model_name='venue', name='waters', diff --git a/apps/home/models.py b/apps/home/models.py index b4d0ea6..8ffdc2c 100644 --- a/apps/home/models.py +++ b/apps/home/models.py @@ -5,19 +5,6 @@ from django.utils import timezone from django.core.exceptions import ValidationError -# region Generic Models - -class GenericTypeModel(models.Model): - name = models.CharField(max_length=128) - - class Meta: - abstract = True - ordering = ("name",) - - def __str__(self): - return self.name - - # region Anglers & Groups class Angler(models.Model): @@ -25,19 +12,29 @@ class Angler(models.Model): name = models.CharField(max_length=128) redact = models.BooleanField() + class Meta: + verbose_name = "angler" + verbose_name_plural = "anglers" + def __str__(self): return self.name -class AnglerGroupType(GenericTypeModel): - id = models.AutoField(primary_key=True) - - class AnglerGroup(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=128) anglers = models.ForeignKey(to=Angler, on_delete=models.CASCADE) - type = models.ForeignKey(to=AnglerGroupType, on_delete=models.CASCADE) + + TYPES = ( + (0, "choice 1"), + (1, "choice 2"), + (2, "choice 3") + ) + type = models.PositiveSmallIntegerField(choices=TYPES) + + class Meta: + verbose_name = "angler group" + verbose_name_plural = "angler groups" def __str__(self): return f"{self.name} ({self.anglers.count} anglers)" @@ -45,13 +42,6 @@ class AnglerGroup(models.Model): # region Venues & Waters -class FishType(GenericTypeModel): - id = models.AutoField(primary_key=True) - - -class WatersType(GenericTypeModel): - id = models.AutoField(primary_key=True) - class Waters(models.Model): id = models.AutoField(primary_key=True) @@ -60,17 +50,44 @@ class Waters(models.Model): pegs_to = models.IntegerField() map = models.ImageField() - type = models.ForeignKey(to=WatersType, on_delete=models.CASCADE) - fish_types = models.ForeignKey(to=FishType, on_delete=models.CASCADE) + class Types: + COMMERCIAL = 0 + NATURAL_STILL = 1 + CANAL = 2 + RIVER = 3 + LOCH = 4 + type = models.PositiveSmallIntegerField( + choices=( + (Types.COMMERCIAL, "Commercial Water"), + (Types.NATURAL_STILL, "Natural Still Water"), + (Types.CANAL, "Canal"), + (Types.RIVER, "River"), + (Types.LOCH, "Loch") + ) + ) + + class FishTypes: + COARSE = 0 + SPECIMEN_CARP = 1 + GAME = 2 + PREDATOR = 3 + fish_types = models.PositiveSmallIntegerField( + choices=( + (FishTypes.COARSE, "Coarse"), + (FishTypes.SPECIMEN_CARP, "Specimen Carp"), + (FishTypes.GAME, "Game"), + (FishTypes.PREDATOR, "Predator") + ) + ) + + class Meta: + verbose_name = "waters" + verbose_name_plural = "waters" def __str__(self): return self.name -class VenueType(GenericTypeModel): - id = models.AutoField(primary_key=True) - - class VenueAddress(models.Model): id = models.AutoField(primary_key=True) street_number = models.IntegerField() @@ -83,6 +100,10 @@ class VenueAddress(models.Model): latitude = models.DecimalField(max_digits=22, decimal_places=16) longitude = models.DecimalField(max_digits=22, decimal_places=16) + class Meta: + verbose_name = "venue address" + verbose_name_plural = "venue addresses" + def __str__(self): return f"{self.street_address}, {self.town} ({self.country})" @@ -96,6 +117,10 @@ class VenueContacts(models.Model): twitter_url = models.URLField() instagram_url = models.URLField() + class Meta: + verbose_name = "venue contacts" + verbose_name_plural = "venue contacts" + def __str__(self): return self.email_address @@ -112,11 +137,27 @@ class Venue(models.Model): profile_picture = models.ImageField() banner_picture = models.ImageField() - type = models.ForeignKey(to=VenueType, on_delete=models.CASCADE) + class Types: + FISHERY = 0 + CLUB = 1 + PRIVATE = 2 + + type = models.PositiveSmallIntegerField( + choices=( + (Types.FISHERY, "Fishery"), + (Types.CLUB, "Club"), + (Types.PRIVATE, "Private") + ) + ) + address = models.ForeignKey(to=VenueAddress, on_delete=models.CASCADE) contacts = models.ForeignKey(to=VenueContacts, on_delete=models.CASCADE) waters = models.ManyToManyField(to=Waters) + class Meta: + verbose_name = "venue" + verbose_name_plural = "venues" + def __str__(self): return self.name @@ -127,13 +168,6 @@ class Venue(models.Model): # region Leagues & Matches -class CompetitorType(GenericTypeModel): - id = models.AutoField(primary_key=True) - - -class MatchType(GenericTypeModel): - id = models.AutoField(primary_key=True) - class Match(models.Model): id = models.AutoField(primary_key=True) @@ -151,12 +185,101 @@ class Match(models.Model): end_datetime = models.DateTimeField() draw_datetime = models.DateTimeField() - type = models.ForeignKey(to=MatchType, on_delete=models.CASCADE) - competitor_type = models.ForeignKey(to=CompetitorType, on_delete=models.CASCADE) + TYPES = ( + (0, "choice 1"), + (1, "choice 2"), + (2, "choice 3") + ) + type = models.PositiveSmallIntegerField(choices=TYPES) + + COMPETITOR_TYPES = ( + (0, "choice 1"), + (1, "choice 2"), + (2, "choice 3") + ) + competitor_type = models.PositiveSmallIntegerField(choices=COMPETITOR_TYPES) + + class Meta: + verbose_name = "match" + verbose_name_plural = "matches" + + def __str__(self): + return self.name class LeagueRule(models.Model): - pass + id = models.AutoField(primary_key=True) + name = models.CharField(max_length=128) + + RANKING_SYSTEMS = ( + (0, "choice 1"), + (1, "choice 2"), + (2, "choice 3") + ) + ranking_system = models.PositiveSmallIntegerField(choices=RANKING_SYSTEMS) + + POINTS_ALLOCATIONS = ( + (0, "choice 1"), + (1, "choice 2"), + (2, "choice 3") + ) + points_allocation = models.PositiveSmallIntegerField(choices=POINTS_ALLOCATIONS) + + POINTS_AWARDED = ( + (0, "choice 1"), + (1, "choice 2"), + (2, "choice 3") + ) + points_awarded = models.PositiveSmallIntegerField(choices=POINTS_AWARDED) + + place_secondly_by_weight = models.BooleanField() + team_places_secondly_by_section = models.BooleanField() + section_placed_positions = models.IntegerField() + worst_place_limits = models.BooleanField() + attendance_points = models.IntegerField() + + DID_NOT_WEIGHS = ( + (0, "choice 1"), + (1, "choice 2"), + (2, "choice 3") + ) + did_not_weigh = models.PositiveSmallIntegerField(choices=DID_NOT_WEIGHS) + did_not_weigh_value = models.IntegerField() + + LEFT_EARLYS = ( + (0, "choice 1"), + (1, "choice 2"), + (2, "choice 3") + ) + left_early = models.PositiveSmallIntegerField(choices=LEFT_EARLYS) + left_early_value = models.IntegerField() + + DID_NOT_BOOKS = ( + (0, "choice 1"), + (1, "choice 2"), + (2, "choice 3") + ) + did_not_book = models.PositiveSmallIntegerField(choices=DID_NOT_BOOKS) + did_not_book = models.IntegerField() + + DISQUALIFICATIONS = ( + (0, "choice 1"), + (1, "choice 2"), + (2, "choice 3") + ) + disqualification = models.PositiveSmallIntegerField(choices=DISQUALIFICATIONS) + disqualification_value = models.IntegerField() + + best_league_sessions = models.IntegerField() + worst_league_sessions = models.IntegerField() + match_placed_positions = models.IntegerField() + + class Meta: + verbose_name = "league rule" + verbose_name_plural = "league rules" + + def __str__(self): + return self.name class League(models.Model): @@ -172,6 +295,10 @@ class League(models.Model): anglers = models.ManyToManyField(to=Angler) rules = models.ManyToManyField(to=LeagueRule) + class Meta: + verbose_name = "league" + verbose_name_plural = "leagues" + def __str__(self): return self.name @@ -186,6 +313,10 @@ class Sponsor(models.Model): url = models.URLField() image = models.ImageField() + class Meta: + verbose_name = "sponsor" + verbose_name_plural = "sponsors" + def __str__(self): return self.name @@ -201,6 +332,10 @@ class LeagueResult(models.Model): matches = models.IntegerField() date = models.DateField(default=timezone.now) + class Meta: + verbose_name = "league result" + verbose_name_plural = "league results" + def __str__(self): return f"{self.league.name} - {self.angler.name}"