add event organizer models, changes to associations
This commit is contained in:
@ -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())]),
|
||||
),
|
||||
]
|
@ -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',
|
||||
),
|
||||
]
|
@ -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"),
|
||||
]
|
||||
|
@ -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)
|
||||
|
27
dnscms/events/migrations/0018_eventorganizer.py
Normal file
27
dnscms/events/migrations/0018_eventorganizer.py
Normal file
@ -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,
|
||||
},
|
||||
),
|
||||
]
|
@ -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'),
|
||||
),
|
||||
]
|
@ -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,
|
||||
),
|
||||
]
|
||||
|
||||
|
||||
|
@ -1,3 +0,0 @@
|
||||
from django.shortcuts import render
|
||||
|
||||
# Create your views here.
|
||||
|
Reference in New Issue
Block a user