redirect to /editor/finalize and show edit and signin button
This commit is contained in:
parent
ade73d19a2
commit
66c459ae17
10 changed files with 112 additions and 41 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -1,3 +1,9 @@
|
||||||
|
body {
|
||||||
|
font-size:16px;
|
||||||
|
}
|
||||||
|
.btn-lg {
|
||||||
|
font-size:18px;
|
||||||
|
}
|
||||||
#map {
|
#map {
|
||||||
position:absolute;
|
position:absolute;
|
||||||
top:54px;
|
top:54px;
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>
|
||||||
|
|
||||||
|
|
7
src/c3nav/editor/templates/editor/error.html
Normal file
7
src/c3nav/editor/templates/editor/error.html
Normal 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 %}
|
|
@ -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 %}
|
27
src/c3nav/editor/templates/editor/finalize.html
Normal file
27
src/c3nav/editor/templates/editor/finalize.html
Normal 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 %}
|
|
@ -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')
|
||||||
]
|
]
|
||||||
|
|
|
@ -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
|
||||||
|
})
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue