diff --git a/src/c3nav/editor/static/editor/css/editor.css b/src/c3nav/editor/static/editor/css/editor.css
index 076235eb..cc1da825 100644
--- a/src/c3nav/editor/static/editor/css/editor.css
+++ b/src/c3nav/editor/static/editor/css/editor.css
@@ -115,7 +115,7 @@ legend {
right: 8px;
top: 8px;
}
-[data-levels], [data-sublevels], [data-changeset] {
+[data-levels], [data-sublevels], #sidebar .nav, [data-back-to-map] {
display:none;
}
form button.invisiblesubmit {
@@ -218,19 +218,6 @@ form button.invisiblesubmit {
left:-100vw;
}
- .navbar-collapse.collapse {
- display: block;
- }
- .navbar-nav>li, .navbar-header {
- float: left;
- }
- .navbar-nav.navbar-right:last-child {
- margin-right: -15px;
- }
- .navbar-right {
- float: right;
- }
-
#show_details {
display:none;
}
diff --git a/src/c3nav/editor/static/editor/js/editor.js b/src/c3nav/editor/static/editor/js/editor.js
index cd70c888..39bd4d78 100644
--- a/src/c3nav/editor/static/editor/js/editor.js
+++ b/src/c3nav/editor/static/editor/js/editor.js
@@ -89,7 +89,7 @@ editor = {
$('#sidebar').find('.content').on('click', 'a[href]', editor._sidebar_link_click)
.on('click', 'button[type=submit]', editor._sidebar_submit_btn_click)
.on('submit', 'form', editor._sidebar_submit);
- $('.changeset a').click(editor._sidebar_link_click);
+ $('nav.navbar').on('click', 'a[href]', editor._sidebar_link_click);
var location_path = editor.get_location_path();
editor._sidebar_loaded();
history.replaceState({}, '', location_path);
@@ -143,9 +143,9 @@ editor = {
return;
}
- var changeset = content.find('a[data-changeset]');
- if (changeset.length) {
- $('.changeset a').text(changeset.text()).attr('href', changeset.attr('href'));
+ var nav = content.find('.nav');
+ if (nav.length) {
+ $('#navbar-collapse').find('.nav').html(nav.html());
}
content.find('[data-toggle="tooltip"]').tooltip();
@@ -179,7 +179,7 @@ editor = {
});
} else if (content.find('[data-keep-geometry]').length) {
if (editor._last_map_path === null) $('[data-back-to-map]').remove()
- $('a[data-back-to-map]').attr('href', editor._last_map_path);
+ $('a[data-back-to-map]').attr('href', editor._last_map_path).show();
$('body').removeClass('show-map');
editor._level_control.hide();
editor._sublevel_control.hide();
diff --git a/src/c3nav/editor/templates/editor/base.html b/src/c3nav/editor/templates/editor/base.html
index d0a0e078..43d1c560 100644
--- a/src/c3nav/editor/templates/editor/base.html
+++ b/src/c3nav/editor/templates/editor/base.html
@@ -19,10 +19,18 @@
diff --git a/src/c3nav/editor/templates/editor/changeset.html b/src/c3nav/editor/templates/editor/changeset.html
index 93373b2f..31b3c3c1 100644
--- a/src/c3nav/editor/templates/editor/changeset.html
+++ b/src/c3nav/editor/templates/editor/changeset.html
@@ -4,7 +4,7 @@
{% include 'editor/fragment_levels.html' %}
-
diff --git a/src/c3nav/editor/templates/editor/fragment_nav.html b/src/c3nav/editor/templates/editor/fragment_nav.html
new file mode 100644
index 00000000..3ca4157c
--- /dev/null
+++ b/src/c3nav/editor/templates/editor/fragment_nav.html
@@ -0,0 +1,17 @@
+{% load i18n %}
+
+
diff --git a/src/c3nav/editor/templates/editor/login.html b/src/c3nav/editor/templates/editor/login.html
new file mode 100644
index 00000000..5bd938d7
--- /dev/null
+++ b/src/c3nav/editor/templates/editor/login.html
@@ -0,0 +1,14 @@
+{% load bootstrap3 %}
+{% load i18n %}
+
+{% trans 'Log in' %}
+
+« {% trans 'back to map' %}
+
+
diff --git a/src/c3nav/editor/templates/editor/map.html b/src/c3nav/editor/templates/editor/map.html
index e6186da3..dc714745 100644
--- a/src/c3nav/editor/templates/editor/map.html
+++ b/src/c3nav/editor/templates/editor/map.html
@@ -6,9 +6,7 @@
-
+{% include 'editor/fragment_nav.html' %}
{% endblock %}
{% block subheader %}
diff --git a/src/c3nav/editor/urls.py b/src/c3nav/editor/urls.py
index 6a6bc06e..e81640c1 100644
--- a/src/c3nav/editor/urls.py
+++ b/src/c3nav/editor/urls.py
@@ -1,7 +1,8 @@
from django.apps import apps
from django.conf.urls import url
-from c3nav.editor.views import changeset_detail, edit, level_detail, list_objects, main_index, space_detail
+from c3nav.editor.views import (changeset_detail, edit, level_detail, list_objects, login_view, logout_view, main_index,
+ space_detail)
def add_editor_urls(model_name, parent_model_name=None, with_list=True, explicit_edit=False):
@@ -35,6 +36,8 @@ urlpatterns = [
url(r'^levels/(?Pc?[0-9]+)/levels_on_top/create$', edit, name='editor.levels_on_top.create',
kwargs={'model': 'Level'}),
url(r'^changesets/(?P[0-9]+)/$', changeset_detail, name='editor.changesets.detail'),
+ url(r'^login$', login_view, name='editor.login'),
+ url(r'^logout$', logout_view, name='editor.logout'),
]
urlpatterns.extend(add_editor_urls('Level', with_list=False, explicit_edit=True))
urlpatterns.extend(add_editor_urls('LocationGroup'))
diff --git a/src/c3nav/editor/views.py b/src/c3nav/editor/views.py
index 74c2c252..9428c65e 100644
--- a/src/c3nav/editor/views.py
+++ b/src/c3nav/editor/views.py
@@ -3,12 +3,13 @@ from contextlib import suppress
from functools import wraps
from django.conf import settings
+from django.contrib.auth import login, logout
+from django.contrib.auth.forms import AuthenticationForm
from django.core.exceptions import FieldDoesNotExist, PermissionDenied
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse
from django.utils.formats import date_format
-from django.utils.html import escape
from django.utils.translation import ugettext_lazy as _
from django.views.decorators.cache import never_cache
@@ -27,8 +28,7 @@ def sidebar_view(func):
if request.is_ajax() or 'ajax' in request.GET:
if isinstance(response, HttpResponseRedirect):
return render(request, 'editor/redirect.html', {'target': response['location']})
- response.write('%s' % (request.changeset.get_absolute_url(),
- escape(request.changeset.count_display)))
+ response.write(render(request, 'editor/fragment_nav.html', {}).content)
return response
if isinstance(response, HttpResponseRedirect):
return response
@@ -481,3 +481,27 @@ def changeset_detail(request, pk):
return render(request, 'editor/delete.html', ctx)
return render(request, 'editor/changeset.html', ctx)
+
+
+@sidebar_view
+def login_view(request):
+ if request.method == 'POST':
+ form = AuthenticationForm(request, data=request.POST)
+ if form.is_valid():
+ login(request, form.user_cache)
+ print(request.GET.get('redirect', ''))
+ if request.GET.get('redirect', '').startswith('/editor/'):
+ return redirect(request.GET.get('redirect', ''))
+ return redirect(reverse('editor.index'))
+ else:
+ form = AuthenticationForm(request)
+
+ return render(request, 'editor/login.html', {'form': form})
+
+
+@sidebar_view
+def logout_view(request):
+ logout(request)
+ if request.GET.get('redirect', '').startswith('/editor/'):
+ return redirect(request.GET.get('redirect', ''))
+ return redirect(reverse('editor.login'))