From 42a8ae9c20e7e4961287758e9d9f9baaa3efc366 Mon Sep 17 00:00:00 2001 From: Corban-Lee Date: Tue, 5 Nov 2024 10:38:33 +0000 Subject: [PATCH] new ERD based models --- src/Results/urls.py | 2 +- src/api/admin.py | 3 - src/api/models.py | 3 - src/api/serializers.py | 50 +- src/api/urls.py | 14 +- src/api/views.py | 16 +- src/mainapp/admin.py | 22 +- ...waters_venue_delete_venue_delete_waters.py | 23 + src/mainapp/models.py | 298 ++++-- src/mainapp/urls.py | 32 +- src/mainapp/views.py | 965 +++++++++--------- 11 files changed, 811 insertions(+), 617 deletions(-) delete mode 100644 src/api/admin.py delete mode 100644 src/api/models.py create mode 100644 src/mainapp/migrations/0006_remove_waters_venue_delete_venue_delete_waters.py diff --git a/src/Results/urls.py b/src/Results/urls.py index a4308a1..d83e0a3 100644 --- a/src/Results/urls.py +++ b/src/Results/urls.py @@ -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')), ] diff --git a/src/api/admin.py b/src/api/admin.py deleted file mode 100644 index 8c38f3f..0000000 --- a/src/api/admin.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.contrib import admin - -# Register your models here. diff --git a/src/api/models.py b/src/api/models.py deleted file mode 100644 index 71a8362..0000000 --- a/src/api/models.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.db import models - -# Create your models here. diff --git a/src/api/serializers.py b/src/api/serializers.py index 080010d..6d28f28 100644 --- a/src/api/serializers.py +++ b/src/api/serializers.py @@ -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", - ) \ No newline at end of file +# 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", +# ) \ No newline at end of file diff --git a/src/api/urls.py b/src/api/urls.py index c017404..3646649 100644 --- a/src/api/urls.py +++ b/src/api/urls.py @@ -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("/", VenueDetailView.as_view()) - ])) -] \ No newline at end of file +# urlpatterns = [ +# path('venue/', include([ +# path("", VenueListView.as_view()), +# path("/", VenueDetailView.as_view()) +# ])) +# ] \ No newline at end of file diff --git a/src/api/views.py b/src/api/views.py index 151a88a..cde80af 100644 --- a/src/api/views.py +++ b/src/api/views.py @@ -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") \ No newline at end of file +# class VenueDetailView(generics.RetrieveUpdateDestroyAPIView): +# serializer_class = VenueSerializer +# queryset = Venue.objects.all().order_by("name") \ No newline at end of file diff --git a/src/mainapp/admin.py b/src/mainapp/admin.py index 9448039..ac17219 100644 --- a/src/mainapp/admin.py +++ b/src/mainapp/admin.py @@ -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""" diff --git a/src/mainapp/migrations/0006_remove_waters_venue_delete_venue_delete_waters.py b/src/mainapp/migrations/0006_remove_waters_venue_delete_venue_delete_waters.py new file mode 100644 index 0000000..4f9b361 --- /dev/null +++ b/src/mainapp/migrations/0006_remove_waters_venue_delete_venue_delete_waters.py @@ -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', + ), + ] diff --git a/src/mainapp/models.py b/src/mainapp/models.py index 6d5eb00..ba8f3fc 100644 --- a/src/mainapp/models.py +++ b/src/mainapp/models.py @@ -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.""" diff --git a/src/mainapp/urls.py b/src/mainapp/urls.py index bf436d7..b07daa1 100644 --- a/src/mainapp/urls.py +++ b/src/mainapp/urls.py @@ -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/', views.get_venue_waters, name="get-venue-waters"), - path('venues/', views.venue_details, name="venue-details"), - path("venues/api/", 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/', views.get_venue_waters, name="get-venue-waters"), + # path('venues/', views.venue_details, name="venue-details"), + # path("venues/api/", 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'), ] \ No newline at end of file diff --git a/src/mainapp/views.py b/src/mainapp/views.py index fbd6a57..8da1997 100644 --- a/src/mainapp/views.py +++ b/src/mainapp/views.py @@ -13,408 +13,407 @@ from django.http import HttpRequest, HttpResponseNotFound from django.core import serializers from django.forms.models import model_to_dict -from .models import Venue, Waters -# from .models import Team, Member, Section, SectionManager, ReusableAutoField, SectionValidator +# from .models import Venue, Waters def index(request): - venues = Venue.objects.all() - context = {"venues": venues, "venue_types": Venue.VENUE_TYPES} + # venues = Venue.objects.all() + # context = {"venues": venues, "venue_types": Venue.VENUE_TYPES} - return render(request, 'index.html', context) + return render(request, 'index.html') #, context -def results(request): - return render(request, 'results.html') +# def results(request): +# return render(request, 'results.html') -def scoreboard(request): - return render(request, 'scoreboard.html') +# def scoreboard(request): +# return render(request, 'scoreboard.html') -def teams(request): - return render(request, 'teams.html') +# def teams(request): +# return render(request, 'teams.html') -def venues(request): +# def venues(request): - venues = Venue.objects.all() - context = {"venues": venues, "venue_types": Venue.VENUE_TYPES} +# venues = Venue.objects.all() +# context = {"venues": venues, "venue_types": Venue.VENUE_TYPES} - return render(request, 'venues.html', context) +# return render(request, 'venues.html', context) -def venue_details(request, venue_id): +# def venue_details(request, venue_id): - try: - venue = Venue.objects.get(id=venue_id) - except Venue.DoesNotExist: - return HttpResponseNotFound("

404 - Venue not found

") +# try: +# venue = Venue.objects.get(id=venue_id) +# except Venue.DoesNotExist: +# return HttpResponseNotFound("

404 - Venue not found

") - context = {"venue": venue} +# context = {"venue": venue} - return render(request, 'venue_details.html', context) +# return render(request, 'venue_details.html', context) -def create_venue(request): +# def create_venue(request): - if request.method != "POST": - return JsonResponse({"error", "Method not allowed"}, status=403) +# if request.method != "POST": +# return JsonResponse({"error", "Method not allowed"}, status=403) - test = request.POST +# test = request.POST - attributes = { - name: request.POST.get(name) for name in - [field.name for field in Venue._meta.get_fields()] - } - venue_id = request.POST.get("id") +# attributes = { +# name: request.POST.get(name) for name in +# [field.name for field in Venue._meta.get_fields()] +# } +# venue_id = request.POST.get("id") - if venue_id: - venue = Venue.objects.get(id=venue_id) - for k, v in attributes.items(): - setattr(venue, k, v) +# if venue_id: +# venue = Venue.objects.get(id=venue_id) +# for k, v in attributes.items(): +# setattr(venue, k, v) - venue.save() - return JsonResponse({"success": "successful update"}, status=200) +# venue.save() +# return JsonResponse({"success": "successful update"}, status=200) - del attributes["id"] - Venue.objects.create(**attributes) - return JsonResponse({"success": "successful creation"}, status=200) +# del attributes["id"] +# Venue.objects.create(**attributes) +# return JsonResponse({"success": "successful creation"}, status=200) -def get_venue_details(request, venue_id: int): +# def get_venue_details(request, venue_id: int): - try: - venue = Venue.objects.get(pk=venue_id) - except Venue.DoesNotExist: - return JsonResponse({"error": "Venue not found"}, status=404) +# try: +# venue = Venue.objects.get(pk=venue_id) +# except Venue.DoesNotExist: +# return JsonResponse({"error": "Venue not found"}, status=404) - json_venue = model_to_dict(venue) +# json_venue = model_to_dict(venue) - return JsonResponse({"data": json_venue}) +# return JsonResponse({"data": json_venue}) -def get_venue_waters(request, venue_id: int): +# def get_venue_waters(request, venue_id: int): - try: - venue = Venue.objects.get(pk=venue_id) - except Venue.DoesNotExist: - return JsonResponse({"error": "Venue not found"}, status=404) +# try: +# venue = Venue.objects.get(pk=venue_id) +# except Venue.DoesNotExist: +# return JsonResponse({"error": "Venue not found"}, status=404) - waters = Waters.objects.filter(venue=venue) - waters_data = [ - { - "name": water.name, - "description": water.description, - "pegs_min": water.pegs_min, - "pegs_max": water.pegs_max, - "water_type": water.water_type, - "fish_type": water.fish_type - } - for water in waters - ] - return JsonResponse({"waters", waters_data}) +# waters = Waters.objects.filter(venue=venue) +# waters_data = [ +# { +# "name": water.name, +# "description": water.description, +# "pegs_min": water.pegs_min, +# "pegs_max": water.pegs_max, +# "water_type": water.water_type, +# "fish_type": water.fish_type +# } +# for water in waters +# ] +# return JsonResponse({"waters", waters_data}) -# def bulk_create_pegs(request): -# """Bulk create pegs""" +# # def bulk_create_pegs(request): +# # """Bulk create pegs""" -# number_of_pegs = request.POST.get("pegAmount") -# for i in range(int(number_of_pegs)): -# Peg.objects.create() +# # number_of_pegs = request.POST.get("pegAmount") +# # for i in range(int(number_of_pegs)): +# # Peg.objects.create() -# # return to previous page -# return redirect(request.META.get('HTTP_REFERER')) +# # # return to previous page +# # return redirect(request.META.get('HTTP_REFERER')) -def name_sort_key(section): - if len(section.name) == 1: - return (0, section.name) - else: - return (1, section.name[:-1], section.name[-1]) +# def name_sort_key(section): +# if len(section.name) == 1: +# return (0, section.name) +# else: +# return (1, section.name[:-1], section.name[-1]) -class ManageAnglersView(View): - """View for the Manage Anglers page.""" +# class ManageAnglersView(View): +# """View for the Manage Anglers page.""" - template_name = "anglers.html" +# template_name = "anglers.html" - def get(self, request: HttpRequest, *args, **kwargs) -> HttpRequest: - """Handle GET requests to the Manage Anglers page. +# def get(self, request: HttpRequest, *args, **kwargs) -> HttpRequest: +# """Handle GET requests to the Manage Anglers page. - Args: - request (HttpRequest): The HttpRequest object, contains GET data. +# Args: +# request (HttpRequest): The HttpRequest object, contains GET data. - Returns: - HttpRequest: A render of the Manage Anglers page. - """ +# Returns: +# HttpRequest: A render of the Manage Anglers page. +# """ - anglers = Member.objects.order_by("first_name", "last_name") - context = {"anglers": anglers} +# anglers = Member.objects.order_by("first_name", "last_name") +# context = {"anglers": anglers} - return render(request, self.template_name, context) +# return render(request, self.template_name, context) - def post(self, request: HttpRequest, *args, **kwargs) -> JsonResponse: - """Handle POST requests to the Manage Anglers page. +# def post(self, request: HttpRequest, *args, **kwargs) -> JsonResponse: +# """Handle POST requests to the Manage Anglers page. - Args: - request (HttpRequest): The HttpRequest object, contains POST data. +# Args: +# request (HttpRequest): The HttpRequest object, contains POST data. - Returns: - JsonResponse: Contains the result of the action. - """ +# Returns: +# JsonResponse: Contains the result of the action. +# """ - tasks = request.POST.getlist("tasks[]") +# tasks = request.POST.getlist("tasks[]") - data = {} - for task in tasks: - data.update(self.handle_task(request, task)) +# data = {} +# for task in tasks: +# data.update(self.handle_task(request, task)) - return JsonResponse(data) +# return JsonResponse(data) - def handle_task(self, request, task: str) -> dict[str, str]: - """Handle a task. +# def handle_task(self, request, task: str) -> dict[str, str]: +# """Handle a task. - Args: - request (HttpRequest): HttpRequest object, contains POST data. - task (str): The task to handle. +# Args: +# request (HttpRequest): HttpRequest object, contains POST data. +# task (str): The task to handle. - Raises: - ValueError: The task is invalid. - - Returns: - dict[str, str]: The result of the task. - """ - - # Format is {key = ACTION-TASK_NAME: value = HANDLER_FUNCTION} - task_handlers = { - "update-team": self.update_team, - "update-section": self.update_section, - "update-angler": self.update_angler, - "get-teams": self.get_teams, - "get-sections": self.get_sections, - "get-anglers": self.get_anglers, - "delete-team": self.delete_team, - "delete-section": self.delete_section, - "delete-angler": self.delete_angler, - "get-nextTeamNumber": self.get_next_team_number, - "get-nextPegNumber": self.get_next_peg_number, - } - - handler = task_handlers.get(task) - if not handler: - raise ValueError(f"Invalid task: {task}") - - return handler(request) - - def update_team(self, request) -> dict[str]: - """Update a team, returns a dictionary of the new team's data.""" - - result = {"form_errors": {}, "team": None} - team_id = request.POST.get("id") - team_number = request.POST.get("number") - - if not (team_id and team_number): - raise ValueError("Team ID or Team Number is missing or empty") - - if team_id == "-1": - team = Team(number=team_number) - else: - team = Team.objects.get(id=team_id) - team.number = team_number - - try: - team.save() - result["team"] = {"id": team.id, "number": team.number} - except IntegrityError: - result["form_errors"]["#teamNumber"] = "A Team with this number already exists" - - return result - - def update_section(self, request) -> dict[str]: - """Update a section, returns a dictionary of the new section's data.""" - - result = {"form_errors": {}, "section": None} - section_id = request.POST.get("id") - section_character = request.POST.get("character") - - if not (section_id and section_character): - raise ValueError("Section ID or Section Character is missing or empty") - - if section_id == "-1": - section = Section(character=section_character) - else: - section = Section.objects.get(id=section_id) - section.character = section_character - - try: - section.save() - result["section"] = {"id": section.id, "character": section.character} - except IntegrityError: - result["form_errors"]["#editSectionNameError"] = "A Section with this character already exists" - - return result - - def update_angler(self, request) -> dict[str]: - """Update an Angler, returns a dictionary of the new angler's data.""" - - result = {"form_errors": {}, "angler": None} - angler_id = request.POST.get("angler_id") - forename = request.POST.get("forename") - surname = request.POST.get("surname") - peg_number = request.POST.get("peg_number") - team_id = request.POST.get("team_id") - section_id = request.POST.get("section_id") - - if not angler_id: - raise ValueError("Invalid angler ID") - - team = Team.objects.get(id=team_id) - section = Section.objects.get(id=section_id) - - if angler_id == "-1": - angler = Member( - first_name=forename, - last_name=surname, - peg_number=peg_number, - team=team, - section=section - ) - else: - angler = Member.objects.get(id=angler_id) - angler.first_name = forename - angler.last_name = surname - angler.peg_number = peg_number - angler.team = team - angler.section = section - - try: - angler.save() - except IntegrityError: - result["form_errors"]["#anglerPeg"] = "An Angler with this peg number already exists" - - result["angler"] = { - "id": angler.id, - "forename": forename, - "surname": surname, - "peg_number": peg_number, - "team_id": team_id, - "section_id": section_id, - "team_number": angler.team.number, - "section_character": angler.section.character - } - - return result - - def get_teams(self, request) -> dict[str]: - """Returns a dictionary of all teams.""" - - search = request.POST.get("search") - teams = Team.objects.order_by("number").all() - - # Search works by exluding teams that do not contain members with the search term in their names. - if search: - search_terms = search.split() - members = Member.objects.filter(reduce(lambda x, y: x & y, [ - Q(first_name__icontains=term) | Q(last_name__icontains=term) - for term in search_terms - ])) - teams = teams.filter(members__in=members).distinct() - - return {"teams": [{"id": team.id, "number": team.number} for team in teams]} - - def get_sections(self, request) -> dict[str]: - """Returns a dictionary of all sections.""" - - search = request.POST.get("search") - sections = Section.objects.order_by("character").all() - - if search: - search_terms = search.split() - members = Member.objects.filter(reduce(lambda x, y: x & y, [ - Q(first_name__icontains=term) | Q(last_name__icontains=term) - for term in search_terms - ])) - sections = sections.filter(members__in=members).distinct() - - return {"sections": [{"id": section.id, "character": section.character} for section in sections]} - - def get_anglers(self, request) -> dict[str]: - """Returns a dictionary of all anglers.""" - - search = request.POST.get("search") - anglers = Member.objects.order_by("first_name").all() - order_by = "peg_number" if request.POST.get("sortAnglers") == "pegs" else "first_name" - - if search: - search_terms = search.split() - anglers = anglers.filter(reduce(lambda x, y: x & y, [ - Q(first_name__icontains=term) | Q(last_name__icontains=term) - for term in search_terms - ])).distinct() - - return { - "anglers": [ - { - "id": angler.id, - "first_name": angler.first_name, - "last_name": angler.last_name, - "peg_number": angler.peg_number, - "team_id": angler.team.id, - "section_id": angler.section.id, - "team_number": angler.team.number, - "section_character": angler.section.character - } - for angler in anglers.order_by(order_by).all() - ] - } - - def delete_team(self, request) -> dict: - """Deletes a team.""" - - team_id = request.POST.get("team_id") - if not team_id: - raise ValueError("Invalid team ID") - - teams = Team.objects.get(id=team_id) - teams.delete() - - return {} - - def delete_section(self, request) -> dict: - """Deletes a section.""" - - section_id = request.POST.get("section_id") - if not section_id: - raise ValueError("Invalid section ID") - - sections = Section.objects.get(id=section_id) - sections.delete() - - return {} - - def delete_angler(self, request) -> dict: - """Delete an angler.""" - - angler_id = request.POST.get("angler_id") - if not angler_id: - raise ValueError("Invalid angler ID") +# Raises: +# ValueError: The task is invalid. + +# Returns: +# dict[str, str]: The result of the task. +# """ + +# # Format is {key = ACTION-TASK_NAME: value = HANDLER_FUNCTION} +# task_handlers = { +# "update-team": self.update_team, +# "update-section": self.update_section, +# "update-angler": self.update_angler, +# "get-teams": self.get_teams, +# "get-sections": self.get_sections, +# "get-anglers": self.get_anglers, +# "delete-team": self.delete_team, +# "delete-section": self.delete_section, +# "delete-angler": self.delete_angler, +# "get-nextTeamNumber": self.get_next_team_number, +# "get-nextPegNumber": self.get_next_peg_number, +# } + +# handler = task_handlers.get(task) +# if not handler: +# raise ValueError(f"Invalid task: {task}") + +# return handler(request) + +# def update_team(self, request) -> dict[str]: +# """Update a team, returns a dictionary of the new team's data.""" + +# result = {"form_errors": {}, "team": None} +# team_id = request.POST.get("id") +# team_number = request.POST.get("number") + +# if not (team_id and team_number): +# raise ValueError("Team ID or Team Number is missing or empty") + +# if team_id == "-1": +# team = Team(number=team_number) +# else: +# team = Team.objects.get(id=team_id) +# team.number = team_number + +# try: +# team.save() +# result["team"] = {"id": team.id, "number": team.number} +# except IntegrityError: +# result["form_errors"]["#teamNumber"] = "A Team with this number already exists" + +# return result + +# def update_section(self, request) -> dict[str]: +# """Update a section, returns a dictionary of the new section's data.""" + +# result = {"form_errors": {}, "section": None} +# section_id = request.POST.get("id") +# section_character = request.POST.get("character") + +# if not (section_id and section_character): +# raise ValueError("Section ID or Section Character is missing or empty") + +# if section_id == "-1": +# section = Section(character=section_character) +# else: +# section = Section.objects.get(id=section_id) +# section.character = section_character + +# try: +# section.save() +# result["section"] = {"id": section.id, "character": section.character} +# except IntegrityError: +# result["form_errors"]["#editSectionNameError"] = "A Section with this character already exists" + +# return result + +# def update_angler(self, request) -> dict[str]: +# """Update an Angler, returns a dictionary of the new angler's data.""" + +# result = {"form_errors": {}, "angler": None} +# angler_id = request.POST.get("angler_id") +# forename = request.POST.get("forename") +# surname = request.POST.get("surname") +# peg_number = request.POST.get("peg_number") +# team_id = request.POST.get("team_id") +# section_id = request.POST.get("section_id") + +# if not angler_id: +# raise ValueError("Invalid angler ID") + +# team = Team.objects.get(id=team_id) +# section = Section.objects.get(id=section_id) + +# if angler_id == "-1": +# angler = Member( +# first_name=forename, +# last_name=surname, +# peg_number=peg_number, +# team=team, +# section=section +# ) +# else: +# angler = Member.objects.get(id=angler_id) +# angler.first_name = forename +# angler.last_name = surname +# angler.peg_number = peg_number +# angler.team = team +# angler.section = section + +# try: +# angler.save() +# except IntegrityError: +# result["form_errors"]["#anglerPeg"] = "An Angler with this peg number already exists" + +# result["angler"] = { +# "id": angler.id, +# "forename": forename, +# "surname": surname, +# "peg_number": peg_number, +# "team_id": team_id, +# "section_id": section_id, +# "team_number": angler.team.number, +# "section_character": angler.section.character +# } + +# return result + +# def get_teams(self, request) -> dict[str]: +# """Returns a dictionary of all teams.""" + +# search = request.POST.get("search") +# teams = Team.objects.order_by("number").all() + +# # Search works by exluding teams that do not contain members with the search term in their names. +# if search: +# search_terms = search.split() +# members = Member.objects.filter(reduce(lambda x, y: x & y, [ +# Q(first_name__icontains=term) | Q(last_name__icontains=term) +# for term in search_terms +# ])) +# teams = teams.filter(members__in=members).distinct() + +# return {"teams": [{"id": team.id, "number": team.number} for team in teams]} + +# def get_sections(self, request) -> dict[str]: +# """Returns a dictionary of all sections.""" + +# search = request.POST.get("search") +# sections = Section.objects.order_by("character").all() + +# if search: +# search_terms = search.split() +# members = Member.objects.filter(reduce(lambda x, y: x & y, [ +# Q(first_name__icontains=term) | Q(last_name__icontains=term) +# for term in search_terms +# ])) +# sections = sections.filter(members__in=members).distinct() + +# return {"sections": [{"id": section.id, "character": section.character} for section in sections]} + +# def get_anglers(self, request) -> dict[str]: +# """Returns a dictionary of all anglers.""" + +# search = request.POST.get("search") +# anglers = Member.objects.order_by("first_name").all() +# order_by = "peg_number" if request.POST.get("sortAnglers") == "pegs" else "first_name" + +# if search: +# search_terms = search.split() +# anglers = anglers.filter(reduce(lambda x, y: x & y, [ +# Q(first_name__icontains=term) | Q(last_name__icontains=term) +# for term in search_terms +# ])).distinct() + +# return { +# "anglers": [ +# { +# "id": angler.id, +# "first_name": angler.first_name, +# "last_name": angler.last_name, +# "peg_number": angler.peg_number, +# "team_id": angler.team.id, +# "section_id": angler.section.id, +# "team_number": angler.team.number, +# "section_character": angler.section.character +# } +# for angler in anglers.order_by(order_by).all() +# ] +# } + +# def delete_team(self, request) -> dict: +# """Deletes a team.""" + +# team_id = request.POST.get("team_id") +# if not team_id: +# raise ValueError("Invalid team ID") + +# teams = Team.objects.get(id=team_id) +# teams.delete() + +# return {} + +# def delete_section(self, request) -> dict: +# """Deletes a section.""" + +# section_id = request.POST.get("section_id") +# if not section_id: +# raise ValueError("Invalid section ID") + +# sections = Section.objects.get(id=section_id) +# sections.delete() + +# return {} + +# def delete_angler(self, request) -> dict: +# """Delete an angler.""" + +# angler_id = request.POST.get("angler_id") +# if not angler_id: +# raise ValueError("Invalid angler ID") - angler = Member.objects.get(id=angler_id) - angler.delete() +# angler = Member.objects.get(id=angler_id) +# angler.delete() - return {} +# return {} - def get_next_team_number(self, request) -> dict[str, int]: - """Returns the next available team number.""" +# def get_next_team_number(self, request) -> dict[str, int]: +# """Returns the next available team number.""" - next_team_number = 1 +# next_team_number = 1 - while Team.objects.filter(number=next_team_number).exists(): - next_team_number += 1 +# while Team.objects.filter(number=next_team_number).exists(): +# next_team_number += 1 - return {"nextTeamNumber": next_team_number} +# return {"nextTeamNumber": next_team_number} - def get_next_peg_number(self, request) -> dict[str, int]: - """Returns the next available peg number.""" +# def get_next_peg_number(self, request) -> dict[str, int]: +# """Returns the next available peg number.""" - next_peg_number = 1 +# next_peg_number = 1 - while Member.objects.filter(peg_number=next_peg_number).exists(): - next_peg_number += 1 +# while Member.objects.filter(peg_number=next_peg_number).exists(): +# next_peg_number += 1 - return {"nextPegNumber": next_peg_number} +# return {"nextPegNumber": next_peg_number} @@ -431,192 +430,192 @@ class ManageAnglersView(View): -def get_angler_page_data(request, **kwargs): - """Returns a JsonResponse containing a dictionary with a k/v pair for a list of teams. +# def get_angler_page_data(request, **kwargs): +# """Returns a JsonResponse containing a dictionary with a k/v pair for a list of teams. - Args: - request: the web request object. - Returns: - JsonResponse: dictionary of teams like so {'teams': [{}, {}, {}]}. - """ +# Args: +# request: the web request object. +# Returns: +# JsonResponse: dictionary of teams like so {'teams': [{}, {}, {}]}. +# """ - if not request.POST: - return +# if not request.POST: +# return - search = request.POST.get("search") - sort_groups = request.POST.get("sortGroups") or "team" - sort_members = request.POST.get("sortMembers") or "peg_number" +# search = request.POST.get("search") +# sort_groups = request.POST.get("sortGroups") or "team" +# sort_members = request.POST.get("sortMembers") or "peg_number" - teams = Team.objects.order_by("number").all() - sections = Section.objects.order_by("character").all() +# teams = Team.objects.order_by("number").all() +# sections = Section.objects.order_by("character").all() - if search: - search_terms = search.split() - members = Member.objects.filter( - reduce( - lambda x, y: x & y, ## changed to AND from OR to fix bug with whitespace searches - [ - Q(first_name__icontains=term) | Q(last_name__icontains=term) - for term in search_terms - ] - ) - ) - teams = teams.filter(members__in=members).distinct() - sections = sections.filter(members__in=members).distinct() +# if search: +# search_terms = search.split() +# members = Member.objects.filter( +# reduce( +# lambda x, y: x & y, ## changed to AND from OR to fix bug with whitespace searches +# [ +# Q(first_name__icontains=term) | Q(last_name__icontains=term) +# for term in search_terms +# ] +# ) +# ) +# teams = teams.filter(members__in=members).distinct() +# sections = sections.filter(members__in=members).distinct() - response_data = { - "teams": [ - {"id": team.id, "number": team.number} - for team in teams - ], - "sections": [ - {"id": sec.id, "character": sec.character} - for sec in sections - ], - "anglers": [ - { - "id": member.id, - "first": member.first_name, - "last": member.last_name, - "peg": member.peg_number, - "team_id": member.team.id if member.team else None, - "section_id": member.section.id if member.section else None - } - for member in Member.objects.order_by(sort_members).all() - ] - } +# response_data = { +# "teams": [ +# {"id": team.id, "number": team.number} +# for team in teams +# ], +# "sections": [ +# {"id": sec.id, "character": sec.character} +# for sec in sections +# ], +# "anglers": [ +# { +# "id": member.id, +# "first": member.first_name, +# "last": member.last_name, +# "peg": member.peg_number, +# "team_id": member.team.id if member.team else None, +# "section_id": member.section.id if member.section else None +# } +# for member in Member.objects.order_by(sort_members).all() +# ] +# } - response_data["sortGroups"] = sort_groups - response_data["sortMembers"] = sort_members +# response_data["sortGroups"] = sort_groups +# response_data["sortMembers"] = sort_members - for key, value in kwargs.items(): - response_data[key] = value +# for key, value in kwargs.items(): +# response_data[key] = value - return JsonResponse(response_data) +# return JsonResponse(response_data) -def update_member(request): - """Update a member. Returns a JsonResponse with the updated teams.""" +# def update_member(request): +# """Update a member. Returns a JsonResponse with the updated teams.""" - if not request.POST: - return +# if not request.POST: +# return - # Get the updated values - member_id = request.POST.get("memberId") - first = request.POST.get("first") - last = request.POST.get("last") - team_number = request.POST.get("teamNumber") - peg_number = request.POST.get("pegNumber") +# # Get the updated values +# member_id = request.POST.get("memberId") +# first = request.POST.get("first") +# last = request.POST.get("last") +# team_number = request.POST.get("teamNumber") +# peg_number = request.POST.get("pegNumber") - # Get the member and team - member = Member.objects.get(id=member_id) - team = Team.objects.get(name=team_number) +# # Get the member and team +# member = Member.objects.get(id=member_id) +# team = Team.objects.get(name=team_number) - # Update the member - member.first_name = first - member.last_name = last - member.team = team - member.peg_number = peg_number +# # Update the member +# member.first_name = first +# member.last_name = last +# member.team = team +# member.peg_number = peg_number - member.save() +# member.save() - return get_angler_page_data(request) +# return get_angler_page_data(request) -def update_section(request): - """Update a section, returns JsonResponse with updated teams data.""" +# def update_section(request): +# """Update a section, returns JsonResponse with updated teams data.""" - if not request.POST: - return +# if not request.POST: +# return - section_id = request.POST.get("sectionId") - section_name = request.POST.get("sectionName") +# section_id = request.POST.get("sectionId") +# section_name = request.POST.get("sectionName") - validator = SectionValidator() - if not validator.is_valid(section_name): - json_response = get_angler_page_data(request, form_errors={ - "editSectionName": "This is an invalid section" - }) - return json_response +# validator = SectionValidator() +# if not validator.is_valid(section_name): +# json_response = get_angler_page_data(request, form_errors={ +# "editSectionName": "This is an invalid section" +# }) +# return json_response - if section_id == "-1": - section = Section(character=section_name) - else: - section = Section.objects.get(id=section_id) - section.character = section_name +# if section_id == "-1": +# section = Section(character=section_name) +# else: +# section = Section.objects.get(id=section_id) +# section.character = section_name - try: - section.save() - except IntegrityError: - json_response = get_angler_page_data(request, form_errors={ - "editSectionName": "A Section with this character already exists" - }) - return json_response +# try: +# section.save() +# except IntegrityError: +# json_response = get_angler_page_data(request, form_errors={ +# "editSectionName": "A Section with this character already exists" +# }) +# return json_response - return get_angler_page_data(request) # returns jsonresponse with new details +# return get_angler_page_data(request) # returns jsonresponse with new details -def update_team(request): - """Update a team, returns a JsonResponse with updated teams data.""" +# def update_team(request): +# """Update a team, returns a JsonResponse with updated teams data.""" - if not request.POST: - return +# if not request.POST: +# return - team_id = request.POST.get("id") - team_number = request.POST.get("number") +# team_id = request.POST.get("id") +# team_number = request.POST.get("number") - try: - if team_id == "-1": - team = Team.objects.create(number=team_number) - else: - team = Team.objects.get(id=team_id) - team.number = team_number - team.save() - except IntegrityError as error: - json_response = get_angler_page_data(request, form_errors={ - "editTeamNumber": "A Team with this number already exists" - }) - return json_response +# try: +# if team_id == "-1": +# team = Team.objects.create(number=team_number) +# else: +# team = Team.objects.get(id=team_id) +# team.number = team_number +# team.save() +# except IntegrityError as error: +# json_response = get_angler_page_data(request, form_errors={ +# "editTeamNumber": "A Team with this number already exists" +# }) +# return json_response - return get_angler_page_data(request) +# return get_angler_page_data(request) -def get_next_peg() -> int: - pass +# def get_next_peg() -> int: +# pass -def get_next_section() -> str: +# def get_next_section() -> str: - section_name = SectionManager.get_max_section() - return SectionManager.find_next_section(section_name) +# section_name = SectionManager.get_max_section() +# return SectionManager.find_next_section(section_name) -def get_next_team() -> int: +# def get_next_team() -> int: - field = ReusableAutoField - field.model = Team +# field = ReusableAutoField +# field.model = Team - return field().get_default() +# return field().get_default() -def get_next_identifier(request): - """Get the next available identifer (peg, section character, etc.) for an object.""" +# def get_next_identifier(request): +# """Get the next available identifer (peg, section character, etc.) for an object.""" - if not request.POST: - return +# if not request.POST: +# return - item = request.POST.get("item") +# item = request.POST.get("item") - match item: - case "member_peg": - result = get_next_peg() +# match item: +# case "member_peg": +# result = get_next_peg() - case "section_name": - result = get_next_section() +# case "section_name": +# result = get_next_section() - case "team_number": - result = get_next_team() +# case "team_number": +# result = get_next_team() - case _: - raise ValueError(f"Bad identifier item: {item}") +# case _: +# raise ValueError(f"Bad identifier item: {item}") - return JsonResponse({"identifier": result}) +# return JsonResponse({"identifier": result})