Compare commits

...

2 Commits

Author SHA1 Message Date
Arne Schauf b447adb389 "Enhance partner event styling and adjust newsletter text 2 weeks ago
Arne Schauf b8c745d675 ribbon first version 2 weeks ago
  1. 18
      core/migrations/0020_rename_is_external_to_is_partner_event.py
  2. 4
      core/models.py
  3. 55
      core/static/css/theme/events.css
  4. 22
      core/tasks.py
  5. 6
      core/templates/core/event_index_page.html
  6. 2
      core/templates/core/tags/newsletter_minimal_form.html
  7. 4
      core/templatetags/core_tags.py

@ -0,0 +1,18 @@
# Generated by Django 4.2.1 on 2023-11-15 12:00
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('core', '0019_alter_aboutuspage_team_members'),
]
operations = [
migrations.RenameField(
model_name='eventpage',
old_name='is_external',
new_name='is_partner_event',
),
]

@ -318,7 +318,7 @@ class EventPage(Page):
help_text="Last day where the registration will be available. Leave empty to enable registration permanently" help_text="Last day where the registration will be available. Leave empty to enable registration permanently"
"after start date") "after start date")
show_in_event_calendar = models.BooleanField(default=True, help_text='Event in Eventliste und im Kalender anzeigen?') show_in_event_calendar = models.BooleanField(default=True, help_text='Event in Eventliste und im Kalender anzeigen?')
is_external = models.BooleanField(default=False, help_text='Externes Event? Externe Events werden nicht im Upcoming Events Banner auf der Startseite angezeigt.') is_partner_event = models.BooleanField(default=False, help_text='Partner Event? Partner Events werden mit einem Ribbon markiert und nicht im Upcoming Events Banner auf der Startseite angezeigt.')
is_free = models.BooleanField(default=False, help_text='If this is checked the send button under the registration' is_free = models.BooleanField(default=False, help_text='If this is checked the send button under the registration'
'form will be labeled "verbindlich anmelden" instead of "kostenpflichtig anmelden"') 'form will be labeled "verbindlich anmelden" instead of "kostenpflichtig anmelden"')
@ -369,7 +369,7 @@ EventPage.content_panels = [
FieldPanel('downloads'), FieldPanel('downloads'),
MultiFieldPanel([ MultiFieldPanel([
FieldPanel('show_in_event_calendar'), FieldPanel('show_in_event_calendar'),
FieldPanel('is_external'), FieldPanel('is_partner_event'),
FieldPanel('vimeo_id'), FieldPanel('vimeo_id'),
], heading="Settings", classname="collapsible collapsed"), ], heading="Settings", classname="collapsible collapsed"),
MultiFieldPanel([ MultiFieldPanel([

@ -34,6 +34,57 @@
padding-bottom: 1rem; padding-bottom: 1rem;
border-bottom: 1px solid rgba(0, 0, 0, 0.05); border-bottom: 1px solid rgba(0, 0, 0, 0.05);
transition: all 0.3s ease; transition: all 0.3s ease;
position: relative;
}
/* Partner event ribbon */
.partner-event-ribbon {
position: absolute;
top: 30px;
right: -20px;
background: linear-gradient(135deg, rgba(132, 0, 75, 0.6), #84004b);
color: white;
padding: 0.3rem 0;
font-size: 0.8rem;
font-weight: var(--font-weight-medium);
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
z-index: 10;
transform: rotate(45deg);
text-transform: uppercase;
letter-spacing: 0.5px;
width: 160px;
text-align: center;
overflow: hidden;
clip-path: polygon(20px 0, 100% 0, 100% calc(100% - 20px), calc(100% - 20px) 100%, 0 100%, 0 20px);
}
/* Partner event card left border */
.timeline-panel.partner-event-card {
border: none;
border-left: 4px solid #84004b;
transition: all 0.3s ease;
}
.partner-event-ribbon::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 25px;
height: 25px;
background: linear-gradient(90deg, rgba(0,0,0,0), rgba(0, 0, 0, 0.15));
clip-path: polygon(0 0, 100% 0, 0 100%);
}
.partner-event-ribbon::after {
content: '';
position: absolute;
bottom: 0;
right: 0;
width: 20px;
height: 20px;
background: rgba(0, 0, 0, 0.15);
clip-path: polygon(0 0, 100% 0, 0 100%);
} }
.event-item:hover { .event-item:hover {
@ -180,6 +231,10 @@
font-size: 2rem; font-size: 2rem;
} }
.event-calendar .event-title {
font-size: 1.25rem;
}
.event-title::after { .event-title::after {
content: ''; content: '';
position: absolute; position: absolute;

@ -11,11 +11,11 @@ from core.models import EventPage, EventHistoryPage
def move_past_events_to_history(): def move_past_events_to_history():
""" """
Daily task to: Daily task to:
1. Move past events that are not external to the history 1. Move past events that are not partner events to the history
2. Unpublish external events that are past 2. Unpublish partner events that are past
""" """
today = date.today() today = date.today()
# Find all live EventPage objects with a start_date in the past # Find all live EventPage objects with a start_date in the past
past_events = EventPage.objects.live().filter( past_events = EventPage.objects.live().filter(
Q(end_date__lt=timezone.now()) | Q(end_date__isnull=True, start_date__lt=timezone.now())) Q(end_date__lt=timezone.now()) | Q(end_date__isnull=True, start_date__lt=timezone.now()))
@ -28,26 +28,26 @@ def move_past_events_to_history():
return "No EventHistoryPage found. Cannot move past events." return "No EventHistoryPage found. Cannot move past events."
except EventHistoryPage.DoesNotExist: except EventHistoryPage.DoesNotExist:
return "No EventHistoryPage found. Cannot move past events." return "No EventHistoryPage found. Cannot move past events."
moved_count = 0 moved_count = 0
unpublished_count = 0 unpublished_count = 0
with transaction.atomic(): with transaction.atomic():
# Process each past event # Process each past event
for event in past_events: for event in past_events:
if event.is_external: if event.is_partner_event:
# Unpublish external events # Unpublish partner events
event.unpublish() event.unpublish()
unpublished_count += 1 unpublished_count += 1
else: else:
# Move non-external events to history # Move non-partner events to history
# Get the current parent page # Get the current parent page
current_parent = event.get_parent() current_parent = event.get_parent()
# Only move if not already under the history page # Only move if not already under the history page
if current_parent.id != history_page.id: if current_parent.id != history_page.id:
# Move the event to be a child of the history page # Move the event to be a child of the history page
event.move(history_page, pos='last-child') event.move(history_page, pos='last-child')
moved_count += 1 moved_count += 1
return f"Processed past events: {moved_count} moved to history, {unpublished_count} external events unpublished." return f"Processed past events: {moved_count} moved to history, {unpublished_count} partner events unpublished."

@ -19,14 +19,16 @@
<span class="timeline-badge-day">{{ event.start_date|date:"d" }}</span> <span class="timeline-badge-day">{{ event.start_date|date:"d" }}</span>
<span class="timeline-badge-month">{{ event.start_date|date:"b" }}</span> <span class="timeline-badge-month">{{ event.start_date|date:"b" }}</span>
</div> </div>
<div class="timeline-panel card border-0 shadow-sm"> <div class="timeline-panel card shadow-sm{% if event.is_partner_event %} partner-event-card{% else %} border-0{% endif %}">
{% if event.is_partner_event %}
<div class="partner-event-ribbon">Partner Event</div>
{% endif %}
<div class="card-header bg-light"> <div class="card-header bg-light">
<div class="d-flex justify-content-between align-items-center"> <div class="d-flex justify-content-between align-items-center">
<div> <div>
<span class="fs-5">{{ event.start_date|date:"SHORT_DATE_FORMAT" }}{% if event.end_date %} - {{ event.end_date|date:"SHORT_DATE_FORMAT" }}{% endif %}</span> <span class="fs-5">{{ event.start_date|date:"SHORT_DATE_FORMAT" }}{% if event.end_date %} - {{ event.end_date|date:"SHORT_DATE_FORMAT" }}{% endif %}</span>
</div> </div>
<div> <div>
<span class="text-muted">{{ event.start_date|date:"F Y" }}</span>
</div> </div>
</div> </div>
</div> </div>

@ -1,6 +1,6 @@
<div id="mc_embed_signup" class="newsletter-cta p-3 mb-4 rounded"> <div id="mc_embed_signup" class="newsletter-cta p-3 mb-4 rounded">
<p class="newsletter-heading mb-2">Bleiben Sie informiert!</p> <p class="newsletter-heading mb-2">Bleiben Sie informiert!</p>
<p class="newsletter-text mb-3">Erhalten Sie Updates zu unseren Veranstaltungen und Angeboten.</p> <p class="newsletter-text mb-3">Erhalten Sie Updates zu unseren Veranstaltungen.</p>
<a href="https://gmbh.us8.list-manage.com/subscribe?u=a2db855ea544f9ced14052793&id=42a1a3ba11" <a href="https://gmbh.us8.list-manage.com/subscribe?u=a2db855ea544f9ced14052793&id=42a1a3ba11"
target="_blank" class="btn btn-primary w-100 d-flex align-items-center justify-content-center"> target="_blank" class="btn btn-primary w-100 d-flex align-items-center justify-content-center">
<i class="bi bi-envelope-fill me-2"></i> <i class="bi bi-envelope-fill me-2"></i>

@ -26,13 +26,13 @@ def footer_newsletter(context):
def get_upcoming_events(limit=3): def get_upcoming_events(limit=3):
""" """
Returns a specified number of upcoming events ordered by start date. Returns a specified number of upcoming events ordered by start date.
External events are excluded from the results. Partner events are excluded from the results.
Usage: {% get_upcoming_events 3 as upcoming_events %} Usage: {% get_upcoming_events 3 as upcoming_events %}
""" """
from core.models import EventPage from core.models import EventPage
return EventPage.objects.live().filter( return EventPage.objects.live().filter(
show_in_event_calendar=True, show_in_event_calendar=True,
is_external=False, is_partner_event=False,
).filter( ).filter(
Q(end_date__gte=datetime.datetime.now()) | Q(end_date__isnull=True, start_date__gte=datetime.datetime.now()) Q(end_date__gte=datetime.datetime.now()) | Q(end_date__isnull=True, start_date__gte=datetime.datetime.now())
).order_by('start_date')[:limit] ).order_by('start_date')[:limit]

Loading…
Cancel
Save