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 django.db import models
|
||||||
|
|
||||||
|
|
||||||
from wagtail.models import Page
|
|
||||||
from wagtail.fields import StreamField
|
|
||||||
from wagtail import blocks
|
from wagtail import blocks
|
||||||
from wagtail.admin.panels import FieldPanel
|
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):
|
class AssociationType(models.TextChoices):
|
||||||
FORENING = "forening", "Forening"
|
FORENING = "forening", "Forening"
|
||||||
UTVALG = "utvalg", "Utvalg"
|
UTVALG = "utvalg", "Utvalg"
|
||||||
|
|
||||||
body = StreamField(
|
body = StreamField(
|
||||||
[
|
[
|
||||||
("heading", blocks.CharBlock(form_classname="title")),
|
|
||||||
("paragraph", blocks.RichTextBlock()),
|
("paragraph", blocks.RichTextBlock()),
|
||||||
("image", ImageChooserBlock()),
|
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
association_type = models.CharField(
|
association_type = models.CharField(
|
||||||
@ -30,13 +44,11 @@ class Association(Page):
|
|||||||
on_delete=models.SET_NULL,
|
on_delete=models.SET_NULL,
|
||||||
related_name="+",
|
related_name="+",
|
||||||
)
|
)
|
||||||
url = models.URLField()
|
websiteUrl = models.URLField()
|
||||||
|
|
||||||
content_panels = Page.content_panels + [
|
content_panels = Page.content_panels + [
|
||||||
# FieldPanel('author'),
|
|
||||||
# FieldPanel('date'),
|
|
||||||
FieldPanel("body"),
|
FieldPanel("body"),
|
||||||
FieldPanel("logo"),
|
FieldPanel("logo"),
|
||||||
FieldPanel("association_type"),
|
FieldPanel("association_type", heading="Type"),
|
||||||
FieldPanel("url"),
|
FieldPanel("websiteUrl", heading="Nettside"),
|
||||||
]
|
]
|
||||||
|
@ -3,6 +3,7 @@ from django.urls import reverse
|
|||||||
from wagtail import hooks
|
from wagtail import hooks
|
||||||
from wagtail.admin.menu import MenuItem
|
from wagtail.admin.menu import MenuItem
|
||||||
|
|
||||||
|
from associations.models import AssociationIndex
|
||||||
from events.models import EventIndex
|
from events.models import EventIndex
|
||||||
|
|
||||||
|
|
||||||
@ -14,5 +15,16 @@ def enable_additional_rich_text_features(features):
|
|||||||
@hooks.register("register_admin_menu_item")
|
@hooks.register("register_admin_menu_item")
|
||||||
def register_events_menu_item():
|
def register_events_menu_item():
|
||||||
page = EventIndex.objects.first()
|
page = EventIndex.objects.first()
|
||||||
|
events_url = "#"
|
||||||
|
if page:
|
||||||
events_url = reverse("wagtailadmin_explore", args=(quote(page.pk),))
|
events_url = reverse("wagtailadmin_explore", args=(quote(page.pk),))
|
||||||
return MenuItem("Arrangementer", events_url, icon_name="date", order=1)
|
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,
|
GraphQLString,
|
||||||
)
|
)
|
||||||
from modelcluster.fields import ParentalKey, ParentalManyToManyField
|
from modelcluster.fields import ParentalKey, ParentalManyToManyField
|
||||||
|
from modelcluster.models import ClusterableModel
|
||||||
from wagtail import blocks
|
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.fields import StreamField
|
||||||
from wagtail.images.blocks import ImageChooserBlock
|
from wagtail.images.blocks import ImageChooserBlock
|
||||||
from wagtail.models import Orderable, Page
|
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?"
|
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 = [
|
graphql_fields = [
|
||||||
GraphQLString("name", required=True),
|
GraphQLString("name", required=True),
|
||||||
@ -63,6 +72,43 @@ class EventCategory(models.Model):
|
|||||||
return self.name
|
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):
|
class EventPage(Page):
|
||||||
# no children
|
# no children
|
||||||
subpage_types = []
|
subpage_types = []
|
||||||
@ -106,6 +152,11 @@ class EventPage(Page):
|
|||||||
blank=True,
|
blank=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
organizers = ParentalManyToManyField(
|
||||||
|
"events.EventOrganizer",
|
||||||
|
blank=True,
|
||||||
|
)
|
||||||
|
|
||||||
ticket_url = models.URLField(
|
ticket_url = models.URLField(
|
||||||
blank=True,
|
blank=True,
|
||||||
max_length=512,
|
max_length=512,
|
||||||
@ -117,12 +168,7 @@ class EventPage(Page):
|
|||||||
help_text="Lenke direkte til arrangementet på Facebook",
|
help_text="Lenke direkte til arrangementet på Facebook",
|
||||||
)
|
)
|
||||||
|
|
||||||
# "event_types": [13],
|
|
||||||
# "event_organizers": [390, 322],
|
# "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_regular = models.IntegerField(null=True, blank=True)
|
||||||
price_student = 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("featured_image"),
|
||||||
FieldPanel("body"),
|
FieldPanel("body"),
|
||||||
FieldPanel("categories", widget=forms.CheckboxSelectMultiple),
|
FieldPanel("categories", widget=forms.CheckboxSelectMultiple),
|
||||||
|
FieldPanel("organizers", widget=forms.SelectMultiple),
|
||||||
MultiFieldPanel(
|
MultiFieldPanel(
|
||||||
heading="Priser og billettkjøp",
|
heading="Priser og billettkjøp",
|
||||||
children=ticket_panels,
|
children=ticket_panels,
|
||||||
@ -185,6 +232,13 @@ class EventPage(Page):
|
|||||||
required=True,
|
required=True,
|
||||||
item_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