diff --git a/dnscms/events/migrations/0014_eventcategory_eventpage_categories.py b/dnscms/events/migrations/0014_eventcategory_eventpage_categories.py new file mode 100644 index 0000000..f50a088 --- /dev/null +++ b/dnscms/events/migrations/0014_eventcategory_eventpage_categories.py @@ -0,0 +1,30 @@ +# Generated by Django 5.0.6 on 2024-05-12 23:14 + +import modelcluster.fields +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('events', '0013_alter_eventoccurrence_options'), + ] + + operations = [ + migrations.CreateModel( + name='EventCategory', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100, null=True)), + ('slug', models.SlugField(help_text='The name of the category as it will appear in URLs.', max_length=255, verbose_name='slug')), + ], + options={ + 'ordering': ['name'], + }, + ), + migrations.AddField( + model_name='eventpage', + name='categories', + field=modelcluster.fields.ParentalManyToManyField(blank=True, to='events.eventcategory'), + ), + ] diff --git a/dnscms/events/migrations/0015_alter_eventcategory_options.py b/dnscms/events/migrations/0015_alter_eventcategory_options.py new file mode 100644 index 0000000..9dbd890 --- /dev/null +++ b/dnscms/events/migrations/0015_alter_eventcategory_options.py @@ -0,0 +1,17 @@ +# Generated by Django 5.0.6 on 2024-05-12 23:16 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('events', '0014_eventcategory_eventpage_categories'), + ] + + operations = [ + migrations.AlterModelOptions( + name='eventcategory', + options={'ordering': ['name'], 'verbose_name': 'Event category', 'verbose_name_plural': 'Event categories'}, + ), + ] diff --git a/dnscms/events/migrations/0016_eventcategory_show_in_filters.py b/dnscms/events/migrations/0016_eventcategory_show_in_filters.py new file mode 100644 index 0000000..b460f02 --- /dev/null +++ b/dnscms/events/migrations/0016_eventcategory_show_in_filters.py @@ -0,0 +1,18 @@ +# Generated by Django 5.0.6 on 2024-05-12 23:35 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('events', '0015_alter_eventcategory_options'), + ] + + operations = [ + migrations.AddField( + model_name='eventcategory', + name='show_in_filters', + field=models.BooleanField(default=False, help_text='Skal denne kategorien være mulig å filtrere på i programmet?'), + ), + ] diff --git a/dnscms/events/models.py b/dnscms/events/models.py index ed3b510..347e112 100644 --- a/dnscms/events/models.py +++ b/dnscms/events/models.py @@ -1,5 +1,9 @@ +from django import forms from django.db import models +from django.utils.translation import gettext_lazy as _ +from grapple.helpers import register_query_field from grapple.models import ( + GraphQLBoolean, GraphQLCollection, GraphQLForeignKey, GraphQLImage, @@ -7,12 +11,13 @@ from grapple.models import ( GraphQLStreamfield, GraphQLString, ) -from modelcluster.fields import ParentalKey +from modelcluster.fields import ParentalKey, ParentalManyToManyField from wagtail import blocks from wagtail.admin.panels import FieldPanel, FieldRowPanel, HelpPanel, InlinePanel, MultiFieldPanel from wagtail.fields import StreamField from wagtail.images.blocks import ImageChooserBlock from wagtail.models import Orderable, Page +from wagtail.snippets.models import register_snippet from venues.models import VenuePage @@ -24,6 +29,39 @@ class EventIndex(Page): graphql_fields = [] +@register_snippet +@register_query_field("eventCategory", "eventCategories") +class EventCategory(models.Model): + name = models.CharField( + max_length=100, + null=True, + ) + slug = models.SlugField( + verbose_name=_("slug"), + max_length=255, + help_text=_("The name of the category as it will appear in URLs."), + ) + show_in_filters = models.BooleanField( + default=False, help_text="Skal denne kategorien være mulig å filtrere på i programmet?" + ) + + panels = [FieldPanel("name"), FieldPanel("slug"), FieldPanel("show_in_filters")] + + graphql_fields = [ + GraphQLString("name"), + GraphQLString("slug"), + GraphQLBoolean("show_in_filters"), + ] + + class Meta: + verbose_name = "Event category" + verbose_name_plural = "Event categories" + ordering = ["name"] + + def __str__(self): + return self.name + + class EventPage(Page): # no children subpage_types = [] @@ -62,6 +100,11 @@ class EventPage(Page): ] ) + categories = ParentalManyToManyField( + "events.EventCategory", + blank=True, + ) + ticket_url = models.URLField( blank=True, max_length=512, @@ -100,6 +143,7 @@ class EventPage(Page): content_panels = Page.content_panels + [ FieldPanel("featured_image"), FieldPanel("body"), + FieldPanel("categories", widget=forms.CheckboxSelectMultiple), MultiFieldPanel( heading="Priser og billettkjøp", children=ticket_panels, @@ -126,6 +170,7 @@ class EventPage(Page): GraphQLInt("price_regular"), GraphQLInt("price_student"), GraphQLInt("price_member"), + GraphQLCollection(GraphQLForeignKey, "categories", "events.EventCategory"), GraphQLCollection(GraphQLForeignKey, "occurrences", "events.EventOccurrence"), ] diff --git a/web/src/components/events/EventContainer.tsx b/web/src/components/events/EventContainer.tsx index 8fdcccb..0d5b16b 100644 --- a/web/src/components/events/EventContainer.tsx +++ b/web/src/components/events/EventContainer.tsx @@ -34,6 +34,7 @@ export const EventContainer = ({ events }: { events: EventFragment[] }) => { }; const EventList = ({ events }: { events: EventFragment[] }) => { + console.log('events', events) return (