new ERD based models

This commit is contained in:
Corban-Lee Jones 2024-11-05 10:38:33 +00:00
parent bc0166b3ce
commit 42a8ae9c20
11 changed files with 811 additions and 617 deletions

View File

@ -18,6 +18,6 @@ from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('api.urls')),
# path('api/', include('api.urls')),
path('', include('mainapp.urls')),
]

View File

@ -1,3 +0,0 @@
from django.contrib import admin
# Register your models here.

View File

@ -1,3 +0,0 @@
from django.db import models
# Create your models here.

View File

@ -1,27 +1,27 @@
from rest_framework import serializers
from mainapp.models import Venue
# from mainapp.models import Venue
class VenueSerializer(serializers.ModelSerializer):
class Meta:
model = Venue
fields = (
"pk",
"name",
"description",
"extra_notes",
"venue_type",
"phone_number",
"email_address",
"website_url",
"street_address",
"city",
"provence",
"postal_code",
"country",
"latitude",
"longitude",
"twitter_url",
"instagram_url",
"facebook_url",
"active",
)
# class VenueSerializer(serializers.ModelSerializer):
# class Meta:
# model = Venue
# fields = (
# "pk",
# "name",
# "description",
# "extra_notes",
# "venue_type",
# "phone_number",
# "email_address",
# "website_url",
# "street_address",
# "city",
# "provence",
# "postal_code",
# "country",
# "latitude",
# "longitude",
# "twitter_url",
# "instagram_url",
# "facebook_url",
# "active",
# )

View File

@ -1,9 +1,9 @@
from django.urls import path, include
from .views import VenueListView, VenueDetailView
# from .views import VenueListView, VenueDetailView
urlpatterns = [
path('venue/', include([
path("", VenueListView.as_view()),
path("<int:pk>/", VenueDetailView.as_view())
]))
]
# urlpatterns = [
# path('venue/', include([
# path("", VenueListView.as_view()),
# path("<int:pk>/", VenueDetailView.as_view())
# ]))
# ]

View File

@ -1,14 +1,14 @@
from django.shortcuts import render
from rest_framework import generics
from .serializers import VenueSerializer
from mainapp.models import Venue
# from .serializers import VenueSerializer
# from mainapp.models import Venue
# Create your views here.
class VenueListView(generics.ListCreateAPIView):
serializer_class = VenueSerializer
queryset = Venue.objects.all().order_by("name")
# class VenueListView(generics.ListCreateAPIView):
# serializer_class = VenueSerializer
# queryset = Venue.objects.all().order_by("name")
class VenueDetailView(generics.RetrieveUpdateDestroyAPIView):
serializer_class = VenueSerializer
queryset = Venue.objects.all().order_by("name")
# class VenueDetailView(generics.RetrieveUpdateDestroyAPIView):
# serializer_class = VenueSerializer
# queryset = Venue.objects.all().order_by("name")

View File

@ -2,17 +2,23 @@
from django.contrib import admin
from .models import Venue, Waters
# from .models import Member, Team, Section
# from .models import Venue, Waters
# # from .models import Member, Team, Section
# @admin.register(Venue)
# class VenueAdmin(admin.ModelAdmin):
# """Admin model for the Venue model."""
# @admin.register(Waters)
# class WatersAdmin(admin.ModelAdmin):
# """Admin model for the Waters model"""
@admin.register(Venue)
class VenueAdmin(admin.ModelAdmin):
"""Admin model for the Venue model."""
@admin.register(Waters)
class WatersAdmin(admin.ModelAdmin):
"""Admin model for the Waters model"""

View File

@ -0,0 +1,23 @@
# Generated by Django 5.0.6 on 2024-11-05 09:51
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('mainapp', '0005_alter_venue_city_alter_venue_country_and_more'),
]
operations = [
migrations.RemoveField(
model_name='waters',
name='venue',
),
migrations.DeleteModel(
name='Venue',
),
migrations.DeleteModel(
name='Waters',
),
]

View File

