From 838c9d6e6440bddf94dc36d09ac286d98c406209 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Thu, 29 Sep 2016 19:38:31 +0200 Subject: [PATCH] editor/finalize: add commit_msg with suggestion and various improvements --- src/c3nav/editor/forms.py | 6 ++- src/c3nav/editor/static/editor/js/editor.js | 13 ++++++ src/c3nav/editor/templates/editor/error.html | 7 ---- .../editor/templates/editor/finalize.html | 32 +++++++++++--- src/c3nav/editor/views.py | 42 ++++++++++++++----- 5 files changed, 76 insertions(+), 24 deletions(-) delete mode 100644 src/c3nav/editor/templates/editor/error.html diff --git a/src/c3nav/editor/forms.py b/src/c3nav/editor/forms.py index b0ac50d1..3ddfa5ed 100644 --- a/src/c3nav/editor/forms.py +++ b/src/c3nav/editor/forms.py @@ -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) diff --git a/src/c3nav/editor/static/editor/js/editor.js b/src/c3nav/editor/static/editor/js/editor.js index 1b4ce4b5..b933b24b 100644 --- a/src/c3nav/editor/static/editor/js/editor.js +++ b/src/c3nav/editor/static/editor/js/editor.js @@ -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(); diff --git a/src/c3nav/editor/templates/editor/error.html b/src/c3nav/editor/templates/editor/error.html deleted file mode 100644 index a8d52cdd..00000000 --- a/src/c3nav/editor/templates/editor/error.html +++ /dev/null @@ -1,7 +0,0 @@ -{% extends 'editor/base.html' %} -{% block content %} - -{% endblock %} diff --git a/src/c3nav/editor/templates/editor/finalize.html b/src/c3nav/editor/templates/editor/finalize.html index 4f55a2fd..e149d5c3 100644 --- a/src/c3nav/editor/templates/editor/finalize.html +++ b/src/c3nav/editor/templates/editor/finalize.html @@ -1,4 +1,6 @@ {% extends 'editor/base.html' %} +{% load static %} +{% load bootstrap3 %} {% block content %} {% if hoster %} {% if hoster_error %} @@ -6,11 +8,30 @@

{{ hoster_error }}

{% endif %} - {% if hoster_state == 'logged_in' %} -

Submit a pull request

-

blablabla #todo

+

Propose Changes

+

Please provide a short helpful title for your change.

+
+ {% csrf_token %} + + {% bootstrap_form commit_form %} + + {% buttons %} +
+ + {{ hoster.name }} – {{ hoster.base_url }} + + {% endbuttons %} + {% elif hoster_state == 'checking' %} +

Sign in with {{ hoster.title }}

+ + {% csrf_token %} + +

+

Checking authentication, please wait…

+
+ {% else %} {% if hoster_state == 'misssing_permissions' %}

Missing {{ hoster.title }} Permissions

@@ -20,14 +41,14 @@

Sign in with {{ hoster.title }}

Please sign in to continue and propose your edit.

{% endif %} -
+ {% csrf_token %}


{{ hoster.name }} – {{ hoster.base_url }} - +

{% endif %} @@ -37,6 +58,7 @@

In order to propose your edit, please copy it and send it to the maps maintainer.

You are seeing this message because there is no hoster defined for this map package.

{% endif %} +

Your Edit

Map Package: {{ package_name }}

{% if file_contents %} diff --git a/src/c3nav/editor/views.py b/src/c3nav/editor/views.py index 0d7a1a85..ecaf9a21 100644 --- a/src/c3nav/editor/views.py +++ b/src/c3nav/editor/views.py @@ -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: