From 3522620cea1e5f21e7b57dfa2a9259bdf09f2083 Mon Sep 17 00:00:00 2001 From: Jonas Braathen Date: Tue, 14 May 2024 23:01:09 +0200 Subject: [PATCH] add event organizer models, changes to associations --- ...ame_url_association_websiteurl_and_more.py | 38 +++++++++++ ...0003_rename_association_associationpage.py | 19 ++++++ dnscms/associations/models.py | 38 +++++++---- dnscms/dnscms/wagtail_hooks.py | 14 +++- .../events/migrations/0018_eventorganizer.py | 27 ++++++++ ...torganizer_options_eventpage_organizers.py | 23 +++++++ dnscms/events/models.py | 68 +++++++++++++++++-- dnscms/events/views.py | 3 - 8 files changed, 206 insertions(+), 24 deletions(-) create mode 100644 dnscms/associations/migrations/0002_associationindex_rename_url_association_websiteurl_and_more.py create mode 100644 dnscms/associations/migrations/0003_rename_association_associationpage.py create mode 100644 dnscms/events/migrations/0018_eventorganizer.py create mode 100644 dnscms/events/migrations/0019_alter_eventorganizer_options_eventpage_organizers.py diff --git a/dnscms/associations/migrations/0002_associationindex_rename_url_association_websiteurl_and_more.py b/dnscms/associations/migrations/0002_associationindex_rename_url_association_websiteurl_and_more.py new file mode 100644 index 0000000..65ca071 --- /dev/null +++ b/dnscms/associations/migrations/0002_associationindex_rename_url_association_websiteurl_and_more.py @@ -0,0 +1,38 @@ +# Generated by Django 5.0.6 on 2024-05-13 02:15 + +import django.db.models.deletion +import wagtail.blocks +import wagtail.fields +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('associations', '0001_initial'), + ('wagtailcore', '0093_uploadedfile'), + ] + + operations = [ + migrations.CreateModel( + name='AssociationIndex', + fields=[ + ('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.page')), + ('body', wagtail.fields.StreamField([('paragraph', wagtail.blocks.RichTextBlock())])), + ], + options={ + 'abstract': False, + }, + bases=('wagtailcore.page',), + ), + migrations.RenameField( + model_name='association', + old_name='url', + new_name='websiteUrl', + ), + migrations.AlterField( + model_name='association', + name='body', + field=wagtail.fields.StreamField([('paragraph', wagtail.blocks.RichTextBlock())]), + ), + ] diff --git a/dnscms/associations/migrations/0003_rename_association_associationpage.py b/dnscms/associations/migrations/0003_rename_association_associationpage.py new file mode 100644 index 0000000..51f5083 --- /dev/null +++ b/dnscms/associations/migrations/0003_rename_association_associationpage.py @@ -0,0 +1,19 @@ +# Generated by Django 5.0.6 on 2024-05-13 02:21 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('associations', '0002_associationindex_rename_url_association_websiteurl_and_more'), + ('wagtailcore', '0093_uploadedfile'), + ('wagtailimages', '0026_delete_uploadedimage'), + ] + + operations = [ + migrations.RenameModel( + old_name='Association', + new_name='AssociationPage', + ), + ] diff --git a/dnscms/associations/models.py b/dnscms/associations/models.py index 6e3a364..4dba15b 100644 --- a/dnscms/associations/models.py +++ b/dnscms/associations/models.py @@ -1,23 +1,37 @@ from django.db import models - - -from wagtail.models import Page -from wagtail.fields import StreamField from wagtail import blocks from wagtail.admin.panels import FieldPanel -from wagtail.images.blocks import ImageChooserBlock +from wagtail.fields import StreamField +from wagtail.models import Page -class Association(Page): +class AssociationIndex(Page): + max_count = 1 + subpage_types = ["associations.AssociationPage"] + + body = StreamField( + [ + ("paragraph", blocks.RichTextBlock()), + ] + ) + + content_panels = Page.content_panels + [ + FieldPanel("body"), + ] + + +class AssociationPage(Page): + subpage_types = [] + parent_page_types = ["associations.AssociationIndex"] + show_in_menus = False + class AssociationType(models.TextChoices): FORENING = "forening", "Forening" UTVALG = "utvalg", "Utvalg" body = StreamField( [ - ("heading", blocks.CharBlock(form_classname="title")), ("paragraph", blocks.RichTextBlock()), - ("image", ImageChooserBlock()), ] ) association_type = models.CharField( @@ -30,13 +44,11 @@ class Association(Page): on_delete=models.SET_NULL, related_name="+", ) - url = models.URLField() + websiteUrl = models.URLField() content_panels = Page.content_panels + [ - # FieldPanel('author'), - # FieldPanel('date'), FieldPanel("body"), FieldPanel("logo"), - FieldPanel("association_type"), - FieldPanel("url"), + FieldPanel("association_type", heading="Type"), + FieldPanel("websiteUrl", heading="Nettside"), ] diff --git a/dnscms/dnscms/wagtail_hooks.py b/dnscms/dnscms/wagtail_hooks.py index 8c77192..810d94c 100644 --- a/dnscms/dnscms/wagtail_hooks.py +++ b/dnscms/dnscms/wagtail_hooks.py @@ -3,6 +3,7 @@ from django.urls import reverse from wagtail import hooks from wagtail.admin.menu import MenuItem +from associations.models import AssociationIndex from events.models import EventIndex @@ -14,5 +15,16 @@ def enable_additional_rich_text_features(features): @hooks.register("register_admin_menu_item") def register_events_menu_item(): page = EventIndex.objects.first() - events_url = reverse("wagtailadmin_explore", args=(quote(page.pk),)) + events_url = "#" + if page: + events_url = reverse("wagtailadmin_explore", args=(quote(page.pk),)) return MenuItem("Arrangementer", events_url, icon_name="date", order=1) + + +@hooks.register("register_admin_menu_item") +def register_associations_menu_item(): + page = AssociationIndex.objects.first() + associations_url = "#" + if page: + associations_url = reverse("wagtailadmin_explore", args=(quote(page.pk),)) + return MenuItem("Foreninger", associations_url, icon_name="group", order=2) diff --git a/dnscms/events/migrations/0018_eventorganizer.py b/dnscms/events/migrations/0018_eventorganizer.py new file mode 100644 index 0000000..390e101 --- /dev/null +++ b/dnscms/events/migrations/0018_eventorganizer.py @@ -0,0 +1,27 @@ +# Generated by Django 5.0.6 on 2024-05-13 02:54 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('associations', '0003_rename_association_associationpage'), + ('events', '0017_alter_eventcategory_name'), + ] + + operations = [ + migrations.CreateModel( + name='EventOrganizer', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100)), + ('slug', models.SlugField(help_text='The name of the organizer as it will appear in URLs.', max_length=255, verbose_name='slug')), + ('association', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='organizers', to='associations.associationpage')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/dnscms/events/migrations/0019_alter_eventorganizer_options_eventpage_organizers.py b/dnscms/events/migrations/0019_alter_eventorganizer_options_eventpage_organizers.py new file mode 100644 index 0000000..5d3ecbb --- /dev/null +++ b/dnscms/events/migrations/0019_alter_eventorganizer_options_eventpage_organizers.py @@ -0,0 +1,23 @@ +# Generated by Django 5.0.6 on 2024-05-13 03:09 + +import modelcluster.fields +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('events', '0018_eventorganizer'), + ] + + operations = [ + migrations.AlterModelOptions( + name='eventorganizer', + options={'ordering': ['name'], 'verbose_name': 'Event organizer', 'verbose_name_plural': 'Event organizers'}, + ), + migrations.AddField( + model_name='eventpage', + name='organizers', + field=modelcluster.fields.ParentalManyToManyField(blank=True, to='events.eventorganizer'), + ), + ] diff --git a/dnscms/events/models.py b/dnscms/events/models.py index 9db4724..455bc62 100644 --- a/dnscms/events/models.py +++ b/dnscms/events/models.py @@ -12,8 +12,17 @@ from grapple.models import ( GraphQLString, ) from modelcluster.fields import ParentalKey, ParentalManyToManyField +from modelcluster.models import ClusterableModel from wagtail import blocks -from wagtail.admin.panels import FieldPanel, FieldRowPanel, HelpPanel, InlinePanel, MultiFieldPanel +from wagtail.admin.panels import ( + FieldPanel, + FieldRowPanel, + HelpPanel, + InlinePanel, + MultiFieldPanel, + PageChooserPanel, + TitleFieldPanel, +) from wagtail.fields import StreamField from wagtail.images.blocks import ImageChooserBlock from wagtail.models import Orderable, Page @@ -46,7 +55,7 @@ class EventCategory(models.Model): default=False, help_text="Skal denne kategorien være mulig å filtrere på i programmet?" ) - panels = [FieldPanel("name"), FieldPanel("slug"), FieldPanel("show_in_filters")] + panels = [TitleFieldPanel("name"), FieldPanel("slug"), FieldPanel("show_in_filters")] graphql_fields = [ GraphQLString("name", required=True), @@ -63,6 +72,43 @@ class EventCategory(models.Model): return self.name +@register_snippet +@register_query_field("eventOrganizer", "eventOrganizers") +class EventOrganizer(ClusterableModel): + name = models.CharField( + max_length=100, + null=False, + blank=False, + ) + slug = models.SlugField( + verbose_name=_("slug"), + max_length=255, + help_text=_("The name of the organizer as it will appear in URLs."), + ) + + association = models.ForeignKey( + "associations.AssociationPage", + null=True, + blank=True, + on_delete=models.PROTECT, + related_name="organizers", + ) + + panels = [ + TitleFieldPanel("name"), + FieldPanel("slug"), + PageChooserPanel("association", ["associations.AssociationPage"]), + ] + + class Meta: + verbose_name = "Event organizer" + verbose_name_plural = "Event organizers" + ordering = ["name"] + + def __str__(self): + return self.name + + class EventPage(Page): # no children subpage_types = [] @@ -106,6 +152,11 @@ class EventPage(Page): blank=True, ) + organizers = ParentalManyToManyField( + "events.EventOrganizer", + blank=True, + ) + ticket_url = models.URLField( blank=True, max_length=512, @@ -117,12 +168,7 @@ class EventPage(Page): help_text="Lenke direkte til arrangementet på Facebook", ) - # "event_types": [13], # "event_organizers": [390, 322], - # "start_time": "2024-05-07T17:00:00+00:00", - # "end_time": "2024-05-07T20:00:00+00:00", - # "venue": "Glassbaren", - # "venue_id": "55063", price_regular = models.IntegerField(null=True, blank=True) price_student = models.IntegerField(null=True, blank=True) @@ -145,6 +191,7 @@ class EventPage(Page): FieldPanel("featured_image"), FieldPanel("body"), FieldPanel("categories", widget=forms.CheckboxSelectMultiple), + FieldPanel("organizers", widget=forms.SelectMultiple), MultiFieldPanel( heading="Priser og billettkjøp", children=ticket_panels, @@ -185,6 +232,13 @@ class EventPage(Page): required=True, item_required=True, ), + GraphQLCollection( + GraphQLForeignKey, + "organizers", + "events.EventOrganizer", + required=True, + item_required=True, + ), ] diff --git a/dnscms/events/views.py b/dnscms/events/views.py index 91ea44a..e69de29 100644 --- a/dnscms/events/views.py +++ b/dnscms/events/views.py @@ -1,3 +0,0 @@ -from django.shortcuts import render - -# Create your views here.