diff --git a/dav_event_office/__init__.py b/dav_event_office/__init__.py
new file mode 100644
index 0000000..6d3b94b
--- /dev/null
+++ b/dav_event_office/__init__.py
@@ -0,0 +1 @@
+default_app_config = 'dav_event_office.apps.AppConfig'
diff --git a/dav_event_office/apps.py b/dav_event_office/apps.py
new file mode 100644
index 0000000..5ea50d1
--- /dev/null
+++ b/dav_event_office/apps.py
@@ -0,0 +1,9 @@
+from dav_base.config.apps import AppConfig as _AppConfig
+
+DEFAULT_SETTINGS = ()
+
+
+class AppConfig(_AppConfig):
+ name = 'dav_event_office'
+ verbose_name = u'DAV Touren- & Kursreferat'
+ default_settings = DEFAULT_SETTINGS
diff --git a/dav_event_office/django_project_config/settings-dav_event_office.py b/dav_event_office/django_project_config/settings-dav_event_office.py
new file mode 100644
index 0000000..40a96af
--- /dev/null
+++ b/dav_event_office/django_project_config/settings-dav_event_office.py
@@ -0,0 +1 @@
+# -*- coding: utf-8 -*-
diff --git a/dav_event_office/module.json b/dav_event_office/module.json
new file mode 100644
index 0000000..5a4ef89
--- /dev/null
+++ b/dav_event_office/module.json
@@ -0,0 +1,3 @@
+{
+ "url_prefix": "office/events"
+}
\ No newline at end of file
diff --git a/dav_event_office/templates/dav_event_office/base.html b/dav_event_office/templates/dav_event_office/base.html
new file mode 100644
index 0000000..dc3aa99
--- /dev/null
+++ b/dav_event_office/templates/dav_event_office/base.html
@@ -0,0 +1,3 @@
+{% extends "dav_base/base.html" %}
+
+{% block head-title %}Touren- & Kursreferat - {{ block.super }}{% endblock %}
diff --git a/dav_event_office/templates/dav_event_office/event_detail.html b/dav_event_office/templates/dav_event_office/event_detail.html
new file mode 100644
index 0000000..3c7392f
--- /dev/null
+++ b/dav_event_office/templates/dav_event_office/event_detail.html
@@ -0,0 +1,59 @@
+{% extends 'dav_event_office/base.html' %}
+{% load bootstrap3 %}
+{% load i18n %}
+
+{% block head-title %}{{ event }} - {{ block.super }}{% endblock head-title %}
+
+{% block page-container-fluid %}
+
+
+
+
+ {{ event.render_as_html }}
+
+
+
+
+
Status-Log
+ {% for flag in event.flags.all %}
+
+
+ {% bootstrap_icon 'check' %}
+ {{ flag.status.label }}:
+
+
+ {{ flag.timestamp|date:'l, d. F Y, H:i' }} {% trans 'Uhr' %}
+ {% trans 'von' %} {{ flag.user.get_full_name|default:flag.user }}
+
+
+ {% endfor %}
+
+
+
{% trans 'Veröffentlichung' %}
+ {% if event.planned_publication_date %}
+ {{ event.planned_publication_date|date:'l, d. F Y' }}
+ {% else %}
+ {% trans 'Unverzüglich' %}
+ {% endif %}
+ {% if event.internal_note %}
+
{% trans 'Bearbeitungshinweis' %}
+
{{ event.internal_note|linebreaksbr }}
+ {% endif %}
+
+
+
+
+
+
+{% endblock page-container-fluid %}
\ No newline at end of file
diff --git a/dav_event_office/templates/dav_event_office/event_list.html b/dav_event_office/templates/dav_event_office/event_list.html
new file mode 100644
index 0000000..d1b8700
--- /dev/null
+++ b/dav_event_office/templates/dav_event_office/event_list.html
@@ -0,0 +1,101 @@
+{% extends 'dav_event_office/base.html' %}
+{% load bootstrap3 %}
+{% load i18n %}
+{% load dav_events %}
+
+{% block page-container-fluid %}
+
+
+
+{% endblock page-container-fluid %}
\ No newline at end of file
diff --git a/dav_event_office/templates/dav_event_office/home.html b/dav_event_office/templates/dav_event_office/home.html
new file mode 100644
index 0000000..e7ef3a3
--- /dev/null
+++ b/dav_event_office/templates/dav_event_office/home.html
@@ -0,0 +1,8 @@
+{% extends "dav_event_office/base.html" %}
+{% load bootstrap3 %}
+{% load i18n %}
+
+{% block page-container-fluid %}
+{% trans 'Touren- & Kursreferat' %}
+{% include './includes/home_tiles.html' %}
+{% endblock page-container-fluid %}
diff --git a/dav_event_office/templates/dav_event_office/includes/home_tiles.html b/dav_event_office/templates/dav_event_office/includes/home_tiles.html
new file mode 100644
index 0000000..c7f9807
--- /dev/null
+++ b/dav_event_office/templates/dav_event_office/includes/home_tiles.html
@@ -0,0 +1,38 @@
+{% load bootstrap3 %}
+{% load i18n %}
+
+
diff --git a/dav_event_office/tests/__init__.py b/dav_event_office/tests/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dav_event_office/urls.py b/dav_event_office/urls.py
new file mode 100644
index 0000000..e023335
--- /dev/null
+++ b/dav_event_office/urls.py
@@ -0,0 +1,9 @@
+from django.conf.urls import url
+
+from . import views
+
+urlpatterns = [
+ url(r'^home$', views.HomeView.as_view(), name='root'),
+ url(r'^$', views.EventListView.as_view(), name='event-list'),
+ url(r'^(?P\d+)/', views.EventDetailView.as_view(), name='event-detail'),
+]
diff --git a/dav_event_office/views.py b/dav_event_office/views.py
new file mode 100644
index 0000000..63a4612
--- /dev/null
+++ b/dav_event_office/views.py
@@ -0,0 +1,44 @@
+# -*- coding: utf-8 -*-
+from django.contrib.auth.decorators import login_required
+from django.core.exceptions import PermissionDenied
+from django.utils.decorators import method_decorator
+from django.views import generic
+
+from dav_events.models import Event
+from dav_events.roles import has_role
+
+
+class HomeView(generic.TemplateView):
+ template_name = 'dav_event_office/home.html'
+
+
+class OfficePermissionMixin(object):
+ def enforce_permission(self, request):
+ user = request.user
+ if user.is_superuser:
+ return None
+ elif has_role(user, 'manager_super'):
+ return None
+ elif has_role(user, 'event_office'):
+ return None
+ raise PermissionDenied('event_office')
+
+
+class EventListView(OfficePermissionMixin, generic.ListView):
+ model = Event
+ template_name = 'dav_event_office/event_list.html'
+
+ @method_decorator(login_required)
+ def dispatch(self, request, *args, **kwargs):
+ self.enforce_permission(request)
+ return super(EventListView, self).dispatch(request, *args, **kwargs)
+
+
+class EventDetailView(OfficePermissionMixin, generic.DetailView):
+ model = Event
+ template_name = 'dav_event_office/event_detail.html'
+
+ @method_decorator(login_required)
+ def dispatch(self, request, *args, **kwargs):
+ self.enforce_permission(request)
+ return super(EventDetailView, self).dispatch(request, *args, **kwargs)