editor/finalize: add commit_msg with suggestion and various improvements
This commit is contained in:
parent
91c2f10cf2
commit
838c9d6e64
5 changed files with 76 additions and 24 deletions
|
@ -1,7 +1,7 @@
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.forms import CharField, ModelForm, ValidationError
|
from django.forms import CharField, Form, ModelForm, ValidationError
|
||||||
from django.forms.models import ModelChoiceField
|
from django.forms.models import ModelChoiceField
|
||||||
from django.forms.widgets import HiddenInput
|
from django.forms.widgets import HiddenInput
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
@ -57,3 +57,7 @@ class FeatureForm(ModelForm):
|
||||||
# generate extra fields in the number specified via extra_fields
|
# generate extra fields in the number specified via extra_fields
|
||||||
model = Feature
|
model = Feature
|
||||||
fields = ['name', 'package', 'level', 'geometry']
|
fields = ['name', 'package', 'level', 'geometry']
|
||||||
|
|
||||||
|
|
||||||
|
class CommitForm(Form):
|
||||||
|
commit_msg = CharField(label=_('Commit message'), max_length=100)
|
||||||
|
|
|
@ -395,3 +395,16 @@ if ($('#mapeditlist').length) {
|
||||||
editor.init();
|
editor.init();
|
||||||
}
|
}
|
||||||
$('form[name=redirect]').submit();
|
$('form[name=redirect]').submit();
|
||||||
|
|
||||||
|
function check_hoster_form() {
|
||||||
|
$('form[data-check-hoster]').each(function() {
|
||||||
|
$.getJSON('/api/v1/hosters/'+$(this).attr('data-check-hoster')+'/state/', function(state) {
|
||||||
|
if (state == 'checking') {
|
||||||
|
window.setTimeout(check_hoster_form, 700);
|
||||||
|
} else {
|
||||||
|
$('form[data-check-hoster]').submit();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
check_hoster_form();
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
{% extends 'editor/base.html' %}
|
|
||||||
{% block content %}
|
|
||||||
<div class="alert alert-danger" role="alert">
|
|
||||||
<h3>{{ title }}</h3>
|
|
||||||
<p>{{ description }}</p>
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
|
@ -1,4 +1,6 @@
|
||||||
{% extends 'editor/base.html' %}
|
{% extends 'editor/base.html' %}
|
||||||
|
{% load static %}
|
||||||
|
{% load bootstrap3 %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{% if hoster %}
|
{% if hoster %}
|
||||||
{% if hoster_error %}
|
{% if hoster_error %}
|
||||||
|
@ -6,11 +8,30 @@
|
||||||
<p>{{ hoster_error }}</p>
|
<p>{{ hoster_error }}</p>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if hoster_state == 'logged_in' %}
|
{% if hoster_state == 'logged_in' %}
|
||||||
<h2>Submit a pull request</h2>
|
<h2>Propose Changes</h2>
|
||||||
<p>blablabla #todo</p>
|
<p>Please provide a short helpful title for your change.</p>
|
||||||
|
<form action="{% url 'editor.finalize' %}" method="POST">
|
||||||
|
{% csrf_token %}
|
||||||
|
<input type="hidden" name="data" value="{{ data }}">
|
||||||
|
{% bootstrap_form commit_form %}
|
||||||
|
|
||||||
|
{% buttons %}
|
||||||
|
<button type="submit" class="btn btn-lg btn-primary">Create Pull Request</button><br>
|
||||||
|
<small><em>
|
||||||
|
{{ hoster.name }} – {{ hoster.base_url }}
|
||||||
|
</em></small>
|
||||||
|
{% endbuttons %}
|
||||||
|
|
||||||
{% elif hoster_state == 'checking' %}
|
{% elif hoster_state == 'checking' %}
|
||||||
|
<h2>Sign in with {{ hoster.title }}</h2>
|
||||||
|
<form action="{% url 'editor.finalize' %}" method="POST" data-check-hoster="{{ hoster.name }}">
|
||||||
|
{% csrf_token %}
|
||||||
|
<input type="hidden" name="data" value="{{ data }}">
|
||||||
|
<p><img src="{% static 'img/loader.gif' %}"></p>
|
||||||
|
<p><em>Checking authentication, please wait…</em></p>
|
||||||
|
</form>
|
||||||
|
|
||||||
{% else %}
|
{% else %}
|
||||||
{% if hoster_state == 'misssing_permissions' %}
|
{% if hoster_state == 'misssing_permissions' %}
|
||||||
<h2>Missing {{ hoster.title }} Permissions</h2>
|
<h2>Missing {{ hoster.title }} Permissions</h2>
|
||||||
|
@ -20,14 +41,14 @@
|
||||||
<h2>Sign in with {{ hoster.title }}</h2>
|
<h2>Sign in with {{ hoster.title }}</h2>
|
||||||
<p>Please sign in to continue and propose your edit.</p>
|
<p>Please sign in to continue and propose your edit.</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<form action="{% url 'editor.finalize.oauth' %}" method="POST">
|
<form action="{% url 'editor.finalize.oauth' %}" method="POST" data-task="{{ task }}">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<input type="hidden" name="data" value="{{ data }}">
|
<input type="hidden" name="data" value="{{ data }}">
|
||||||
<p>
|
<p>
|
||||||
<button type="submit" class="btn btn-lg btn-primary">Sign in with {{ hoster.title }}</button><br>
|
<button type="submit" class="btn btn-lg btn-primary">Sign in with {{ hoster.title }}</button><br>
|
||||||
<small><em>
|
<small><em>
|
||||||
{{ hoster.name }} – {{ hoster.base_url }}
|
{{ hoster.name }} – {{ hoster.base_url }}
|
||||||
</small></em>
|
</em></small>
|
||||||
</p>
|
</p>
|
||||||
</form>
|
</form>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
@ -37,6 +58,7 @@
|
||||||
<p>In order to propose your edit, please copy it and send it to the maps maintainer.</p>
|
<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>
|
<p><em>You are seeing this message because there is no hoster defined for this map package.</em></p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<h3>Your Edit</h3>
|
<h3>Your Edit</h3>
|
||||||
<p><strong>Map Package:</strong> {{ package_name }}</p>
|
<p><strong>Map Package:</strong> {{ package_name }}</p>
|
||||||
{% if file_contents %}
|
{% if file_contents %}
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.core import signing
|
from django.core import signing
|
||||||
from django.core.exceptions import PermissionDenied
|
from django.core.exceptions import PermissionDenied, SuspiciousOperation
|
||||||
from django.http.response import Http404
|
from django.http.response import Http404
|
||||||
from django.shortcuts import get_object_or_404, redirect, render
|
from django.shortcuts import get_object_or_404, redirect, render
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
from django.utils.translation import activate, get_language
|
||||||
from django.views.decorators.http import require_POST
|
from django.views.decorators.http import require_POST
|
||||||
|
|
||||||
from c3nav.editor.forms import FeatureForm
|
from c3nav.editor.forms import CommitForm, FeatureForm
|
||||||
from c3nav.editor.hosters import get_hoster_for_package, hosters
|
from c3nav.editor.hosters import get_hoster_for_package, hosters
|
||||||
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.models.package import Package
|
||||||
|
@ -30,8 +31,13 @@ def add_feature(request, feature_type):
|
||||||
feature.titles[language] = title
|
feature.titles[language] = title
|
||||||
|
|
||||||
if not settings.DIRECT_EDITING:
|
if not settings.DIRECT_EDITING:
|
||||||
|
content = json_encode(feature.tofile())
|
||||||
|
language = get_language()
|
||||||
|
title_en = feature.titles.get('en', next(iter(feature.titles.values())))
|
||||||
|
commit_msg = 'Added %s: %s' % (str(feature_type.title).lower(), title_en)
|
||||||
|
activate(language)
|
||||||
return render(request, 'editor/feature_success.html', {
|
return render(request, 'editor/feature_success.html', {
|
||||||
'data': signing.dumps((feature.package.name, feature.tofilename(), json_encode(feature.tofile())))
|
'data': signing.dumps((feature.package.name, feature.tofilename(), content, commit_msg))
|
||||||
})
|
})
|
||||||
|
|
||||||
feature.save()
|
feature.save()
|
||||||
|
@ -58,8 +64,12 @@ 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:
|
||||||
|
language = get_language()
|
||||||
|
title_en = feature.titles.get('en', next(iter(feature.titles.values())))
|
||||||
|
commit_msg = 'Deleted %s: %s' % (str(feature_type.title).lower(), title_en)
|
||||||
|
activate(language)
|
||||||
return render(request, 'editor/feature_success.html', {
|
return render(request, 'editor/feature_success.html', {
|
||||||
'data': signing.dumps((feature.package.name, feature.tofilename(), None))
|
'data': signing.dumps((feature.package.name, feature.tofilename(), None, commit_msg))
|
||||||
})
|
})
|
||||||
|
|
||||||
feature.delete()
|
feature.delete()
|
||||||
|
@ -81,8 +91,13 @@ def edit_feature(request, name):
|
||||||
feature.titles[language] = title
|
feature.titles[language] = title
|
||||||
|
|
||||||
if not settings.DIRECT_EDITING:
|
if not settings.DIRECT_EDITING:
|
||||||
|
content = json_encode(feature.tofile())
|
||||||
|
language = get_language()
|
||||||
|
title_en = feature.titles.get('en', next(iter(feature.titles.values())))
|
||||||
|
commit_msg = 'Updated %s: %s' % (str(feature_type.title).lower(), title_en)
|
||||||
|
activate(language)
|
||||||
return render(request, 'editor/feature_success.html', {
|
return render(request, 'editor/feature_success.html', {
|
||||||
'data': signing.dumps((feature.package.name, feature.tofilename(), json_encode(feature.tofile())))
|
'data': signing.dumps((feature.package.name, feature.tofilename(), content, commit_msg))
|
||||||
})
|
})
|
||||||
|
|
||||||
feature.save()
|
feature.save()
|
||||||
|
@ -102,13 +117,10 @@ def edit_feature(request, name):
|
||||||
@require_POST
|
@require_POST
|
||||||
def finalize(request):
|
def finalize(request):
|
||||||
if 'data' not in request.POST:
|
if 'data' not in request.POST:
|
||||||
return render(request, 'editor/error.html', {
|
raise SuspiciousOperation('Missing data.')
|
||||||
'title': _('Missing data.'),
|
|
||||||
'description': _('Edit data is missing.')
|
|
||||||
}, status=400)
|
|
||||||
data = request.POST['data']
|
data = request.POST['data']
|
||||||
|
|
||||||
package_name, file_path, file_contents = signing.loads(data)
|
package_name, file_path, file_contents, commit_msg = signing.loads(data)
|
||||||
|
|
||||||
package = Package.objects.filter(name=package_name).first()
|
package = Package.objects.filter(name=package_name).first()
|
||||||
hoster = None
|
hoster = None
|
||||||
|
@ -121,8 +133,16 @@ def finalize(request):
|
||||||
hoster_state = hoster.get_state(request)
|
hoster_state = hoster.get_state(request)
|
||||||
hoster_error = hoster.get_error(request) if hoster_state == 'logged_out' else None
|
hoster_error = hoster.get_error(request) if hoster_state == 'logged_out' else None
|
||||||
|
|
||||||
|
if request.method == 'POST' and 'commit_msg' in request.POST:
|
||||||
|
form = CommitForm(request.POST)
|
||||||
|
if form.is_valid() and hoster_state == 'logged_in':
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
form = CommitForm({'commit_msg': commit_msg})
|
||||||
|
|
||||||
return render(request, 'editor/finalize.html', {
|
return render(request, 'editor/finalize.html', {
|
||||||
'data': data,
|
'data': data,
|
||||||
|
'commit_form': form,
|
||||||
'package_name': package_name,
|
'package_name': package_name,
|
||||||
'hoster': hoster,
|
'hoster': hoster,
|
||||||
'hoster_state': hoster_state,
|
'hoster_state': hoster_state,
|
||||||
|
@ -146,7 +166,7 @@ def finalize_oauth_redirect(request):
|
||||||
}, status=400)
|
}, status=400)
|
||||||
data = request.POST['data']
|
data = request.POST['data']
|
||||||
|
|
||||||
package_name, file_path, file_contents = signing.loads(data)
|
package_name, file_path, file_contents, commit_msg = signing.loads(data)
|
||||||
package = Package.objects.filter(name=package_name).first()
|
package = Package.objects.filter(name=package_name).first()
|
||||||
hoster = None
|
hoster = None
|
||||||
if package is not None:
|
if package is not None:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue