editor/finalize: add commit_msg with suggestion and various improvements

This commit is contained in:
Laura Klünder 2016-09-29 19:38:31 +02:00
parent 91c2f10cf2
commit 838c9d6e64
5 changed files with 76 additions and 24 deletions

View file

@ -1,7 +1,7 @@
from collections import OrderedDict
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.widgets import HiddenInput
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
model = Feature
fields = ['name', 'package', 'level', 'geometry']
class CommitForm(Form):
commit_msg = CharField(label=_('Commit message'), max_length=100)

View file

@ -395,3 +395,16 @@ if ($('#mapeditlist').length) {
editor.init();
}
$('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();

View file

@ -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 %}

View file

@ -1,4 +1,6 @@
{% extends 'editor/base.html' %}
{% load static %}
{% load bootstrap3 %}
{% block content %}
{% if hoster %}
{% if hoster_error %}
@ -6,11 +8,30 @@
<p>{{ hoster_error }}</p>
</div>
{% endif %}
{% if hoster_state == 'logged_in' %}
<h2>Submit a pull request</h2>
<p>blablabla #todo</p>
<h2>Propose Changes</h2>
<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' %}
<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 %}
{% if hoster_state == 'misssing_permissions' %}
<h2>Missing {{ hoster.title }} Permissions</h2>
@ -20,14 +41,14 @@
<h2>Sign in with {{ hoster.title }}</h2>
<p>Please sign in to continue and propose your edit.</p>
{% endif %}
<form action="{% url 'editor.finalize.oauth' %}" method="POST">
<form action="{% url 'editor.finalize.oauth' %}" method="POST" data-task="{{ task }}">
{% csrf_token %}
<input type="hidden" name="data" value="{{ data }}">
<p>
<button type="submit" class="btn btn-lg btn-primary">Sign in with {{ hoster.title }}</button><br>
<small><em>
{{ hoster.name }} {{ hoster.base_url }}
</small></em>
</em></small>
</p>
</form>
{% endif %}
@ -37,6 +58,7 @@
<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 %}

View file

@ -1,12 +1,13 @@
from django.conf import settings
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.shortcuts import get_object_or_404, redirect, render
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 c3nav.editor.forms import FeatureForm
from c3nav.editor.forms import CommitForm, FeatureForm
from c3nav.editor.hosters import get_hoster_for_package, hosters
from c3nav.mapdata.models.feature import FEATURE_TYPES, Feature
from c3nav.mapdata.models.package import Package
@ -30,8 +31,13 @@ def add_feature(request, feature_type):
feature.titles[language] = title
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', {
'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()
@ -58,8 +64,12 @@ def edit_feature(request, name):
if request.POST.get('delete') == '1':
if request.POST.get('delete_confirm') == '1':
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', {
'data': signing.dumps((feature.package.name, feature.tofilename(), None))
'data': signing.dumps((feature.package.name, feature.tofilename(), None, commit_msg))
})
feature.delete()
@ -81,8 +91,13 @@ def edit_feature(request, name):
feature.titles[language] = title
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', {
'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()
@ -102,13 +117,10 @@ def edit_feature(request, name):
@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)
raise SuspiciousOperation('Missing 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()
hoster = None
@ -121,8 +133,16 @@ def finalize(request):
hoster_state = hoster.get_state(request)
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', {
'data': data,
'commit_form': form,
'package_name': package_name,
'hoster': hoster,
'hoster_state': hoster_state,
@ -146,7 +166,7 @@ def finalize_oauth_redirect(request):
}, status=400)
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()
hoster = None
if package is not None: