ribbon first version

main
Arne Schauf 2 weeks ago
parent f1911ab8c9
commit b8c745d675
  1. 18
      core/migrations/0020_rename_is_external_to_is_partner_event.py
  2. 4
      core/models.py
  3. 22
      core/static/css/theme/events.css
  4. 22
      core/tasks.py
  5. 3
      core/templates/core/event_index_page.html
  6. 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,24 @@
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: 10px;
right: 10px;
background: linear-gradient(135deg, #ff9800, #ff5722);
color: white;
padding: 0.3rem 1rem;
font-size: 0.8rem;
font-weight: var(--font-weight-medium);
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
z-index: 10;
border-radius: 3px;
text-transform: uppercase;
letter-spacing: 0.5px;
} }
.event-item:hover { .event-item:hover {
@ -180,6 +198,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."

@ -20,6 +20,9 @@
<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 border-0 shadow-sm">
{% 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>

@ -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