new ERD based models
This commit is contained in:
parent
bc0166b3ce
commit
42a8ae9c20
@ -18,6 +18,6 @@ from django.urls import path, include
|
|||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('admin/', admin.site.urls),
|
path('admin/', admin.site.urls),
|
||||||
path('api/', include('api.urls')),
|
# path('api/', include('api.urls')),
|
||||||
path('', include('mainapp.urls')),
|
path('', include('mainapp.urls')),
|
||||||
]
|
]
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
from django.contrib import admin
|
|
||||||
|
|
||||||
# Register your models here.
|
|
@ -1,3 +0,0 @@
|
|||||||
from django.db import models
|
|
||||||
|
|
||||||
# Create your models here.
|
|
@ -1,27 +1,27 @@
|
|||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from mainapp.models import Venue
|
# from mainapp.models import Venue
|
||||||
|
|
||||||
class VenueSerializer(serializers.ModelSerializer):
|
# class VenueSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
# class Meta:
|
||||||
model = Venue
|
# model = Venue
|
||||||
fields = (
|
# fields = (
|
||||||
"pk",
|
# "pk",
|
||||||
"name",
|
# "name",
|
||||||
"description",
|
# "description",
|
||||||
"extra_notes",
|
# "extra_notes",
|
||||||
"venue_type",
|
# "venue_type",
|
||||||
"phone_number",
|
# "phone_number",
|
||||||
"email_address",
|
# "email_address",
|
||||||
"website_url",
|
# "website_url",
|
||||||
"street_address",
|
# "street_address",
|
||||||
"city",
|
# "city",
|
||||||
"provence",
|
# "provence",
|
||||||
"postal_code",
|
# "postal_code",
|
||||||
"country",
|
# "country",
|
||||||
"latitude",
|
# "latitude",
|
||||||
"longitude",
|
# "longitude",
|
||||||
"twitter_url",
|
# "twitter_url",
|
||||||
"instagram_url",
|
# "instagram_url",
|
||||||
"facebook_url",
|
# "facebook_url",
|
||||||
"active",
|
# "active",
|
||||||
)
|
# )
|
@ -1,9 +1,9 @@
|
|||||||
from django.urls import path, include
|
from django.urls import path, include
|
||||||
from .views import VenueListView, VenueDetailView
|
# from .views import VenueListView, VenueDetailView
|
||||||
|
|
||||||
urlpatterns = [
|
# urlpatterns = [
|
||||||
path('venue/', include([
|
# path('venue/', include([
|
||||||
path("", VenueListView.as_view()),
|
# path("", VenueListView.as_view()),
|
||||||
path("<int:pk>/", VenueDetailView.as_view())
|
# path("<int:pk>/", VenueDetailView.as_view())
|
||||||
]))
|
# ]))
|
||||||
]
|
# ]
|
@ -1,14 +1,14 @@
|
|||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
from rest_framework import generics
|
from rest_framework import generics
|
||||||
from .serializers import VenueSerializer
|
# from .serializers import VenueSerializer
|
||||||
from mainapp.models import Venue
|
# from mainapp.models import Venue
|
||||||
|
|
||||||
# Create your views here.
|
# Create your views here.
|
||||||
|
|
||||||
class VenueListView(generics.ListCreateAPIView):
|
# class VenueListView(generics.ListCreateAPIView):
|
||||||
serializer_class = VenueSerializer
|
# serializer_class = VenueSerializer
|
||||||
queryset = Venue.objects.all().order_by("name")
|
# queryset = Venue.objects.all().order_by("name")
|
||||||
|
|
||||||
class VenueDetailView(generics.RetrieveUpdateDestroyAPIView):
|
# class VenueDetailView(generics.RetrieveUpdateDestroyAPIView):
|
||||||
serializer_class = VenueSerializer
|
# serializer_class = VenueSerializer
|
||||||
queryset = Venue.objects.all().order_by("name")
|
# queryset = Venue.objects.all().order_by("name")
|
@ -2,17 +2,23 @@
|
|||||||
|
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
|
|
||||||
from .models import Venue, Waters
|
# from .models import Venue, Waters
|
||||||
# from .models import Member, Team, Section
|
# # 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"""
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -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',
|
||||||
|
),
|
||||||
|
]
|
@ -1,88 +1,260 @@
|
|||||||
"""Models for the mainapp."""
|
"""Models for the mainapp."""
|
||||||
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
from django.utils import timezone
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
|
|
||||||
|
|
||||||
class Venue(models.Model):
|
# region Generic Models
|
||||||
"""Represents a Venue and Waters."""
|
|
||||||
|
|
||||||
VENUE_TYPES = (
|
class GenericTypeModel(models.Model):
|
||||||
("FISHERY", "Fishery"),
|
name = models.CharField(max_length=128)
|
||||||
("CLUB", "Club"),
|
|
||||||
("PRIVATE", "Private")
|
|
||||||
)
|
|
||||||
|
|
||||||
name = models.CharField(max_length=255, null=True, blank=True)
|
class Meta:
|
||||||
description = models.TextField(blank=True, max_length=500, null=True,)
|
abstract = True
|
||||||
extra_notes = models.TextField(blank=True, null=True,)
|
ordering = ("name",)
|
||||||
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):
|
def __str__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
def waters(self):
|
|
||||||
"""Returns all waters linked to this venue."""
|
|
||||||
|
|
||||||
waters = Waters.objects.filter(venue=self)
|
# region Anglers & Groups
|
||||||
return waters
|
|
||||||
|
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):
|
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 = (
|
type = models.ForeignKey(to=WatersType, on_delete=models.CASCADE)
|
||||||
("CW", "Commercial Water"),
|
fish_types = models.ForeignKey()
|
||||||
("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):
|
def __str__(self):
|
||||||
return self.name
|
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):
|
# class ReusableAutoField(models.PositiveIntegerField):
|
||||||
# """A django auto field that can reuse deleted primary keys."""
|
# """A django auto field that can reuse deleted primary keys."""
|
||||||
|
|
||||||
|
@ -3,22 +3,22 @@ from . import views
|
|||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('', views.index, name='index'),
|
path('', views.index, name='index'),
|
||||||
path('results/', views.results, name='results'),
|
# path('results/', views.results, name='results'),
|
||||||
path('scoreboard/', views.scoreboard, name='scoreboard'),
|
# path('scoreboard/', views.scoreboard, name='scoreboard'),
|
||||||
path('members/', views.teams, name='members'),
|
# path('members/', views.teams, name='members'),
|
||||||
path('venues/', views.venues, name='venues'),
|
# path('venues/', views.venues, name='venues'),
|
||||||
path('venues/get-waters/<int:venue_id>', views.get_venue_waters, name="get-venue-waters"),
|
# 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/<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/<int:venue_id>", views.get_venue_details, name="venue-details"),
|
||||||
path("venues/api/create", views.create_venue, name="create-venue"),
|
# path("venues/api/create", views.create_venue, name="create-venue"),
|
||||||
|
|
||||||
# path('bulk-peg/', views.bulk_create_pegs, name='bulk-peg'),
|
# # path('bulk-peg/', views.bulk_create_pegs, name='bulk-peg'),
|
||||||
path('get-angler-data/', views.get_angler_page_data, name='get-angler-data'),
|
# path('get-angler-data/', views.get_angler_page_data, name='get-angler-data'),
|
||||||
path('update-member/', views.update_member, name='update-member'),
|
# path('update-member/', views.update_member, name='update-member'),
|
||||||
path('update-section/', views.update_section, name='update-section'),
|
# path('update-section/', views.update_section, name='update-section'),
|
||||||
path('update-team/', views.update_team, name='update-team'),
|
# path('update-team/', views.update_team, name='update-team'),
|
||||||
path("get-next-identifier/", views.get_next_identifier, name='get-next-identifier'),
|
# path("get-next-identifier/", views.get_next_identifier, name='get-next-identifier'),
|
||||||
|
|
||||||
# Rewrite
|
# # Rewrite
|
||||||
path('anglers/', views.ManageAnglersView.as_view(), name='anglers'),
|
# path('anglers/', views.ManageAnglersView.as_view(), name='anglers'),
|
||||||
]
|
]
|
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user