From e74db50bdd0b5a716bc8a194b6ae23cdf18c9d3d Mon Sep 17 00:00:00 2001 From: Corban-Lee <77944149+XordK@users.noreply.github.com> Date: Thu, 26 Jan 2023 10:20:49 +0000 Subject: [PATCH] added pegging baby --- .gitignore | 5 ++- src/mainapp/admin.py | 15 ++++++- src/mainapp/migrations/0001_initial.py | 21 ++++++++++ src/mainapp/models.py | 41 ++++++++++++++++++- .../templates/entities/bulk_pegging.html | 35 ++++++++++++++++ src/mainapp/urls.py | 1 + src/mainapp/views.py | 14 ++++++- 7 files changed, 128 insertions(+), 4 deletions(-) create mode 100644 src/mainapp/migrations/0001_initial.py create mode 100644 src/mainapp/templates/entities/bulk_pegging.html diff --git a/.gitignore b/.gitignore index c6f223d..af179e6 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,7 @@ venv venv/ pyvenv.cfg -*.pyc \ No newline at end of file +*.pyc +venv/pyvenv.cfg +src/db.sqlite3 +*.sqlite3 diff --git a/src/mainapp/admin.py b/src/mainapp/admin.py index 8c38f3f..032dcb9 100644 --- a/src/mainapp/admin.py +++ b/src/mainapp/admin.py @@ -1,3 +1,16 @@ +"""Admin models for the mainapp app.""" + from django.contrib import admin -# Register your models here. +from .models import Peg + + +@admin.register(Peg) +class PegAdmin(admin.ModelAdmin): + """Admin model for the Peg model.""" + + change_list_template = "entities/bulk_pegging.html" + readonly_fields = ("peg_number",) + list_display = ("peg_number",) + search_fields = ("peg_number",) + diff --git a/src/mainapp/migrations/0001_initial.py b/src/mainapp/migrations/0001_initial.py new file mode 100644 index 0000000..6a12d9c --- /dev/null +++ b/src/mainapp/migrations/0001_initial.py @@ -0,0 +1,21 @@ +# Generated by Django 4.1.5 on 2023-01-26 09:11 + +from django.db import migrations +import mainapp.models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Peg', + fields=[ + ('peg_number', mainapp.models.ReusableAutoField(default=mainapp.models.ReusableAutoField.get_default, editable=False, primary_key=True, serialize=False)), + ], + ), + ] diff --git a/src/mainapp/models.py b/src/mainapp/models.py index 421ef63..b31ec15 100644 --- a/src/mainapp/models.py +++ b/src/mainapp/models.py @@ -3,8 +3,47 @@ from django.db import models # products/models.py from django.db import models -class Pegs(models.Model): + +class ReusableAutoField(models.PositiveIntegerField): + """A django auto field that can reuse deleted primary keys""" + def get_next_available_id(self, model_cls, using=None): + """ + Returns the next available id for the given model class. + """ + all_ids = set(range(1, model_cls._default_manager.count()+1)) + used_ids = set(model_cls._default_manager.all().values_list('pk', flat=True)) + available_ids = all_ids - used_ids + + if available_ids: + return min(available_ids) + + if used_ids: + return max(used_ids) + 1 + + return 1 + + def get_default(self): + return self.get_next_available_id(self.model) + + +class Peg(models.Model): + """Represents a person getting pegged""" + + peg_number = ReusableAutoField(primary_key=True, default=ReusableAutoField.get_default, editable=False) + + def __str__(self): + return f"{self.peg_number}" + + +def get_next_available_peg_id(): + queryset = Peg.__class__._default_manager.all() + try: + last_id = queryset.order_by("-pk")[0].pk + except IndexError: + last_id = 0 + return last_id + 1 + #class Scoreboard(models.Model): # class Status(models.IntegerChoices): diff --git a/src/mainapp/templates/entities/bulk_pegging.html b/src/mainapp/templates/entities/bulk_pegging.html new file mode 100644 index 0000000..4f84335 --- /dev/null +++ b/src/mainapp/templates/entities/bulk_pegging.html @@ -0,0 +1,35 @@ +{% extends "admin/change_list.html" %} + +{% block object-tools %} +
+ +
+ {% csrf_token %} + + +
+
+ +{% endblock object-tools %} \ No newline at end of file diff --git a/src/mainapp/urls.py b/src/mainapp/urls.py index 5b6d3cd..740b31d 100644 --- a/src/mainapp/urls.py +++ b/src/mainapp/urls.py @@ -6,4 +6,5 @@ urlpatterns = [ path('results.html', views.results, name='results'), path('scoreboard.html', views.scoreboard, name='scoreboard'), path('teams.html', views.teams, name='teams'), + path('bulk-peg/', views.bulk_create_pegs, name='bulk-peg') ] \ No newline at end of file diff --git a/src/mainapp/views.py b/src/mainapp/views.py index fa9817d..b474308 100644 --- a/src/mainapp/views.py +++ b/src/mainapp/views.py @@ -1,5 +1,7 @@ from django.shortcuts import render, redirect +from .models import Peg + def index(request): return render(request, 'index.html') @@ -10,4 +12,14 @@ def scoreboard(request): return render(request, 'scoreboard.html') def teams(request): - return render(request, 'teams.html') \ No newline at end of file + return render(request, 'teams.html') + +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() + + # return to previous page + return redirect(request.META.get('HTTP_REFERER'))