--- /dev/null
+$(function() {
+ $('div[contenteditable]').on('input', function(event) {
+ if (event.originalEvent.inputType == "insertParagraph") {
+ var sel = document.getSelection();
+ var anchorNode = sel.anchorNode;
+ var prev_p = sel.anchorNode.previousSibling;
+ if (prev_p.tagName != 'P') {
+ prev_p = $(prev_p).parents('p')[0];
+ }
+ var title_match = prev_p.innerText.match(/^(h[1-6]). /);
+ if (title_match) {
+ var title = document.createElement(title_match[1]);
+ title.innerHTML = prev_p.innerHTML;
+ title.textContent = title.textContent.slice(4);
+ prev_p.replaceWith(title);
+ }
+ }
+ return true;
+ });
+ $('#save').on('click', function() {
+ var text = $('div[contenteditable]')[0].innerHTML;
+ $.post('api-save/', {text: text}).fail(function() {
+ $('#save').css('background', 'red');
+ });
+ return false;
+ });
+});
-{% load i18n %}<!DOCTYPE html>
+{% load gadjo i18n %}<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/> <!-- 🌱 -->
<title>{% block page-title %}Coin web de Frédéric Péters{% endblock %}</title>
<link rel="stylesheet" type="text/css" href="/static/css/style.css">
<link rel="alternate" type="application/atom+xml" title="Atom feed" href="/feed/atom" />
+ {% if request.user.is_staff %}
+ <script src="{% xstatic 'jquery' 'jquery.min.js' %}"></script>
+ <script src="/static/js/chloro.js"></script>
+ {% endif %}
{% block bottom-head %}
{% endblock %}
</head>
{% block body %}
<div>
<h2>{{ object.title }}</h2>
-<div>{{ object.text|safe }}</div>
+<div {% if request.user.is_staff %}contenteditable="true"{% endif %}>{{ object.text|safe }}</div>
+{% if request.user.is_staff %}<button id="save">{% trans "Save" %}</button>{% endif %}
<div class="meta">{{ object.creation_timestamp|date:"j E Y, H:i"|lower }}</div>
</div>
{% load gadjo i18n static %}
{% block bottom-head %}
-<script src="{% xstatic 'jquery' 'jquery.min.js' %}"></script>
<script src="{% static "ckeditor/ckeditor/ckeditor.js" %}"></script>
<script type="text/javascript" src="{% static "ckeditor/ckeditor-init.js" %}"></script>
{% endblock %}
r'^(?P<slug>[\w:-]+)/delete/$',
staff_member_required(views.NoteDeleteView.as_view(), login_url='login'),
),
+ url(r'^(?P<slug>[\w:-]+)/api-save/$', staff_member_required(views.NoteApiSaveView.as_view())),
url(r'^new-note/$', staff_member_required(views.NoteAddView.as_view(), login_url='login')),
url(r'^feeds/(?P<sub>[\w:-]+)/atom$', views.AtomFeed()),
url(r'^feed/atom$', views.AtomFeed()),
from django.conf import settings
from django.contrib.syndication.views import Feed
from django.core.exceptions import PermissionDenied
-from django.http import Http404
+from django.http import HttpResponse, Http404
from django.utils.feedgenerator import Atom1Feed
+from django.views import View
+from django.views.decorators.csrf import csrf_exempt
from django.views.generic import CreateView, DeleteView, DetailView, ListView, UpdateView, TemplateView
from .models import Note
fields = ['title', 'slug', 'text', 'tags', 'published']
+class NoteApiSaveView(View):
+ http_method_names = ['post']
+
+ @csrf_exempt
+ def dispatch(self, *args, **kwargs):
+ return super().dispatch(*args, **kwargs)
+
+ def post(self, request, *args, **kwargs):
+ note = Note.objects.get(slug=kwargs['slug'])
+ note.text = request.POST['text']
+ note.save()
+ return HttpResponse('ok')
+
+
class NoteAddView(CreateView):
model = Note
fields = ['title', 'slug', 'text', 'tags', 'published']