{% extends "base.html" %} {% block title %}Manage Events | Roadshow Calendar{% endblock %} {% block content %}
Staff workspace

Manage your public event calendar securely

Only staff members can reach this area. Create events here or jump into Django Admin for bulk edits.

Backup

Download a full event backup

Export every event into one JSON file so you can keep an offline backup before larger edits or restore the calendar later if needed.

Restore

Import a previous backup

Upload an exported JSON file, review the preview, then confirm before anything in the live calendar is replaced.

{% csrf_token %}
Uploading only prepares a preview. The actual restore is a separate confirmation step.
Recommended flow: export a fresh backup first, then test your restore file.
{% if pending_import %}
Restore preview

Ready to replace the current calendar

This backup contains {{ pending_import.event_count }} event{{ pending_import.event_count|pluralize }}. If you confirm, Django will replace the current {{ dashboard_count }} live item{{ dashboard_count|pluralize }} in one transaction.

{% csrf_token %}
Backup events {{ pending_import.event_count }}
Published {{ pending_import.published_count }}
Drafts {{ pending_import.draft_count }}
Exported {{ pending_import.exported_at_display }}

First events in this backup

{% for event in pending_import.preview_events %}
{{ event.name }}
{{ event.start|date:"M j, Y g:i A" }} – {{ event.end|date:"M j, Y g:i A" }}
{{ event.location|default:"—" }}
{% if event.is_published %}Published{% else %}Draft{% endif %}
{% empty %}

This backup has no events. Confirming the restore would clear the current calendar.

{% endfor %}
{% if pending_import.remaining_count %}

Plus {{ pending_import.remaining_count }} more event{{ pending_import.remaining_count|pluralize }} in the same backup.

{% endif %}

Restore source

Project
{{ pending_import.project }}
Version
{{ pending_import.version }}
Action
Replace all current events

Safety note: the restore deletes the current event table contents and recreates them from this uploaded backup inside one database transaction.

{% endif %}
Embed settings

Generate a copy-ready widget snippet

Tune the iframe once, copy the finished code, and paste it into your existing HTML site.

Live embed output

Copy either the direct widget URL or the full iframe snippet.

Preview widget
Widget URL
{{ embed_base_url }}
Iframe snippet
<iframe src="{{ embed_base_url }}" title="Where to find us calendar" width="100%" height="760" style="border:0;border-radius:24px;overflow:hidden;" loading="lazy"></iframe>

All events

{{ dashboard_count }} scheduled item{{ dashboard_count|pluralize }} currently in the system.

{% for event in events %} {% empty %} {% endfor %}
Event Date Location Status Actions
{{ event.name }}
{{ event.start|date:"g:i A" }} – {{ event.end|date:"g:i A" }}
{{ event.start|date:"M j, Y" }} {{ event.location|default:"—" }} {% if event.is_published %} Published {% else %} Draft {% endif %}

No events yet

Create your first event to populate the public calendar and widget.

Create event
{% endblock %}