replace generic types abstract model with integer choices

This commit is contained in:
Corban-Lee Jones 2024-11-05 13:47:12 +00:00
parent 33de71ba71
commit 5f7ba001ac
3 changed files with 265 additions and 153 deletions

View File

@ -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)

View File

@ -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',

View File

@ -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}"