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 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)

View file

@ -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();

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' %} {% 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 %}

View file

@ -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: