From 8ac8a1402ba27957711126bfe4c1ea3883eb024c Mon Sep 17 00:00:00 2001 From: Minigrim0 Date: Mon, 3 Oct 2022 13:33:12 +0200 Subject: [PATCH 01/14] [Add] Diff form (Trying to figure out how to limit the scope) --- wiki/forms.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/wiki/forms.py b/wiki/forms.py index 5a1ce81a..682edeb5 100644 --- a/wiki/forms.py +++ b/wiki/forms.py @@ -1,14 +1,22 @@ -from django.forms import ModelForm, Textarea - +from django import forms from .models import Article -class ArticleForm(ModelForm): +class ArticleForm(forms.ModelForm): class Meta: model = Article exclude = ['creator', 'last_modifier'] widgets = { - 'content': Textarea(attrs={'rows': 20}), - 'commit': Textarea(attrs={'rows': 3}), + 'content': forms.Textarea(attrs={'rows': 20}), + 'commit': forms.Textarea(attrs={'rows': 3}), } + + +class DiffForm(forms.Form): + base_commit = forms.ModelChoiceField(queryset=Article.history.model.objects.all(), required=True, label="Version de base") + comp_commit = forms.ModelChoiceField(queryset=Article.history.model.objects.all(), required=True, label="Version à comparer") + + # def __init__(self, *args, **kwargs): + # if 'article' in kwargs: + # article = kwargs.pop('article') From 5e45392f96cf8bfd84206bde3d9ae7ad83542ead Mon Sep 17 00:00:00 2001 From: Minigrim0 Date: Mon, 3 Oct 2022 13:33:25 +0200 Subject: [PATCH 02/14] [Add] diff view --- wiki/urls.py | 14 +++++++------- wiki/views.py | 27 ++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/wiki/urls.py b/wiki/urls.py index 6e2f6af7..2f6ac17d 100644 --- a/wiki/urls.py +++ b/wiki/urls.py @@ -1,12 +1,12 @@ from django.urls import path -from .views import ( - wiki_home, ArticleDetailView, ArticleAddView, ArticleEditView, ArticleOldDetailView) +from wiki import views urlpatterns = [ - path('', wiki_home, name='wiki_home'), - path('add', ArticleAddView.as_view(), name='add_article'), - path('edit/', ArticleEditView.as_view(), name='edit_article'), - path('', ArticleDetailView.as_view(), name='view_article'), - path('/old/', ArticleOldDetailView.as_view(), name='view_old_version') + path('', views.wiki_home, name='wiki_home'), + path('diff', views.diff_article, name='diff_article'), + path('add', views.ArticleAddView.as_view(), name='add_article'), + path('edit/', views.ArticleEditView.as_view(), name='edit_article'), + path('', views.ArticleDetailView.as_view(), name='view_article'), + path('/old/', views.ArticleOldDetailView.as_view(), name='view_old_version') ] diff --git a/wiki/views.py b/wiki/views.py index 88d46bb9..60069be9 100644 --- a/wiki/views.py +++ b/wiki/views.py @@ -6,7 +6,7 @@ from actstream import action from .models import Article -from .forms import ArticleForm +from .forms import ArticleForm, DiffForm def wiki_home(request): @@ -21,6 +21,26 @@ def wiki_home(request): }) +def diff_article(request): + """Compares two versions of an article.""" + form = DiffForm() + + if request.method == 'POST': + form_post = DiffForm(request.POST) + if form_post.is_valid(): + article = form_post.cleaned_data['article'] + old_article = form_post.cleaned_data['old_article'] + return render(request, "diff_article.html", { + "article": article, + "old_article": old_article, + "form": form, + }) + + return render(request, "diff_article.html", { + "form": form, + }) + + class ArticleAddView(LoginRequiredMixin, CreateView): form_class = ArticleForm template_name = 'add_article.html' @@ -57,6 +77,11 @@ class ArticleDetailView(DetailView): template_name = 'article_detail.html' context_object_name = 'article' + def get_context_data(self, **kwargs): + context = super(ArticleDetailView, self).get_context_data(**kwargs) + context['diff_form'] = DiffForm + + return context class ArticleOldDetailView(DetailView): model = Article.history.model From a8b003af765dd1646053f6128566228b628293c2 Mon Sep 17 00:00:00 2001 From: Minigrim0 Date: Mon, 3 Oct 2022 13:33:37 +0200 Subject: [PATCH 03/14] [Upd] Show last commit message on name --- wiki/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wiki/models.py b/wiki/models.py index e17d083e..e5844738 100644 --- a/wiki/models.py +++ b/wiki/models.py @@ -32,7 +32,7 @@ class Meta: verbose_name = "Article" def __str__(self): - return self.title + return f"{self.title} ({self.commit})" def get_absolute_url(self): return reverse('view_article', args=[self.pk]) From 94fee3d8d1cf6d2f8996d36c323396d0ee3ef922 Mon Sep 17 00:00:00 2001 From: Minigrim0 Date: Mon, 3 Oct 2022 13:33:53 +0200 Subject: [PATCH 04/14] [Add] Diff form at bottom of commit history --- wiki/templates/article_detail.html | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/wiki/templates/article_detail.html b/wiki/templates/article_detail.html index b6fb2e40..67e47554 100644 --- a/wiki/templates/article_detail.html +++ b/wiki/templates/article_detail.html @@ -78,7 +78,13 @@