@ -1,88 +1,260 @@
"""Models for the mainapp."""
from django.db import models
from django.utils import timezone
from django.core.exceptions import ValidationError
class Venue(models.Model):
"""Represents a Venue and Waters."""
# region Generic Models
VENUE_TYPES = (
("FISHERY", "Fishery"),
("CLUB", "Club"),
("PRIVATE", "Private")
)
class GenericTypeModel(models.Model):
name = models.CharField(max_length=128)
name = models.CharField(max_length=255, null=True, blank=True)
description = models.TextField(blank=True, max_length=500, null=True,)
extra_notes = models.TextField(blank=True, null=True,)
venue_type = models.CharField(choices=VENUE_TYPES, max_length=50, null=True, blank=True)
# Contact information
phone_number = models.CharField(max_length=100, null=True, blank=True)
email_address = models.EmailField(null=True, blank=True)
website_url = models.URLField(null=True, blank=True)
# Location information
street_address = models.CharField(max_length=100, null=True, blank=True)
city = models.CharField(max_length=255, null=True, blank=True)
provence = models.CharField(max_length=100, null=True, blank=True)
postal_code = models.CharField(max_length=20, null=True, blank=True)
country = models.CharField(max_length=100, null=True, blank=True)
latitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True)
longitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True)
# Socials information
twitter_url = models.URLField(blank=True, null=True)
instagram_url = models.URLField(blank=True, null=True)
facebook_url = models.URLField(blank=True, null=True)
active = models.BooleanField(default=True)
class Meta:
abstract = True
ordering = ("name",)
def __str__(self):
return self.name
def waters(self):
"""Returns all waters linked to this venue."""
waters = Waters.objects.filter(venue=self)
return waters
# region Anglers & Groups
class Angler(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=128)
redact = models.BooleanField()
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)
def __str__(self):
return f"{self.name} ({self.anglers.count} anglers)"
# 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):
"""Represents the waters of a Venue"""
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=128)
pegs_from = models.IntegerField()
pegs_to = models.IntegerField()
map = models.ImageField()
WATER_TYPES = (
("CW", "Commercial Water"),
("NSW", "Natural Still Water"),
("C", "Canal"),
("R", "River"),
("L", "Loch"),
)
FISH_TYPES = (
("C", "Coarse"),
("SC", "Specimen Carp"),
("G", "Game"),
("P", "Predator"),
)
venue = models.ForeignKey(Venue, on_delete=models.CASCADE)
name = models.CharField(max_length=100)
description = models.TextField(max_length=255)
pegs_min = models.IntegerField()
pegs_max = models.IntegerField()
water_type = models.CharField(choices=WATER_TYPES, max_length=50)
fish_type = models.CharField(choices=FISH_TYPES, max_length=50)
# water_map = models.ImageField()
type = models.ForeignKey(to=WatersType, on_delete=models.CASCADE)
fish_types = models.ForeignKey()
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()
street_address = models.CharField(max_length=256)
town = models.CharField(max_length=256)
county = models.CharField(max_length=256)
post_code = models.CharField(max_length=32)
satnav_post_code = models.CharField(max_length=32)
country = models.CharField(max_length=128)
latitude = models.DecimalField(max_digits=22, decimal_places=16)
longitude = models.DecimalField(max_digits=22, decimal_places=16)
def __str__(self):
return f"{self.street_address}, {self.town} ({self.country})"
class VenueContacts(models.Model):
id = models.AutoField(primary_key=True)
phone_number = models.CharField(max_length=64)
email_address = models.EmailField()
website_url = models.URLField()
facebook_url = models.URLField()
twitter_url = models.URLField()
instagram_url = models.URLField()
def __str__(self):
return self.email_address
class Venue(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=128)
description = models.CharField(max_length=384)
extra_notes = models.CharField(max_length=1028)
created_at = models.DateTimeField(default=timezone.now, editable=False)
updated_at = models.DateTimeField(default=timezone.now, editable=False)
profile_picture = models.ImageField()
banner_picture = models.ImageField()
type = models.ForeignKey(to=VenueType, on_delete=models.CASCADE)
address = models.ForeignKey(to=VenueAddress, on_delete=models.CASCADE)
contacts = models.ForeignKey(to=VenueContacts, on_delete=models.CASCADE)
waters = models.ManyToManyField(to=Waters)
def __str__(self):
return self.name
def save(self, *args, **kwargs):
self.updated_at = timezone.now()
return super().save(*args, **kwargs)
# region Leagues & Matches
class LeagueRule(models.Model):
pass
class League(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=128)
description = models.CharField(max_length=384)
extra_notes = models.CharField(max_length=1028)
profile_picture = models.ImageField()
banner_picture = models.ImageField()
matches = models.ForeignKey()
anglers = models.ForeignKey()
results = models.ManyToManyField()
rules = models.ManyToManyField(to=LeagueRule)
class Sponsor(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=128)
url = models.URLField()
image = models.ImageField()
def __str__(self):
return self.name
class LeagueResult(models.Model):
id = models.AutoField(primary_key=True)
league = models.ForeignKey(to=League, on_delete=models.CASCADE)
angler = models.ForeignKey(to=Angler, on_delete=models.CASCADE)
sponsor = models.ForeignKey(to=Sponsor, on_delete=models.CASCADE, null=True, blank=True)
total_weight = models.CharField(max_length=64)
matches = models.IntegerField()
date = models.DateField(default=timezone.now)
def __str__(self):
return f"{self.league.name} - {self.angler.name}"
# class Venue(models.Model):
# """Represents a Venue and Waters."""
# VENUE_TYPES = (
# ("FISHERY", "Fishery"),
# ("CLUB", "Club"),
# ("PRIVATE", "Private")
# )
# name = models.CharField(max_length=255, null=True, blank=True)
# description = models.TextField(blank=True, max_length=500, null=True,)
# extra_notes = models.TextField(blank=True, null=True,)
# venue_type = models.CharField(choices=VENUE_TYPES, max_length=50, null=True, blank=True)
# # Contact information
# phone_number = models.CharField(max_length=100, null=True, blank=True)
# email_address = models.EmailField(null=True, blank=True)
# website_url = models.URLField(null=True, blank=True)
# # Location information
# street_address = models.CharField(max_length=100, null=True, blank=True)
# city = models.CharField(max_length=255, null=True, blank=True)
# provence = models.CharField(max_length=100, null=True, blank=True)
# postal_code = models.CharField(max_length=20, null=True, blank=True)
# country = models.CharField(max_length=100, null=True, blank=True)
# latitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True)
# longitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True)
# # Socials information
# twitter_url = models.URLField(blank=True, null=True)
# instagram_url = models.URLField(blank=True, null=True)
# facebook_url = models.URLField(blank=True, null=True)
# active = models.BooleanField(default=True)
# def __str__(self):
# return self.name
# def waters(self):
# """Returns all waters linked to this venue."""
# waters = Waters.objects.filter(venue=self)
# return waters
# class Waters(models.Model):
# """Represents the waters of a Venue"""
# WATER_TYPES = (
# ("CW", "Commercial Water"),
# ("NSW", "Natural Still Water"),
# ("C", "Canal"),
# ("R", "River"),
# ("L", "Loch"),
# )
# FISH_TYPES = (
# ("C", "Coarse"),
# ("SC", "Specimen Carp"),
# ("G", "Game"),
# ("P", "Predator"),
# )
# venue = models.ForeignKey(Venue, on_delete=models.CASCADE)
# name = models.CharField(max_length=100)
# description = models.TextField(max_length=255)
# pegs_min = models.IntegerField()
# pegs_max = models.IntegerField()
# water_type = models.CharField(choices=WATER_TYPES, max_length=50)
# fish_type = models.CharField(choices=FISH_TYPES, max_length=50)
# # water_map = models.ImageField()
# def __str__(self):
# return self.name
# class ReusableAutoField(models.PositiveIntegerField):
# """A django auto field that can reuse deleted primary keys."""

