From b250825a2123e75fded98ba622aab3236dc1ab2f Mon Sep 17 00:00:00 2001 From: OndraRehounek <ondra.rehounek@seznam.cz> Date: Fri, 18 Mar 2022 10:48:29 +0100 Subject: [PATCH] messages refactor --- district/forms.py | 36 +++++++++--------- district/jekyll_import.py | 79 ++++++++++++++++++++++++--------------- district/wagtail_hooks.py | 9 +++-- 3 files changed, 71 insertions(+), 53 deletions(-) diff --git a/district/forms.py b/district/forms.py index b5da4b38..579e97e8 100644 --- a/district/forms.py +++ b/district/forms.py @@ -1,4 +1,5 @@ from django import forms +from django.contrib.messages import ERROR, WARNING from wagtail.admin.forms import WagtailAdminPageForm from wagtail.core.models.collections import Collection @@ -63,29 +64,26 @@ class JekyllImportForm(WagtailAdminPageForm): return cleaned_data if cleaned_data.get("dry_run"): - error_list = perform_import( - article_parent_page=self.instance, - collection=self.cleaned_data["collection"], - url=self.cleaned_data["jekyll_repo_url"], - dry_run=True, - use_git=self.cleaned_data["use_git"], - ) - # self.instance.import_error_list = error_list - - for error in error_list: - self.add_error("jekyll_repo_url", error) + import_message_list = self.handle_import() + for message in import_message_list: + if message["level"] in (WARNING, ERROR): + self.add_error("jekyll_repo_url", message["text"]) return cleaned_data + def handle_import(self): + import_message_list = perform_import( + article_parent_page=self.instance, + collection=self.cleaned_data["collection"], + url=self.cleaned_data["jekyll_repo_url"], + dry_run=self.cleaned_data["dry_run"], + use_git=self.cleaned_data["use_git"], + ) + self.instance.import_message_list = import_message_list + return import_message_list + def save(self, commit=True): if self.cleaned_data.get("do_import") and not self.cleaned_data["dry_run"]: - error_list = perform_import( - article_parent_page=self.instance, - collection=self.cleaned_data["collection"], - url=self.cleaned_data["jekyll_repo_url"], - dry_run=False, - use_git=self.cleaned_data["use_git"], - ) - self.instance.import_error_list = error_list + self.handle_import() return super().save(commit=commit) diff --git a/district/jekyll_import.py b/district/jekyll_import.py index f3697003..afc4e462 100644 --- a/district/jekyll_import.py +++ b/district/jekyll_import.py @@ -11,6 +11,7 @@ from typing import List import markdown.serializers import yaml +from django.contrib.messages import ERROR, INFO, SUCCESS, WARNING from django.core.files.images import ImageFile from django.utils.dateparse import parse_date from markdown import Markdown @@ -22,6 +23,8 @@ from wagtail.images.models import Image # Wagtail to portrebuje https://docs.wagtail.io/en/stable/extending/rich_text_internals.html#data-format markdown.serializers.HTML_EMPTY.add("embed") +message_list = [] + # Plain format pro perex def unmark_element(element, stream=None): @@ -93,13 +96,11 @@ def import_post(path, file_path, parent, title_suffix, dry_run): if DistrictArticlePage.objects.filter(title=meta["title"]).exists(): for article in DistrictArticlePage.objects.filter(title=meta["title"]): if article.date == parse_date(meta["date"].split()[0]): - warning = "Article already imported: %s" % article - stdout.write(warning) - - if dry_run: - return article, warning + msg = "Článek již existuje: %s" % article + stdout.write(msg) + message_list.append({"level": INFO, "text": msg}) - return article, "" + return article, False article = DistrictArticlePage() @@ -125,18 +126,24 @@ def import_post(path, file_path, parent, title_suffix, dry_run): article.image = get_or_create_image(path, meta["image"], collection=collection) if dry_run: - return article, "" - else: - try: - parent.add_child(instance=article) - stdout.write("Creating article: %s" % article) - rev = article.save_revision() - if meta["published"]: - rev.publish() - except Exception as e: - return article, "Nelze uložit článek {}: {}".format(article.title, str(e)) + return article, True + + try: + parent.add_child(instance=article) + stdout.write("Creating article: %s" % article) + rev = article.save_revision() + if meta["published"]: + rev.publish() + except Exception as e: + message_list.append( + { + "level": WARNING if dry_run else ERROR, + "text": "Nelze uložit článek {}: {}".format(article.title, str(e)), + } + ) + return article, False - return article, "" + return article, True def get_collection(): @@ -213,9 +220,13 @@ def download_repo_as_zip(url: str) -> str: def perform_import( article_parent_page, collection, url: str, dry_run: bool, use_git: bool -) -> "List[str]": - - error_list = [] +) -> "List[dict]": + """ + Přijímá parent page pro články, kolekci pro obrázky, url pro stažení (zip nebo git + repo, boolean jestli jde o testovací běh a boolean, zda použít git (anebo zip)). + Vrací list dict pro requests messages (klíče level, text). + """ + success_counter = 0 params["kolekce"] = collection site = article_parent_page.get_site() @@ -237,15 +248,15 @@ def perform_import( ext = match.group(5) if ext == "md": - article, error = import_post( + article, success = import_post( path, fname, article_parent_page, title_suffix, dry_run ) - if error: - error_list.append(error) + if not success: continue if dry_run: + success_counter += 1 continue Redirect.objects.get_or_create( @@ -254,15 +265,23 @@ def perform_import( % (articlepath, y, m.zfill(2), d.zfill(2), slug), defaults={"is_permanent": True, "redirect_page": article}, ) + + success_counter += 1 else: - error = "ERROR: This extension is not implemented: %s" % ext - error_list.append(error) - stdout.write(error) + msg = "ERROR: Nepodporovaná přípona souboru: %s" % ext + message_list.append({"level": ERROR, "text": msg}) + stdout.write(msg) else: - warning = "WARNING: Skipping: %s" % fn - stdout.write(warning) + msg = "Skipped: %s" % fn + stdout.write(msg) if dry_run: - error_list.append(warning) + message_list.append({"level": WARNING, "text": msg}) + + if success_counter: + base_msg = "Lze importovat" if dry_run else "Úspěšně naimportováno" + message_list.append( + {"level": SUCCESS, "text": "{} {} článků".format(base_msg, success_counter)} + ) - return error_list + return message_list diff --git a/district/wagtail_hooks.py b/district/wagtail_hooks.py index ed88031a..896696bc 100644 --- a/district/wagtail_hooks.py +++ b/district/wagtail_hooks.py @@ -1,7 +1,8 @@ +from django.contrib.messages import ERROR, SUCCESS, WARNING, add_message from wagtail.admin import messages from wagtail.core import hooks -from .models import DistrictHomePage +from .models import DistrictArticlesPage @hooks.register("after_edit_page") @@ -9,9 +10,9 @@ from .models import DistrictHomePage def handle_page_import(request, page): # def after_create_page(request, page): """Block awesome page deletion and show a message.""" - if request.method == "POST" and page.specific_class in [DistrictHomePage]: - if getattr(page, "import_messages", None): - messages.warning(request, str(page.import_error_list)) + if request.method == "POST" and page.specific_class in [DistrictArticlesPage]: + for message in getattr(page, "import_message_list", []): + add_message(request, message["level"], message["text"]) # import re -- GitLab