diff --git a/dnscms/events/models.py b/dnscms/events/models.py index 11ce12c..ce22414 100644 --- a/dnscms/events/models.py +++ b/dnscms/events/models.py @@ -478,7 +478,7 @@ class EventOccurrence(Orderable): ), FieldRowPanel( children=[ - FieldPanel("venue", heading=_("Venue")), + FieldPanel("venue", heading=_("Venue"), widget=forms.Select), FieldPanel("venue_custom", heading=_("Venue as free text")), ], ), @@ -492,6 +492,15 @@ class EventOccurrence(Orderable): ] def clean(self): + if self.venue_custom: + trimmed = self.venue_custom.strip() + self.venue_custom = trimmed + if trimmed: + match = VenuePage.objects.filter(title=trimmed).first() + if match: + self.venue = match + self.venue_custom = "" + if self.venue and self.venue_custom: raise ValidationError( { diff --git a/dnscms/tests/test_events.py b/dnscms/tests/test_events.py index 5caa134..c3e29c1 100644 --- a/dnscms/tests/test_events.py +++ b/dnscms/tests/test_events.py @@ -104,6 +104,34 @@ def test_eventoccurrence_clean_rejects_both_venue_and_venue_custom(event_index, assert "venue_custom" in exc.value.message_dict +def test_eventoccurrence_clean_promotes_matching_custom_text_to_venue(event_index, venue): + event = EventPageFactory(parent=event_index) + occurrence = EventOccurrence( + event=event, + start=timezone.now(), + venue_custom=f" {venue.title} ", + ) + + occurrence.clean() + + assert occurrence.venue_id == venue.pk + assert occurrence.venue_custom == "" + + +def test_eventoccurrence_clean_keeps_custom_text_when_no_venue_matches(event_index): + event = EventPageFactory(parent=event_index) + occurrence = EventOccurrence( + event=event, + start=timezone.now(), + venue_custom=" Frederikkeplassen ", + ) + + occurrence.clean() + + assert occurrence.venue is None + assert occurrence.venue_custom == "Frederikkeplassen" + + def test_eventoccurrence_clean_requires_venue_or_venue_custom(event_index): event = EventPageFactory(parent=event_index) occurrence = EventOccurrence(event=event, start=timezone.now())