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 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)
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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' %}
|
||||
{% 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 %}
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue