new ERD based models
This commit is contained in:
parent
bc0166b3ce
commit
42a8ae9c20
@ -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')),
|
||||
]
|
||||
|
@ -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 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",
|
||||
# )
|
@ -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())
|
||||
# ]))
|
||||
# ]
|
@ -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")
|
@ -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"""
|
||||
|
||||
|
||||
|
||||
|
@ -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."""
|
||||
|
||||
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."""
|
||||
|
||||
|
@ -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
Loading…
x
Reference in New Issue
Block a user