From 8405c2b8135d8cbc428000b7b3f8c573e07740e3 Mon Sep 17 00:00:00 2001
From: UlrichB22 <97119703+UlrichB22@users.noreply.github.com>
Date: Mon, 21 Oct 2024 11:14:38 +0200
Subject: [PATCH] Performance: add aliases to trail and remove exists check
---
src/moin/_tests/test_user.py | 4 ++--
src/moin/apps/frontend/views.py | 4 ++--
src/moin/templates/utils.html | 18 +++++++++---------
src/moin/themes/__init__.py | 20 ++++----------------
src/moin/themes/_tests/test_navi_bar.py | 12 ++++++------
src/moin/user.py | 24 ++++++++++++++++++------
6 files changed, 41 insertions(+), 41 deletions(-)
diff --git a/src/moin/_tests/test_user.py b/src/moin/_tests/test_user.py
index a35f55c59..854ea3d6c 100644
--- a/src/moin/_tests/test_user.py
+++ b/src/moin/_tests/test_user.py
@@ -217,10 +217,10 @@ def test_trail(self):
assert result == expected
# item name added to trail
- theUser.add_trail("item_added")
+ theUser.add_trail("item_added", [])
theUser = user.User(name=name, password=password)
result = theUser.get_trail()
- expected = ["MoinTest/item_added"]
+ expected = [("MoinTest/item_added", [])]
assert result == expected
# Sessions -------------------------------------------------------
diff --git a/src/moin/apps/frontend/views.py b/src/moin/apps/frontend/views.py
index 7b8b817f4..bdebf23ff 100644
--- a/src/moin/apps/frontend/views.py
+++ b/src/moin/apps/frontend/views.py
@@ -531,7 +531,7 @@ def wrapper(item_name, rev):
if abort404 and isinstance(item, NonExistent):
abort(404, item_name)
if add_trail:
- flaskg.user.add_trail(item_name)
+ flaskg.user.add_trail(item_name, aliases=item.meta.revision.fqnames)
return wrapped(item)
return wrapper
@@ -589,7 +589,7 @@ def show_item(item_name, rev):
try:
item = Item.create(item_name, rev_id=rev)
if item.itemtype != ITEMTYPE_NONEXISTENT:
- flaskg.user.add_trail(item_name)
+ flaskg.user.add_trail(item_name, aliases=item.meta.revision.fqnames)
item_is_deleted = flash_if_item_deleted(item_name, rev, item)
item_may = get_item_permissions(fqname, item)
result = item.do_show(rev, item_is_deleted=item_is_deleted, item_may=item_may)
diff --git a/src/moin/templates/utils.html b/src/moin/templates/utils.html
index 28e854a62..24dd94eb3 100644
--- a/src/moin/templates/utils.html
+++ b/src/moin/templates/utils.html
@@ -233,13 +233,13 @@
{%- endif %}
{%- endmacro -%}
-{% macro page_trail_link(wiki_name, fqname, exists) %}
+{% macro page_trail_link(wiki_name, fqname) %}
{%- if wiki_name -%}
{{ fqname|shorten_fqname }}
{%- else -%}
-
+
{{ fqname|shorten_fqname }}
{%- endif %}
@@ -257,30 +257,30 @@
{{ _('Page Trail') }}
{%- set trail_items = breadcrumbs() %}
{%- if trail_items %}
- {%- for wiki_name, fqname, item_href, exists, err in trail_items %}
+ {%- for wiki_name, fqname, item_href, aliases, err in trail_items %}
{%- if not loop.last %}
- {{ page_trail_link(wiki_name, fqname, exists) }}
- {{ alias_list(theme_supp.get_fqnames(fqname)) }}
+ {{ page_trail_link(wiki_name, fqname) }}
+ {{ alias_list(aliases) }}
{%- endif %}
{%- if loop.last %}
- {%- for segment_name, segment_path, exists in theme_supp.location_breadcrumbs(fqname) -%}
+ {%- for segment_name, segment_path in theme_supp.location_breadcrumbs(fqname) -%}
{%- if not loop.last %}
-
+
{{ segment_name|shorten_fqname }}
{%- else %}
-
+
{{ segment_name|shorten_fqname }}
{%- endif %}
{%- endfor %}
- {{ alias_list(theme_supp.get_fqnames(fqname)) }}
+ {{ alias_list(aliases) }}
{%- if title_name %}
diff --git a/src/moin/themes/__init__.py b/src/moin/themes/__init__.py
index 91cb7d0d7..574f1cbba 100644
--- a/src/moin/themes/__init__.py
+++ b/src/moin/themes/__init__.py
@@ -332,14 +332,13 @@ def location_breadcrumbs(self, fqname):
namespace as a prefix.
:rtype: list
- :returns: location breadcrumbs items in tuple (segment_name, fq_name, exists)
+ :returns: location breadcrumbs items in tuple (segment_name, fq_name)
"""
breadcrumbs = []
current_item = ""
if not isinstance(fqname, CompositeName):
fqname = split_fqname(fqname)
if fqname.field != NAME_EXACT:
- # flaskg.unprotected_storage.get_item(**fqname.query)
return [(fqname, fqname, bool(self.storage.get_item(**fqname.query)))]
namespace = segment1_namespace = fqname.namespace
item_name = fqname.value
@@ -349,7 +348,7 @@ def location_breadcrumbs(self, fqname):
current_item += segment
fq_current = CompositeName(namespace, NAME_EXACT, current_item)
fq_segment = CompositeName(segment1_namespace, NAME_EXACT, segment)
- breadcrumbs.append((fq_segment, fq_current, True))
+ breadcrumbs.append((fq_segment, fq_current))
current_item += "/"
segment1_namespace = ""
return breadcrumbs
@@ -364,7 +363,7 @@ def path_breadcrumbs(self):
user = self.user
breadcrumbs = []
trail = user.get_trail()
- for interwiki_item_name in trail:
+ for interwiki_item_name, aliases in trail:
wiki_name, namespace, field, item_name = split_interwiki(interwiki_item_name)
fqname = CompositeName(namespace, field, item_name)
err = not is_known_wiki(wiki_name)
@@ -372,7 +371,7 @@ def path_breadcrumbs(self):
if is_local_wiki(wiki_name):
wiki_name = "" # means "this wiki" for the theme code
if item_name:
- breadcrumbs.append((wiki_name, fqname, href, True, err))
+ breadcrumbs.append((wiki_name, fqname, href, aliases, err))
return breadcrumbs
def userhome(self):
@@ -558,17 +557,6 @@ def login_url(self):
url = url or url_for("frontend.login")
return url
- def get_fqnames(self, fqname):
- """
- Return the list of other fqnames associated with the item.
- """
- if fqname.field != NAME_EXACT:
- return []
- item = self.storage.get_item(**fqname.query)
- fqnames = item.fqnames
- fqnames.remove(fqname)
- return fqnames or []
-
def get_namespaces(self, ns=None):
"""
Return the list of tuples (composite name, namespace) referring to namespaces other
diff --git a/src/moin/themes/_tests/test_navi_bar.py b/src/moin/themes/_tests/test_navi_bar.py
index 94e22a506..ae2db611b 100644
--- a/src/moin/themes/_tests/test_navi_bar.py
+++ b/src/moin/themes/_tests/test_navi_bar.py
@@ -45,9 +45,9 @@ def test_split_navilink(self, theme):
def test_location_breadcrumbs(self, theme):
test_result = ThemeSupport.location_breadcrumbs(theme, "some/place/test_item")
- test_segment_name_1, test_item_name_1, test_item_exists_1 = test_result[0]
- test_segment_name_2, test_item_name_2, test_item_exists_2 = test_result[1]
- test_segment_name_3, test_item_name_3, test_item_exists_3 = test_result[2]
+ test_segment_name_1, test_item_name_1 = test_result[0]
+ test_segment_name_2, test_item_name_2 = test_result[1]
+ test_segment_name_3, test_item_name_3 = test_result[2]
assert test_segment_name_1.namespace == ""
assert test_item_name_1.namespace == ""
@@ -59,9 +59,9 @@ def test_location_breadcrumbs(self, theme):
assert test_item_name_3.value == "some/place/test_item"
test_result = ThemeSupport.location_breadcrumbs(theme, "users/some/place/test_item")
- test_segment_name_1, test_item_name_1, test_item_exists_1 = test_result[0]
- test_segment_name_2, test_item_name_2, test_item_exists_2 = test_result[1]
- test_segment_name_3, test_item_name_3, test_item_exists_3 = test_result[2]
+ test_segment_name_1, test_item_name_1 = test_result[0]
+ test_segment_name_2, test_item_name_2 = test_result[1]
+ test_segment_name_3, test_item_name_3 = test_result[2]
assert test_segment_name_1.namespace == "users"
assert test_item_name_1.namespace == "users"
diff --git a/src/moin/user.py b/src/moin/user.py
index 95de95df8..f146b4f4d 100644
--- a/src/moin/user.py
+++ b/src/moin/user.py
@@ -58,7 +58,7 @@
from moin.constants.misc import ANON
from moin.i18n import _
from moin.mail import sendmail
-from moin.utils.interwiki import getInterwikiHome, getInterwikiName
+from moin.utils.interwiki import getInterwikiHome, getInterwikiName, CompositeName
from moin.utils.crypto import generate_token, valid_token, make_uuid
from moin.utils.subscriptions import get_matched_subscription_patterns
from moin.storage.error import NoSuchItemError, NoSuchRevisionError
@@ -732,27 +732,39 @@ def quickunlink(self, pagename):
# Trail ------------------------------------------------------------------
- def add_trail(self, item_name):
+ def add_trail(self, item_name, aliases=None):
"""Add item name to trail.
+ Store aliases as tuple
:param item_name: the item name (unicode) to add to the trail
+ :param aliases: a list of aliases for this item
"""
+ full_name = item_name
item_name = getInterwikiName(item_name)
trail_in_session = session.get("trail", [])
trail = trail_in_session[:]
- trail = [i for i in trail if i != item_name] # avoid dupes
- trail.append(item_name) # append current item name at end
+ aliases_trail = []
+ for alias in aliases:
+ if alias.fullname != full_name:
+ aliases_trail.append((alias.namespace, alias.field, alias.value))
+ trail = [i for i in trail if i != (item_name, aliases_trail)] # avoid dupes
+ trail.append((item_name, aliases_trail)) # append current item name and aliases at end
trail = trail[-self._cfg.trail_size :] # limit trail length
if trail != trail_in_session:
session["trail"] = trail
def get_trail(self):
"""Return list of recently visited item names.
-
+ convert aliases to CompositeName
:rtype: list
:returns: item names (unicode) in trail
"""
- return session.get("trail", [])
+ trail_session = session.get("trail", [])
+ trail = []
+ for entry in trail_session:
+ aliases = [CompositeName(*alias) for alias in entry[1]]
+ trail.append((entry[0], aliases))
+ return trail
# Other ------------------------------------------------------------------