add custom image model, fetch alt text

This commit is contained in:
2024-05-15 04:42:42 +02:00
parent 5540040ea2
commit 71b0a87180
26 changed files with 358 additions and 132 deletions

View File

@ -0,0 +1,29 @@
# Generated by Django 5.0.6 on 2024-05-15 01:46
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("associations", "0005_associationindex_lead"),
("images", "0002_alter_customimage_options_alter_customimage_alt"),
]
operations = [
migrations.RemoveField(
model_name="associationpage",
name="logo",
),
migrations.AddField(
model_name="associationpage",
name="logo",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="+",
to="images.customimage",
),
),
]

View File

@ -52,7 +52,7 @@ class AssociationPage(Page):
max_length=64, choices=AssociationType, default=AssociationType.FORENING
)
logo = models.ForeignKey(
"wagtailimages.Image",
"images.CustomImage",
null=True,
blank=True,
on_delete=models.SET_NULL,

View File

@ -25,6 +25,7 @@ BASE_DIR = os.path.dirname(PROJECT_DIR)
INSTALLED_APPS = [
"dnscms",
"images",
"home",
"generic",
"associations",
@ -159,6 +160,7 @@ MEDIA_URL = "/media/"
# Wagtail settings
WAGTAIL_SITE_NAME = "dnscms"
WAGTAILIMAGES_IMAGE_MODEL = "images.CustomImage"
# Search
# https://docs.wagtail.org/en/stable/topics/search/backends.html
@ -184,6 +186,7 @@ GRAPPLE = {
"associations",
"events",
"venues",
"images",
],
"EXPOSE_GRAPHIQL": True,
}

View File

@ -0,0 +1,30 @@
# Generated by Django 5.0.6 on 2024-05-15 01:40
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("events", "0025_delete_featuredeventsorderable"),
("images", "0002_alter_customimage_options_alter_customimage_alt"),
]
operations = [
migrations.RemoveField(
model_name="eventpage",
name="featured_image",
),
migrations.AddField(
model_name="eventpage",
name="featured_image",
field=models.ForeignKey(
blank=True,
help_text="Velg et bilde til bruk i programmet og andre visningsflater. Bør være et bilde eller en illustrasjon uten tekst ikke gjenbruk et Facebook-cover ukritisk!",
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="+",
to="images.customimage",
),
),
]

View File

@ -127,7 +127,7 @@ class EventPage(Page):
# search_description: text (in promote panel)
featured_image = models.ForeignKey(
"wagtailimages.Image",
"images.CustomImage",
null=True,
blank=True,
on_delete=models.SET_NULL,

View File

6
dnscms/images/apps.py Normal file
View File

@ -0,0 +1,6 @@
from django.apps import AppConfig
class ImagesConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'images'

View File

@ -0,0 +1,65 @@
# Generated by Django 5.0.6 on 2024-05-15 01:33
import django.db.models.deletion
import taggit.managers
import wagtail.images.models
import wagtail.models.media
import wagtail.search.index
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
('taggit', '0006_rename_taggeditem_content_type_object_id_taggit_tagg_content_8fc721_idx'),
('wagtailcore', '0093_uploadedfile'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='CustomImage',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=255, verbose_name='title')),
('file', wagtail.images.models.WagtailImageField(height_field='height', upload_to=wagtail.images.models.get_upload_to, verbose_name='file', width_field='width')),
('width', models.IntegerField(editable=False, verbose_name='width')),
('height', models.IntegerField(editable=False, verbose_name='height')),
('created_at', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='created at')),
('focal_point_x', models.PositiveIntegerField(blank=True, null=True)),
('focal_point_y', models.PositiveIntegerField(blank=True, null=True)),
('focal_point_width', models.PositiveIntegerField(blank=True, null=True)),
('focal_point_height', models.PositiveIntegerField(blank=True, null=True)),
('file_size', models.PositiveIntegerField(editable=False, null=True)),
('file_hash', models.CharField(blank=True, db_index=True, editable=False, max_length=40)),
('alt', models.TextField(blank=True, help_text=('Er ikke synlig på nettsiden, men leses opp for de som bruker skjermlesere. Viktig for SEO og tilgjengelighet. Beskriv det du ser i bildet som til en blind person. F.eks. "Logo for Superforeningen" eller "Stemningsbilde fra konserten med Eminem"',), verbose_name='Alternativ bildetekst')),
('attribution', models.CharField(blank=True, help_text='Navn på fotograf, illustratør, organisasjon, e.l.', max_length=255, verbose_name='Kreditering')),
('collection', models.ForeignKey(default=wagtail.models.media.get_root_collection_id, on_delete=django.db.models.deletion.CASCADE, related_name='+', to='wagtailcore.collection', verbose_name='collection')),
('tags', taggit.managers.TaggableManager(blank=True, help_text=None, through='taggit.TaggedItem', to='taggit.Tag', verbose_name='tags')),
('uploaded_by_user', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='uploaded by user')),
],
options={
'abstract': False,
},
bases=(wagtail.images.models.ImageFileMixin, wagtail.search.index.Indexed, models.Model),
),
migrations.CreateModel(
name='Rendition',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('filter_spec', models.CharField(db_index=True, max_length=255)),
('file', wagtail.images.models.WagtailImageField(height_field='height', storage=wagtail.images.models.get_rendition_storage, upload_to=wagtail.images.models.get_rendition_upload_to, width_field='width')),
('width', models.IntegerField(editable=False)),
('height', models.IntegerField(editable=False)),
('focal_point_key', models.CharField(blank=True, default='', editable=False, max_length=16)),
('image', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='renditions', to='images.customimage')),
],
options={
'unique_together': {('image', 'filter_spec', 'focal_point_key')},
},
bases=(wagtail.images.models.ImageFileMixin, models.Model),
),
]

