diff --git a/beers/migrations/0040_create_collation.py b/beers/migrations/0040_create_collation.py new file mode 100644 index 00000000..a56b42e3 --- /dev/null +++ b/beers/migrations/0040_create_collation.py @@ -0,0 +1,21 @@ +"""Create a case-insensitive collation for replacing the CITextField""" + +# Generated by Django 4.2.1 on 2023-05-22 19:29 + +from django.db import migrations +from django.contrib.postgres.operations import CreateCollation + + +class Migration(migrations.Migration): + dependencies = [ + ("beers", "0039_alter_manufacturer_location"), + ] + + operations = [ + CreateCollation( + "case_insensitive", + provider="icu", + locale="und-u-ks-level2", + deterministic=False, + ) + ] diff --git a/beers/migrations/0041_alter_beer_alternate_names_alter_beer_name_and_more.py b/beers/migrations/0041_alter_beer_alternate_names_alter_beer_name_and_more.py new file mode 100644 index 00000000..484f91d9 --- /dev/null +++ b/beers/migrations/0041_alter_beer_alternate_names_alter_beer_name_and_more.py @@ -0,0 +1,55 @@ +# Generated by Django 4.2.1 on 2023-05-22 19:33 + +import django.contrib.postgres.fields +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("beers", "0040_create_collation"), + ] + + operations = [ + migrations.AlterField( + model_name="beer", + name="alternate_names", + field=django.contrib.postgres.fields.ArrayField( + base_field=models.TextField(db_collation="case_insensitive"), + default=list, + size=None, + ), + ), + migrations.AlterField( + model_name="beer", + name="name", + field=models.TextField(db_collation="case_insensitive"), + ), + migrations.AlterField( + model_name="manufacturer", + name="alternate_names", + field=django.contrib.postgres.fields.ArrayField( + base_field=models.TextField(db_collation="case_insensitive"), + default=list, + size=None, + ), + ), + migrations.AlterField( + model_name="manufacturer", + name="name", + field=models.TextField(db_collation="case_insensitive"), + ), + migrations.AlterField( + model_name="style", + name="alternate_names", + field=django.contrib.postgres.fields.ArrayField( + base_field=models.TextField(db_collation="case_insensitive"), + default=list, + size=None, + ), + ), + migrations.AlterField( + model_name="style", + name="name", + field=models.TextField(db_collation="case_insensitive", unique=True), + ), + ] diff --git a/beers/models.py b/beers/models.py index 64de6c1d..e8c0e437 100644 --- a/beers/models.py +++ b/beers/models.py @@ -1,7 +1,7 @@ import logging from typing import Iterable -from django.contrib.postgres.fields import CITextField, ArrayField +from django.contrib.postgres.fields import ArrayField from django.db import models, transaction from django.db.utils import IntegrityError from django.utils.timezone import now @@ -15,13 +15,15 @@ class Style(models.Model): - name = CITextField(unique=True) + name = models.TextField(unique=True, db_collation="case_insensitive") default_color = models.CharField( "HTML color (in hex) to use if the beer has no known color", max_length=9, # #00112233 -> RGBA blank=True, ) - alternate_names = ArrayField(CITextField(), default=list) + alternate_names = ArrayField( + models.TextField(db_collation="case_insensitive"), default=list + ) def merge_from(self, other_styles: Iterable["Style"]): with transaction.atomic(): @@ -50,7 +52,7 @@ def __str__(self): # pylint: disable=invalid-str-returned class Manufacturer(models.Model): - name = CITextField() + name = models.TextField(db_collation="case_insensitive") url = models.URLField(blank=True) location = models.CharField(blank=True, max_length=250) logo_url = models.URLField(blank=True) @@ -63,7 +65,9 @@ class Manufacturer(models.Model): taplist_io_pk = models.PositiveIntegerField(blank=True, null=True) time_first_seen = models.DateTimeField(blank=True, null=True, default=now) beermenus_slug = models.CharField(max_length=250, blank=True, null=True) - alternate_names = ArrayField(CITextField(), default=list) + alternate_names = ArrayField( + models.TextField(db_collation="case_insensitive"), default=list + ) class Meta: constraints = [ @@ -144,7 +148,7 @@ def __str__(self): # pylint: disable=invalid-str-returned class Beer(models.Model): - name = CITextField() + name = models.TextField(db_collation="case_insensitive") style = models.ForeignKey( Style, models.DO_NOTHING, @@ -205,7 +209,9 @@ class Beer(models.Model): time_first_seen = models.DateTimeField(blank=True, null=True, default=now) tweeted_about = models.BooleanField(default=False) beermenus_slug = models.CharField(max_length=250, blank=True, null=True) - alternate_names = ArrayField(CITextField(), default=list) + alternate_names = ArrayField( + models.TextField(db_collation="case_insensitive"), default=list + ) class Meta: indexes = [ diff --git a/hsv_dot_beer/config/production.py b/hsv_dot_beer/config/production.py index 75d4ad67..42ff97d3 100644 --- a/hsv_dot_beer/config/production.py +++ b/hsv_dot_beer/config/production.py @@ -11,11 +11,18 @@ class Production(Common): INSTALLED_APPS += ("gunicorn",) # Static files (CSS, JavaScript, Images) - # https://docs.djangoproject.com/en/2.0/howto/static-files/ + # https://docs.djangoproject.com/en/4.2/howto/static-files/ # http://django-storages.readthedocs.org/en/latest/index.html INSTALLED_APPS += ("storages",) - DEFAULT_FILE_STORAGE = "storages.backends.s3boto3.S3Boto3Storage" - STATICFILES_STORAGE = "storages.backends.s3boto3.S3Boto3Storage" + STORAGES = { + "default": { + "BACKEND": "storages.backends.s3boto3.S3Boto3Storage", + }, + "staticfiles": { + # Leave whatever setting you already have here, e.g.: + "BACKEND": "storages.backends.s3boto3.S3Boto3Storage", + }, + } AWS_ACCESS_KEY_ID = os.getenv("DJANGO_AWS_ACCESS_KEY_ID") AWS_SECRET_ACCESS_KEY = os.getenv("DJANGO_AWS_SECRET_ACCESS_KEY") AWS_STORAGE_BUCKET_NAME = os.getenv("DJANGO_AWS_STORAGE_BUCKET_NAME") diff --git a/venues/migrations/0033_alter_venueapiconfiguration_arryved_manufacturer_name.py b/venues/migrations/0033_alter_venueapiconfiguration_arryved_manufacturer_name.py new file mode 100644 index 00000000..8a219561 --- /dev/null +++ b/venues/migrations/0033_alter_venueapiconfiguration_arryved_manufacturer_name.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.1 on 2023-05-22 19:33 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("venues", "0032_merge_20201124_1755"), + ("beers", "0040_create_collation"), + ] + + operations = [ + migrations.AlterField( + model_name="venueapiconfiguration", + name="arryved_manufacturer_name", + field=models.TextField(blank=True, db_collation="case_insensitive"), + ), + ] diff --git a/venues/models.py b/venues/models.py index 012310cc..1ab734be 100644 --- a/venues/models.py +++ b/venues/models.py @@ -3,7 +3,7 @@ from django.db import models from django.conf import settings from django.shortcuts import reverse -from django.contrib.postgres.fields import ArrayField, CITextField +from django.contrib.postgres.fields import ArrayField from django.utils.text import gettext_lazy as _ from timezone_field.fields import TimeZoneField from django_countries.fields import CountryField @@ -135,7 +135,9 @@ class VenueAPIConfiguration(models.Model): beermenus_slug = models.CharField(max_length=250, blank=True) arryved_location_id = models.CharField(max_length=50, blank=True) arryved_menu_id = models.CharField(max_length=50, blank=True) - arryved_manufacturer_name = CITextField(blank=True) + arryved_manufacturer_name = models.TextField( + db_collation="case_insensitive", blank=True + ) arryved_serving_sizes = ArrayField( models.TextField(), default=list,