From 8fbd71f17f0d9a6e11496b50417076e0e60dd7c3 Mon Sep 17 00:00:00 2001
From: Jan Mach <jan.mach@cesnet.cz>
Date: Mon, 24 Feb 2020 10:30:31 +0100
Subject: [PATCH] Redesigned working with response_context in AJAX and Snippet
 view mixins.

---
 lib/hawat/base.py | 65 ++++++++++++++++++++++-------------------------
 1 file changed, 31 insertions(+), 34 deletions(-)

diff --git a/lib/hawat/base.py b/lib/hawat/base.py
index be579b44a..37ce54078 100644
--- a/lib/hawat/base.py
+++ b/lib/hawat/base.py
@@ -658,10 +658,10 @@ class AJAXMixin:
             redirect = get_redirect_target(target_url, default_url, exclude_url)
         )
         return flask.jsonify(
-            self.process_response_context()
+            self.process_response_context(self.response_context)
         )
 
-    def process_response_context(self):
+    def process_response_context(self, response_context):
         """
         Perform additional mangling with the response context before generating
         the response. This method can be useful to delete some context keys, that
@@ -671,13 +671,26 @@ class AJAXMixin:
         :return: Possibly updated response context.
         :rtype: dict
         """
+        # Prevent certain response context keys to appear in final response.
+        response_context[self.KW_RESP_VIEW_TITLE] = self.get_view_title()
+        response_context[self.KW_RESP_VIEW_ICON]  = self.get_view_icon()
+
+        flashed_messages = flask.get_flashed_messages(with_categories = True)
+        if flashed_messages:
+            for category, message in flashed_messages:
+                response_context.\
+                    setdefault(self.KW_RESP_FLASH_MESSAGES, {}).\
+                    setdefault(category, []).\
+                    append(message)
+
         # Prevent certain response context keys to appear in final response.
         for key in ('search_form', 'item_form'):
             try:
-                del self.response_context[key]
+                del response_context[key]
             except KeyError:
                 pass
-        return self.response_context
+
+        return response_context
 
     def generate_response(self, view_template = None):  # pylint: disable=locally-disabled,unused-argument
         """
@@ -686,19 +699,8 @@ class AJAXMixin:
 
         :param str view_template: Override internally preconfigured page template.
         """
-        self.response_context[self.KW_RESP_VIEW_TITLE] = self.get_view_title()
-        self.response_context[self.KW_RESP_VIEW_ICON]  = self.get_view_icon()
-
-        flashed_messages = flask.get_flashed_messages(with_categories = True)
-        if flashed_messages:
-            for category, message in flashed_messages:
-                self.response_context.\
-                    setdefault(self.KW_RESP_FLASH_MESSAGES, {}).\
-                    setdefault(category, []).\
-                    append(message)
-
         return flask.jsonify(
-            self.process_response_context()
+            self.process_response_context(self.response_context)
         )
 
 
@@ -754,32 +756,29 @@ class SnippetMixin(AJAXMixin):
                 )
             )
 
-    def generate_response(self, view_template = None):  # pylint: disable=locally-disabled,unused-argument
+    def process_response_context(self, response_context):
         """
-        Generate the response appropriate for this view class, in this case JSON
-        document containing ready to use HTML snippets.
-
-        :param str view_template: Override internally preconfigured page template.
+        Reimplementation of :py:func:`hawat.base.AJAXMixin.process_response_context`.
         """
-        self.response_context[self.KW_RESP_VIEW_TITLE] = self.get_view_title()
-        self.response_context[self.KW_RESP_VIEW_ICON]  = self.get_view_icon()
-        self.response_context[self.KW_RESP_RENDER] = flask.request.args.get(
+        response_context[self.KW_RESP_VIEW_TITLE] = self.get_view_title()
+        response_context[self.KW_RESP_VIEW_ICON]  = self.get_view_icon()
+        response_context[self.KW_RESP_RENDER] = flask.request.args.get(
             'render',
             self.renders[0]
         ) or self.renders[0]
-        if self.response_context[self.KW_RESP_RENDER] not in self.renders:
+        if response_context[self.KW_RESP_RENDER] not in self.renders:
             self.abort(
                 400,
                 gettext(
                     'Invalid value %(val)s for snippet rendering parameter.',
-                    val = self.response_context[self.KW_RESP_RENDER]
+                    val = response_context[self.KW_RESP_RENDER]
                 )
             )
 
         flashed_messages = flask.get_flashed_messages(with_categories = True)
         if flashed_messages:
             for category, message in flashed_messages:
-                self.response_context.\
+                response_context.\
                     setdefault(self.KW_RESP_SNIPPETS, {}).\
                     setdefault(self.KW_RESP_FLASH_MESSAGES, {}).\
                     setdefault(category, []).\
@@ -791,9 +790,7 @@ class SnippetMixin(AJAXMixin):
                         )
                     )
 
-        return flask.jsonify(
-            self.process_response_context()
-        )
+        return response_context
 
 
 class SQLAlchemyMixin:
@@ -814,7 +811,7 @@ class SQLAlchemyMixin:
     @property
     def search_by(self):
         """
-        Return model`s attribute (column) according to which to search for the item.
+        Return model`s attribute (column) according to which to search for a single item.
         """
         return self.dbmodel.id
 
@@ -1112,7 +1109,7 @@ class BaseView(flask.views.View):
         Return title for the view, that will be displayed in the ``title`` tag of
         HTML ``head`` element and also as the content of page header in ``h2`` tag.
 
-        Default implementation returns the return value of :py:func:`mydojo.base.BaseView.get_menu_title`
+        Default implementation returns the return value of :py:func:`hawat.base.BaseView.get_menu_title`
         method by default.
 
         :param dict kwargs: Optional parameters.
@@ -1126,7 +1123,7 @@ class BaseView(flask.views.View):
         """
         Return menu entry title for the view.
 
-        Default implementation returns the return value of :py:func:`mydojo.base.BaseView.get_view_title`
+        Default implementation returns the return value of :py:func:`hawat.base.BaseView.get_view_title`
         method by default.
 
         :param dict kwargs: Optional parameters.
@@ -1140,7 +1137,7 @@ class BaseView(flask.views.View):
         """
         Return menu entry legend for the view (menu entry hover tooltip).
 
-        Default implementation returns the return value of :py:func:`mydojo.base.BaseView.get_menu_title`
+        Default implementation returns the return value of :py:func:`hawat.base.BaseView.get_menu_title`
         method by default.
 
         :param dict kwargs: Optional parameters.
-- 
GitLab