From 45df0219cbb7ef375b98b4f45d7c0e1cf5e57b39 Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Tue, 9 Apr 2024 08:58:01 +1000 Subject: [PATCH] Migrate to Django v5.0.2 (#137) * Add migration * Update Python to 5.0.2 * Add generated template info across * Ran format on settings.py * Fix up logout form * Fix typo in create Bookinstance * Fix up name of bookinstances to copies * Improve layout of layout form * move import libraries to right place * Update bootstrap used * Add unique constraints * Genre function ordering to match text * Improve the All Bookinstances rendering - not in doc so can do * Update requirements to latest * Update urls.py - fix up 4.2 URL to 5.0 --------- Co-authored-by: Brian Thomas Smith --- ...r_book_author_alter_genre_name_and_more.py | 29 ++++++++++++++ catalog/models.py | 27 ++++++++++--- catalog/static/css/styles.css | 8 ++++ catalog/templates/base_generic.html | 14 ++++--- .../templates/catalog/bookinstance_list.html | 6 ++- locallibrary/asgi.py | 16 ++++++++ locallibrary/settings.py | 40 +++++++++---------- locallibrary/urls.py | 6 +-- locallibrary/wsgi.py | 2 +- requirements.txt | 8 ++-- 10 files changed, 116 insertions(+), 40 deletions(-) create mode 100644 catalog/migrations/0026_alter_book_author_alter_genre_name_and_more.py create mode 100644 locallibrary/asgi.py diff --git a/catalog/migrations/0026_alter_book_author_alter_genre_name_and_more.py b/catalog/migrations/0026_alter_book_author_alter_genre_name_and_more.py new file mode 100644 index 00000000..8cdeb6ab --- /dev/null +++ b/catalog/migrations/0026_alter_book_author_alter_genre_name_and_more.py @@ -0,0 +1,29 @@ +# Generated by Django 5.0.2 on 2024-02-23 01:19 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('catalog', '0025_auto_20220222_0623'), + ] + + operations = [ + migrations.AlterField( + model_name='book', + name='author', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.RESTRICT, to='catalog.author'), + ), + migrations.AlterField( + model_name='genre', + name='name', + field=models.CharField(help_text='Enter a book genre (e.g. Science Fiction, French Poetry etc.)', max_length=200, unique=True), + ), + migrations.AlterField( + model_name='language', + name='name', + field=models.CharField(help_text="Enter the book's natural language (e.g. English, French, Japanese etc.)", max_length=200, unique=True), + ), + ] diff --git a/catalog/models.py b/catalog/models.py index 140a4592..c55bb95c 100644 --- a/catalog/models.py +++ b/catalog/models.py @@ -3,7 +3,8 @@ # Create your models here. from django.urls import reverse # To generate URLS by reversing URL patterns - +from django.db.models import UniqueConstraint +from django.db.models.functions import Lower class Genre(models.Model): """Model representing a book genre (e.g. Science Fiction, Non Fiction).""" @@ -13,14 +14,22 @@ class Genre(models.Model): help_text="Enter a book genre (e.g. Science Fiction, French Poetry etc.)" ) - def get_absolute_url(self): - """Returns the url to access a particular genre instance.""" - return reverse('genre-detail', args=[str(self.id)]) - def __str__(self): """String for representing the Model object (in Admin site etc.)""" return self.name + def get_absolute_url(self): + """Returns the url to access a particular genre instance.""" + return reverse('genre-detail', args=[str(self.id)]) + + class Meta: + constraints = [ + UniqueConstraint( + Lower('name'), + name='genre_name_case_insensitive_unique', + violation_error_message = "Genre already exists (case insensitive match)" + ), + ] class Language(models.Model): """Model representing a Language (e.g. English, French, Japanese, etc.)""" @@ -36,6 +45,14 @@ def __str__(self): """String for representing the Model object (in Admin site etc.)""" return self.name + class Meta: + constraints = [ + UniqueConstraint( + Lower('name'), + name='language_name_case_insensitive_unique', + violation_error_message = "Language already exists (case insensitive match)" + ), + ] class Book(models.Model): """Model representing a book (but not a specific copy of a book).""" diff --git a/catalog/static/css/styles.css b/catalog/static/css/styles.css index 5b791adf..0614f165 100644 --- a/catalog/static/css/styles.css +++ b/catalog/static/css/styles.css @@ -4,3 +4,11 @@ list-style: none; } +#logout-form { + display: inline; +} +#logout-form button { + padding: 0; + margin: 0; +} + diff --git a/catalog/templates/base_generic.html b/catalog/templates/base_generic.html index 7968f04f..b7fe1ee1 100644 --- a/catalog/templates/base_generic.html +++ b/catalog/templates/base_generic.html @@ -5,8 +5,7 @@ {% block title %}Local Library{% endblock %} - - + {% load static %} @@ -31,7 +30,12 @@ {% if user.is_authenticated %}
  • User: {{ user.get_username }}
  • My borrowed
  • -
  • Logout
  • +
  • +
    + {% csrf_token %} + +
    +
  • {% else %}
  • Login
  • {% endif %} @@ -55,10 +59,10 @@
  • Create book
  • {% endif %} {% if perms.catalog.add_bookinstance %} -
  • create BookInstance
  • +
  • Create copy of book
  • {% endif %} - {% endif %} + {% endif %} {% endblock %} diff --git a/catalog/templates/catalog/bookinstance_list.html b/catalog/templates/catalog/bookinstance_list.html index 0a650424..dcfe0aa6 100644 --- a/catalog/templates/catalog/bookinstance_list.html +++ b/catalog/templates/catalog/bookinstance_list.html @@ -6,7 +6,11 @@

    Book Copies in Library