View File

@ -3,22 +3,22 @@ from . import views
urlpatterns = [
path('', views.index, name='index'),
path('results/', views.results, name='results'),
path('scoreboard/', views.scoreboard, name='scoreboard'),
path('members/', views.teams, name='members'),
path('venues/', views.venues, name='venues'),
path('venues/get-waters/<int:venue_id>', views.get_venue_waters, name="get-venue-waters"),
path('venues/<int:venue_id>', views.venue_details, name="venue-details"),
path("venues/api/<int:venue_id>", views.get_venue_details, name="venue-details"),
path("venues/api/create", views.create_venue, name="create-venue"),
# path('results/', views.results, name='results'),
# path('scoreboard/', views.scoreboard, name='scoreboard'),
# path('members/', views.teams, name='members'),
# path('venues/', views.venues, name='venues'),
# path('venues/get-waters/<int:venue_id>', views.get_venue_waters, name="get-venue-waters"),
# path('venues/<int:venue_id>', views.venue_details, name="venue-details"),
# path("venues/api/<int:venue_id>", views.get_venue_details, name="venue-details"),
# path("venues/api/create", views.create_venue, name="create-venue"),
# path('bulk-peg/', views.bulk_create_pegs, name='bulk-peg'),
path('get-angler-data/', views.get_angler_page_data, name='get-angler-data'),
path('update-member/', views.update_member, name='update-member'),
path('update-section/', views.update_section, name='update-section'),
path('update-team/', views.update_team, name='update-team'),
path("get-next-identifier/", views.get_next_identifier, name='get-next-identifier'),
# # path('bulk-peg/', views.bulk_create_pegs, name='bulk-peg'),
# path('get-angler-data/', views.get_angler_page_data, name='get-angler-data'),
# path('update-member/', views.update_member, name='update-member'),
# path('update-section/', views.update_section, name='update-section'),
# path('update-team/', views.update_team, name='update-team'),
# path("get-next-identifier/", views.get_next_identifier, name='get-next-identifier'),
# Rewrite
path('anglers/', views.ManageAnglersView.as_view(), name='anglers'),
# # Rewrite
# path('anglers/', views.ManageAnglersView.as_view(), name='anglers'),
]

File diff suppressed because it is too large Load Diff