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 %} +