improve event organizer selection, show on web
This commit is contained in:
@ -1,6 +1,6 @@
|
||||
from django import forms
|
||||
from django.db import models
|
||||
from django.db.models import Min, Q
|
||||
from django.db.models import Min, Q, UniqueConstraint
|
||||
from django.utils import timezone
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from grapple.helpers import register_query_field, register_singular_query_field
|
||||
@ -21,12 +21,13 @@ from wagtail.admin.panels import (
|
||||
HelpPanel,
|
||||
InlinePanel,
|
||||
MultiFieldPanel,
|
||||
PageChooserPanel,
|
||||
MultipleChooserPanel,
|
||||
TitleFieldPanel,
|
||||
)
|
||||
from wagtail.models import Orderable, Page, PageManager, PageQuerySet
|
||||
from wagtail.snippets.models import register_snippet
|
||||
|
||||
from associations.widgets import AssociationChooserWidget
|
||||
from dnscms.fields import CommonStreamField
|
||||
from venues.models import VenuePage
|
||||
|
||||
@ -117,6 +118,36 @@ class EventCategory(models.Model):
|
||||
return self.name
|
||||
|
||||
|
||||
class EventOrganizerLink(Orderable):
|
||||
event = ParentalKey(
|
||||
"events.EventPage", on_delete=models.CASCADE, related_name="organizer_links"
|
||||
)
|
||||
organizer = models.ForeignKey(
|
||||
"events.EventOrganizer",
|
||||
on_delete=models.PROTECT,
|
||||
related_name="organized_events",
|
||||
help_text="",
|
||||
)
|
||||
|
||||
panels = [FieldPanel("organizer", heading="", help_text="")]
|
||||
|
||||
graphql_fields = [
|
||||
GraphQLForeignKey("organizer", "events.EventOrganizer"),
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.organizer.name}"
|
||||
|
||||
class Meta:
|
||||
verbose_name = "Arrangør"
|
||||
verbose_name_plural = "Arrangører"
|
||||
constraints = [
|
||||
UniqueConstraint(
|
||||
"event", "organizer", name="event_organizer_link_event_organizer_unique"
|
||||
)
|
||||
]
|
||||
|
||||
|
||||
@register_snippet
|
||||
@register_query_field("eventOrganizer", "eventOrganizers")
|
||||
class EventOrganizer(ClusterableModel):
|
||||
@ -137,12 +168,39 @@ class EventOrganizer(ClusterableModel):
|
||||
blank=True,
|
||||
on_delete=models.PROTECT,
|
||||
related_name="organizers",
|
||||
help_text="Om en samfundsforening eller et utvalg står bak, velg det her.",
|
||||
)
|
||||
|
||||
external_url = models.URLField(
|
||||
blank=True,
|
||||
max_length=512,
|
||||
help_text="Lenke til nettstedet til ekstern arrangør",
|
||||
)
|
||||
|
||||
panels = [
|
||||
TitleFieldPanel("name"),
|
||||
FieldPanel("slug"),
|
||||
PageChooserPanel("association", ["associations.AssociationPage"]),
|
||||
FieldPanel(
|
||||
"association",
|
||||
widget=AssociationChooserWidget(linked_fields={"association": "#id_association"}),
|
||||
heading="Intern arrangør",
|
||||
),
|
||||
MultiFieldPanel(
|
||||
heading="Ekstern arrangør",
|
||||
children=[
|
||||
FieldPanel(
|
||||
"external_url",
|
||||
heading="Nettsted",
|
||||
help_text="La denne stå tom om arrangøren finnes i lista over.",
|
||||
),
|
||||
],
|
||||
),
|
||||
]
|
||||
|
||||
graphql_fields = [
|
||||
GraphQLString("name"),
|
||||
GraphQLForeignKey("association", "associations.AssociationPage", required=False),
|
||||
GraphQLString("external_url"),
|
||||
]
|
||||
|
||||
class Meta:
|
||||
@ -191,9 +249,8 @@ class EventPage(Page):
|
||||
blank=True,
|
||||
)
|
||||
|
||||
organizers = ParentalManyToManyField(
|
||||
"events.EventOrganizer",
|
||||
blank=True,
|
||||
organizers = models.ManyToManyField(
|
||||
"events.EventOrganizer", through="events.EventOrganizerLink"
|
||||
)
|
||||
|
||||
PIG_CHOICES = [
|
||||
@ -251,7 +308,17 @@ class EventPage(Page):
|
||||
FieldPanel("featured_image"),
|
||||
FieldPanel("body"),
|
||||
FieldPanel("categories", widget=forms.CheckboxSelectMultiple),
|
||||
FieldPanel("organizers", widget=forms.SelectMultiple),
|
||||
MultiFieldPanel(
|
||||
heading="Arrangører",
|
||||
children=[
|
||||
HelpPanel(
|
||||
content=("Hvem står bak arrangementet?"),
|
||||
),
|
||||
MultipleChooserPanel(
|
||||
"organizer_links", chooser_field_name="organizer", min_num=1, label="Arrangør"
|
||||
),
|
||||
],
|
||||
),
|
||||
FieldPanel("pig", heading="Gris"),
|
||||
FieldPanel(
|
||||
"facebook_url",
|
||||
@ -309,6 +376,16 @@ class EventPage(Page):
|
||||
def clean(self):
|
||||
super().clean()
|
||||
|
||||
# remove duped organizers based on name
|
||||
organizers = [x.organizer.name for x in self.organizer_links.all()]
|
||||
if len(organizers) != len(set(organizers)):
|
||||
seen_organizers = set()
|
||||
for link in self.organizer_links.all():
|
||||
if link.organizer.name in seen_organizers:
|
||||
self.organizer_links.remove(link)
|
||||
else:
|
||||
seen_organizers.add(link.organizer.name)
|
||||
|
||||
# if the event is free, all specific pricing is unset
|
||||
if self.free:
|
||||
self.price_regular = None
|
||||
|
Reference in New Issue
Block a user