{{article.title}}

{% endfor %} - {% endif %} +
+
+ {{ diff_form.as_p }} +
+ +
+ {% endif %} From 0aaee9e0b7d01d17de194b81e449e942b2c8fa2b Mon Sep 17 00:00:00 2001 From: Minigrim0 Date: Sun, 9 Oct 2022 21:58:30 +0200 Subject: [PATCH 05/14] [Fix] Added CSRF token in form --- wiki/templates/article_detail.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/wiki/templates/article_detail.html b/wiki/templates/article_detail.html index 67e47554..1e5d3a73 100644 --- a/wiki/templates/article_detail.html +++ b/wiki/templates/article_detail.html @@ -78,7 +78,8 @@

{{article.title}}

{% endfor %} -
+ + {% csrf_token %}
{{ diff_form.as_p }}
From 265c298534ece599d2523158e0f498033c2cf288 Mon Sep 17 00:00:00 2001 From: Minigrim0 Date: Sun, 9 Oct 2022 21:58:38 +0200 Subject: [PATCH 06/14] [Upd] add delta in form --- wiki/views.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/wiki/views.py b/wiki/views.py index 60069be9..d41ada38 100644 --- a/wiki/views.py +++ b/wiki/views.py @@ -28,9 +28,11 @@ def diff_article(request): if request.method == 'POST': form_post = DiffForm(request.POST) if form_post.is_valid(): - article = form_post.cleaned_data['article'] - old_article = form_post.cleaned_data['old_article'] + article = form_post.cleaned_data['base_commit'] + old_article = form_post.cleaned_data['comp_commit'] + delta = article.diff_against(old_article, included_fields=['content']) return render(request, "diff_article.html", { + "delta": delta, "article": article, "old_article": old_article, "form": form, From 6009621411f427725ae92b42bd8fdde8dca25f65 Mon Sep 17 00:00:00 2001 From: Minigrim0 Date: Sun, 9 Oct 2022 21:58:51 +0200 Subject: [PATCH 07/14] [Add] started diff template --- wiki/templates/diff_article.html | 47 ++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 wiki/templates/diff_article.html diff --git a/wiki/templates/diff_article.html b/wiki/templates/diff_article.html new file mode 100644 index 00000000..f695a156 --- /dev/null +++ b/wiki/templates/diff_article.html @@ -0,0 +1,47 @@ +{% extends "base.html" %} +{% load bootstrap4 %} +{% load static %} + +{% block title %} +Formulaire article +{% endblock %} + +{% block head %} + {{ form.media }} + + +{% endblock %} + +{% block content %} + Différences: + {% for change in delta.changes %} +

{{ change.old | safe }}

{{ change.new | safe }}

+ {% empty %} +

Aucun changement dans le contenu

+ {% endfor %} + + + + +{% endblock %} From 002f96057fa7c39ecac38c2b53f023b74aedf5a6 Mon Sep 17 00:00:00 2001 From: Minigrim0 Date: Sun, 9 Oct 2022 22:40:57 +0200 Subject: [PATCH 08/14] [Add] BeautifulSoup --- requirements.in | 1 + requirements.txt | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/requirements.in b/requirements.in index 6bbeab56..ed928e99 100644 --- a/requirements.in +++ b/requirements.in @@ -32,3 +32,4 @@ Pillow redis requests sentry-sdk +beautifulsoup4 \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 447680f1..f8343aff 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ # This file is autogenerated by pip-compile with python 3.10 # To update, run: # -# pip-compile --output-file=requirements.txt requirements.in +# pip-compile # arrow==1.2.2 # via ics @@ -17,7 +17,9 @@ attrs==21.4.0 backcall==0.2.0 # via ipython beautifulsoup4==4.11.1 - # via django-bootstrap4 + # via + # -r requirements.in + # django-bootstrap4 bleach[css]==5.0.1 # via wiki build==0.8.0 From 64ebf2baee6243faabbda5f2039ac0dd5703a544 Mon Sep 17 00:00:00 2001 From: Minigrim0 Date: Sun, 9 Oct 2022 22:41:14 +0200 Subject: [PATCH 09/14] [Upd] Use BeautifulSoup to show diffs --- wiki/templates/diff_article.html | 47 ++++++++++++-------------------- wiki/views.py | 15 ++++++++-- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/wiki/templates/diff_article.html b/wiki/templates/diff_article.html index f695a156..d33c8415 100644 --- a/wiki/templates/diff_article.html +++ b/wiki/templates/diff_article.html @@ -13,35 +13,24 @@ {% endblock %} {% block content %} - Différences: - {% for change in delta.changes %} -

{{ change.old | safe }}

{{ change.new | safe }}

- {% empty %} -

Aucun changement dans le contenu

- {% endfor %} +

Différences:

- - - + {% endblock %} diff --git a/wiki/views.py b/wiki/views.py index d41ada38..bb4b4084 100644 --- a/wiki/views.py +++ b/wiki/views.py @@ -1,9 +1,11 @@ +from difflib import HtmlDiff from django.shortcuts import render from django.views.generic.detail import DetailView from django.views.generic import CreateView, UpdateView from django.contrib.auth.mixins import LoginRequiredMixin from django.utils import timezone from actstream import action +from bs4 import BeautifulSoup from .models import Article from .forms import ArticleForm, DiffForm @@ -30,9 +32,18 @@ def diff_article(request): if form_post.is_valid(): article = form_post.cleaned_data['base_commit'] old_article = form_post.cleaned_data['comp_commit'] - delta = article.diff_against(old_article, included_fields=['content']) + + # Calculating the delta + delta = HtmlDiff().make_table( + old_article.content.split("\n"), + article.content.split("\n") + ) + # Making the table pretty + table = BeautifulSoup(delta, features="html.parser") + table.table['class'] = table.table.get('class', []) + ["table table-stripped"] + return render(request, "diff_article.html", { - "delta": delta, + "delta": table.prettify(), "article": article, "old_article": old_article, "form": form, From b85c3f8adcbb993fb7f2cc8439be323bb21f3079 Mon Sep 17 00:00:00 2001 From: Minigrim0 Date: Mon, 10 Oct 2022 09:10:32 +0200 Subject: [PATCH 10/14] [Fix] invert comparison --- wiki/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wiki/views.py b/wiki/views.py index bb4b4084..923e224a 100644 --- a/wiki/views.py +++ b/wiki/views.py @@ -35,8 +35,8 @@ def diff_article(request): # Calculating the delta delta = HtmlDiff().make_table( - old_article.content.split("\n"), - article.content.split("\n") + article.content.split("\n"), + old_article.content.split("\n") ) # Making the table pretty table = BeautifulSoup(delta, features="html.parser") From 40f438571627e208e66851d5763564f27142f1f1 Mon Sep 17 00:00:00 2001 From: Minigrim0 Date: Mon, 10 Oct 2022 09:12:48 +0200 Subject: [PATCH 11/14] [Add] Caption table + colored modifications --- wiki/templates/diff_article.html | 38 ++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/wiki/templates/diff_article.html b/wiki/templates/diff_article.html index d33c8415..788c50bf 100644 --- a/wiki/templates/diff_article.html +++ b/wiki/templates/diff_article.html @@ -10,6 +10,20 @@ {{ form.media }} + + {% endblock %} {% block content %} @@ -19,6 +33,30 @@

Différences:

{{ delta | safe }} + Légende: + + + + + + + + + + + + + + + + + + + + + +
CouleurSignification
(t)opSupprimé
(f)irst changeAjouté
(n)ext changeModifié
+
From 82df5e1eef3619dbc43a2e14510877cbb664c95b Mon Sep 17 00:00:00 2001 From: Minigrim0 Date: Mon, 10 Oct 2022 09:32:55 +0200 Subject: [PATCH 12/14] [Fix] Article inversion --- wiki/views.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/wiki/views.py b/wiki/views.py index 923e224a..31739e72 100644 --- a/wiki/views.py +++ b/wiki/views.py @@ -30,13 +30,13 @@ def diff_article(request): if request.method == 'POST': form_post = DiffForm(request.POST) if form_post.is_valid(): - article = form_post.cleaned_data['base_commit'] - old_article = form_post.cleaned_data['comp_commit'] + old_article = form_post.cleaned_data['base_commit'] + article = form_post.cleaned_data['comp_commit'] # Calculating the delta delta = HtmlDiff().make_table( - article.content.split("\n"), - old_article.content.split("\n") + old_article.content.split("\n"), + article.content.split("\n") ) # Making the table pretty table = BeautifulSoup(delta, features="html.parser") @@ -44,6 +44,7 @@ def diff_article(request): return render(request, "diff_article.html", { "delta": table.prettify(), + "initial_article": article.history_object, "article": article, "old_article": old_article, "form": form, From b19293139cd1bbd377d5adc650949646fbebc746 Mon Sep 17 00:00:00 2001 From: Minigrim0 Date: Mon, 10 Oct 2022 09:34:12 +0200 Subject: [PATCH 13/14] [Upd] Template --- wiki/templates/diff_article.html | 43 ++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/wiki/templates/diff_article.html b/wiki/templates/diff_article.html index 788c50bf..636e7c69 100644 --- a/wiki/templates/diff_article.html +++ b/wiki/templates/diff_article.html @@ -29,11 +29,37 @@ {% block content %}

Différences:

+
+
+
+

{{ old_article.commit }}

+
+
+
+

{{ article.commit }}

+
+
+
{{ delta | safe }}
- Légende: + + +

Légende:

@@ -56,19 +82,4 @@

Différences:

- - {% endblock %} From d2917661b98db49ade0be7491d259867c08e9d74 Mon Sep 17 00:00:00 2001 From: Minigrim0 Date: Mon, 17 Oct 2022 22:37:03 +0200 Subject: [PATCH 14/14] [Upd] Wrap text --- wiki/templates/diff_article.html | 4 +--- wiki/views.py | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/wiki/templates/diff_article.html b/wiki/templates/diff_article.html index 636e7c69..40d0e3e5 100644 --- a/wiki/templates/diff_article.html +++ b/wiki/templates/diff_article.html @@ -40,9 +40,7 @@

Différences:

-
- {{ delta | safe }} -
+ {{ delta | safe }}
diff --git a/wiki/views.py b/wiki/views.py index 31739e72..ebd40b3e 100644 --- a/wiki/views.py +++ b/wiki/views.py @@ -34,7 +34,7 @@ def diff_article(request): article = form_post.cleaned_data['comp_commit'] # Calculating the delta - delta = HtmlDiff().make_table( + delta = HtmlDiff(wrapcolumn=75).make_table( old_article.content.split("\n"), article.content.split("\n") )