View File

@ -0,0 +1,22 @@
# Generated by Django 5.0.6 on 2024-05-15 01:40
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('images', '0001_initial'),
]
operations = [
migrations.AlterModelOptions(
name='customimage',
options={'permissions': [('choose_image', 'Can choose image')], 'verbose_name': 'image', 'verbose_name_plural': 'images'},
),
migrations.AlterField(
model_name='customimage',
name='alt',
field=models.CharField(blank=True, help_text=('Er ikke synlig på nettsiden, men leses opp for de som bruker skjermlesere. Viktig for SEO og tilgjengelighet. Beskriv det du ser i bildet som til en blind person. F.eks. "Logo for Superforeningen" eller "Stemningsbilde fra konserten med Eminem"',), max_length=512, verbose_name='Alternativ bildetekst'),
),
]

View File

51
dnscms/images/models.py Normal file
View File

@ -0,0 +1,51 @@
from django.db import models
from django.utils.translation import gettext_lazy as _
from grapple.models import (
GraphQLString,
)
from wagtail.images.models import AbstractImage, AbstractRendition, Image
class CustomImage(AbstractImage):
alt = models.CharField(
max_length=512,
blank=True,
verbose_name="Alternativ bildetekst",
help_text=(
"Er ikke synlig på nettsiden, men leses opp for de som bruker skjermlesere. "
"Viktig for SEO og tilgjengelighet. "
"Beskriv det du ser i bildet som til en blind person. "
'F.eks. "Logo for Superforeningen" eller "Stemningsbilde fra konserten med Eminem"',
),
)
attribution = models.CharField(
max_length=255,
blank=True,
verbose_name="Kreditering",
help_text="Navn på fotograf, illustratør, organisasjon, e.l.",
)
admin_form_fields = Image.admin_form_fields + ("alt", "attribution")
@property
def default_alt_text(self):
return self.alt or self.title
class Meta(AbstractImage.Meta):
verbose_name = _("image")
verbose_name_plural = _("images")
permissions = [
("choose_image", "Can choose image"),
]
graphql_fields = [
GraphQLString("alt"),
GraphQLString("attribution"),
]
class Rendition(AbstractRendition):
image = models.ForeignKey(CustomImage, on_delete=models.CASCADE, related_name="renditions")
class Meta:
unique_together = (("image", "filter_spec", "focal_point_key"),)

View File

@ -0,0 +1,30 @@
# Generated by Django 5.0.6 on 2024-05-15 01:40
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("images", "0002_alter_customimage_options_alter_customimage_alt"),
("venues", "0002_venueindex"),
]
operations = [
migrations.RemoveField(
model_name="venuepage",
name="featured_image",
),
migrations.AddField(
model_name="venuepage",
name="featured_image",
field=models.ForeignKey(
blank=True,
help_text="Bilde av lokalet",
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="+",
to="images.customimage",
),
),
]

View File

@ -22,7 +22,7 @@ class VenuePage(Page):
show_in_menus = False
featured_image = models.ForeignKey(
"wagtailimages.Image",
"images.CustomImage",
null=True,
blank=True,
on_delete=models.SET_NULL,