redirect to /editor/finalize and show edit and signin button

This commit is contained in:
Laura Klünder 2016-09-26 16:44:17 +02:00
parent ade73d19a2
commit 66c459ae17
10 changed files with 112 additions and 41 deletions

View file

@ -2,6 +2,8 @@ from .base import Hoster
class GithubHoster(Hoster): class GithubHoster(Hoster):
title = 'GitHub'
def __init__(self, app_id, app_secret, **kwargs): def __init__(self, app_id, app_secret, **kwargs):
super().__init__(**kwargs) super().__init__(**kwargs)
self._app_id = app_id self._app_id = app_id

View file

@ -2,6 +2,8 @@ from .base import Hoster
class GitlabHoster(Hoster): class GitlabHoster(Hoster):
title = 'Gitlab'
def __init__(self, app_id, app_secret, **kwargs): def __init__(self, app_id, app_secret, **kwargs):
super().__init__(**kwargs) super().__init__(**kwargs)
self._app_id = app_id self._app_id = app_id

View file

@ -1,3 +1,9 @@
body {
font-size:16px;
}
.btn-lg {
font-size:18px;
}
#map { #map {
position:absolute; position:absolute;
top:54px; top:54px;

View file

@ -359,6 +359,7 @@ editor = {
}); });
}, },
submit_editing: function(e) { submit_editing: function(e) {
if ($(this).attr('name') == 'redirect') return;
e.preventDefault(); e.preventDefault();
var data = $(this).serialize(); var data = $(this).serialize();
var btn = $(this).data('btn'); var btn = $(this).data('btn');
@ -374,6 +375,7 @@ editor = {
if ($('<div>').append(content).find('form').length > 0) { if ($('<div>').append(content).find('form').length > 0) {
$('#mapeditdetail').html(content); $('#mapeditdetail').html(content);
$('#mapeditcontrols').addClass('detail'); $('#mapeditcontrols').addClass('detail');
$('#mapeditdetail').find('form[name=redirect]').submit();
if ($('#id_geometry').length) { if ($('#id_geometry').length) {
editor._editing.enableEdit(); editor._editing.enableEdit();
} }

View file

@ -19,25 +19,8 @@
<nav class="navbar navbar-default"> <nav class="navbar 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" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">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' %}">c3nav map editor</a> <a class="navbar-brand" href="{% url 'editor.index' %}">c3nav map editor</a>
</div> </div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="#">Map</a></li>
<li><a href="#">Packages</a></li>
<li><a href="#">Levels</a></li>
<li><a href="#">Sources</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li><a href="#">Commit</a></li>
</ul>
</div>
</div> </div>
</nav> </nav>

View file

@ -0,0 +1,7 @@
{% extends 'editor/base.html' %}
{% block content %}
<div class="alert alert-danger" role="alert">
<h3>{{ title }}</h3>
<p>{{ description }}</p>
</div>
{% endblock %}

View file

@ -0,0 +1,7 @@
{% if data %}
<form action="{% url 'editor.finalize' %}" method="POST" name="redirect">
{% csrf_token %}
<input type="hidden" name="data" value="{{ data }}">
<button type="submit" class="btn btn-default disabled">Redirecting…</button>
</form>
{% endif %}

View file

@ -0,0 +1,27 @@
{% extends 'editor/base.html' %}
{% block content %}
{% if hoster %}
<h2>Sign in with {{ hoster.title }}</h2>
<p>Please sign in to continue and propose your edit.</p>
<p>
<a class="btn btn-lg btn-primary">Sign in with {{ hoster.title }}</a><br>
<small><em>
{{ hoster.name }} {{ hoster.base_url }}
</small></em>
</p>
<p></p>
<p>Alternatively, you can copy your edit below and send it to the maps maintainer.</p>
{% else %}
<h2>Copy your edit</h2>
<p>In order to propose your edit, please copy it and send it to the maps maintainer.</p>
<p><em>You are seeing this message because there is no hoster defined for this map package.</em></p>
{% endif %}
<h3>Your Edit</h3>
<p><strong>Map Package:</strong> {{ package_name }}</p>
{% if file_contents %}
<p><strong>New content for file:</strong> <code>{{ file_path }}</code></p>
<pre>{{ file_contents }}</pre>
{% else %}
<p><strong>Delete file:</strong> <code>{{ file_path }}</code></p>
{% endif %}
{% endblock %}

View file

@ -1,10 +1,11 @@
from django.conf.urls import url from django.conf.urls import url
from django.views.generic import TemplateView from django.views.generic import TemplateView
from c3nav.editor.views import add_feature, edit_feature from c3nav.editor.views import add_feature, edit_feature, finalize
urlpatterns = [ urlpatterns = [
url(r'^$', TemplateView.as_view(template_name='editor/map.html'), name='editor.index'), url(r'^$', TemplateView.as_view(template_name='editor/map.html'), name='editor.index'),
url(r'^features/(?P<feature_type>[^/]+)/add/$', add_feature, name='editor.feature.add'), url(r'^features/(?P<feature_type>[^/]+)/add/$', add_feature, name='editor.feature.add'),
url(r'^features/edit/(?P<name>[^/]+)/$', edit_feature, name='editor.feature.edit') url(r'^features/edit/(?P<name>[^/]+)/$', edit_feature, name='editor.feature.edit'),
url(r'^finalize/$', finalize, name='editor.finalize')
] ]

View file

@ -1,11 +1,16 @@
from django.conf import settings from django.conf import settings
from django.core import signing
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from django.db import transaction
from django.http.response import Http404 from django.http.response import Http404
from django.shortcuts import get_object_or_404, render from django.shortcuts import get_object_or_404, render
from django.utils.translation import ugettext_lazy as _
from django.views.decorators.http import require_POST
from c3nav.editor.forms import FeatureForm from c3nav.editor.forms import FeatureForm
from c3nav.editor.hosters import get_hoster_for_package
from c3nav.mapdata.models.feature import FEATURE_TYPES, Feature from c3nav.mapdata.models.feature import FEATURE_TYPES, Feature
from c3nav.mapdata.models.package import Package
from c3nav.mapdata.packageio.write import json_encode
from c3nav.mapdata.permissions import can_access_package from c3nav.mapdata.permissions import can_access_package
@ -17,17 +22,19 @@ def add_feature(request, feature_type):
if request.method == 'POST': if request.method == 'POST':
form = FeatureForm(request.POST, feature_type=feature_type) form = FeatureForm(request.POST, feature_type=feature_type)
if form.is_valid(): if form.is_valid():
if not settings.DIRECT_EDITING: feature = form.instance
return render(request, 'editor/feature_success.html', {}) feature.feature_type = feature_type.name
feature.titles = {}
for language, title in form.titles.items():
if title:
feature.titles[language] = title
with transaction.atomic(): if not settings.DIRECT_EDITING:
feature = form.instance return render(request, 'editor/feature_success.html', {
feature.feature_type = feature_type.name 'data': signing.dumps((feature.package.name, feature.tofilename(), json_encode(feature.tofile())))
feature.titles = {} })
for language, title in form.titles.items():
if title: feature.save()
feature.titles[language] = title
feature.save()
return render(request, 'editor/feature_success.html', {}) return render(request, 'editor/feature_success.html', {})
else: else:
@ -51,7 +58,9 @@ def edit_feature(request, name):
if request.POST.get('delete') == '1': if request.POST.get('delete') == '1':
if request.POST.get('delete_confirm') == '1': if request.POST.get('delete_confirm') == '1':
if not settings.DIRECT_EDITING: if not settings.DIRECT_EDITING:
return render(request, 'editor/feature_success.html', {}) return render(request, 'editor/feature_success.html', {
'data': signing.dumps((feature.package.name, feature.tofilename(), None))
})
feature.delete() feature.delete()
return render(request, 'editor/feature_success.html', {}) return render(request, 'editor/feature_success.html', {})
@ -64,17 +73,19 @@ def edit_feature(request, name):
form = FeatureForm(instance=feature, data=request.POST, feature_type=feature_type) form = FeatureForm(instance=feature, data=request.POST, feature_type=feature_type)
if form.is_valid(): if form.is_valid():
if not settings.DIRECT_EDITING: feature = form.instance
return render(request, 'editor/feature_success.html', {}) feature.feature_type = feature_type.name
feature.titles = {}
for language, title in form.titles.items():
if title:
feature.titles[language] = title
with transaction.atomic(): if not settings.DIRECT_EDITING:
feature = form.instance return render(request, 'editor/feature_success.html', {
feature.feature_type = feature_type.name 'data': signing.dumps((feature.package.name, feature.tofilename(), json_encode(feature.tofile())))
feature.titles = {} })
for language, title in form.titles.items():
if title: feature.save()
feature.titles[language] = title
feature.save()
return render(request, 'editor/feature_success.html', {}) return render(request, 'editor/feature_success.html', {})
else: else:
@ -86,3 +97,26 @@ def edit_feature(request, name):
'path': request.path, 'path': request.path,
'new': False 'new': False
}) })
@require_POST
def finalize(request):
if 'data' not in request.POST:
return render(request, 'editor/error.html', {
'title': _('Missing data.'),
'description': _('Edit data is missing.')
}, status=400)
package_name, file_path, file_contents = signing.loads(request.POST['data'])
package = Package.objects.filter(name=package_name).first()
hoster = None
if package is not None:
hoster = get_hoster_for_package(package)
return render(request, 'editor/finalize.html', {
'package_name': package_name,
'hoster': hoster,
'file_path': file_path,
'file_contents': file_contents
})