add login to editor

This commit is contained in:
Laura Klünder 2017-06-18 20:43:20 +02:00
parent 0f3fea804a
commit b014da6a9b
9 changed files with 85 additions and 30 deletions

View file

@ -115,7 +115,7 @@ legend {
right: 8px; right: 8px;
top: 8px; top: 8px;
} }
[data-levels], [data-sublevels], [data-changeset] { [data-levels], [data-sublevels], #sidebar .nav, [data-back-to-map] {
display:none; display:none;
} }
form button.invisiblesubmit { form button.invisiblesubmit {
@ -218,19 +218,6 @@ form button.invisiblesubmit {
left:-100vw; 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 { #show_details {
display:none; display:none;
} }

View file

@ -89,7 +89,7 @@ editor = {
$('#sidebar').find('.content').on('click', 'a[href]', editor._sidebar_link_click) $('#sidebar').find('.content').on('click', 'a[href]', editor._sidebar_link_click)
.on('click', 'button[type=submit]', editor._sidebar_submit_btn_click) .on('click', 'button[type=submit]', editor._sidebar_submit_btn_click)
.on('submit', 'form', editor._sidebar_submit); .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(); var location_path = editor.get_location_path();
editor._sidebar_loaded(); editor._sidebar_loaded();
history.replaceState({}, '', location_path); history.replaceState({}, '', location_path);
@ -143,9 +143,9 @@ editor = {
return; return;
} }
var changeset = content.find('a[data-changeset]'); var nav = content.find('.nav');
if (changeset.length) { if (nav.length) {
$('.changeset a').text(changeset.text()).attr('href', changeset.attr('href')); $('#navbar-collapse').find('.nav').html(nav.html());
} }
content.find('[data-toggle="tooltip"]').tooltip(); content.find('[data-toggle="tooltip"]').tooltip();
@ -179,7 +179,7 @@ editor = {
}); });
} else if (content.find('[data-keep-geometry]').length) { } else if (content.find('[data-keep-geometry]').length) {
if (editor._last_map_path === null) $('[data-back-to-map]').remove() 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'); $('body').removeClass('show-map');
editor._level_control.hide(); editor._level_control.hide();
editor._sublevel_control.hide(); editor._sublevel_control.hide();

View file

@ -19,10 +19,18 @@
<nav class="navbar navbar-static-top navbar-default"> <nav class="navbar navbar-static-top navbar-default">
<div class="container"> <div class="container">
<div class="navbar-header"> <div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar-collapse" aria-expanded="false">
<span class="sr-only">{% trans 'Toggle navigation' %}</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="{% url 'editor.index' %}">{% trans 'c3nav map editor' %}</a> <a class="navbar-brand" href="{% url 'editor.index' %}">{% trans 'c3nav map editor' %}</a>
</div> </div>
{% block addnav %} <div class="collapse navbar-collapse" id="navbar-collapse">
{% endblock %} {% block addnav %}
{% endblock %}
</div>
</div> </div>
</nav> </nav>

View file

@ -4,7 +4,7 @@
{% include 'editor/fragment_levels.html' %} {% include 'editor/fragment_levels.html' %}
<form method="post" data-keep-geometry> <form method="post" action="{{ request.path }}" data-keep-geometry>
{% csrf_token %} {% csrf_token %}
<h3>{{ changeset.title }}</h3> <h3>{{ changeset.title }}</h3>
@ -40,6 +40,10 @@
{% endfor %} {% endfor %}
{% buttons %} {% buttons %}
<button type="submit" class="btn btn-danger btn-sm" name="delete" value="1">{% trans 'Delete' %}</button> <button type="submit" class="btn btn-danger" name="delete" value="1">{% trans 'Delete' %}</button>
<div class="pull-right">
<a type="submit" class="btn btn-default">{% trans 'Edit' %}</a>
<a type="submit" class="btn btn-primary">{% trans 'Login' %}</a>
</div>
{% endbuttons %} {% endbuttons %}
</form> </form>

View file

@ -0,0 +1,17 @@
{% load i18n %}
<ul class="nav navbar-nav navbar-right">
<li><a href="{{ request.changeset.get_absolute_url }}">{{ request.changeset.count_display }}</a></li>
{% if request.user.is_authenticated %}
<li class="logged_in_user">
<a>{{ request.user.username }}</a>
</li>
{% endif %}
<li class="login_logout">
{% if request.user.is_authenticated %}
<a href="{% url 'editor.logout' %}?redirect={{ request.path }}">{% trans 'Log out' %}</a>
{% else %}
<a href="{% url 'editor.login' %}?redirect={{ request.path }}">{% trans 'Log in' %}</a>
{% endif %}
</li>
</ul>

View file

@ -0,0 +1,14 @@
{% load bootstrap3 %}
{% load i18n %}
<h3>{% trans 'Log in' %}</h3>
<p><a data-back-to-map>« {% trans 'back to map' %}</a></p>
<form method="post" action="{{ request.path_info }}?{{ request.GET.urlencode }}" data-keep-geometry>
{% csrf_token %}
{% bootstrap_form form %}
<div class="form-group">
<button type="submit" class="btn btn-primary btn-block">{% trans 'Log in' %}</button>
</div>
</form>

View file

@ -6,9 +6,7 @@
<noscript> <noscript>
<div id="noscript">{% trans 'Without Javascript' %}</div> <div id="noscript">{% trans 'Without Javascript' %}</div>
</noscript> </noscript>
<ul class="nav navbar-nav navbar-right"> {% include 'editor/fragment_nav.html' %}
<li class="changeset"><a href="{{ request.changeset.get_absolute_url }}">{{ request.changeset.count_display }}</a></li>
</ul>
{% endblock %} {% endblock %}
{% block subheader %} {% block subheader %}

View file

@ -1,7 +1,8 @@
from django.apps import apps from django.apps import apps
from django.conf.urls import url 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): def add_editor_urls(model_name, parent_model_name=None, with_list=True, explicit_edit=False):
@ -35,6 +36,8 @@ urlpatterns = [
url(r'^levels/(?P<on_top_of>c?[0-9]+)/levels_on_top/create$', edit, name='editor.levels_on_top.create', url(r'^levels/(?P<on_top_of>c?[0-9]+)/levels_on_top/create$', edit, name='editor.levels_on_top.create',
kwargs={'model': 'Level'}), kwargs={'model': 'Level'}),
url(r'^changesets/(?P<pk>[0-9]+)/$', changeset_detail, name='editor.changesets.detail'), url(r'^changesets/(?P<pk>[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('Level', with_list=False, explicit_edit=True))
urlpatterns.extend(add_editor_urls('LocationGroup')) urlpatterns.extend(add_editor_urls('LocationGroup'))

View file

@ -3,12 +3,13 @@ from contextlib import suppress
from functools import wraps from functools import wraps
from django.conf import settings 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.core.exceptions import FieldDoesNotExist, PermissionDenied
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404, redirect, render from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse from django.urls import reverse
from django.utils.formats import date_format from django.utils.formats import date_format
from django.utils.html import escape
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.views.decorators.cache import never_cache 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 request.is_ajax() or 'ajax' in request.GET:
if isinstance(response, HttpResponseRedirect): if isinstance(response, HttpResponseRedirect):
return render(request, 'editor/redirect.html', {'target': response['location']}) return render(request, 'editor/redirect.html', {'target': response['location']})
response.write('<a data-changeset href="%s">%s</a>' % (request.changeset.get_absolute_url(), response.write(render(request, 'editor/fragment_nav.html', {}).content)
escape(request.changeset.count_display)))
return response return response
if isinstance(response, HttpResponseRedirect): if isinstance(response, HttpResponseRedirect):
return response return response
@ -481,3 +481,27 @@ def changeset_detail(request, pk):
return render(request, 'editor/delete.html', ctx) return render(request, 'editor/delete.html', ctx)
return render(request, 'editor/changeset.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'))